/ Hex Artifact Content
Login

Artifact 47d08dda2ade559d85c75ccc4623c6aa7f5c063bf323a382b307145ed66ae7ab:


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 74 68 65 20 74 79 70 65 20 6f 66 20 62  is the type of b
10d0: 72 61 6e 63 68 2e 20 20 49 20 69 73 20 74 68 65  ranch.  I is the
10e0: 20 64 69 72 65 63 74 69 6f 6e 20 74 61 6b 65 6e   direction taken
10f0: 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 61 6e   for this instan
1100: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 62 72 61  ce of.** the bra
1110: 6e 63 68 2e 0a 2a 2a 0a 2a 2a 20 20 20 4d 3a 20  nch..**.**   M: 
1120: 32 20 2d 20 74 77 6f 2d 77 61 79 20 62 72 61 6e  2 - two-way bran
1130: 63 68 20 28 49 3d 30 3a 20 66 61 6c 6c 2d 74 68  ch (I=0: fall-th
1140: 72 75 20 20 20 31 3a 20 6a 75 6d 70 20 20 20 20  ru   1: jump    
1150: 20 20 20 20 20 20 20 20 20 20 20 20 29 0a 2a 2a              ).**
1160: 20 20 20 20 20 20 33 20 2d 20 74 77 6f 2d 77 61        3 - two-wa
1170: 79 20 2b 20 4e 55 4c 4c 20 28 49 3d 30 3a 20 66  y + NULL (I=0: f
1180: 61 6c 6c 2d 74 68 72 75 20 20 20 31 3a 20 6a 75  all-thru   1: ju
1190: 6d 70 20 20 20 20 20 20 32 3a 20 4e 55 4c 4c 20  mp      2: NULL 
11a0: 20 20 29 0a 2a 2a 20 20 20 20 20 20 34 20 2d 20    ).**      4 - 
11b0: 4f 50 5f 4a 75 6d 70 20 20 20 20 20 20 20 20 28  OP_Jump        (
11c0: 49 3d 30 3a 20 6a 75 6d 70 20 70 31 20 20 20 20  I=0: jump p1    
11d0: 20 31 3a 20 6a 75 6d 70 20 70 32 20 20 20 32 3a   1: jump p2   2:
11e0: 20 6a 75 6d 70 20 70 33 29 0a 2a 2a 0a 2a 2a 20   jump p3).**.** 
11f0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1200: 69 66 20 4d 20 69 73 20 32 2c 20 74 68 65 6e 20  if M is 2, then 
1210: 49 20 69 73 20 65 69 74 68 65 72 20 30 20 28 66  I is either 0 (f
1220: 6f 72 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 29  or fall-through)
1230: 20 6f 72 0a 2a 2a 20 31 20 28 66 6f 72 20 77 68   or.** 1 (for wh
1240: 65 6e 20 74 68 65 20 62 72 61 6e 63 68 20 69 73  en the branch is
1250: 20 74 61 6b 65 6e 29 2e 20 20 49 66 20 4d 20 69   taken).  If M i
1260: 73 20 33 2c 20 74 68 65 20 49 20 69 73 20 30 20  s 3, the I is 0 
1270: 66 6f 72 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61  for an.** ordina
1280: 72 79 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 2c  ry fall-through,
1290: 20 49 20 69 73 20 31 20 69 66 20 74 68 65 20 62   I is 1 if the b
12a0: 72 61 6e 63 68 20 77 61 73 20 74 61 6b 65 6e 2c  ranch was taken,
12b0: 20 61 6e 64 20 49 20 69 73 20 32 20 0a 2a 2a 20   and I is 2 .** 
12c0: 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
12d0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e   comparison is N
12e0: 55 4c 4c 2e 20 20 46 6f 72 20 4d 3d 33 2c 20 49  ULL.  For M=3, I
12f0: 3d 32 20 74 68 65 20 6a 75 6d 70 20 6d 61 79 20  =2 the jump may 
1300: 6f 72 0a 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65  or.** may not be
1310: 20 74 61 6b 65 6e 2c 20 64 65 70 65 6e 64 69 6e   taken, dependin
1320: 67 20 6f 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  g on the SQLITE_
1330: 4a 55 4d 50 49 46 4e 55 4c 4c 20 66 6c 61 67 73  JUMPIFNULL flags
1340: 20 69 6e 20 70 35 2e 0a 2a 2a 20 57 68 65 6e 20   in p5..** When 
1350: 4d 20 69 73 20 34 2c 20 74 68 61 74 20 6d 65 61  M is 4, that mea
1360: 6e 73 20 74 68 61 74 20 61 6e 20 4f 50 5f 4a 75  ns that an OP_Ju
1370: 6d 70 20 69 73 20 62 65 69 6e 67 20 72 75 6e 2e  mp is being run.
1380: 20 20 49 20 69 73 20 30 2c 20 31 2c 20 6f 72 20    I is 0, 1, or 
1390: 32 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f  2.** depending o
13a0: 6e 20 69 66 20 74 68 65 20 6f 70 65 72 61 6e 64  n if the operand
13b0: 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 2c  s are less than,
13c0: 20 65 71 75 61 6c 2c 20 6f 72 20 67 72 65 61 74   equal, or great
13d0: 65 72 20 74 68 61 6e 2e 0a 2a 2a 0a 2a 2a 20 69  er than..**.** i
13e0: 53 72 63 4c 69 6e 65 20 69 73 20 74 68 65 20 73  SrcLine is the s
13f0: 6f 75 72 63 65 20 63 6f 64 65 20 6c 69 6e 65 20  ource code line 
1400: 28 66 72 6f 6d 20 74 68 65 20 5f 5f 4c 49 4e 45  (from the __LINE
1410: 5f 5f 20 6d 61 63 72 6f 29 20 74 68 61 74 0a 2a  __ macro) that.*
1420: 2a 20 67 65 6e 65 72 61 74 65 64 20 74 68 65 20  * generated the 
1430: 56 44 42 45 20 69 6e 73 74 72 75 63 74 69 6f 6e  VDBE instruction
1440: 20 63 6f 6d 62 69 6e 65 64 20 77 69 74 68 20 66   combined with f
1450: 6c 61 67 20 62 69 74 73 2e 20 20 54 68 65 20 73  lag bits.  The s
1460: 6f 75 72 63 65 0a 2a 2a 20 63 6f 64 65 20 6c 69  ource.** code li
1470: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20  ne number is in 
1480: 74 68 65 20 6c 6f 77 65 72 20 32 34 20 62 69 74  the lower 24 bit
1490: 73 20 6f 66 20 69 53 72 63 4c 69 6e 65 20 61 6e  s of iSrcLine an
14a0: 64 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 38  d the upper.** 8
14b0: 20 62 79 74 65 73 20 61 72 65 20 66 6c 61 67 73   bytes are flags
14c0: 2e 20 20 54 68 65 20 6c 6f 77 65 72 20 74 68 72  .  The lower thr
14d0: 65 65 20 62 69 74 73 20 6f 66 20 74 68 65 20 66  ee bits of the f
14e0: 6c 61 67 73 20 69 6e 64 69 63 61 74 65 0a 2a 2a  lags indicate.**
14f0: 20 76 61 6c 75 65 73 20 66 6f 72 20 49 20 74 68   values for I th
1500: 61 74 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  at should never 
1510: 6f 63 63 75 72 2e 20 20 46 6f 72 20 65 78 61 6d  occur.  For exam
1520: 70 6c 65 2c 20 69 66 20 74 68 65 20 62 72 61 6e  ple, if the bran
1530: 63 68 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  ch is.** always 
1540: 74 61 6b 65 6e 2c 20 74 68 65 20 66 6c 61 67 73  taken, the flags
1550: 20 73 68 6f 75 6c 64 20 62 65 20 30 78 30 35 20   should be 0x05 
1560: 73 69 6e 63 65 20 74 68 65 20 66 61 6c 6c 2d 74  since the fall-t
1570: 68 72 6f 75 67 68 20 61 6e 64 0a 2a 2a 20 61 6c  hrough and.** al
1580: 74 65 72 6e 61 74 65 20 62 72 61 6e 63 68 20 61  ternate branch a
1590: 72 65 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 20  re never taken. 
15a0: 20 49 66 20 61 20 62 72 61 6e 63 68 20 69 73 20   If a branch is 
15b0: 6e 65 76 65 72 20 74 61 6b 65 6e 20 74 68 65 6e  never taken then
15c0: 0a 2a 2a 20 66 6c 61 67 73 20 73 68 6f 75 6c 64  .** flags should
15d0: 20 62 65 20 30 78 30 36 20 73 69 6e 63 65 20 6f   be 0x06 since o
15e0: 6e 6c 79 20 74 68 65 20 66 61 6c 6c 2d 74 68 72  nly the fall-thr
15f0: 6f 75 67 68 20 61 70 70 72 6f 61 63 68 20 69 73  ough approach is
1600: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20   allowed..**.** 
1610: 42 69 74 20 30 78 30 38 20 6f 66 20 74 68 65 20  Bit 0x08 of the 
1620: 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 73 20  flags indicates 
1630: 61 6e 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64  an OP_Jump opcod
1640: 65 20 74 68 61 74 20 69 73 20 6f 6e 6c 79 0a 2a  e that is only.*
1650: 2a 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e 20  * interested in 
1660: 65 71 75 61 6c 20 6f 72 20 6e 6f 74 2d 65 71 75  equal or not-equ
1670: 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
1680: 72 64 73 2c 20 49 3d 3d 30 20 61 6e 64 20 49 3d  rds, I==0 and I=
1690: 3d 32 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  =2.** should be 
16a0: 74 72 65 61 74 65 64 20 61 73 20 65 71 75 69 76  treated as equiv
16b0: 61 6c 65 6e 74 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  alent.**.** Sinc
16c0: 65 20 6f 6e 6c 79 20 61 20 6c 69 6e 65 20 6e 75  e only a line nu
16d0: 6d 62 65 72 20 69 73 20 72 65 74 61 69 6e 65 64  mber is retained
16e0: 2c 20 6e 6f 74 20 74 68 65 20 66 69 6c 65 6e 61  , not the filena
16f0: 6d 65 2c 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a  me, this macro.*
1700: 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  * only works for
1710: 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 62 75   amalgamation bu
1720: 69 6c 64 73 2e 20 20 42 75 74 20 74 68 61 74 20  ilds.  But that 
1730: 69 73 20 6f 6b 2c 20 73 69 6e 63 65 20 74 68 65  is ok, since the
1740: 73 65 20 6d 61 63 72 6f 73 0a 2a 2a 20 73 68 6f  se macros.** sho
1750: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 20 65 78  uld be no-ops ex
1760: 63 65 70 74 20 66 6f 72 20 73 70 65 63 69 61 6c  cept for special
1770: 20 62 75 69 6c 64 73 20 75 73 65 64 20 74 6f 20   builds used to 
1780: 6d 65 61 73 75 72 65 20 74 65 73 74 20 63 6f 76  measure test cov
1790: 65 72 61 67 65 2e 0a 2a 2f 0a 23 69 66 20 21 64  erage..*/.#if !d
17a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 56 44  efined(SQLITE_VD
17b0: 42 45 5f 43 4f 56 45 52 41 47 45 29 0a 23 20 64  BE_COVERAGE).# d
17c0: 65 66 69 6e 65 20 56 64 62 65 42 72 61 6e 63 68  efine VdbeBranch
17d0: 54 61 6b 65 6e 28 49 2c 4d 29 0a 23 65 6c 73 65  Taken(I,M).#else
17e0: 0a 23 20 64 65 66 69 6e 65 20 56 64 62 65 42 72  .# define VdbeBr
17f0: 61 6e 63 68 54 61 6b 65 6e 28 49 2c 4d 29 20 76  anchTaken(I,M) v
1800: 64 62 65 54 61 6b 65 42 72 61 6e 63 68 28 70 4f  dbeTakeBranch(pO
1810: 70 2d 3e 69 53 72 63 4c 69 6e 65 2c 49 2c 4d 29  p->iSrcLine,I,M)
1820: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 76  .  static void v
1830: 64 62 65 54 61 6b 65 42 72 61 6e 63 68 28 75 33  dbeTakeBranch(u3
1840: 32 20 69 53 72 63 4c 69 6e 65 2c 20 75 38 20 49  2 iSrcLine, u8 I
1850: 2c 20 75 38 20 4d 29 7b 0a 20 20 20 20 75 38 20  , u8 M){.    u8 
1860: 6d 4e 65 76 65 72 3b 0a 20 20 20 20 61 73 73 65  mNever;.    asse
1870: 72 74 28 20 49 3c 3d 32 20 29 3b 20 20 2f 2a 20  rt( I<=2 );  /* 
1880: 30 3a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2c  0: fall through,
1890: 20 20 31 3a 20 74 61 6b 65 6e 2c 20 20 32 3a 20    1: taken,  2: 
18a0: 61 6c 74 65 72 6e 61 74 65 20 74 61 6b 65 6e 20  alternate taken 
18b0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  */.    assert( M
18c0: 3c 3d 34 20 29 3b 20 20 2f 2a 20 32 3a 20 74 77  <=4 );  /* 2: tw
18d0: 6f 2d 77 61 79 20 62 72 61 6e 63 68 2c 20 33 3a  o-way branch, 3:
18e0: 20 74 68 72 65 65 2d 77 61 79 20 62 72 61 6e 63   three-way branc
18f0: 68 2c 20 34 3a 20 4f 50 5f 4a 75 6d 70 20 2a 2f  h, 4: OP_Jump */
1900: 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 3c 4d  .    assert( I<M
1910: 20 29 3b 20 20 20 2f 2a 20 49 20 63 61 6e 20 6f   );   /* I can o
1920: 6e 6c 79 20 62 65 20 32 20 69 66 20 4d 20 69 73  nly be 2 if M is
1930: 20 33 20 6f 72 20 34 20 2a 2f 0a 20 20 20 20 2f   3 or 4 */.    /
1940: 2a 20 54 72 61 6e 73 66 6f 72 6d 20 49 20 66 72  * Transform I fr
1950: 6f 6d 20 61 20 69 6e 74 65 67 65 72 20 5b 30 2c  om a integer [0,
1960: 31 2c 32 5d 20 69 6e 74 6f 20 61 20 62 69 74 6d  1,2] into a bitm
1970: 61 73 6b 20 6f 66 20 5b 31 2c 32 2c 34 5d 20 2a  ask of [1,2,4] *
1980: 2f 0a 20 20 20 20 49 20 3d 20 31 3c 3c 49 3b 0a  /.    I = 1<<I;.
1990: 20 20 20 20 2f 2a 20 54 68 65 20 75 70 70 65 72      /* The upper
19a0: 20 38 20 62 69 74 73 20 6f 66 20 69 53 72 63 4c   8 bits of iSrcL
19b0: 69 6e 65 20 61 72 65 20 66 6c 61 67 73 2e 20 20  ine are flags.  
19c0: 54 68 65 20 6c 6f 77 65 72 20 74 68 72 65 65 20  The lower three 
19d0: 62 69 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  bits of.    ** t
19e0: 68 65 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  he flags indicat
19f0: 65 20 64 69 72 65 63 74 69 6f 6e 73 20 74 68 61  e directions tha
1a00: 74 20 74 68 65 20 62 72 61 6e 63 68 20 63 61 6e  t the branch can
1a10: 20 6e 65 76 65 72 20 67 6f 2e 20 20 49 66 0a 20   never go.  If. 
1a20: 20 20 20 2a 2a 20 61 20 62 72 61 6e 63 68 20 72     ** a branch r
1a30: 65 61 6c 6c 79 20 64 6f 65 73 20 67 6f 20 69 6e  eally does go in
1a40: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 69   one of those di
1a50: 72 65 63 74 69 6f 6e 73 2c 20 61 73 73 65 72 74  rections, assert
1a60: 20 72 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 77   right.    ** aw
1a70: 61 79 2e 20 2a 2f 0a 20 20 20 20 6d 4e 65 76 65  ay. */.    mNeve
1a80: 72 20 3d 20 69 53 72 63 4c 69 6e 65 20 3e 3e 20  r = iSrcLine >> 
1a90: 32 34 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  24;.    assert( 
1aa0: 28 49 20 26 20 6d 4e 65 76 65 72 29 3d 3d 30 20  (I & mNever)==0 
1ab0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1ac0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1ad0: 56 64 62 65 42 72 61 6e 63 68 3d 3d 30 20 29 20  VdbeBranch==0 ) 
1ae0: 72 65 74 75 72 6e 3b 20 20 2f 2a 4e 4f 5f 54 45  return;  /*NO_TE
1af0: 53 54 2a 2f 0a 20 20 20 20 2f 2a 20 49 6e 76 6f  ST*/.    /* Invo
1b00: 6b 65 20 74 68 65 20 62 72 61 6e 63 68 20 63 6f  ke the branch co
1b10: 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20  verage callback 
1b20: 77 69 74 68 20 74 68 72 65 65 20 61 72 67 75 6d  with three argum
1b30: 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ents:.    **    
1b40: 69 53 72 63 4c 69 6e 65 20 2d 20 74 68 65 20 6c  iSrcLine - the l
1b50: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  ine number of th
1b60: 65 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 29  e VdbeCoverage()
1b70: 20 6d 61 63 72 6f 2c 20 77 69 74 68 0a 20 20 20   macro, with.   
1b80: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1b90: 20 20 66 6c 61 67 73 20 72 65 6d 6f 76 65 64 2e    flags removed.
1ba0: 0a 20 20 20 20 2a 2a 20 20 20 20 49 20 20 20 20  .    **    I    
1bb0: 20 20 20 20 2d 20 4d 61 73 6b 20 6f 66 20 62 69      - Mask of bi
1bc0: 74 73 20 30 78 30 37 20 69 6e 64 69 63 61 74 69  ts 0x07 indicati
1bd0: 6e 67 20 77 68 69 63 68 20 63 61 73 65 73 20 61  ng which cases a
1be0: 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20  re are.    **   
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 66 75 6c 66              fulf
1c00: 69 6c 6c 65 64 20 62 79 20 74 68 69 73 20 69 6e  illed by this in
1c10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 6a 75  stance of the ju
1c20: 6d 70 2e 20 20 30 78 30 31 20 6d 65 61 6e 73 0a  mp.  0x01 means.
1c30: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1c40: 20 20 20 20 20 66 61 6c 6c 2d 74 68 72 75 2c 20       fall-thru, 
1c50: 30 78 30 32 20 6d 65 61 6e 73 20 74 61 6b 65 6e  0x02 means taken
1c60: 2c 20 30 78 30 34 20 6d 65 61 6e 73 20 4e 55 4c  , 0x04 means NUL
1c70: 4c 2e 20 20 41 6e 79 0a 20 20 20 20 2a 2a 20 20  L.  Any.    **  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
1c90: 6f 73 73 69 62 6c 65 20 63 61 73 65 73 20 28 65  ossible cases (e
1ca0: 78 3a 20 69 66 20 74 68 65 20 63 6f 6d 70 61 72  x: if the compar
1cb0: 69 73 6f 6e 20 69 73 20 6e 65 76 65 72 20 4e 55  ison is never NU
1cc0: 4c 4c 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  LL).    **      
1cd0: 20 20 20 20 20 20 20 20 20 61 72 65 20 66 69 6c           are fil
1ce0: 6c 65 64 20 69 6e 20 61 75 74 6f 6d 61 74 69 63  led in automatic
1cf0: 61 6c 6c 79 20 73 6f 20 74 68 61 74 20 74 68 65  ally so that the
1d00: 20 63 6f 76 65 72 61 67 65 0a 20 20 20 20 2a 2a   coverage.    **
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1d20: 65 61 73 75 72 65 6d 65 6e 74 20 6c 6f 67 69 63  easurement logic
1d30: 20 64 6f 65 73 20 6e 6f 74 20 66 6c 61 67 20 74   does not flag t
1d40: 68 6f 73 65 20 69 6d 70 6f 73 73 69 62 6c 65 20  hose impossible 
1d50: 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 20 20 20  cases.    **    
1d60: 20 20 20 20 20 20 20 20 20 20 20 61 73 20 6d 69             as mi
1d70: 73 73 65 64 20 63 6f 76 65 72 61 67 65 2e 0a 20  ssed coverage.. 
1d80: 20 20 20 2a 2a 20 20 20 20 4d 20 20 20 20 20 20     **    M      
1d90: 20 20 2d 20 54 79 70 65 20 6f 66 20 6a 75 6d 70    - Type of jump
1da0: 2e 20 20 53 61 6d 65 20 61 73 20 4d 20 61 72 67  .  Same as M arg
1db0: 75 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 20 20  ument above.    
1dc0: 2a 2f 0a 20 20 20 20 49 20 7c 3d 20 6d 4e 65 76  */.    I |= mNev
1dd0: 65 72 3b 0a 20 20 20 20 69 66 28 20 4d 3d 3d 32  er;.    if( M==2
1de0: 20 29 20 49 20 7c 3d 20 30 78 30 34 3b 0a 20 20   ) I |= 0x04;.  
1df0: 20 20 69 66 28 20 4d 3d 3d 34 20 29 7b 0a 20 20    if( M==4 ){.  
1e00: 20 20 20 20 49 20 7c 3d 20 30 78 30 38 3b 0a 20      I |= 0x08;. 
1e10: 20 20 20 20 20 69 66 28 20 28 6d 4e 65 76 65 72       if( (mNever
1e20: 26 30 78 30 38 29 21 3d 30 20 26 26 20 28 49 26  &0x08)!=0 && (I&
1e30: 30 78 30 35 29 21 3d 30 29 20 49 20 7c 3d 20 30  0x05)!=0) I |= 0
1e40: 78 30 35 3b 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  x05; /*NO_TEST*/
1e50: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1e60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1e70: 56 64 62 65 42 72 61 6e 63 68 28 73 71 6c 69 74  VdbeBranch(sqlit
1e80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1e90: 56 64 62 65 42 72 61 6e 63 68 41 72 67 2c 0a 20  VdbeBranchArg,. 
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 69 53 72 63 4c 69 6e 65 26 30 78 66 66     iSrcLine&0xff
1ed0: 66 66 66 66 2c 20 49 2c 20 4d 29 3b 0a 20 20 7d  ffff, I, M);.  }
1ee0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
1ef0: 6f 6e 76 65 72 74 20 74 68 65 20 67 69 76 65 6e  onvert the given
1f00: 20 72 65 67 69 73 74 65 72 20 69 6e 74 6f 20 61   register into a
1f10: 20 73 74 72 69 6e 67 20 69 66 20 69 74 20 69 73   string if it is
1f20: 6e 27 74 20 6f 6e 65 0a 2a 2a 20 61 6c 72 65 61  n't one.** alrea
1f30: 64 79 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  dy. Return non-z
1f40: 65 72 6f 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ero if a malloc(
1f50: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66  ) fails..*/.#def
1f60: 69 6e 65 20 53 74 72 69 6e 67 69 66 79 28 50 2c  ine Stringify(P,
1f70: 20 65 6e 63 29 20 5c 0a 20 20 20 69 66 28 28 28   enc) \.   if(((
1f80: 50 29 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 53  P)->flags&(MEM_S
1f90: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  tr|MEM_Blob))==0
1fa0: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 4d   && sqlite3VdbeM
1fb0: 65 6d 53 74 72 69 6e 67 69 66 79 28 50 2c 65 6e  emStringify(P,en
1fc0: 63 2c 30 29 29 20 5c 0a 20 20 20 20 20 7b 20 67  c,0)) \.     { g
1fd0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20 7d 0a 0a 2f  oto no_mem; }../
1fe0: 2a 0a 2a 2a 20 41 6e 20 65 70 68 65 6d 65 72 61  *.** An ephemera
1ff0: 6c 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 28  l string value (
2000: 73 69 67 6e 69 66 69 65 64 20 62 79 20 74 68 65  signified by the
2010: 20 4d 45 4d 5f 45 70 68 65 6d 20 66 6c 61 67 29   MEM_Ephem flag)
2020: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70   contains.** a p
2030: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 79 6e 61  ointer to a dyna
2040: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
2050: 64 20 73 74 72 69 6e 67 20 77 68 65 72 65 20 73  d string where s
2060: 6f 6d 65 20 6f 74 68 65 72 20 65 6e 74 69 74 79  ome other entity
2070: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2080: 6c 65 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74  le for deallocat
2090: 69 6e 67 20 74 68 61 74 20 73 74 72 69 6e 67 2e  ing that string.
20a0: 20 20 42 65 63 61 75 73 65 20 74 68 65 20 72 65    Because the re
20b0: 67 69 73 74 65 72 0a 2a 2a 20 64 6f 65 73 20 6e  gister.** does n
20c0: 6f 74 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 73  ot control the s
20d0: 74 72 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 20  tring, it might 
20e0: 62 65 20 64 65 6c 65 74 65 64 20 77 69 74 68 6f  be deleted witho
20f0: 75 74 20 74 68 65 20 72 65 67 69 73 74 65 72 0a  ut the register.
2100: 2a 2a 20 6b 6e 6f 77 69 6e 67 20 69 74 2e 0a 2a  ** knowing it..*
2110: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2120: 65 20 63 6f 6e 76 65 72 74 73 20 61 6e 20 65 70  e converts an ep
2130: 68 65 6d 65 72 61 6c 20 73 74 72 69 6e 67 20 69  hemeral string i
2140: 6e 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c  nto a dynamicall
2150: 79 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73  y allocated.** s
2160: 74 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 72  tring that the r
2170: 65 67 69 73 74 65 72 20 69 74 73 65 6c 66 20 63  egister itself c
2180: 6f 6e 74 72 6f 6c 73 2e 20 20 49 6e 20 6f 74 68  ontrols.  In oth
2190: 65 72 20 77 6f 72 64 73 2c 20 69 74 0a 2a 2a 20  er words, it.** 
21a0: 63 6f 6e 76 65 72 74 73 20 61 6e 20 4d 45 4d 5f  converts an MEM_
21b0: 45 70 68 65 6d 20 73 74 72 69 6e 67 20 69 6e 74  Ephem string int
21c0: 6f 20 61 20 73 74 72 69 6e 67 20 77 69 74 68 20  o a string with 
21d0: 50 2e 7a 3d 3d 50 2e 7a 4d 61 6c 6c 6f 63 2e 0a  P.z==P.zMalloc..
21e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 44 65 65 70 68  */.#define Deeph
21f0: 65 6d 65 72 61 6c 69 7a 65 28 50 29 20 5c 0a 20  emeralize(P) \. 
2200: 20 20 69 66 28 20 28 28 50 29 2d 3e 66 6c 61 67    if( ((P)->flag
2210: 73 26 4d 45 4d 5f 45 70 68 65 6d 29 21 3d 30 20  s&MEM_Ephem)!=0 
2220: 5c 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  \.       && sqli
2230: 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72  te3VdbeMemMakeWr
2240: 69 74 65 61 62 6c 65 28 50 29 20 29 7b 20 67 6f  iteable(P) ){ go
2250: 74 6f 20 6e 6f 5f 6d 65 6d 3b 7d 0a 0a 2f 2a 20  to no_mem;}../* 
2260: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
2270: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
2280: 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ened using the O
2290: 50 5f 4f 70 65 6e 53 6f 72 74 65 72 20 6f 70 63  P_OpenSorter opc
22a0: 6f 64 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ode. */.#define 
22b0: 69 73 53 6f 72 74 65 72 28 78 29 20 28 28 78 29  isSorter(x) ((x)
22c0: 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
22d0: 59 50 45 5f 53 4f 52 54 45 52 29 0a 0a 2f 2a 0a  YPE_SORTER)../*.
22e0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 56 64 62 65  ** Allocate Vdbe
22f0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 43  Cursor number iC
2300: 75 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ur.  Return a po
2310: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 52 65  inter to it.  Re
2320: 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
2330: 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
2340: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
2350: 56 64 62 65 43 75 72 73 6f 72 20 2a 61 6c 6c 6f  VdbeCursor *allo
2360: 63 61 74 65 43 75 72 73 6f 72 28 0a 20 20 56 64  cateCursor(.  Vd
2370: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
2380: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2390: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
23a0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
23b0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
23c0: 66 20 74 68 65 20 6e 65 77 20 56 64 62 65 43 75  f the new VdbeCu
23d0: 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  rsor */.  int nF
23e0: 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  ield,           
23f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* Number of fie
2400: 6c 64 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  lds in the table
2410: 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   or index */.  i
2420: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
2430: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2440: 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 6c 6f   the cursor belo
2450: 6e 67 73 20 74 6f 2c 20 6f 72 20 2d 31 20 2a 2f  ngs to, or -1 */
2460: 0a 20 20 75 38 20 65 43 75 72 54 79 70 65 20 20  .  u8 eCurType  
2470: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
2480: 20 6f 66 20 74 68 65 20 6e 65 77 20 63 75 72 73   of the new curs
2490: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 46 69  or */.){.  /* Fi
24a0: 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  nd the memory ce
24b0: 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ll that will be 
24c0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
24d0: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
24e0: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66  .  ** required f
24f0: 6f 72 20 74 68 69 73 20 56 64 62 65 43 75 72 73  or this VdbeCurs
2500: 6f 72 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  or structure. It
2510: 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
2520: 6f 20 75 73 65 20 61 20 0a 20 20 2a 2a 20 76 64  o use a .  ** vd
2530: 62 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  be memory cell t
2540: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 6d 65 6d  o manage the mem
2550: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72  ory allocation r
2560: 65 71 75 69 72 65 64 20 66 6f 72 20 61 0a 20 20  equired for a.  
2570: 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 20 73 74  ** VdbeCursor st
2580: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
2590: 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e  following reason
25a0: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  s:.  **.  **   *
25b0: 20 53 6f 6d 65 74 69 6d 65 73 20 63 75 72 73 6f   Sometimes curso
25c0: 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 75 73  r numbers are us
25d0: 65 64 20 66 6f 72 20 61 20 63 6f 75 70 6c 65 20  ed for a couple 
25e0: 6f 66 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a  of different.  *
25f0: 2a 20 20 20 20 20 70 75 72 70 6f 73 65 73 20 69  *     purposes i
2600: 6e 20 61 20 76 64 62 65 20 70 72 6f 67 72 61 6d  n a vdbe program
2610: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 74 20  . The different 
2620: 75 73 65 73 20 6d 69 67 68 74 20 72 65 71 75 69  uses might requi
2630: 72 65 0a 20 20 2a 2a 20 20 20 20 20 64 69 66 66  re.  **     diff
2640: 65 72 65 6e 74 20 73 69 7a 65 64 20 61 6c 6c 6f  erent sized allo
2650: 63 61 74 69 6f 6e 73 2e 20 4d 65 6d 6f 72 79 20  cations. Memory 
2660: 63 65 6c 6c 73 20 70 72 6f 76 69 64 65 20 67 72  cells provide gr
2670: 6f 77 61 62 6c 65 0a 20 20 2a 2a 20 20 20 20 20  owable.  **     
2680: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  allocations..  *
2690: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
26a0: 75 73 69 6e 67 20 45 4e 41 42 4c 45 5f 4d 45 4d  using ENABLE_MEM
26b0: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 2c 20  ORY_MANAGEMENT, 
26c0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 62 75 66 66  memory cell buff
26d0: 65 72 73 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20  ers can.  **    
26e0: 20 62 65 20 66 72 65 65 64 20 6c 61 7a 69 6c 79   be freed lazily
26f0: 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2700: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
2710: 29 20 41 50 49 2e 20 54 68 69 73 0a 20 20 2a 2a  ) API. This.  **
2720: 20 20 20 20 20 6d 69 6e 69 6d 69 7a 65 73 20 74       minimizes t
2730: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c  he number of mal
2740: 6c 6f 63 20 63 61 6c 6c 73 20 6d 61 64 65 20 62  loc calls made b
2750: 79 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 20 20  y the system..  
2760: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 65 6d 6f  **.  ** The memo
2770: 72 79 20 63 65 6c 6c 20 66 6f 72 20 63 75 72 73  ry cell for curs
2780: 6f 72 20 30 20 69 73 20 61 4d 65 6d 5b 30 5d 2e  or 0 is aMem[0].
2790: 20 54 68 65 20 72 65 73 74 20 61 72 65 20 61 6c   The rest are al
27a0: 6c 6f 63 61 74 65 64 20 66 72 6f 6d 0a 20 20 2a  located from.  *
27b0: 2a 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * the top of the
27c0: 20 72 65 67 69 73 74 65 72 20 73 70 61 63 65 2e   register space.
27d0: 20 20 43 75 72 73 6f 72 20 31 20 69 73 20 61 74    Cursor 1 is at
27e0: 20 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 31 5d 2e   Mem[p->nMem-1].
27f0: 0a 20 20 2a 2a 20 43 75 72 73 6f 72 20 32 20 69  .  ** Cursor 2 i
2800: 73 20 61 74 20 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d  s at Mem[p->nMem
2810: 2d 32 5d 2e 20 41 6e 64 20 73 6f 20 66 6f 72 74  -2]. And so fort
2820: 68 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  h..  */.  Mem *p
2830: 4d 65 6d 20 3d 20 69 43 75 72 3e 30 20 3f 20 26  Mem = iCur>0 ? &
2840: 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d  p->aMem[p->nMem-
2850: 69 43 75 72 5d 20 3a 20 70 2d 3e 61 4d 65 6d 3b  iCur] : p->aMem;
2860: 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ..  int nByte;. 
2870: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
2880: 20 3d 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20   = 0;.  nByte = 
2890: 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69  .      ROUND8(si
28a0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29  zeof(VdbeCursor)
28b0: 29 20 2b 20 32 2a 73 69 7a 65 6f 66 28 75 33 32  ) + 2*sizeof(u32
28c0: 29 2a 6e 46 69 65 6c 64 20 2b 20 0a 20 20 20 20  )*nField + .    
28d0: 20 20 28 65 43 75 72 54 79 70 65 3d 3d 43 55 52    (eCurType==CUR
28e0: 54 59 50 45 5f 42 54 52 45 45 3f 73 71 6c 69 74  TYPE_BTREE?sqlit
28f0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
2900: 65 28 29 3a 30 29 3b 0a 0a 20 20 61 73 73 65 72  e():0);..  asser
2910: 74 28 20 69 43 75 72 3e 3d 30 20 26 26 20 69 43  t( iCur>=0 && iC
2920: 75 72 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  ur<p->nCursor );
2930: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b  .  if( p->apCsr[
2940: 69 43 75 72 5d 20 29 7b 20 2f 2a 4f 50 54 49 4d  iCur] ){ /*OPTIM
2950: 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45  IZATION-IF-FALSE
2960: 2a 2f 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65  */.    /* Before
2970: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
2980: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 29  VdbeFreeCursor()
2990: 2c 20 65 6e 73 75 72 65 20 74 68 65 20 69 73 45  , ensure the isE
29a0: 70 68 65 6d 65 72 61 6c 20 66 6c 61 67 0a 20 20  phemeral flag.  
29b0: 20 20 2a 2a 20 69 73 20 63 6c 65 61 72 2e 20 4f    ** is clear. O
29c0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 69  therwise, if thi
29d0: 73 20 69 73 20 61 6e 20 65 70 68 65 6d 65 72 61  s is an ephemera
29e0: 6c 20 63 75 72 73 6f 72 20 63 72 65 61 74 65 64  l cursor created
29f0: 20 62 79 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 4f   by .    ** OP_O
2a00: 70 65 6e 44 75 70 2c 20 74 68 65 20 63 75 72 73  penDup, the curs
2a10: 6f 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  or will not be c
2a20: 6c 6f 73 65 64 20 61 6e 64 20 77 69 6c 6c 20 73  losed and will s
2a30: 74 69 6c 6c 20 62 65 20 70 61 72 74 0a 20 20 20  till be part.   
2a40: 20 2a 2a 20 6f 66 20 61 20 42 74 53 68 61 72 65   ** of a BtShare
2a50: 64 2e 70 43 75 72 73 6f 72 20 6c 69 73 74 2e 20  d.pCursor list. 
2a60: 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 70 43 73 72   */.    p->apCsr
2a70: 5b 69 43 75 72 5d 2d 3e 69 73 45 70 68 65 6d 65  [iCur]->isEpheme
2a80: 72 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ral = 0;.    sql
2a90: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
2aa0: 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 69  or(p, p->apCsr[i
2ab0: 43 75 72 5d 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Cur]);.    p->ap
2ac0: 43 73 72 5b 69 43 75 72 5d 20 3d 20 30 3b 0a 20  Csr[iCur] = 0;. 
2ad0: 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f   }.  if( SQLITE_
2ae0: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
2af0: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
2b00: 28 70 4d 65 6d 2c 20 6e 42 79 74 65 29 20 29 7b  (pMem, nByte) ){
2b10: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 43  .    p->apCsr[iC
2b20: 75 72 5d 20 3d 20 70 43 78 20 3d 20 28 56 64 62  ur] = pCx = (Vdb
2b30: 65 43 75 72 73 6f 72 2a 29 70 4d 65 6d 2d 3e 7a  eCursor*)pMem->z
2b40: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43 78  ;.    memset(pCx
2b50: 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 56 64  , 0, offsetof(Vd
2b60: 62 65 43 75 72 73 6f 72 2c 70 41 6c 74 43 75 72  beCursor,pAltCur
2b70: 73 6f 72 29 29 3b 0a 20 20 20 20 70 43 78 2d 3e  sor));.    pCx->
2b80: 65 43 75 72 54 79 70 65 20 3d 20 65 43 75 72 54  eCurType = eCurT
2b90: 79 70 65 3b 0a 20 20 20 20 70 43 78 2d 3e 69 44  ype;.    pCx->iD
2ba0: 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 43 78  b = iDb;.    pCx
2bb0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
2bc0: 64 3b 0a 20 20 20 20 70 43 78 2d 3e 61 4f 66 66  d;.    pCx->aOff
2bd0: 73 65 74 20 3d 20 26 70 43 78 2d 3e 61 54 79 70  set = &pCx->aTyp
2be0: 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 69  e[nField];.    i
2bf0: 66 28 20 65 43 75 72 54 79 70 65 3d 3d 43 55 52  f( eCurType==CUR
2c00: 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20  TYPE_BTREE ){.  
2c10: 20 20 20 20 70 43 78 2d 3e 75 63 2e 70 43 75 72      pCx->uc.pCur
2c20: 73 6f 72 20 3d 20 28 42 74 43 75 72 73 6f 72 2a  sor = (BtCursor*
2c30: 29 0a 20 20 20 20 20 20 20 20 20 20 26 70 4d 65  ).          &pMe
2c40: 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73 69 7a 65  m->z[ROUND8(size
2c50: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 2b  of(VdbeCursor))+
2c60: 32 2a 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46  2*sizeof(u32)*nF
2c70: 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ield];.      sql
2c80: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
2c90: 65 72 6f 28 70 43 78 2d 3e 75 63 2e 70 43 75 72  ero(pCx->uc.pCur
2ca0: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  sor);.    }.  }.
2cb0: 20 20 72 65 74 75 72 6e 20 70 43 78 3b 0a 7d 0a    return pCx;.}.
2cc0: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f  ./*.** Try to co
2cd0: 6e 76 65 72 74 20 61 20 76 61 6c 75 65 20 69 6e  nvert a value in
2ce0: 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72 65 70  to a numeric rep
2cf0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 77  resentation if w
2d00: 65 20 63 61 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77  e can.** do so w
2d10: 69 74 68 6f 75 74 20 6c 6f 73 73 20 6f 66 20 69  ithout loss of i
2d20: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 6e 20  nformation.  In 
2d30: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
2d40: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f  the string.** lo
2d50: 6f 6b 73 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65  oks like a numbe
2d60: 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e  r, convert it in
2d70: 74 6f 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66  to a number.  If
2d80: 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20   it does not.** 
2d90: 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75 6d 62  look like a numb
2da0: 65 72 2c 20 6c 65 61 76 65 20 69 74 20 61 6c 6f  er, leave it alo
2db0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ne..**.** If the
2dc0: 20 62 54 72 79 46 6f 72 49 6e 74 20 66 6c 61 67   bTryForInt flag
2dd0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 65   is true, then e
2de0: 78 74 72 61 20 65 66 66 6f 72 74 20 69 73 20 6d  xtra effort is m
2df0: 61 64 65 20 74 6f 20 67 69 76 65 0a 2a 2a 20 61  ade to give.** a
2e00: 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
2e10: 65 6e 74 61 74 69 6f 6e 2e 20 20 53 74 72 69 6e  entation.  Strin
2e20: 67 73 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b  gs that look lik
2e30: 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
2e40: 0a 2a 2a 20 76 61 6c 75 65 73 20 62 75 74 20 77  .** values but w
2e50: 68 69 63 68 20 68 61 76 65 20 6e 6f 20 66 72 61  hich have no fra
2e60: 63 74 69 6f 6e 61 6c 20 63 6f 6d 70 6f 6e 65 6e  ctional componen
2e70: 74 20 28 65 78 61 6d 70 6c 65 3a 20 27 34 38 2e  t (example: '48.
2e80: 30 30 27 29 0a 2a 2a 20 77 69 6c 6c 20 68 61 76  00').** will hav
2e90: 65 20 61 20 4d 45 4d 5f 49 6e 74 20 72 65 70 72  e a MEM_Int repr
2ea0: 65 73 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20  esentation when 
2eb0: 62 54 72 79 46 6f 72 49 6e 74 20 69 73 20 74 72  bTryForInt is tr
2ec0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 54 72  ue..**.** If bTr
2ed0: 79 46 6f 72 49 6e 74 20 69 73 20 66 61 6c 73 65  yForInt is false
2ee0: 2c 20 74 68 65 6e 20 69 66 20 74 68 65 20 69 6e  , then if the in
2ef0: 70 75 74 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  put string conta
2f00: 69 6e 73 20 61 20 64 65 63 69 6d 61 6c 0a 2a 2a  ins a decimal.**
2f10: 20 70 6f 69 6e 74 20 6f 72 20 65 78 70 6f 6e 65   point or expone
2f20: 6e 74 69 61 6c 20 6e 6f 74 61 74 69 6f 6e 2c 20  ntial notation, 
2f30: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6f 6e  the result is on
2f40: 6c 79 20 4d 45 4d 5f 52 65 61 6c 2c 20 65 76 65  ly MEM_Real, eve
2f50: 6e 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  n.** if there is
2f60: 20 61 6e 20 65 78 61 63 74 20 69 6e 74 65 67 65   an exact intege
2f70: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
2f80: 20 6f 66 20 74 68 65 20 71 75 61 6e 74 69 74 79   of the quantity
2f90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2fa0: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
2fb0: 69 6e 69 74 79 28 4d 65 6d 20 2a 70 52 65 63 2c  inity(Mem *pRec,
2fc0: 20 69 6e 74 20 62 54 72 79 46 6f 72 49 6e 74 29   int bTryForInt)
2fd0: 7b 0a 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 75  {.  double rValu
2fe0: 65 3b 0a 20 20 69 36 34 20 69 56 61 6c 75 65 3b  e;.  i64 iValue;
2ff0: 0a 20 20 75 38 20 65 6e 63 20 3d 20 70 52 65 63  .  u8 enc = pRec
3000: 2d 3e 65 6e 63 3b 0a 20 20 61 73 73 65 72 74 28  ->enc;.  assert(
3010: 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20   (pRec->flags & 
3020: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 49 6e 74  (MEM_Str|MEM_Int
3030: 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d 3d 4d 45 4d  |MEM_Real))==MEM
3040: 5f 53 74 72 20 29 3b 0a 20 20 69 66 28 20 73 71  _Str );.  if( sq
3050: 6c 69 74 65 33 41 74 6f 46 28 70 52 65 63 2d 3e  lite3AtoF(pRec->
3060: 7a 2c 20 26 72 56 61 6c 75 65 2c 20 70 52 65 63  z, &rValue, pRec
3070: 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30 20 29 20 72  ->n, enc)==0 ) r
3080: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 30 3d 3d  eturn;.  if( 0==
3090: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 70 52  sqlite3Atoi64(pR
30a0: 65 63 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 2c 20  ec->z, &iValue, 
30b0: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 20 29 7b  pRec->n, enc) ){
30c0: 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 69 20 3d  .    pRec->u.i =
30d0: 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 70 52 65   iValue;.    pRe
30e0: 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  c->flags |= MEM_
30f0: 49 6e 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Int;.  }else{.  
3100: 20 20 70 52 65 63 2d 3e 75 2e 72 20 3d 20 72 56    pRec->u.r = rV
3110: 61 6c 75 65 3b 0a 20 20 20 20 70 52 65 63 2d 3e  alue;.    pRec->
3120: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61  flags |= MEM_Rea
3130: 6c 3b 0a 20 20 20 20 69 66 28 20 62 54 72 79 46  l;.    if( bTryF
3140: 6f 72 49 6e 74 20 29 20 73 71 6c 69 74 65 33 56  orInt ) sqlite3V
3150: 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69  dbeIntegerAffini
3160: 74 79 28 70 52 65 63 29 3b 0a 20 20 7d 0a 20 20  ty(pRec);.  }.  
3170: 2f 2a 20 54 45 58 54 2d 3e 4e 55 4d 45 52 49 43  /* TEXT->NUMERIC
3180: 20 69 73 20 6d 61 6e 79 2d 3e 6f 6e 65 2e 20 20   is many->one.  
3190: 48 65 6e 63 65 2c 20 69 74 20 69 73 20 69 6d 70  Hence, it is imp
31a0: 6f 72 74 61 6e 74 20 74 6f 20 69 6e 76 61 6c 69  ortant to invali
31b0: 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 73 74  date the.  ** st
31c0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
31d0: 69 6f 6e 20 61 66 74 65 72 20 63 6f 6d 70 75 74  ion after comput
31e0: 69 6e 67 20 61 20 6e 75 6d 65 72 69 63 20 65 71  ing a numeric eq
31f0: 75 69 76 61 6c 65 6e 74 2c 20 62 65 63 61 75 73  uivalent, becaus
3200: 65 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 69 6e  e the.  ** strin
3210: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
3220: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 68   might not be th
3230: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 72 65 70 72  e canonical repr
3240: 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  esentation for t
3250: 68 65 0a 20 20 2a 2a 20 6e 75 6d 65 72 69 63 20  he.  ** numeric 
3260: 76 61 6c 75 65 2e 20 20 54 69 63 6b 65 74 20 5b  value.  Ticket [
3270: 33 34 33 36 33 34 39 34 32 64 64 35 34 61 62 35  343634942dd54ab5
3280: 37 62 37 30 32 34 5d 20 32 30 31 38 2d 30 31 2d  7b7024] 2018-01-
3290: 33 31 2e 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 66  31. */.  pRec->f
32a0: 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 53 74 72  lags &= ~MEM_Str
32b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  ;.}../*.** Proce
32c0: 73 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69  ssing is determi
32d0: 6e 65 20 62 79 20 74 68 65 20 61 66 66 69 6e 69  ne by the affini
32e0: 74 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a  ty parameter:.**
32f0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
3300: 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54  NTEGER:.** SQLIT
3310: 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53  E_AFF_REAL:.** S
3320: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
3330: 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20  C:.**    Try to 
3340: 63 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20  convert pRec to 
3350: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
3360: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a  sentation or a .
3370: 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70  **    floating-p
3380: 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  oint representat
3390: 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65  ion if an intege
33a0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
33b0: 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f  .**    is not po
33c0: 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68  ssible.  Note th
33d0: 61 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  at the integer r
33e0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
33f0: 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72  .**    always pr
3400: 65 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66  eferred, even if
3410: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 69 73   the affinity is
3420: 20 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a   REAL, because.*
3430: 2a 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20  *    an integer 
3440: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
3450: 73 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66  s more space eff
3460: 69 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a  icient on disk..
3470: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  **.** SQLITE_AFF
3480: 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e  _TEXT:.**    Con
3490: 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 20 74  vert pRec to a t
34a0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
34b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  on..**.** SQLITE
34c0: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a 2a 20 20 20  _AFF_BLOB:.**   
34d0: 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73   No-op.  pRec is
34e0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
34f0: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79  tatic void apply
3500: 41 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20  Affinity(.  Mem 
3510: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  *pRec,          
3520: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20  /* The value to 
3530: 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74  apply affinity t
3540: 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  o */.  char affi
3550: 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  nity,      /* Th
3560: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65  e affinity to be
3570: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38   applied */.  u8
3580: 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20 20   enc            
3590: 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65    /* Use this te
35a0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29  xt encoding */.)
35b0: 7b 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74 79  {.  if( affinity
35c0: 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  >=SQLITE_AFF_NUM
35d0: 45 52 49 43 20 29 7b 0a 20 20 20 20 61 73 73 65  ERIC ){.    asse
35e0: 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51  rt( affinity==SQ
35f0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
3600: 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51   || affinity==SQ
3610: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
3620: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66             || af
3630: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
3640: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
3650: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
3660: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
3670: 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49   ){ /*OPTIMIZATI
3680: 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
3690: 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66      if( (pRec->f
36a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29  lags & MEM_Real)
36b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
36c0: 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26  f( pRec->flags &
36d0: 20 4d 45 4d 5f 53 74 72 20 29 20 61 70 70 6c 79   MEM_Str ) apply
36e0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
36f0: 70 52 65 63 2c 31 29 3b 0a 20 20 20 20 20 20 7d  pRec,1);.      }
3700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3710: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
3720: 41 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a  Affinity(pRec);.
3730: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3740: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
3750: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
3760: 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  EXT ){.    /* On
3770: 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65 20 63  ly attempt the c
3780: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54 45 58  onversion to TEX
3790: 54 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  T if there is an
37a0: 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c   integer or real
37b0: 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
37c0: 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64  tation (blob and
37d0: 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74   NULL do not get
37e0: 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75 74 20   converted) but 
37f0: 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a  no string.    **
3800: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
3810: 20 20 49 74 20 77 6f 75 6c 64 20 62 65 20 68 61    It would be ha
3820: 72 6d 6c 65 73 73 20 74 6f 20 72 65 70 65 61 74  rmless to repeat
3830: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
3840: 69 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  if .    ** there
3850: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 73 74   is already a st
3860: 72 69 6e 67 20 72 65 70 2c 20 62 75 74 20 69 74  ring rep, but it
3870: 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 74 6f   is pointless to
3880: 20 77 61 73 74 65 20 74 68 6f 73 65 0a 20 20 20   waste those.   
3890: 20 2a 2a 20 43 50 55 20 63 79 63 6c 65 73 2e 20   ** CPU cycles. 
38a0: 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  */.    if( 0==(p
38b0: 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  Rec->flags&MEM_S
38c0: 74 72 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  tr) ){ /*OPTIMIZ
38d0: 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
38e0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65 63  .      if( (pRec
38f0: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61  ->flags&(MEM_Rea
3900: 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20  l|MEM_Int)) ){. 
3910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3920: 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70  beMemStringify(p
3930: 52 65 63 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20  Rec, enc, 1);.  
3940: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3950: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pRec->flags &= ~
3960: 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  (MEM_Real|MEM_In
3970: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
3980: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
3990: 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66 75  the type of a fu
39a0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  nction argument 
39b0: 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c 75  or a result colu
39c0: 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75 6d  mn.** into a num
39d0: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
39e0: 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65 72  ion.  Use either
39f0: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
3a00: 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69 73   whichever.** is
3a10: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20 42   appropriate.  B
3a20: 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20 63  ut only do the c
3a30: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74 20  onversion if it 
3a40: 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  is possible with
3a50: 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20 69  out.** loss of i
3a60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 72  nformation and r
3a70: 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73 65  eturn the revise
3a80: 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  d type of the ar
3a90: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
3aa0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
3ab0: 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69 74 65  eric_type(sqlite
3ac0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
3ad0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
3ae0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
3af0: 28 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 65 54  (pVal);.  if( eT
3b00: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
3b10: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
3b20: 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a  m = (Mem*)pVal;.
3b30: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
3b40: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 30  Affinity(pMem, 0
3b50: 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  );.    eType = s
3b60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
3b70: 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72  e(pVal);.  }.  r
3b80: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 0a  eturn eType;.}..
3b90: 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76  /*.** Exported v
3ba0: 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41  ersion of applyA
3bb0: 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20  ffinity(). This 
3bc0: 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c  one works on sql
3bd0: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a  ite3_value*, .**
3be0: 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61   not the interna
3bf0: 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a  l Mem* type..*/.
3c00: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75  void sqlite3Valu
3c10: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a  eApplyAffinity(.
3c20: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3c30: 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66  *pVal, .  u8 aff
3c40: 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63  inity, .  u8 enc
3c50: 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e  .){.  applyAffin
3c60: 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c  ity((Mem *)pVal,
3c70: 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b   affinity, enc);
3c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d 65 6d 20 63  .}../*.** pMem c
3c90: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 68 6f  urrently only ho
3ca0: 6c 64 73 20 61 20 73 74 72 69 6e 67 20 74 79 70  lds a string typ
3cb0: 65 20 28 6f 72 20 6d 61 79 62 65 20 61 20 42 4c  e (or maybe a BL
3cc0: 4f 42 20 74 68 61 74 20 77 65 20 63 61 6e 0a 2a  OB that we can.*
3cd0: 2a 20 69 6e 74 65 72 70 72 65 74 20 61 73 20 61  * interpret as a
3ce0: 20 73 74 72 69 6e 67 20 69 66 20 77 65 20 77 61   string if we wa
3cf0: 6e 74 20 74 6f 29 2e 20 20 43 6f 6d 70 75 74 65  nt to).  Compute
3d00: 20 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69   its correspondi
3d10: 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 63 20 74 79  ng.** numeric ty
3d20: 70 65 2c 20 69 66 20 68 61 73 20 6f 6e 65 2e 20  pe, if has one. 
3d30: 20 53 65 74 20 74 68 65 20 70 4d 65 6d 2d 3e 75   Set the pMem->u
3d40: 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e 69  .r and pMem->u.i
3d50: 20 66 69 65 6c 64 73 0a 2a 2a 20 61 63 63 6f 72   fields.** accor
3d60: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
3d70: 63 20 75 31 36 20 53 51 4c 49 54 45 5f 4e 4f 49  c u16 SQLITE_NOI
3d80: 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 65 4e 75 6d  NLINE computeNum
3d90: 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a 70 4d  ericType(Mem *pM
3da0: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28  em){.  assert( (
3db0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3dc0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
3dd0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
3de0: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
3df0: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
3e00: 6f 62 29 29 21 3d 30 20 29 3b 0a 20 20 45 78 70  ob))!=0 );.  Exp
3e10: 61 6e 64 42 6c 6f 62 28 70 4d 65 6d 29 3b 0a 20  andBlob(pMem);. 
3e20: 20 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 46   if( sqlite3AtoF
3e30: 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d  (pMem->z, &pMem-
3e40: 3e 75 2e 72 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70  >u.r, pMem->n, p
3e50: 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a  Mem->enc)==0 ){.
3e60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3e70: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
3e80: 74 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26  toi64(pMem->z, &
3e90: 70 4d 65 6d 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d  pMem->u.i, pMem-
3ea0: 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d  >n, pMem->enc)==
3eb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3ec0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 0a 20 20 72  MEM_Int;.  }.  r
3ed0: 65 74 75 72 6e 20 4d 45 4d 5f 52 65 61 6c 3b 0a  eturn MEM_Real;.
3ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3ef0: 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79 70 65  the numeric type
3f00: 20 66 6f 72 20 70 4d 65 6d 2c 20 65 69 74 68 65   for pMem, eithe
3f10: 72 20 4d 45 4d 5f 49 6e 74 20 6f 72 20 4d 45 4d  r MEM_Int or MEM
3f20: 5f 52 65 61 6c 20 6f 72 20 62 6f 74 68 20 6f 72  _Real or both or
3f30: 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a 2a 2a 0a 2a  .** none.  .**.*
3f40: 2a 20 55 6e 6c 69 6b 65 20 61 70 70 6c 79 4e 75  * Unlike applyNu
3f50: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 29 2c  mericAffinity(),
3f60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
3f70: 65 73 20 6e 6f 74 20 6d 6f 64 69 66 79 20 70 4d  es not modify pM
3f80: 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20 42 75  em->flags..** Bu
3f90: 74 20 69 74 20 64 6f 65 73 20 73 65 74 20 70 4d  t it does set pM
3fa0: 65 6d 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d  em->u.r and pMem
3fb0: 2d 3e 75 2e 69 20 61 70 70 72 6f 70 72 69 61 74  ->u.i appropriat
3fc0: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ely..*/.static u
3fd0: 31 36 20 6e 75 6d 65 72 69 63 54 79 70 65 28 4d  16 numericType(M
3fe0: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28  em *pMem){.  if(
3ff0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28   pMem->flags & (
4000: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
4010: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4020: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
4030: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
4040: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d  ;.  }.  if( pMem
4050: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
4060: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a  tr|MEM_Blob) ){.
4070: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75      return compu
4080: 74 65 4e 75 6d 65 72 69 63 54 79 70 65 28 70 4d  teNumericType(pM
4090: 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  em);.  }.  retur
40a0: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
40b0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
40c0: 2a 20 57 72 69 74 65 20 61 20 6e 69 63 65 20 73  * Write a nice s
40d0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
40e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74  tion of the cont
40f0: 65 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65  ents of cell pMe
4100: 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72  m.** into buffer
4110: 20 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42   zBuf, length nB
4120: 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  uf..*/.void sqli
4130: 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79  te3VdbeMemPretty
4140: 50 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c  Print(Mem *pMem,
4150: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
4160: 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75  char *zCsr = zBu
4170: 66 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65  f;.  int f = pMe
4180: 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61  m->flags;..  sta
4190: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
41a0: 63 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d  const encnames[]
41b0: 20 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22   = {"(X)", "(8)"
41c0: 2c 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36  , "(16LE)", "(16
41d0: 42 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26  BE)"};..  if( f&
41e0: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
41f0: 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
4200: 63 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d  c;.    if( f & M
4210: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
4220: 63 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61  c = 'z';.      a
4230: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
4240: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65  _Static|MEM_Ephe
4250: 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  m))==0 );.    }e
4260: 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f  lse if( f & MEM_
4270: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
4280: 63 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  c = 't';.      a
4290: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
42a0: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
42b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
42c0: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
42d0: 65 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  em ){.      c = 
42e0: 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'e';.      asser
42f0: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
4300: 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30  tic|MEM_Dyn))==0
4310: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
4320: 20 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20       c = 's';.  
4330: 20 20 7d 0a 20 20 20 20 2a 28 7a 43 73 72 2b 2b    }.    *(zCsr++
4340: 29 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c 69 74  ) = c;.    sqlit
4350: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
4360: 20 7a 43 73 72 2c 20 22 25 64 5b 22 2c 20 70 4d   zCsr, "%d[", pM
4370: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a 43 73 72  em->n);.    zCsr
4380: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
4390: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 66  n30(zCsr);.    f
43a0: 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20  or(i=0; i<16 && 
43b0: 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pMem->n; i++){
43c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
43d0: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
43e0: 72 2c 20 22 25 30 32 58 22 2c 20 28 28 69 6e 74  r, "%02X", ((int
43f0: 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78  )pMem->z[i] & 0x
4400: 46 46 29 29 3b 0a 20 20 20 20 20 20 7a 43 73 72  FF));.      zCsr
4410: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
4420: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d  n30(zCsr);.    }
4430: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4440: 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b  16 && i<pMem->n;
4450: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
4460: 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d  r z = pMem->z[i]
4470: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3c 33 32  ;.      if( z<32
4480: 20 7c 7c 20 7a 3e 31 32 36 20 29 20 2a 7a 43 73   || z>126 ) *zCs
4490: 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20  r++ = '.';.     
44a0: 20 65 6c 73 65 20 2a 7a 43 73 72 2b 2b 20 3d 20   else *zCsr++ = 
44b0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a  z;.    }.    *(z
44c0: 43 73 72 2b 2b 29 20 3d 20 27 5d 27 3b 0a 20 20  Csr++) = ']';.  
44d0: 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 5a 65    if( f & MEM_Ze
44e0: 72 6f 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ro ){.      sqli
44f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30  te3_snprintf(100
4500: 2c 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c 70 4d  , zCsr,"+%dz",pM
4510: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20  em->u.nZero);.  
4520: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
4530: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
4540: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  );.    }.    *zC
4550: 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c  sr = '\0';.  }el
4560: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
4570: 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c  tr ){.    int j,
4580: 20 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20   k;.    zBuf[0] 
4590: 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 66  = ' ';.    if( f
45a0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
45b0: 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a      zBuf[1] = 'z
45c0: 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ';.      assert(
45d0: 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69   (f & (MEM_Stati
45e0: 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30  c|MEM_Ephem))==0
45f0: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
4600: 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63  ( f & MEM_Static
4610: 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31   ){.      zBuf[1
4620: 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  ] = 't';.      a
4630: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
4640: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
4650: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
4660: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
4670: 65 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  em ){.      zBuf
4680: 5b 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20 20 20  [1] = 'e';.     
4690: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
46a0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79  EM_Static|MEM_Dy
46b0: 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  n))==0 );.    }e
46c0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  lse{.      zBuf[
46d0: 31 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a  1] = 's';.    }.
46e0: 20 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20 20 73      k = 2;.    s
46f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4700: 31 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c 20 22  100, &zBuf[k], "
4710: 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20  %d", pMem->n);. 
4720: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
4730: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
4740: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
4750: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f 72 28   = '[';.    for(
4760: 6a 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a 3c 70  j=0; j<15 && j<p
4770: 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Mem->n; j++){.  
4780: 20 20 20 20 75 38 20 63 20 3d 20 70 4d 65 6d 2d      u8 c = pMem-
4790: 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  >z[j];.      if(
47a0: 20 63 3e 3d 30 78 32 30 20 26 26 20 63 3c 30 78   c>=0x20 && c<0x
47b0: 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42  7f ){.        zB
47c0: 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  uf[k++] = c;.   
47d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
47e0: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e    zBuf[k++] = '.
47f0: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
4800: 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d  .    zBuf[k++] =
4810: 20 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   ']';.    sqlite
4820: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 26  3_snprintf(100,&
4830: 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65  zBuf[k], encname
4840: 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20  s[pMem->enc]);. 
4850: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
4860: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
4870: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
4880: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
4890: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
48a0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
48b0: 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  int the value of
48c0: 20 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20   a register for 
48d0: 74 72 61 63 69 6e 67 20 70 75 72 70 6f 73 65 73  tracing purposes
48e0: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  :.*/.static void
48f0: 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 4d   memTracePrint(M
4900: 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  em *p){.  if( p-
4910: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 55 6e 64  >flags & MEM_Und
4920: 65 66 69 6e 65 64 20 29 7b 0a 20 20 20 20 70 72  efined ){.    pr
4930: 69 6e 74 66 28 22 20 75 6e 64 65 66 69 6e 65 64  intf(" undefined
4940: 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
4950: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  p->flags & MEM_N
4960: 75 6c 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ull ){.    print
4970: 66 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  f(p->flags & MEM
4980: 5f 5a 65 72 6f 20 3f 20 22 20 4e 55 4c 4c 2d 6e  _Zero ? " NULL-n
4990: 6f 63 68 6e 67 22 20 3a 20 22 20 4e 55 4c 4c 22  ochng" : " NULL"
49a0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
49b0: 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  p->flags & (MEM_
49c0: 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28  Int|MEM_Str))==(
49d0: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
49e0: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
49f0: 20 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e   si:%lld", p->u.
4a00: 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  i);.  }else if( 
4a10: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  p->flags & MEM_I
4a20: 6e 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  nt ){.    printf
4a30: 28 22 20 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75  (" i:%lld", p->u
4a40: 2e 69 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  .i);.#ifndef SQL
4a50: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
4a60: 47 5f 50 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20  G_POINT.  }else 
4a70: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
4a80: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 70  EM_Real ){.    p
4a90: 72 69 6e 74 66 28 22 20 72 3a 25 67 22 2c 20 70  rintf(" r:%g", p
4aa0: 2d 3e 75 2e 72 29 3b 0a 23 65 6e 64 69 66 0a 20  ->u.r);.#endif. 
4ab0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
4ac0: 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65  e3VdbeMemIsRowSe
4ad0: 74 28 70 29 20 29 7b 0a 20 20 20 20 70 72 69 6e  t(p) ){.    prin
4ae0: 74 66 28 22 20 28 72 6f 77 73 65 74 29 22 29 3b  tf(" (rowset)");
4af0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
4b00: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
4b10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4b20: 50 72 65 74 74 79 50 72 69 6e 74 28 70 2c 20 7a  PrettyPrint(p, z
4b30: 42 75 66 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  Buf);.    printf
4b40: 28 22 20 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  (" %s", zBuf);. 
4b50: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67   }.  if( p->flag
4b60: 73 20 26 20 4d 45 4d 5f 53 75 62 74 79 70 65 20  s & MEM_Subtype 
4b70: 29 20 70 72 69 6e 74 66 28 22 20 73 75 62 74 79  ) printf(" subty
4b80: 70 65 3d 30 78 25 30 32 78 22 2c 20 70 2d 3e 65  pe=0x%02x", p->e
4b90: 53 75 62 74 79 70 65 29 3b 0a 7d 0a 73 74 61 74  Subtype);.}.stat
4ba0: 69 63 20 76 6f 69 64 20 72 65 67 69 73 74 65 72  ic void register
4bb0: 54 72 61 63 65 28 69 6e 74 20 69 52 65 67 2c 20  Trace(int iReg, 
4bc0: 4d 65 6d 20 2a 70 29 7b 0a 20 20 70 72 69 6e 74  Mem *p){.  print
4bd0: 66 28 22 52 45 47 5b 25 64 5d 20 3d 20 22 2c 20  f("REG[%d] = ", 
4be0: 69 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72 61 63  iReg);.  memTrac
4bf0: 65 50 72 69 6e 74 28 70 29 3b 0a 20 20 70 72 69  ePrint(p);.  pri
4c00: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 73 71 6c  ntf("\n");.  sql
4c10: 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d  ite3VdbeCheckMem
4c20: 49 6e 76 61 72 69 61 6e 74 73 28 70 29 3b 0a 7d  Invariants(p);.}
4c30: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
4c40: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23 20 20  SQLITE_DEBUG.#  
4c50: 64 65 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f  define REGISTER_
4c60: 54 52 41 43 45 28 52 2c 4d 29 20 69 66 28 64 62  TRACE(R,M) if(db
4c70: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 56  ->flags&SQLITE_V
4c80: 64 62 65 54 72 61 63 65 29 72 65 67 69 73 74 65  dbeTrace)registe
4c90: 72 54 72 61 63 65 28 52 2c 4d 29 0a 23 65 6c 73  rTrace(R,M).#els
4ca0: 65 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47 49  e.#  define REGI
4cb0: 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 0a  STER_TRACE(R,M).
4cc0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
4cd0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a  VDBE_PROFILE../*
4ce0: 20 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f   .** hwtime.h co
4cf0: 6e 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73  ntains inline as
4d00: 73 65 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f 72  sembler code for
4d10: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a   implementing .*
4d20: 2a 20 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e  * high-performan
4d30: 63 65 20 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e  ce timing routin
4d40: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
4d50: 22 68 77 74 69 6d 65 2e 68 22 0a 0a 23 65 6e 64  "hwtime.h"..#end
4d60: 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  if..#ifndef NDEB
4d70: 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  UG./*.** This fu
4d80: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
4d90: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
4da0: 6e 20 61 6e 20 61 73 73 65 72 74 28 29 20 65 78  n an assert() ex
4db0: 70 72 65 73 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20  pression. It.** 
4dc0: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
4dd0: 73 71 6c 69 74 65 33 2e 6e 54 72 61 6e 73 61 63  sqlite3.nTransac
4de0: 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73  tion variable is
4df0: 20 63 6f 72 72 65 63 74 6c 79 20 73 65 74 20 74   correctly set t
4e00: 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  o.** the number 
4e10: 6f 66 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69  of non-transacti
4e20: 6f 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 63 75  on savepoints cu
4e30: 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 0a  rrently in the .
4e40: 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  ** linked list s
4e50: 74 61 72 74 69 6e 67 20 61 74 20 73 71 6c 69 74  tarting at sqlit
4e60: 65 33 2e 70 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  e3.pSavepoint..*
4e70: 2a 20 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  * .** Usage:.**.
4e80: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 63  **     assert( c
4e90: 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75  heckSavepointCou
4ea0: 6e 74 28 64 62 29 20 29 3b 0a 2a 2f 0a 73 74 61  nt(db) );.*/.sta
4eb0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 53 61 76  tic int checkSav
4ec0: 65 70 6f 69 6e 74 43 6f 75 6e 74 28 73 71 6c 69  epointCount(sqli
4ed0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
4ee0: 6e 20 3d 20 30 3b 0a 20 20 53 61 76 65 70 6f 69  n = 0;.  Savepoi
4ef0: 6e 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 64  nt *p;.  for(p=d
4f00: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 70  b->pSavepoint; p
4f10: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 20 6e 2b  ; p=p->pNext) n+
4f20: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  +;.  assert( n==
4f30: 28 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  (db->nSavepoint 
4f40: 2b 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74  + db->isTransact
4f50: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ionSavepoint) );
4f60: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
4f70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
4f80: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
4f90: 20 6f 66 20 70 4f 70 2d 3e 70 32 20 61 66 74 65   of pOp->p2 afte
4fa0: 72 20 66 69 72 73 74 20 70 72 65 70 61 72 69 6e  r first preparin
4fb0: 67 20 69 74 20 74 6f 20 62 65 0a 2a 2a 20 6f 76  g it to be.** ov
4fc0: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 61  erwritten with a
4fd0: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  n integer value.
4fe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
4ff0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 4d 65 6d 20 2a  E_NOINLINE Mem *
5000: 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 57 69  out2PrereleaseWi
5010: 74 68 43 6c 65 61 72 28 4d 65 6d 20 2a 70 4f 75  thClear(Mem *pOu
5020: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t){.  sqlite3Vdb
5030: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
5040: 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  );.  pOut->flags
5050: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 72 65   = MEM_Int;.  re
5060: 74 75 72 6e 20 70 4f 75 74 3b 0a 7d 0a 73 74 61  turn pOut;.}.sta
5070: 74 69 63 20 4d 65 6d 20 2a 6f 75 74 32 50 72 65  tic Mem *out2Pre
5080: 72 65 6c 65 61 73 65 28 56 64 62 65 20 2a 70 2c  release(Vdbe *p,
5090: 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a 20   VdbeOp *pOp){. 
50a0: 20 4d 65 6d 20 2a 70 4f 75 74 3b 0a 20 20 61 73   Mem *pOut;.  as
50b0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
50c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
50d0: 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p2<=(p->nMem+1
50e0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
50f0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  ;.  pOut = &p->a
5100: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
5110: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
5120: 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 69 66 28  (p, pOut);.  if(
5130: 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28   VdbeMemDynamic(
5140: 70 4f 75 74 29 20 29 7b 20 2f 2a 4f 50 54 49 4d  pOut) ){ /*OPTIM
5150: 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45  IZATION-IF-FALSE
5160: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 75  */.    return ou
5170: 74 32 50 72 65 72 65 6c 65 61 73 65 57 69 74 68  t2PrereleaseWith
5180: 43 6c 65 61 72 28 70 4f 75 74 29 3b 0a 20 20 7d  Clear(pOut);.  }
5190: 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  else{.    pOut->
51a0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
51b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4f 75 74  .    return pOut
51c0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
51d0: 45 78 65 63 75 74 65 20 61 73 20 6d 75 63 68 20  Execute as much 
51e0: 6f 66 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  of a VDBE progra
51f0: 6d 20 61 73 20 77 65 20 63 61 6e 2e 0a 2a 2a 20  m as we can..** 
5200: 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 72 65  This is the core
5210: 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 74 65 70   of sqlite3_step
5220: 28 29 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ().  .*/.int sql
5230: 69 74 65 33 56 64 62 65 45 78 65 63 28 0a 20 20  ite3VdbeExec(.  
5240: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
5250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5260: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 4f  e VDBE */.){.  O
5270: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
5280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
5290: 79 20 6f 66 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20  y of p->aOp */. 
52a0: 20 4f 70 20 2a 70 4f 70 20 3d 20 61 4f 70 3b 20   Op *pOp = aOp; 
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
52c0: 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e  urrent operation
52d0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
52e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
52f0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
5300: 4f 46 49 4c 45 29 0a 20 20 4f 70 20 2a 70 4f 72  OFILE).  Op *pOr
5310: 69 67 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  igOp;           
5320: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
5330: 70 4f 70 20 61 74 20 74 68 65 20 74 6f 70 20 6f  pOp at the top o
5340: 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 23 65  f the loop */.#e
5350: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
5360: 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  TE_DEBUG.  int n
5370: 45 78 74 72 61 44 65 6c 65 74 65 20 3d 20 30 3b  ExtraDelete = 0;
5380: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 69 65        /* Verifie
5390: 73 20 46 4f 52 44 45 4c 45 54 45 20 61 6e 64 20  s FORDELETE and 
53a0: 41 55 58 44 45 4c 45 54 45 20 66 6c 61 67 73 20  AUXDELETE flags 
53b0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
53c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
53d0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
53e0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
53f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
5400: 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  db;       /* The
5410: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
5420: 38 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46  8 resetSchemaOnF
5430: 61 75 6c 74 20 3d 20 30 3b 20 2f 2a 20 52 65 73  ault = 0; /* Res
5440: 65 74 20 73 63 68 65 6d 61 20 61 66 74 65 72 20  et schema after 
5450: 61 6e 20 65 72 72 6f 72 20 69 66 20 70 6f 73 69  an error if posi
5460: 74 69 76 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63  tive */.  u8 enc
5470: 6f 64 69 6e 67 20 3d 20 45 4e 43 28 64 62 29 3b  oding = ENC(db);
5480: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
5490: 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  base encoding */
54a0: 0a 20 20 69 6e 74 20 69 43 6f 6d 70 61 72 65 20  .  int iCompare 
54b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
54c0: 20 52 65 73 75 6c 74 20 6f 66 20 6c 61 73 74 20   Result of last 
54d0: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
54e0: 75 6e 73 69 67 6e 65 64 20 6e 56 6d 53 74 65 70  unsigned nVmStep
54f0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
5500: 6d 62 65 72 20 6f 66 20 76 69 72 74 75 61 6c 20  mber of virtual 
5510: 6d 61 63 68 69 6e 65 20 73 74 65 70 73 20 2a 2f  machine steps */
5520: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5530: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
5540: 4c 4c 42 41 43 4b 0a 20 20 75 6e 73 69 67 6e 65  LLBACK.  unsigne
5550: 64 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74  d nProgressLimit
5560: 3b 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 78 50  ;   /* Invoke xP
5570: 72 6f 67 72 65 73 73 28 29 20 77 68 65 6e 20 6e  rogress() when n
5580: 56 6d 53 74 65 70 20 72 65 61 63 68 65 73 20 74  VmStep reaches t
5590: 68 69 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  his */.#endif.  
55a0: 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61  Mem *aMem = p->a
55b0: 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  Mem;       /* Co
55c0: 70 79 20 6f 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f  py of p->aMem */
55d0: 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d 20 30  .  Mem *pIn1 = 0
55e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
55f0: 20 31 73 74 20 69 6e 70 75 74 20 6f 70 65 72 61   1st input opera
5600: 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e  nd */.  Mem *pIn
5610: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
5620: 20 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75 74 20     /* 2nd input 
5630: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d  operand */.  Mem
5640: 20 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20 20 20   *pIn3 = 0;     
5650: 20 20 20 20 20 20 20 20 2f 2a 20 33 72 64 20 69          /* 3rd i
5660: 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  nput operand */.
5670: 20 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20 30 3b    Mem *pOut = 0;
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5690: 4f 75 74 70 75 74 20 6f 70 65 72 61 6e 64 20 2a  Output operand *
56a0: 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
56b0: 4f 46 49 4c 45 0a 20 20 75 36 34 20 73 74 61 72  OFILE.  u64 star
56c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
56d0: 20 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63 6b 20     /* CPU clock 
56e0: 63 6f 75 6e 74 20 61 74 20 73 74 61 72 74 20 6f  count at start o
56f0: 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 23 65 6e 64  f opcode */.#end
5700: 69 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45 52 54  if.  /*** INSERT
5710: 20 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52   STACK UNION HER
5720: 45 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65 72 74  E ***/..  assert
5730: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5740: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 20 20 2f  _MAGIC_RUN );  /
5750: 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  * sqlite3_step()
5760: 20 76 65 72 69 66 69 65 73 20 74 68 69 73 20 2a   verifies this *
5770: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  /.  sqlite3VdbeE
5780: 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
5790: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
57a0: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
57b0: 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65   if( db->xProgre
57c0: 73 73 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  ss ){.    u32 iP
57d0: 72 69 6f 72 20 3d 20 70 2d 3e 61 43 6f 75 6e 74  rior = p->aCount
57e0: 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  er[SQLITE_STMTST
57f0: 41 54 55 53 5f 56 4d 5f 53 54 45 50 5d 3b 0a 20  ATUS_VM_STEP];. 
5800: 20 20 20 61 73 73 65 72 74 28 20 30 20 3c 20 64     assert( 0 < d
5810: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
5820: 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73 73  );.    nProgress
5830: 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 6e 50 72 6f  Limit = db->nPro
5840: 67 72 65 73 73 4f 70 73 20 2d 20 28 69 50 72 69  gressOps - (iPri
5850: 6f 72 20 25 20 64 62 2d 3e 6e 50 72 6f 67 72 65  or % db->nProgre
5860: 73 73 4f 70 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  ssOps);.  }else{
5870: 0a 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c 69  .    nProgressLi
5880: 6d 69 74 20 3d 20 30 78 66 66 66 66 66 66 66 66  mit = 0xffffffff
5890: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
58a0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
58b0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a  _NOMEM ){.    /*
58c0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
58d0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69   a malloc() insi
58e0: 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  de a call to sql
58f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
5900: 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  () or.    ** sql
5910: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
5920: 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f  16() failed.  */
5930: 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  .    goto no_mem
5940: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5950: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
5960: 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29   || (p->rc&0xff)
5970: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  ==SQLITE_BUSY );
5980: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
5990: 73 52 65 61 64 65 72 20 7c 7c 20 70 2d 3e 72 65  sReader || p->re
59a0: 61 64 4f 6e 6c 79 21 3d 30 20 29 3b 0a 20 20 70  adOnly!=0 );.  p
59b0: 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d  ->iCurrentTime =
59c0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
59d0: 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20  >explain==0 );. 
59e0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
59f0: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61   0;.  db->busyHa
5a00: 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
5a10: 0a 20 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73  .  if( db->u1.is
5a20: 49 6e 74 65 72 72 75 70 74 65 64 20 29 20 67 6f  Interrupted ) go
5a30: 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
5a40: 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 73 71 6c  interrupt;.  sql
5a50: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
5a60: 71 6c 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ql(p);.#ifdef SQ
5a70: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c  LITE_DEBUG.  sql
5a80: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
5a90: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 70  alloc();.  if( p
5aa0: 2d 3e 70 63 3d 3d 30 0a 20 20 20 26 26 20 28 70  ->pc==0.   && (p
5ab0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 28 53  ->db->flags & (S
5ac0: 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e  QLITE_VdbeListin
5ad0: 67 7c 53 51 4c 49 54 45 5f 56 64 62 65 45 51 50  g|SQLITE_VdbeEQP
5ae0: 7c 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63  |SQLITE_VdbeTrac
5af0: 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  e))!=0.  ){.    
5b00: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6f  int i;.    int o
5b10: 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  nce = 1;.    sql
5b20: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
5b30: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
5b40: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5b50: 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 20 29  TE_VdbeListing )
5b60: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
5b70: 56 44 42 45 20 50 72 6f 67 72 61 6d 20 4c 69 73  VDBE Program Lis
5b80: 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 20  ting:\n");.     
5b90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5ba0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
5bb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
5bc0: 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69 2c 20  ntOp(stdout, i, 
5bd0: 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  &aOp[i]);.      
5be0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
5bf0: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
5c00: 51 4c 49 54 45 5f 56 64 62 65 45 51 50 20 29 7b  QLITE_VdbeEQP ){
5c10: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5c20: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
5c30: 20 20 20 20 20 20 20 20 69 66 28 20 61 4f 70 5b          if( aOp[
5c40: 69 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78  i].opcode==OP_Ex
5c50: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
5c60: 20 20 20 69 66 28 20 6f 6e 63 65 20 29 20 70 72     if( once ) pr
5c70: 69 6e 74 66 28 22 56 44 42 45 20 51 75 65 72 79  intf("VDBE Query
5c80: 20 50 6c 61 6e 3a 5c 6e 22 29 3b 0a 20 20 20 20   Plan:\n");.    
5c90: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
5ca0: 5c 6e 22 2c 20 61 4f 70 5b 69 5d 2e 70 34 2e 7a  \n", aOp[i].p4.z
5cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
5cc0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
5cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5ce0: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
5cf0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
5d00: 65 54 72 61 63 65 20 29 20 20 70 72 69 6e 74 66  eTrace )  printf
5d10: 28 22 56 44 42 45 20 54 72 61 63 65 3a 5c 6e 22  ("VDBE Trace:\n"
5d20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
5d30: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
5d40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28  );.#endif.  for(
5d50: 70 4f 70 3d 26 61 4f 70 5b 70 2d 3e 70 63 5d 3b  pOp=&aOp[p->pc];
5d60: 20 31 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20   1; pOp++){.    
5d70: 2f 2a 20 45 72 72 6f 72 73 20 61 72 65 20 64 65  /* Errors are de
5d80: 74 65 63 74 65 64 20 62 79 20 69 6e 64 69 76 69  tected by indivi
5d90: 64 75 61 6c 20 6f 70 63 6f 64 65 73 2c 20 77 69  dual opcodes, wi
5da0: 74 68 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 0a  th an immediate.
5db0: 20 20 20 20 2a 2a 20 6a 75 6d 70 73 20 74 6f 20      ** jumps to 
5dc0: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
5dd0: 6f 72 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  or. */.    asser
5de0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
5df0: 20 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   );..    assert(
5e00: 20 70 4f 70 3e 3d 61 4f 70 20 26 26 20 70 4f 70   pOp>=aOp && pOp
5e10: 3c 26 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 29 3b 0a  <&aOp[p->nOp]);.
5e20: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
5e30: 49 4c 45 0a 20 20 20 20 73 74 61 72 74 20 3d 20  ILE.    start = 
5e40: 73 71 6c 69 74 65 33 4e 50 72 6f 66 69 6c 65 43  sqlite3NProfileC
5e50: 6e 74 20 3f 20 73 71 6c 69 74 65 33 4e 50 72 6f  nt ? sqlite3NPro
5e60: 66 69 6c 65 43 6e 74 20 3a 20 73 71 6c 69 74 65  fileCnt : sqlite
5e70: 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69  3Hwtime();.#endi
5e80: 66 0a 20 20 20 20 6e 56 6d 53 74 65 70 2b 2b 3b  f.    nVmStep++;
5e90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5ea0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
5eb0: 54 41 54 55 53 0a 20 20 20 20 69 66 28 20 70 2d  TATUS.    if( p-
5ec0: 3e 61 6e 45 78 65 63 20 29 20 70 2d 3e 61 6e 45  >anExec ) p->anE
5ed0: 78 65 63 5b 28 69 6e 74 29 28 70 4f 70 2d 61 4f  xec[(int)(pOp-aO
5ee0: 70 29 5d 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  p)]++;.#endif.. 
5ef0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77     /* Only allow
5f00: 20 74 72 61 63 69 6e 67 20 69 66 20 53 51 4c 49   tracing if SQLI
5f10: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
5f20: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64  ned..    */.#ifd
5f30: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5f40: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
5f50: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
5f60: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71  race ){.      sq
5f70: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
5f80: 28 73 74 64 6f 75 74 2c 20 28 69 6e 74 29 28 70  (stdout, (int)(p
5f90: 4f 70 20 2d 20 61 4f 70 29 2c 20 70 4f 70 29 3b  Op - aOp), pOp);
5fa0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
5fb0: 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65      ..    /* Che
5fc0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
5fd0: 6e 65 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65  need to simulate
5fe0: 20 61 6e 20 69 6e 74 65 72 72 75 70 74 2e 20 20   an interrupt.  
5ff0: 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
6000: 73 0a 20 20 20 20 2a 2a 20 69 66 20 77 65 20 68  s.    ** if we h
6010: 61 76 65 20 61 20 73 70 65 63 69 61 6c 20 74 65  ave a special te
6020: 73 74 20 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f  st build..    */
6030: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
6040: 45 53 54 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EST.    if( sqli
6050: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
6060: 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  unt>0 ){.      s
6070: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
6080: 5f 63 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20  _count--;.      
6090: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  if( sqlite3_inte
60a0: 72 72 75 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29  rrupt_count==0 )
60b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
60c0: 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b  3_interrupt(db);
60d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
60e0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 61  endif..    /* Sa
60f0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
6100: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 73 20   other operands 
6110: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
6120: 5f 44 45 42 55 47 0a 20 20 20 20 7b 0a 20 20 20  _DEBUG.    {.   
6130: 20 20 20 75 38 20 6f 70 50 72 6f 70 65 72 74 79     u8 opProperty
6140: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
6150: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
6160: 63 6f 64 65 5d 3b 0a 20 20 20 20 20 20 69 66 28  code];.      if(
6170: 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f   (opProperty & O
6180: 50 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29 7b 0a  PFLG_IN1)!=0 ){.
6190: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
61a0: 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 20  pOp->p1>0 );.   
61b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
61c0: 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p1<=(p->nMem+1
61d0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
61e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
61f0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
6200: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a  em[pOp->p1]) );.
6210: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6220: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
6230: 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61  MemInvariants(&a
6240: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b  Mem[pOp->p1]) );
6250: 0a 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45  .        REGISTE
6260: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c  R_TRACE(pOp->p1,
6270: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29   &aMem[pOp->p1])
6280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6290: 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20  if( (opProperty 
62a0: 26 20 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20  & OPFLG_IN2)!=0 
62b0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
62c0: 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
62d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
62e0: 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p2<=(p->nMe
62f0: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
6300: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
6310: 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
6320: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20  &aMem[pOp->p2]) 
6330: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
6340: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  t( sqlite3VdbeCh
6350: 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73  eckMemInvariants
6360: 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29  (&aMem[pOp->p2])
6370: 20 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49   );.        REGI
6380: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
6390: 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  p2, &aMem[pOp->p
63a0: 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
63b0: 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72     if( (opProper
63c0: 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29 21  ty & OPFLG_IN3)!
63d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
63e0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
63f0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
6400: 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  t( pOp->p3<=(p->
6410: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
6420: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
6430: 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
6440: 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  id(&aMem[pOp->p3
6450: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ]) );.        as
6460: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
6470: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
6480: 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  nts(&aMem[pOp->p
6490: 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 52  3]) );.        R
64a0: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
64b0: 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f 70  p->p3, &aMem[pOp
64c0: 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ->p3]);.      }.
64d0: 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f        if( (opPro
64e0: 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55  perty & OPFLG_OU
64f0: 54 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  T2)!=0 ){.      
6500: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
6510: 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  2>0 );.        a
6520: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d  ssert( pOp->p2<=
6530: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
6540: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
6550: 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
6560: 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f  ange(p, &aMem[pO
6570: 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d  p->p2]);.      }
6580: 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72  .      if( (opPr
6590: 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f  operty & OPFLG_O
65a0: 55 54 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  UT3)!=0 ){.     
65b0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
65c0: 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  p3>0 );.        
65d0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
65e0: 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
65f0: 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20  >nCursor) );.   
6600: 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43       memAboutToC
6610: 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70  hange(p, &aMem[p
6620: 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20  Op->p3]);.      
6630: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  }.    }.#endif.#
6640: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6650: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
6660: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
6670: 29 0a 20 20 20 20 70 4f 72 69 67 4f 70 20 3d 20  ).    pOrigOp = 
6680: 70 4f 70 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20  pOp;.#endif.  . 
6690: 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e     switch( pOp->
66a0: 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a  opcode ){../****
66b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61  *********.** Wha
6700: 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20 6d  t follows is a m
6710: 61 73 73 69 76 65 20 73 77 69 74 63 68 20 73 74  assive switch st
6720: 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65 61  atement where ea
6730: 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65 6e  ch case implemen
6740: 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  ts a.** separate
6750: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
6760: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
6770: 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c 6c  ine.  If we foll
6780: 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  ow the usual.** 
6790: 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 76  indentation conv
67a0: 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63 61  entions, each ca
67b0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64  se should be ind
67c0: 65 6e 74 65 64 20 62 79 20 36 20 73 70 61 63 65  ented by 6 space
67d0: 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20  s.  But.** that 
67e0: 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73 74  is a lot of wast
67f0: 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ed space on the 
6800: 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53 6f  left margin.  So
6810: 20 74 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   the code within
6820: 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20 73  .** the switch s
6830: 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62 72  tatement will br
6840: 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e 74  eak with convent
6850: 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73 68  ion and be flush
6860: 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a 2a  -left. Another.*
6870: 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28 73  * big comment (s
6880: 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20 6f  imilar to this o
6890: 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74 68  ne) will mark th
68a0: 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  e point in the c
68b0: 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65 20  ode where.** we 
68c0: 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20  transition back 
68d0: 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74  to normal indent
68e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
68f0: 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65   formatting of e
6900: 61 63 68 20 63 61 73 65 20 69 73 20 69 6d 70 6f  ach case is impo
6910: 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b 65  rtant.  The make
6920: 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65 0a  file for SQLite.
6930: 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ** generates two
6940: 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64 65   C files "opcode
6950: 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64 65  s.h" and "opcode
6960: 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e 67  s.c" by scanning
6970: 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f   this.** file lo
6980: 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73 20  oking for lines 
6990: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
69a0: 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68 65  "case OP_".  The
69b0: 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65 73   opcodes.h files
69c0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c 6c  .** will be fill
69d0: 65 64 20 77 69 74 68 20 23 64 65 66 69 6e 65 73  ed with #defines
69e0: 20 74 68 61 74 20 67 69 76 65 20 75 6e 69 71 75   that give uniqu
69f0: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
6a00: 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63 6f   to each.** opco
6a10: 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64  de and the opcod
6a20: 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69 6c  es.c file is fil
6a30: 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72 72 61  led with an arra
6a40: 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68 65  y of strings whe
6a50: 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69 6e  re.** each strin
6a60: 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69  g is the symboli
6a70: 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  c name for the c
6a80: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63  orresponding opc
6a90: 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ode.  If the.** 
6aa0: 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20 69  case statement i
6ab0: 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  s followed by a 
6ac0: 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  comment of the f
6ad0: 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73 20  orm "/# same as 
6ae0: 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74 20  ... #/".** that 
6af0: 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64 20  comment is used 
6b00: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
6b10: 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
6b20: 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e  e of the opcode.
6b30: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65 79  .**.** Other key
6b40: 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f 6d  words in the com
6b50: 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ment that follow
6b60: 73 20 65 61 63 68 20 63 61 73 65 20 61 72 65 20  s each case are 
6b70: 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74  used to.** const
6b80: 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f 49  ruct the OPFLG_I
6b90: 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75 65  NITIALIZER value
6ba0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
6bb0: 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74 79  s opcodeProperty
6bc0: 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73 20  []..** Keywords 
6bd0: 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69 6e  include: in1, in
6be0: 32 2c 20 69 6e 33 2c 20 6f 75 74 32 2c 20 6f 75  2, in3, out2, ou
6bf0: 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20  t3.  See.** the 
6c00: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
6c10: 72 69 70 74 20 66 6f 72 20 61 64 64 69 74 69 6f  ript for additio
6c20: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
6c30: 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74 61  .**.** Documenta
6c40: 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42 45 20  tion about VDBE 
6c50: 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e 65 72  opcodes is gener
6c60: 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67  ated by scanning
6c70: 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66 6f   this file.** fo
6c80: 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61 74 20  r lines of that 
6c90: 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65 3a  contain "Opcode:
6ca0: 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20 61 6e  ".  That line an
6cb0: 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
6cc0: 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65  .** comment line
6cd0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
6ce0: 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20  e generation of 
6cf0: 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c 20  the opcode.html 
6d00: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  documentation.**
6d10: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d   file..**.** SUM
6d20: 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  MARY:.**.**     
6d30: 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20 69 6d  Formatting is im
6d40: 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72 69 70  portant to scrip
6d50: 74 73 20 74 68 61 74 20 73 63 61 6e 20 74 68 69  ts that scan thi
6d60: 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 44  s file..**     D
6d70: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
6d80: 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74 69 6e  om the formattin
6d90: 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e 74 6c  g style currentl
6da0: 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a  y in use..**.***
6db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20  **********/../* 
6e00: 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20  Opcode:  Goto * 
6e10: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  P2 * * *.**.** A
6e20: 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  n unconditional 
6e30: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
6e40: 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  P2..** The next 
6e50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78 65 63  instruction exec
6e60: 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  uted will be .**
6e70: 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e 64 65   the one at inde
6e80: 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20 62 65  x P2 from the be
6e90: 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
6ea0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
6eb0: 20 54 68 65 20 50 31 20 70 61 72 61 6d 65 74 65   The P1 paramete
6ec0: 72 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  r is not actuall
6ed0: 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f  y used by this o
6ee0: 70 63 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  pcode.  However,
6ef0: 20 69 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 69   it.** is someti
6f00: 6d 65 73 20 73 65 74 20 74 6f 20 31 20 69 6e 73  mes set to 1 ins
6f10: 74 65 61 64 20 6f 66 20 30 20 61 73 20 61 20 68  tead of 0 as a h
6f20: 69 6e 74 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61  int to the comma
6f30: 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 0a 2a 2a  nd-line shell.**
6f40: 20 74 68 61 74 20 74 68 69 73 20 47 6f 74 6f 20   that this Goto 
6f50: 69 73 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  is the bottom of
6f60: 20 61 20 6c 6f 6f 70 20 61 6e 64 20 74 68 61 74   a loop and that
6f70: 20 74 68 65 20 6c 69 6e 65 73 20 66 72 6f 6d 20   the lines from 
6f80: 50 32 20 64 6f 77 6e 0a 2a 2a 20 74 6f 20 74 68  P2 down.** to th
6f90: 65 20 63 75 72 72 65 6e 74 20 6c 69 6e 65 20 73  e current line s
6fa0: 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65  hould be indente
6fb0: 64 20 66 6f 72 20 45 58 50 4c 41 49 4e 20 6f 75  d for EXPLAIN ou
6fc0: 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tput..*/.case OP
6fd0: 5f 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20 20 20  _Goto: {        
6fe0: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
6ff0: 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63  jump_to_p2_and_c
7000: 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
7010: 70 74 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70  pt:.  pOp = &aOp
7020: 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 0a  [pOp->p2 - 1];..
7030: 20 20 2f 2a 20 4f 70 63 6f 64 65 73 20 74 68 61    /* Opcodes tha
7040: 74 20 61 72 65 20 75 73 65 64 20 61 73 20 74 68  t are used as th
7050: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c 6f  e bottom of a lo
7060: 6f 70 20 28 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f  op (OP_Next, OP_
7070: 50 72 65 76 2c 0a 20 20 2a 2a 20 4f 50 5f 56 4e  Prev,.  ** OP_VN
7080: 65 78 74 2c 20 6f 72 20 4f 50 5f 53 6f 72 74 65  ext, or OP_Sorte
7090: 72 4e 65 78 74 29 20 61 6c 6c 20 6a 75 6d 70 20  rNext) all jump 
70a0: 68 65 72 65 20 75 70 6f 6e 0a 20 20 2a 2a 20 63  here upon.  ** c
70b0: 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 43 68 65 63  ompletion.  Chec
70c0: 6b 20 74 6f 20 73 65 65 20 69 66 20 73 71 6c 69  k to see if sqli
70d0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20  te3_interrupt() 
70e0: 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
70f0: 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70    ** or if the p
7100: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
7110: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 76   needs to be inv
7120: 6f 6b 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  oked. .  **.  **
7130: 20 54 68 69 73 20 63 6f 64 65 20 75 73 65 73 20   This code uses 
7140: 75 6e 73 74 72 75 63 74 75 72 65 64 20 22 67 6f  unstructured "go
7150: 74 6f 22 20 73 74 61 74 65 6d 65 6e 74 73 20 61  to" statements a
7160: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  nd does not look
7170: 20 63 6c 65 61 6e 2e 0a 20 20 2a 2a 20 42 75 74   clean..  ** But
7180: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 64 75 65   that is not due
7190: 20 74 6f 20 73 6c 6f 70 70 79 20 63 6f 64 69 6e   to sloppy codin
71a0: 67 20 68 61 62 69 74 73 2e 20 54 68 65 20 63 6f  g habits. The co
71b0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 68  de is written th
71c0: 69 73 0a 20 20 2a 2a 20 77 61 79 20 66 6f 72 20  is.  ** way for 
71d0: 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 74 6f 20  performance, to 
71e0: 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20  avoid having to 
71f0: 72 75 6e 20 74 68 65 20 69 6e 74 65 72 72 75 70  run the interrup
7200: 74 20 61 6e 64 20 70 72 6f 67 72 65 73 73 0a 20  t and progress. 
7210: 20 2a 2a 20 63 68 65 63 6b 73 20 6f 6e 20 65 76   ** checks on ev
7220: 65 72 79 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  ery opcode.  Thi
7230: 73 20 68 65 6c 70 73 20 73 71 6c 69 74 65 33 5f  s helps sqlite3_
7240: 73 74 65 70 28 29 20 74 6f 20 72 75 6e 20 61 62  step() to run ab
7250: 6f 75 74 20 31 2e 35 25 0a 20 20 2a 2a 20 66 61  out 1.5%.  ** fa
7260: 73 74 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  ster according t
7270: 6f 20 22 76 61 6c 67 72 69 6e 64 20 2d 2d 74 6f  o "valgrind --to
7280: 6f 6c 3d 63 61 63 68 65 67 72 69 6e 64 22 20 2a  ol=cachegrind" *
7290: 2f 0a 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65  /.check_for_inte
72a0: 72 72 75 70 74 3a 0a 20 20 69 66 28 20 64 62 2d  rrupt:.  if( db-
72b0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
72c0: 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  d ) goto abort_d
72d0: 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b  ue_to_interrupt;
72e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
72f0: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
7300: 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 43 61 6c 6c  LLBACK.  /* Call
7310: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
7320: 6c 6c 62 61 63 6b 20 69 66 20 69 74 20 69 73 20  llback if it is 
7330: 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 74  configured and t
7340: 68 65 20 72 65 71 75 69 72 65 64 20 6e 75 6d 62  he required numb
7350: 65 72 0a 20 20 2a 2a 20 6f 66 20 56 44 42 45 20  er.  ** of VDBE 
7360: 6f 70 73 20 68 61 76 65 20 62 65 65 6e 20 65 78  ops have been ex
7370: 65 63 75 74 65 64 20 28 65 69 74 68 65 72 20 73  ecuted (either s
7380: 69 6e 63 65 20 74 68 69 73 20 69 6e 76 6f 63 61  ince this invoca
7390: 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 73 71 6c  tion of.  ** sql
73a0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20 6f  ite3VdbeExec() o
73b0: 72 20 73 69 6e 63 65 20 6c 61 73 74 20 74 69 6d  r since last tim
73c0: 65 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  e the progress c
73d0: 61 6c 6c 62 61 63 6b 20 77 61 73 20 63 61 6c 6c  allback was call
73e0: 65 64 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ed)..  ** If the
73f0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
7400: 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
7410: 65 72 6f 2c 20 65 78 69 74 20 74 68 65 20 76 69  ero, exit the vi
7420: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 77 69  rtual machine wi
7430: 74 68 0a 20 20 2a 2a 20 61 20 72 65 74 75 72 6e  th.  ** a return
7440: 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 41 42 4f   code SQLITE_ABO
7450: 52 54 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  RT..  */.  while
7460: 28 20 6e 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67  ( nVmStep>=nProg
7470: 72 65 73 73 4c 69 6d 69 74 20 26 26 20 64 62 2d  ressLimit && db-
7480: 3e 78 50 72 6f 67 72 65 73 73 21 3d 30 20 29 7b  >xProgress!=0 ){
7490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
74a0: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 21 3d 30  >nProgressOps!=0
74b0: 20 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73   );.    nProgres
74c0: 73 4c 69 6d 69 74 20 2b 3d 20 64 62 2d 3e 6e 50  sLimit += db->nP
74d0: 72 6f 67 72 65 73 73 4f 70 73 3b 0a 20 20 20 20  rogressOps;.    
74e0: 69 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65 73  if( db->xProgres
74f0: 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41  s(db->pProgressA
7500: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  rg) ){.      nPr
7510: 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 30 78  ogressLimit = 0x
7520: 66 66 66 66 66 66 66 66 3b 0a 20 20 20 20 20 20  ffffffff;.      
7530: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
7540: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  RRUPT;.      got
7550: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
7560: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7570: 23 65 6e 64 69 66 0a 20 20 0a 20 20 62 72 65 61  #endif.  .  brea
7580: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
7590: 20 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a 20    Gosub P1 P2 * 
75a0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  * *.**.** Write 
75b0: 74 68 65 20 63 75 72 72 65 6e 74 20 61 64 64 72  the current addr
75c0: 65 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74 65  ess onto registe
75d0: 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65 6e  r P1.** and then
75e0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
75f0: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
7600: 47 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20 20  Gosub: {        
7610: 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
7620: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
7630: 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28  >0 && pOp->p1<=(
7640: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
7650: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 49 6e  Cursor) );.  pIn
7660: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
7670: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 56 64  1];.  assert( Vd
7680: 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49 6e  beMemDynamic(pIn
7690: 31 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 41 62  1)==0 );.  memAb
76a0: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
76b0: 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c  In1);.  pIn1->fl
76c0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
76d0: 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e   pIn1->u.i = (in
76e0: 74 29 28 70 4f 70 2d 61 4f 70 29 3b 0a 20 20 52  t)(pOp-aOp);.  R
76f0: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
7700: 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 0a 20  p->p1, pIn1);.. 
7710: 20 2f 2a 20 4d 6f 73 74 20 6a 75 6d 70 20 6f 70   /* Most jump op
7720: 65 72 61 74 69 6f 6e 73 20 64 6f 20 61 20 67 6f  erations do a go
7730: 74 6f 20 74 6f 20 74 68 69 73 20 73 70 6f 74 20  to to this spot 
7740: 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 70 64 61  in order to upda
7750: 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 4f 70 20  te.  ** the pOp 
7760: 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 6a 75 6d 70  pointer. */.jump
7770: 5f 74 6f 5f 70 32 3a 0a 20 20 70 4f 70 20 3d 20  _to_p2:.  pOp = 
7780: 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31  &aOp[pOp->p2 - 1
7790: 5d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  ];.  break;.}../
77a0: 2a 20 4f 70 63 6f 64 65 3a 20 20 52 65 74 75 72  * Opcode:  Retur
77b0: 6e 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  n P1 * * * *.**.
77c0: 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e  ** Jump to the n
77d0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
77e0: 61 66 74 65 72 20 74 68 65 20 61 64 64 72 65 73  after the addres
77f0: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
7800: 2e 20 20 41 66 74 65 72 0a 2a 2a 20 74 68 65 20  .  After.** the 
7810: 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20 50  jump, register P
7820: 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66 69  1 becomes undefi
7830: 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ned..*/.case OP_
7840: 52 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20 20  Return: {       
7850: 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20      /* in1 */.  
7860: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
7870: 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
7880: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45   pIn1->flags==ME
7890: 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 4f 70 20 3d  M_Int );.  pOp =
78a0: 20 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d   &aOp[pIn1->u.i]
78b0: 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
78c0: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
78d0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
78e0: 4f 70 63 6f 64 65 3a 20 49 6e 69 74 43 6f 72 6f  Opcode: InitCoro
78f0: 75 74 69 6e 65 20 50 31 20 50 32 20 50 33 20 2a  utine P1 P2 P3 *
7900: 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 75 70 20   *.**.** Set up 
7910: 72 65 67 69 73 74 65 72 20 50 31 20 73 6f 20 74  register P1 so t
7920: 68 61 74 20 69 74 20 77 69 6c 6c 20 59 69 65 6c  hat it will Yiel
7930: 64 20 74 6f 20 74 68 65 20 63 6f 72 6f 75 74 69  d to the corouti
7940: 6e 65 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 61 74  ne.** located at
7950: 20 61 64 64 72 65 73 73 20 50 33 2e 0a 2a 2a 0a   address P3..**.
7960: 2a 2a 20 49 66 20 50 32 21 3d 30 20 74 68 65 6e  ** If P2!=0 then
7970: 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69   the coroutine i
7980: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6d  mplementation im
7990: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
79a0: 73 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f 64 65  s.** this opcode
79b0: 2e 20 20 53 6f 20 6a 75 6d 70 20 6f 76 65 72 20  .  So jump over 
79c0: 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  the coroutine im
79d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 0a  plementation to.
79e0: 2a 2a 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a  ** address P2..*
79f0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 45  *.** See also: E
7a00: 6e 64 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63  ndCoroutine.*/.c
7a10: 61 73 65 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  ase OP_InitCorou
7a20: 74 69 6e 65 3a 20 7b 20 20 20 20 20 2f 2a 20 6a  tine: {     /* j
7a30: 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ump */.  assert(
7a40: 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 20 70   pOp->p1>0 &&  p
7a50: 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p1<=(p->nMem
7a60: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
7a70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
7a80: 70 2d 3e 70 32 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p2>=0 && pOp-
7a90: 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  >p2<p->nOp );.  
7aa0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
7ab0: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d  =0 && pOp->p3<p-
7ac0: 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 75 74 20 3d  >nOp );.  pOut =
7ad0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
7ae0: 0a 20 20 61 73 73 65 72 74 28 20 21 56 64 62 65  .  assert( !Vdbe
7af0: 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29  MemDynamic(pOut)
7b00: 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20   );.  pOut->u.i 
7b10: 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a 20  = pOp->p3 - 1;. 
7b20: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
7b30: 45 4d 5f 49 6e 74 3b 0a 20 20 69 66 28 20 70 4f  EM_Int;.  if( pO
7b40: 70 2d 3e 70 32 20 29 20 67 6f 74 6f 20 6a 75 6d  p->p2 ) goto jum
7b50: 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b  p_to_p2;.  break
7b60: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
7b70: 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 20 50 31   EndCoroutine P1
7b80: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54   * * * *.**.** T
7b90: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  he instruction a
7ba0: 74 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e  t the address in
7bb0: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
7bc0: 61 20 59 69 65 6c 64 2e 0a 2a 2a 20 4a 75 6d 70  a Yield..** Jump
7bd0: 20 74 6f 20 74 68 65 20 50 32 20 70 61 72 61 6d   to the P2 param
7be0: 65 74 65 72 20 6f 66 20 74 68 61 74 20 59 69 65  eter of that Yie
7bf0: 6c 64 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  ld..** After the
7c00: 20 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20   jump, register 
7c10: 50 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66  P1 becomes undef
7c20: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ined..**.** See 
7c30: 61 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74  also: InitCorout
7c40: 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45  ine.*/.case OP_E
7c50: 6e 64 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 20 20  ndCoroutine: {  
7c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20           /* in1 
7c70: 2a 2f 0a 20 20 56 64 62 65 4f 70 20 2a 70 43 61  */.  VdbeOp *pCa
7c80: 6c 6c 65 72 3b 0a 20 20 70 49 6e 31 20 3d 20 26  ller;.  pIn1 = &
7c90: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
7ca0: 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
7cb0: 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b  lags==MEM_Int );
7cc0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
7cd0: 3e 75 2e 69 3e 3d 30 20 26 26 20 70 49 6e 31 2d  >u.i>=0 && pIn1-
7ce0: 3e 75 2e 69 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  >u.i<p->nOp );. 
7cf0: 20 70 43 61 6c 6c 65 72 20 3d 20 26 61 4f 70 5b   pCaller = &aOp[
7d00: 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20 61 73  pIn1->u.i];.  as
7d10: 73 65 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e 6f  sert( pCaller->o
7d20: 70 63 6f 64 65 3d 3d 4f 50 5f 59 69 65 6c 64 20  pcode==OP_Yield 
7d30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 61  );.  assert( pCa
7d40: 6c 6c 65 72 2d 3e 70 32 3e 3d 30 20 26 26 20 70  ller->p2>=0 && p
7d50: 43 61 6c 6c 65 72 2d 3e 70 32 3c 70 2d 3e 6e 4f  Caller->p2<p->nO
7d60: 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f  p );.  pOp = &aO
7d70: 70 5b 70 43 61 6c 6c 65 72 2d 3e 70 32 20 2d 20  p[pCaller->p2 - 
7d80: 31 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67  1];.  pIn1->flag
7d90: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
7da0: 64 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  d;.  break;.}../
7db0: 2a 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c 64  * Opcode:  Yield
7dc0: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
7dd0: 2a 2a 20 53 77 61 70 20 74 68 65 20 70 72 6f 67  ** Swap the prog
7de0: 72 61 6d 20 63 6f 75 6e 74 65 72 20 77 69 74 68  ram counter with
7df0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
7e00: 67 69 73 74 65 72 20 50 31 2e 20 20 54 68 69 73  gister P1.  This
7e10: 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
7e20: 63 74 20 6f 66 20 79 69 65 6c 64 69 6e 67 20 74  ct of yielding t
7e30: 6f 20 61 20 63 6f 72 6f 75 74 69 6e 65 2e 0a 2a  o a coroutine..*
7e40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 72 6f  *.** If the coro
7e50: 75 74 69 6e 65 20 74 68 61 74 20 69 73 20 6c 61  utine that is la
7e60: 75 6e 63 68 65 64 20 62 79 20 74 68 69 73 20 69  unched by this i
7e70: 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 73 20  nstruction ends 
7e80: 77 69 74 68 0a 2a 2a 20 59 69 65 6c 64 20 6f 72  with.** Yield or
7e90: 20 52 65 74 75 72 6e 20 74 68 65 6e 20 63 6f 6e   Return then con
7ea0: 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
7eb0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  t instruction.  
7ec0: 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  But if.** the co
7ed0: 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 64  routine launched
7ee0: 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75 63   by this instruc
7ef0: 74 69 6f 6e 20 65 6e 64 73 20 77 69 74 68 0a 2a  tion ends with.*
7f00: 2a 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  * EndCoroutine, 
7f10: 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 20  then jump to P2 
7f20: 72 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6e 74  rather than cont
7f30: 69 6e 75 69 6e 67 20 77 69 74 68 20 74 68 65 0a  inuing with the.
7f40: 2a 2a 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  ** next instruct
7f50: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ion..**.** See a
7f60: 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69  lso: InitCorouti
7f70: 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59 69  ne.*/.case OP_Yi
7f80: 65 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20  eld: {          
7f90: 20 20 2f 2a 20 69 6e 31 2c 20 6a 75 6d 70 20 2a    /* in1, jump *
7fa0: 2f 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a  /.  int pcDest;.
7fb0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
7fc0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
7fd0: 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  t( VdbeMemDynami
7fe0: 63 28 70 49 6e 31 29 3d 3d 30 20 29 3b 0a 20 20  c(pIn1)==0 );.  
7ff0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pIn1->flags = ME
8000: 4d 5f 49 6e 74 3b 0a 20 20 70 63 44 65 73 74 20  M_Int;.  pcDest 
8010: 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69  = (int)pIn1->u.i
8020: 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20  ;.  pIn1->u.i = 
8030: 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
8040: 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
8050: 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31  CE(pOp->p1, pIn1
8060: 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b  );.  pOp = &aOp[
8070: 70 63 44 65 73 74 5d 3b 0a 20 20 62 72 65 61 6b  pcDest];.  break
8080: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
8090: 20 48 61 6c 74 49 66 4e 75 6c 6c 20 20 50 31 20   HaltIfNull  P1 
80a0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
80b0: 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 33  ynopsis: if r[P3
80c0: 5d 3d 6e 75 6c 6c 20 68 61 6c 74 0a 2a 2a 0a 2a  ]=null halt.**.*
80d0: 2a 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75  * Check the valu
80e0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  e in register P3
80f0: 2e 20 20 49 66 20 69 74 20 69 73 20 4e 55 4c 4c  .  If it is NULL
8100: 20 74 68 65 6e 20 48 61 6c 74 20 75 73 69 6e 67   then Halt using
8110: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 50 31  .** parameter P1
8120: 2c 20 50 32 2c 20 61 6e 64 20 50 34 20 61 73 20  , P2, and P4 as 
8130: 69 66 20 74 68 69 73 20 77 65 72 65 20 61 20 48  if this were a H
8140: 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  alt instruction.
8150: 20 20 49 66 20 74 68 65 0a 2a 2a 20 76 61 6c 75    If the.** valu
8160: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  e in register P3
8170: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
8180: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8190: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  is a no-op..** T
81a0: 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
81b0: 73 68 6f 75 6c 64 20 62 65 20 31 2e 0a 2a 2f 0a  should be 1..*/.
81c0: 63 61 73 65 20 4f 50 5f 48 61 6c 74 49 66 4e 75  case OP_HaltIfNu
81d0: 6c 6c 3a 20 7b 20 20 20 20 20 20 2f 2a 20 69 6e  ll: {      /* in
81e0: 33 20 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61  3 */.  pIn3 = &a
81f0: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69  Mem[pOp->p3];.#i
8200: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8210: 47 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d  G.  if( pOp->p2=
8220: 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 20 73 71 6c  =OE_Abort ){ sql
8230: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41 62  ite3VdbeAssertAb
8240: 6f 72 74 61 62 6c 65 28 70 29 3b 20 7d 0a 23 65  ortable(p); }.#e
8250: 6e 64 69 66 0a 20 20 69 66 28 20 28 70 49 6e 33  ndif.  if( (pIn3
8260: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
8270: 6c 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ll)==0 ) break;.
8280: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
8290: 68 20 69 6e 74 6f 20 4f 50 5f 48 61 6c 74 20 2a  h into OP_Halt *
82a0: 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  /.}../* Opcode: 
82b0: 20 48 61 6c 74 20 50 31 20 50 32 20 2a 20 50 34   Halt P1 P2 * P4
82c0: 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 69 74 20 69   P5.**.** Exit i
82d0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 41 6c 6c  mmediately.  All
82e0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c 20 65   open cursors, e
82f0: 74 63 20 61 72 65 20 63 6c 6f 73 65 64 0a 2a 2a  tc are closed.**
8300: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
8310: 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20  **.** P1 is the 
8320: 72 65 73 75 6c 74 20 63 6f 64 65 20 72 65 74 75  result code retu
8330: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
8340: 65 78 65 63 28 29 2c 20 73 71 6c 69 74 65 33 5f  exec(), sqlite3_
8350: 72 65 73 65 74 28 29 2c 0a 2a 2a 20 6f 72 20 73  reset(),.** or s
8360: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
8370: 29 2e 20 20 46 6f 72 20 61 20 6e 6f 72 6d 61 6c  ).  For a normal
8380: 20 68 61 6c 74 2c 20 74 68 69 73 20 73 68 6f 75   halt, this shou
8390: 6c 64 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20  ld be SQLITE_OK 
83a0: 28 30 29 2e 0a 2a 2a 20 46 6f 72 20 65 72 72 6f  (0)..** For erro
83b0: 72 73 2c 20 69 74 20 63 61 6e 20 62 65 20 73 6f  rs, it can be so
83c0: 6d 65 20 6f 74 68 65 72 20 76 61 6c 75 65 2e 20  me other value. 
83d0: 20 49 66 20 50 31 21 3d 30 20 74 68 65 6e 20 50   If P1!=0 then P
83e0: 32 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  2 will determine
83f0: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
8400: 6f 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ot to rollback t
8410: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
8420: 61 63 74 69 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20  action.  Do not 
8430: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 50  rollback.** if P
8440: 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44 6f 20 74  2==OE_Fail. Do t
8450: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 50  he rollback if P
8460: 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20  2==OE_Rollback. 
8470: 20 49 66 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74   If P2==OE_Abort
8480: 2c 0a 2a 2a 20 74 68 65 6e 20 62 61 63 6b 20 6f  ,.** then back o
8490: 75 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  ut all changes t
84a0: 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65  hat have occurre
84b0: 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 65 78  d during this ex
84c0: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ecution of the.*
84d0: 2a 20 56 44 42 45 2c 20 62 75 74 20 64 6f 20 6e  * VDBE, but do n
84e0: 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ot rollback the 
84f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
8500: 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74  .** If P4 is not
8510: 20 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20 69 73   null then it is
8520: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8530: 65 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  e string..**.** 
8540: 50 35 20 69 73 20 61 20 76 61 6c 75 65 20 62 65  P5 is a value be
8550: 74 77 65 65 6e 20 30 20 61 6e 64 20 34 2c 20 69  tween 0 and 4, i
8560: 6e 63 6c 75 73 69 76 65 2c 20 74 68 61 74 20 6d  nclusive, that m
8570: 6f 64 69 66 69 65 73 20 74 68 65 20 50 34 20 73  odifies the P4 s
8580: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tring..**.**    
8590: 30 3a 20 20 28 6e 6f 20 63 68 61 6e 67 65 29 0a  0:  (no change).
85a0: 2a 2a 20 20 20 20 31 3a 20 20 4e 4f 54 20 4e 55  **    1:  NOT NU
85b0: 4c 4c 20 63 6f 6e 74 72 61 69 6e 74 20 66 61 69  LL contraint fai
85c0: 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 32 3a  led: P4.**    2:
85d0: 20 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61    UNIQUE constra
85e0: 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a  int failed: P4.*
85f0: 2a 20 20 20 20 33 3a 20 20 43 48 45 43 4b 20 63  *    3:  CHECK c
8600: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
8610: 3a 20 50 34 0a 2a 2a 20 20 20 20 34 3a 20 20 46  : P4.**    4:  F
8620: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
8630: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34  raint failed: P4
8640: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
8650: 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20 50 34 20  not zero and P4 
8660: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 65 76  is NULL, then ev
8670: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
8680: 68 65 20 22 3a 22 20 69 73 0a 2a 2a 20 6f 6d 69  he ":" is.** omi
8690: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  tted..**.** Ther
86a0: 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  e is an implied 
86b0: 22 48 61 6c 74 20 30 20 30 20 30 22 20 69 6e 73  "Halt 0 0 0" ins
86c0: 74 72 75 63 74 69 6f 6e 20 69 6e 73 65 72 74 65  truction inserte
86d0: 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e  d at the very en
86e0: 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79 20 70 72  d of.** every pr
86f0: 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20 6a 75 6d  ogram.  So a jum
8700: 70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  p past the last 
8710: 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  instruction of t
8720: 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69 73  he program.** is
8730: 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78 65   the same as exe
8740: 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a 2a 2f 0a  cuting Halt..*/.
8750: 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a 20 7b 0a  case OP_Halt: {.
8760: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
8770: 61 6d 65 3b 0a 20 20 69 6e 74 20 70 63 78 3b 0a  ame;.  int pcx;.
8780: 0a 20 20 70 63 78 20 3d 20 28 69 6e 74 29 28 70  .  pcx = (int)(p
8790: 4f 70 20 2d 20 61 4f 70 29 3b 0a 23 69 66 64 65  Op - aOp);.#ifde
87a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
87b0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45   if( pOp->p2==OE
87c0: 5f 41 62 6f 72 74 20 29 7b 20 73 71 6c 69 74 65  _Abort ){ sqlite
87d0: 33 56 64 62 65 41 73 73 65 72 74 41 62 6f 72 74  3VdbeAssertAbort
87e0: 61 62 6c 65 28 70 29 3b 20 7d 0a 23 65 6e 64 69  able(p); }.#endi
87f0: 66 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d  f.  if( pOp->p1=
8800: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
8810: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f  >pFrame ){.    /
8820: 2a 20 48 61 6c 74 20 74 68 65 20 73 75 62 2d 70  * Halt the sub-p
8830: 72 6f 67 72 61 6d 2e 20 52 65 74 75 72 6e 20 63  rogram. Return c
8840: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 70 61  ontrol to the pa
8850: 72 65 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a 20  rent frame. */. 
8860: 20 20 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70     pFrame = p->p
8870: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 46  Frame;.    p->pF
8880: 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e 70  rame = pFrame->p
8890: 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e  Parent;.    p->n
88a0: 46 72 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71 6c  Frame--;.    sql
88b0: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
88c0: 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
88d0: 65 29 3b 0a 20 20 20 20 70 63 78 20 3d 20 73 71  e);.    pcx = sq
88e0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
88f0: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
8900: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d     if( pOp->p2==
8910: 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
8920: 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
8930: 6e 20 70 63 78 20 69 73 20 74 68 65 20 4f 50 5f  n pcx is the OP_
8940: 50 72 6f 67 72 61 6d 20 74 68 61 74 20 69 6e 76  Program that inv
8950: 6f 6b 65 64 20 74 68 65 20 73 75 62 2d 70 72 6f  oked the sub-pro
8960: 67 72 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20 63  gram .      ** c
8970: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 68  urrently being h
8980: 61 6c 74 65 64 2e 20 49 66 20 74 68 65 20 70 32  alted. If the p2
8990: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
89a0: 74 68 69 73 20 4f 50 5f 48 61 6c 74 0a 20 20 20  this OP_Halt.   
89b0: 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
89c0: 6e 20 69 73 20 73 65 74 20 74 6f 20 4f 45 5f 49  n is set to OE_I
89d0: 67 6e 6f 72 65 2c 20 74 68 65 6e 20 74 68 65 20  gnore, then the 
89e0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 74  sub-program is t
89f0: 68 72 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  hrowing.      **
8a00: 20 61 6e 20 49 47 4e 4f 52 45 20 65 78 63 65 70   an IGNORE excep
8a10: 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
8a20: 73 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 61  se jump to the a
8a30: 64 64 72 65 73 73 20 73 70 65 63 69 66 69 65 64  ddress specified
8a40: 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 74 68 65  .      ** as the
8a50: 20 70 32 20 6f 66 20 74 68 65 20 63 61 6c 6c 69   p2 of the calli
8a60: 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 2e 20 20  ng OP_Program.  
8a70: 2a 2f 0a 20 20 20 20 20 20 70 63 78 20 3d 20 70  */.      pcx = p
8a80: 2d 3e 61 4f 70 5b 70 63 78 5d 2e 70 32 2d 31 3b  ->aOp[pcx].p2-1;
8a90: 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f 70 20 3d  .    }.    aOp =
8aa0: 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 61 4d 65   p->aOp;.    aMe
8ab0: 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20  m = p->aMem;.   
8ac0: 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 78 5d   pOp = &aOp[pcx]
8ad0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
8ae0: 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d 3e  .  p->rc = pOp->
8af0: 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  p1;.  p->errorAc
8b00: 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d 3e  tion = (u8)pOp->
8b10: 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63  p2;.  p->pc = pc
8b20: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  x;.  assert( pOp
8b30: 2d 3e 70 35 3c 3d 34 20 29 3b 0a 20 20 69 66 28  ->p5<=4 );.  if(
8b40: 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 69 66   p->rc ){.    if
8b50: 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20  ( pOp->p5 ){.   
8b60: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
8b70: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54  char * const azT
8b80: 79 70 65 5b 5d 20 3d 20 7b 20 22 4e 4f 54 20 4e  ype[] = { "NOT N
8b90: 55 4c 4c 22 2c 20 22 55 4e 49 51 55 45 22 2c 20  ULL", "UNIQUE", 
8ba0: 22 43 48 45 43 4b 22 2c 0a 20 20 20 20 20 20 20  "CHECK",.       
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 20 20 20 20 20 22 46 4f 52 45 49 47 4e 20 4b        "FOREIGN K
8be0: 45 59 22 20 7d 3b 0a 20 20 20 20 20 20 74 65 73  EY" };.      tes
8bf0: 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d  tcase( pOp->p5==
8c00: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
8c10: 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 32 20  ase( pOp->p5==2 
8c20: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8c30: 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 33 20 29 3b  e( pOp->p5==3 );
8c40: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8c50: 20 70 4f 70 2d 3e 70 35 3d 3d 34 20 29 3b 0a 20   pOp->p5==4 );. 
8c60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8c70: 45 72 72 6f 72 28 70 2c 20 22 25 73 20 63 6f 6e  Error(p, "%s con
8c80: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c  straint failed",
8c90: 20 61 7a 54 79 70 65 5b 70 4f 70 2d 3e 70 35 2d   azType[pOp->p5-
8ca0: 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1]);.      if( p
8cb0: 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20  Op->p4.z ){.    
8cc0: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
8cd0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8ce0: 64 62 2c 20 22 25 7a 3a 20 25 73 22 2c 20 70 2d  db, "%z: %s", p-
8cf0: 3e 7a 45 72 72 4d 73 67 2c 20 70 4f 70 2d 3e 70  >zErrMsg, pOp->p
8d00: 34 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  4.z);.      }.  
8d10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8d20: 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
8d30: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  p, "%s", pOp->p4
8d40: 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  .z);.    }.    s
8d50: 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e  qlite3_log(pOp->
8d60: 70 31 2c 20 22 61 62 6f 72 74 20 61 74 20 25 64  p1, "abort at %d
8d70: 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c 20 70   in [%s]: %s", p
8d80: 63 78 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 2d 3e  cx, p->zSql, p->
8d90: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
8da0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
8db0: 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73 65 72  Halt(p);.  asser
8dc0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  t( rc==SQLITE_BU
8dd0: 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  SY || rc==SQLITE
8de0: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
8df0: 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  E_ERROR );.  if(
8e00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
8e10: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
8e20: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
8e30: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
8e40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8e50: 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d  || (p->rc&0xff)=
8e60: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
8e70: 4e 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  NT );.    assert
8e80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8e90: 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  || db->nDeferred
8ea0: 43 6f 6e 73 3e 30 20 7c 7c 20 64 62 2d 3e 6e 44  Cons>0 || db->nD
8eb0: 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3e 30  eferredImmCons>0
8ec0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e   );.    rc = p->
8ed0: 72 63 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc ? SQLITE_ERRO
8ee0: 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  R : SQLITE_DONE;
8ef0: 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65  .  }.  goto vdbe
8f00: 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f  _return;.}../* O
8f10: 70 63 6f 64 65 3a 20 49 6e 74 65 67 65 72 20 50  pcode: Integer P
8f20: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
8f30: 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 31  nopsis: r[P2]=P1
8f40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62 69  .**.** The 32-bi
8f50: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
8f60: 50 31 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  P1 is written in
8f70: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
8f80: 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67  */.case OP_Integ
8f90: 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  er: {         /*
8fa0: 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20   out2 */.  pOut 
8fb0: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
8fc0: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74  (p, pOp);.  pOut
8fd0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
8fe0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
8ff0: 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34 20 2a 20  Opcode: Int64 * 
9000: 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  P2 * P4 *.** Syn
9010: 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a  opsis: r[P2]=P4.
9020: 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
9030: 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69  inter to a 64-bi
9040: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  t integer value.
9050: 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20 76  .** Write that v
9060: 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74  alue into regist
9070: 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
9080: 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20 20 20 20  P_Int64: {      
9090: 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
90a0: 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
90b0: 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
90c0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
90d0: 70 34 2e 70 49 36 34 21 3d 30 20 29 3b 0a 20 20  p4.pI64!=0 );.  
90e0: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70  pOut->u.i = *pOp
90f0: 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62 72 65  ->p4.pI64;.  bre
9100: 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ak;.}..#ifndef S
9110: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
9120: 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63  ING_POINT./* Opc
9130: 6f 64 65 3a 20 52 65 61 6c 20 2a 20 50 32 20 2a  ode: Real * P2 *
9140: 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
9150: 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a  s: r[P2]=P4.**.*
9160: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
9170: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 66 6c  r to a 64-bit fl
9180: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
9190: 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61  ue..** Write tha
91a0: 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  t value into reg
91b0: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
91c0: 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20 20 20  e OP_Real: {    
91d0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
91e0: 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74  as TK_FLOAT, out
91f0: 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75  2 */.  pOut = ou
9200: 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
9210: 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  pOp);.  pOut->fl
9220: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
9230: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
9240: 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34  e3IsNaN(*pOp->p4
9250: 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f 75  .pReal) );.  pOu
9260: 74 2d 3e 75 2e 72 20 3d 20 2a 70 4f 70 2d 3e 70  t->u.r = *pOp->p
9270: 34 2e 70 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b  4.pReal;.  break
9280: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f  ;.}.#endif../* O
9290: 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 38 20 2a  pcode: String8 *
92a0: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
92b0: 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 27 50  nopsis: r[P2]='P
92c0: 34 27 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e  4'.**.** P4 poin
92d0: 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  ts to a nul term
92e0: 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74 72  inated UTF-8 str
92f0: 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  ing. This opcode
9300: 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
9310: 0a 2a 2a 20 69 6e 74 6f 20 61 20 53 74 72 69 6e  .** into a Strin
9320: 67 20 6f 70 63 6f 64 65 20 62 65 66 6f 72 65 20  g opcode before 
9330: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 20 66  it is executed f
9340: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
9350: 65 2e 20 20 44 75 72 69 6e 67 0a 2a 2a 20 74 68  e.  During.** th
9360: 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  is transformatio
9370: 6e 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  n, the length of
9380: 20 73 74 72 69 6e 67 20 50 34 20 69 73 20 63 6f   string P4 is co
9390: 6d 70 75 74 65 64 20 61 6e 64 20 73 74 6f 72 65  mputed and store
93a0: 64 0a 2a 2a 20 61 73 20 74 68 65 20 50 31 20 70  d.** as the P1 p
93b0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 63 61 73  arameter..*/.cas
93c0: 65 20 4f 50 5f 53 74 72 69 6e 67 38 3a 20 7b 20  e OP_String8: { 
93d0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
93e0: 61 73 20 54 4b 5f 53 54 52 49 4e 47 2c 20 6f 75  as TK_STRING, ou
93f0: 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t2 */.  assert( 
9400: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a  pOp->p4.z!=0 );.
9410: 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
9420: 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
9430: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
9440: 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70 4f   OP_String;.  pO
9450: 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33 53  p->p1 = sqlite3S
9460: 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34 2e  trlen30(pOp->p4.
9470: 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  z);..#ifndef SQL
9480: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
9490: 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d 53   if( encoding!=S
94a0: 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20  QLITE_UTF8 ){.  
94b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
94c0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74  beMemSetStr(pOut
94d0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c  , pOp->p4.z, -1,
94e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
94f0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
9500: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
9510: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
9520: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 3b 0a  QLITE_TOOBIG );.
9530: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
9540: 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 69  o too_big;.    i
9550: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
9560: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
9570: 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e  ncoding(pOut, en
9580: 63 6f 64 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e  coding) ) goto n
9590: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  o_mem;.    asser
95a0: 74 28 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c 6f  t( pOut->szMallo
95b0: 63 3e 30 20 26 26 20 70 4f 75 74 2d 3e 7a 4d 61  c>0 && pOut->zMa
95c0: 6c 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29 3b  lloc==pOut->z );
95d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 56 64 62  .    assert( Vdb
95e0: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
95f0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75 74  )==0 );.    pOut
9600: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
9610: 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20      pOut->flags 
9620: 7c 3d 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a 20  |= MEM_Static;. 
9630: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
9640: 70 65 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 29  pe==P4_DYNAMIC )
9650: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
9660: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 70  bFree(db, pOp->p
9670: 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  4.z);.    }.    
9680: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
9690: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20 70 4f  _DYNAMIC;.    pO
96a0: 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75 74 2d 3e  p->p4.z = pOut->
96b0: 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d  z;.    pOp->p1 =
96c0: 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20 7d 0a 23 65   pOut->n;.  }.#e
96d0: 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ndif.  if( pOp->
96e0: 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  p1>db->aLimit[SQ
96f0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
9700: 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
9710: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 61 73  oo_big;.  }.  as
9720: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
9730: 5f 4f 4b 20 29 3b 0a 20 20 2f 2a 20 46 61 6c 6c  _OK );.  /* Fall
9740: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
9750: 6e 65 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74  next case, OP_St
9760: 72 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20  ring */.}.  ./* 
9770: 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50  Opcode: String P
9780: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
9790: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
97a0: 3d 27 50 34 27 20 28 6c 65 6e 3d 50 31 29 0a 2a  ='P4' (len=P1).*
97b0: 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20  *.** The string 
97c0: 76 61 6c 75 65 20 50 34 20 6f 66 20 6c 65 6e 67  value P4 of leng
97d0: 74 68 20 50 31 20 28 62 79 74 65 73 29 20 69 73  th P1 (bytes) is
97e0: 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
97f0: 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P2..**.** If
9800: 20 50 33 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20   P3 is not zero 
9810: 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  and the content 
9820: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
9830: 73 20 65 71 75 61 6c 20 74 6f 20 50 35 2c 20 74  s equal to P5, t
9840: 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 74  hen.** the datat
9850: 79 70 65 20 6f 66 20 74 68 65 20 72 65 67 69 73  ype of the regis
9860: 74 65 72 20 50 32 20 69 73 20 63 6f 6e 76 65 72  ter P2 is conver
9870: 74 65 64 20 74 6f 20 42 4c 4f 42 2e 20 20 54 68  ted to BLOB.  Th
9880: 65 20 63 6f 6e 74 65 6e 74 20 69 73 0a 2a 2a 20  e content is.** 
9890: 74 68 65 20 73 61 6d 65 20 73 65 71 75 65 6e 63  the same sequenc
98a0: 65 20 6f 66 20 62 79 74 65 73 2c 20 69 74 20 69  e of bytes, it i
98b0: 73 20 6d 65 72 65 6c 79 20 69 6e 74 65 72 70 72  s merely interpr
98c0: 65 74 65 64 20 61 73 20 61 20 42 4c 4f 42 20 69  eted as a BLOB i
98d0: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61 20 73  nstead.** of a s
98e0: 74 72 69 6e 67 2c 20 61 73 20 69 66 20 69 74 20  tring, as if it 
98f0: 68 61 64 20 62 65 65 6e 20 43 41 53 54 2e 20 20  had been CAST.  
9900: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a  In other words:.
9910: 2a 2a 0a 2a 2a 20 69 66 28 20 50 33 21 3d 30 20  **.** if( P3!=0 
9920: 61 6e 64 20 72 65 67 5b 50 33 5d 3d 3d 50 35 20  and reg[P3]==P5 
9930: 29 20 72 65 67 5b 50 32 5d 20 3a 3d 20 43 41 53  ) reg[P2] := CAS
9940: 54 28 72 65 67 5b 50 32 5d 20 61 73 20 42 4c 4f  T(reg[P2] as BLO
9950: 42 29 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74  B).*/.case OP_St
9960: 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20 20 20  ring: {         
9970: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73   /* out2 */.  as
9980: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21  sert( pOp->p4.z!
9990: 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f  =0 );.  pOut = o
99a0: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
99b0: 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66   pOp);.  pOut->f
99c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
99d0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65  EM_Static|MEM_Te
99e0: 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20 3d 20  rm;.  pOut->z = 
99f0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 70 4f 75  pOp->p4.z;.  pOu
9a00: 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  t->n = pOp->p1;.
9a10: 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e    pOut->enc = en
9a20: 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45  coding;.  UPDATE
9a30: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
9a40: 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ut);.#ifndef SQL
9a50: 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
9a60: 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 69 66  MATCH_BLOBS.  if
9a70: 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20  ( pOp->p3>0 ){. 
9a80: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
9a90: 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
9aa0: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
9ab0: 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d      pIn3 = &aMem
9ac0: 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 61  [pOp->p3];.    a
9ad0: 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61  ssert( pIn3->fla
9ae0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
9af0: 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e      if( pIn3->u.
9b00: 69 3d 3d 70 4f 70 2d 3e 70 35 20 29 20 70 4f 75  i==pOp->p5 ) pOu
9b10: 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  t->flags = MEM_B
9b20: 6c 6f 62 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  lob|MEM_Static|M
9b30: 45 4d 5f 54 65 72 6d 3b 0a 20 20 7d 0a 23 65 6e  EM_Term;.  }.#en
9b40: 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  dif.  break;.}..
9b50: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 20  /* Opcode: Null 
9b60: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
9b70: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 2e 2e  Synopsis: r[P2..
9b80: 50 33 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 57  P3]=NULL.**.** W
9b90: 72 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f  rite a NULL into
9ba0: 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 20 20   registers P2.  
9bb0: 49 66 20 50 33 20 67 72 65 61 74 65 72 20 74 68  If P3 greater th
9bc0: 61 6e 20 50 32 2c 20 74 68 65 6e 20 61 6c 73 6f  an P2, then also
9bd0: 20 77 72 69 74 65 0a 2a 2a 20 4e 55 4c 4c 20 69   write.** NULL i
9be0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 20  nto register P3 
9bf0: 61 6e 64 20 65 76 65 72 79 20 72 65 67 69 73 74  and every regist
9c00: 65 72 20 69 6e 20 62 65 74 77 65 65 6e 20 50 32  er in between P2
9c10: 20 61 6e 64 20 50 33 2e 20 20 49 66 20 50 33 0a   and P3.  If P3.
9c20: 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
9c30: 50 32 20 28 74 79 70 69 63 61 6c 6c 79 20 50 33  P2 (typically P3
9c40: 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 20 6f   is zero) then o
9c50: 6e 6c 79 20 72 65 67 69 73 74 65 72 20 50 32 20  nly register P2 
9c60: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 4e 55 4c  is.** set to NUL
9c70: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
9c80: 50 31 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  P1 value is non-
9c90: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6c 73 6f 20  zero, then also 
9ca0: 73 65 74 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  set the MEM_Clea
9cb0: 72 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74  red flag so that
9cc0: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  .** NULL values 
9cd0: 77 69 6c 6c 20 6e 6f 74 20 63 6f 6d 70 61 72 65  will not compare
9ce0: 20 65 71 75 61 6c 20 65 76 65 6e 20 69 66 20 53   equal even if S
9cf0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20  QLITE_NULLEQ is 
9d00: 73 65 74 20 6f 6e 0a 2a 2a 20 4f 50 5f 4e 65 20  set on.** OP_Ne 
9d10: 6f 72 20 4f 50 5f 45 71 2e 0a 2a 2f 0a 63 61 73  or OP_Eq..*/.cas
9d20: 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20  e OP_Null: {    
9d30: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
9d40: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 75  /.  int cnt;.  u
9d50: 31 36 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20 20 70  16 nullFlag;.  p
9d60: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
9d70: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
9d80: 63 6e 74 20 3d 20 70 4f 70 2d 3e 70 33 2d 70 4f  cnt = pOp->p3-pO
9d90: 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28  p->p2;.  assert(
9da0: 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
9db0: 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
9dc0: 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  r) );.  pOut->fl
9dd0: 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 20 3d  ags = nullFlag =
9de0: 20 70 4f 70 2d 3e 70 31 20 3f 20 28 4d 45 4d 5f   pOp->p1 ? (MEM_
9df0: 4e 75 6c 6c 7c 4d 45 4d 5f 43 6c 65 61 72 65 64  Null|MEM_Cleared
9e00: 29 20 3a 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  ) : MEM_Null;.  
9e10: 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 23 69 66  pOut->n = 0;.#if
9e20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9e30: 0a 20 20 70 4f 75 74 2d 3e 75 54 65 6d 70 20 3d  .  pOut->uTemp =
9e40: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 68 69   0;.#endif.  whi
9e50: 6c 65 28 20 63 6e 74 3e 30 20 29 7b 0a 20 20 20  le( cnt>0 ){.   
9e60: 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20 6d 65 6d   pOut++;.    mem
9e70: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
9e80: 20 70 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69   pOut);.    sqli
9e90: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
9ea0: 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 70 4f 75  l(pOut);.    pOu
9eb0: 74 2d 3e 66 6c 61 67 73 20 3d 20 6e 75 6c 6c 46  t->flags = nullF
9ec0: 6c 61 67 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 6e  lag;.    pOut->n
9ed0: 20 3d 20 30 3b 0a 20 20 20 20 63 6e 74 2d 2d 3b   = 0;.    cnt--;
9ee0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
9ef0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 66 74  ./* Opcode: Soft
9f00: 4e 75 6c 6c 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  Null P1 * * * *.
9f10: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
9f20: 31 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 53 65  1]=NULL.**.** Se
9f30: 74 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  t register P1 to
9f40: 20 68 61 76 65 20 74 68 65 20 76 61 6c 75 65 20   have the value 
9f50: 4e 55 4c 4c 20 61 73 20 73 65 65 6e 20 62 79 20  NULL as seen by 
9f60: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
9f70: 64 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e  d.** instruction
9f80: 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 66 72 65  , but do not fre
9f90: 65 20 61 6e 79 20 73 74 72 69 6e 67 20 6f 72 20  e any string or 
9fa0: 62 6c 6f 62 20 6d 65 6d 6f 72 79 20 61 73 73 6f  blob memory asso
9fb0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
9fc0: 68 65 20 72 65 67 69 73 74 65 72 2c 20 73 6f 20  he register, so 
9fd0: 74 68 61 74 20 69 66 20 74 68 65 20 76 61 6c 75  that if the valu
9fe0: 65 20 77 61 73 20 61 20 73 74 72 69 6e 67 20 6f  e was a string o
9ff0: 72 20 62 6c 6f 62 20 74 68 61 74 20 77 61 73 0a  r blob that was.
a000: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  ** previously co
a010: 70 69 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  pied using OP_SC
a020: 6f 70 79 2c 20 74 68 65 20 63 6f 70 69 65 73 20  opy, the copies 
a030: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
a040: 20 62 65 20 76 61 6c 69 64 2e 0a 2a 2f 0a 63 61   be valid..*/.ca
a050: 73 65 20 4f 50 5f 53 6f 66 74 4e 75 6c 6c 3a 20  se OP_SoftNull: 
a060: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  {.  assert( pOp-
a070: 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31  >p1>0 && pOp->p1
a080: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
a090: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
a0a0: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
a0b0: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 2d 3e 66  ->p1];.  pOut->f
a0c0: 6c 61 67 73 20 3d 20 28 70 4f 75 74 2d 3e 66 6c  lags = (pOut->fl
a0d0: 61 67 73 26 7e 28 4d 45 4d 5f 55 6e 64 65 66 69  ags&~(MEM_Undefi
a0e0: 6e 65 64 7c 4d 45 4d 5f 41 66 66 4d 61 73 6b 29  ned|MEM_AffMask)
a0f0: 29 7c 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 62 72  )|MEM_Null;.  br
a100: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
a110: 65 3a 20 42 6c 6f 62 20 50 31 20 50 32 20 2a 20  e: Blob P1 P2 * 
a120: 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  P4 *.** Synopsis
a130: 3a 20 72 5b 50 32 5d 3d 50 34 20 28 6c 65 6e 3d  : r[P2]=P4 (len=
a140: 50 31 29 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69  P1).**.** P4 poi
a150: 6e 74 73 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66  nts to a blob of
a160: 20 64 61 74 61 20 50 31 20 62 79 74 65 73 20 6c   data P1 bytes l
a170: 6f 6e 67 2e 20 20 53 74 6f 72 65 20 74 68 69 73  ong.  Store this
a180: 0a 2a 2a 20 62 6c 6f 62 20 69 6e 20 72 65 67 69  .** blob in regi
a190: 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
a1a0: 20 4f 50 5f 42 6c 6f 62 3a 20 7b 20 20 20 20 20   OP_Blob: {     
a1b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
a1c0: 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t2 */.  assert( 
a1d0: 70 4f 70 2d 3e 70 31 20 3c 3d 20 53 51 4c 49 54  pOp->p1 <= SQLIT
a1e0: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a  E_MAX_LENGTH );.
a1f0: 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
a200: 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
a210: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
a220: 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 70 4f  mSetStr(pOut, pO
a230: 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70 2d 3e 70 31  p->p4.z, pOp->p1
a240: 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 75 74 2d  , 0, 0);.  pOut-
a250: 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  >enc = encoding;
a260: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
a270: 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20  OBSIZE(pOut);.  
a280: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
a290: 6f 64 65 3a 20 56 61 72 69 61 62 6c 65 20 50 31  ode: Variable P1
a2a0: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
a2b0: 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 70 61  nopsis: r[P2]=pa
a2c0: 72 61 6d 65 74 65 72 28 50 31 2c 50 34 29 0a 2a  rameter(P1,P4).*
a2d0: 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 74 68  *.** Transfer th
a2e0: 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e  e values of boun
a2f0: 64 20 70 61 72 61 6d 65 74 65 72 20 50 31 20 69  d parameter P1 i
a300: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 0a  nto register P2.
a310: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72  **.** If the par
a320: 61 6d 65 74 65 72 20 69 73 20 6e 61 6d 65 64 2c  ameter is named,
a330: 20 74 68 65 6e 20 69 74 73 20 6e 61 6d 65 20 61   then its name a
a340: 70 70 65 61 72 73 20 69 6e 20 50 34 2e 0a 2a 2a  ppears in P4..**
a350: 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 69 73   The P4 value is
a360: 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
a370: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
a380: 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63 61 73 65 20  name()..*/.case 
a390: 4f 50 5f 56 61 72 69 61 62 6c 65 3a 20 7b 20 20  OP_Variable: {  
a3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
a3b0: 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56 61 72  2 */.  Mem *pVar
a3c0: 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65  ;       /* Value
a3d0: 20 62 65 69 6e 67 20 74 72 61 6e 73 66 65 72 72   being transferr
a3e0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
a3f0: 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f   pOp->p1>0 && pO
a400: 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 56 61 72 20 29  p->p1<=p->nVar )
a410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
a420: 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20 70 4f 70 2d  >p4.z==0 || pOp-
a430: 3e 70 34 2e 7a 3d 3d 73 71 6c 69 74 65 33 56 4c  >p4.z==sqlite3VL
a440: 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 2d 3e  istNumToName(p->
a450: 70 56 4c 69 73 74 2c 70 4f 70 2d 3e 70 31 29 20  pVList,pOp->p1) 
a460: 29 3b 0a 20 20 70 56 61 72 20 3d 20 26 70 2d 3e  );.  pVar = &p->
a470: 61 56 61 72 5b 70 4f 70 2d 3e 70 31 20 2d 20 31  aVar[pOp->p1 - 1
a480: 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ];.  if( sqlite3
a490: 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56  VdbeMemTooBig(pV
a4a0: 61 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ar) ){.    goto 
a4b0: 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 70  too_big;.  }.  p
a4c0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
a4d0: 3e 70 32 5d 3b 0a 20 20 69 66 28 20 56 64 62 65  >p2];.  if( Vdbe
a4e0: 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29  MemDynamic(pOut)
a4f0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
a500: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
a510: 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2c 20 70    memcpy(pOut, p
a520: 56 61 72 2c 20 4d 45 4d 43 45 4c 4c 53 49 5a 45  Var, MEMCELLSIZE
a530: 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  );.  pOut->flags
a540: 20 26 3d 20 7e 28 4d 45 4d 5f 44 79 6e 7c 4d 45   &= ~(MEM_Dyn|ME
a550: 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 70 4f 75 74  M_Ephem);.  pOut
a560: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53  ->flags |= MEM_S
a570: 74 61 74 69 63 7c 4d 45 4d 5f 46 72 6f 6d 42 69  tatic|MEM_FromBi
a580: 6e 64 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  nd;.  UPDATE_MAX
a590: 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
a5a0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
a5b0: 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50 31 20  Opcode: Move P1 
a5c0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
a5d0: 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33 5d 3d  opsis: r[P2@P3]=
a5e0: 72 5b 50 31 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d  r[P1@P3].**.** M
a5f0: 6f 76 65 20 74 68 65 20 50 33 20 76 61 6c 75 65  ove the P3 value
a600: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
a610: 2e 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72 20 69  ..P1+P3-1 over i
a620: 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  nto.** registers
a630: 20 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52   P2..P2+P3-1.  R
a640: 65 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b  egisters P1..P1+
a650: 50 33 2d 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74  P3-1 are.** left
a660: 20 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e   holding a NULL.
a670: 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
a680: 20 66 6f 72 20 72 65 67 69 73 74 65 72 20 72 61   for register ra
a690: 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50  nges.** P1..P1+P
a6a0: 33 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50  3-1 and P2..P2+P
a6b0: 33 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70 2e 20  3-1 to overlap. 
a6c0: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 0a   It is an error.
a6d0: 2a 2a 20 66 6f 72 20 50 33 20 74 6f 20 62 65 20  ** for P3 to be 
a6e0: 6c 65 73 73 20 74 68 61 6e 20 31 2e 0a 2a 2f 0a  less than 1..*/.
a6f0: 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a  case OP_Move: {.
a700: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
a710: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a720: 72 65 67 69 73 74 65 72 73 20 6c 65 66 74 20 74  registers left t
a730: 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
a740: 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p1;          /* 
a750: 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79  Register to copy
a760: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 70   from */.  int p
a770: 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  2;          /* R
a780: 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79 20  egister to copy 
a790: 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70  to */..  n = pOp
a7a0: 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20 70 4f 70  ->p3;.  p1 = pOp
a7b0: 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70  ->p1;.  p2 = pOp
a7c0: 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
a7d0: 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26 20 70  n>0 && p1>0 && p
a7e0: 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  2>0 );.  assert(
a7f0: 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b   p1+n<=p2 || p2+
a800: 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49 6e 31  n<=p1 );..  pIn1
a810: 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20   = &aMem[p1];.  
a820: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 32 5d  pOut = &aMem[p2]
a830: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
a840: 72 74 28 20 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b  rt( pOut<=&aMem[
a850: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
a860: 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20  nCursor)] );.   
a870: 20 61 73 73 65 72 74 28 20 70 49 6e 31 3c 3d 26   assert( pIn1<=&
a880: 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20  aMem[(p->nMem+1 
a890: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29  - p->nCursor)] )
a8a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
a8b0: 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29  mIsValid(pIn1) )
a8c0: 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
a8d0: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
a8e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a8f0: 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49  MemMove(pOut, pI
a900: 6e 31 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  n1);.#ifdef SQLI
a910: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28  TE_DEBUG.    if(
a920: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
a930: 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d 20 26 26 20  m>=&aMem[p1] && 
a940: 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d  pOut->pScopyFrom
a950: 3c 70 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 70  <pOut ){.      p
a960: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20  Out->pScopyFrom 
a970: 2b 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 70 31 3b  += pOp->p2 - p1;
a980: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
a990: 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65    Deephemeralize
a9a0: 28 70 4f 75 74 29 3b 0a 20 20 20 20 52 45 47 49  (pOut);.    REGI
a9b0: 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b 2b 2c  STER_TRACE(p2++,
a9c0: 20 70 4f 75 74 29 3b 0a 20 20 20 20 70 49 6e 31   pOut);.    pIn1
a9d0: 2b 2b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a  ++;.    pOut++;.
a9e0: 20 20 7d 77 68 69 6c 65 28 20 2d 2d 6e 20 29 3b    }while( --n );
a9f0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
aa00: 4f 70 63 6f 64 65 3a 20 43 6f 70 79 20 50 31 20  Opcode: Copy P1 
aa10: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
aa20: 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33 2b 31  opsis: r[P2@P3+1
aa30: 5d 3d 72 5b 50 31 40 50 33 2b 31 5d 0a 2a 2a 0a  ]=r[P1@P3+1].**.
aa40: 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ** Make a copy o
aa50: 66 20 72 65 67 69 73 74 65 72 73 20 50 31 2e 2e  f registers P1..
aa60: 50 31 2b 50 33 20 69 6e 74 6f 20 72 65 67 69 73  P1+P3 into regis
aa70: 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2e 0a  ters P2..P2+P3..
aa80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
aa90: 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 64  uction makes a d
aaa0: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
aab0: 76 61 6c 75 65 2e 20 20 41 20 64 75 70 6c 69 63  value.  A duplic
aac0: 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64 65 20 6f  ate.** is made o
aad0: 66 20 61 6e 79 20 73 74 72 69 6e 67 20 6f 72 20  f any string or 
aae0: 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74 2e 20 20  blob constant.  
aaf0: 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53 43 6f 70  See also OP_SCop
ab00: 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  y..*/.case OP_Co
ab10: 70 79 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  py: {.  int n;..
ab20: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    n = pOp->p3;. 
ab30: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
ab40: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
ab50: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
ab60: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21  .  assert( pOut!
ab70: 3d 70 49 6e 31 20 29 3b 0a 20 20 77 68 69 6c 65  =pIn1 );.  while
ab80: 28 20 31 20 29 7b 0a 20 20 20 20 6d 65 6d 41 62  ( 1 ){.    memAb
ab90: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
aba0: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
abb0: 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
abc0: 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20  opy(pOut, pIn1, 
abd0: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
abe0: 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70  Deephemeralize(p
abf0: 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Out);.#ifdef SQL
ac00: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4f  ITE_DEBUG.    pO
ac10: 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d  ut->pScopyFrom =
ac20: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 52   0;.#endif.    R
ac30: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
ac40: 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2d 6e 2c  p->p2+pOp->p3-n,
ac50: 20 70 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20   pOut);.    if( 
ac60: 28 6e 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b  (n--)==0 ) break
ac70: 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20  ;.    pOut++;.  
ac80: 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20    pIn1++;.  }.  
ac90: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
aca0: 6f 64 65 3a 20 53 43 6f 70 79 20 50 31 20 50 32  ode: SCopy P1 P2
acb0: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
acc0: 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a  is: r[P2]=r[P1].
acd0: 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68 61  **.** Make a sha
ace0: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 72 65 67  llow copy of reg
acf0: 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65  ister P1 into re
ad00: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a  gister P2..**.**
ad10: 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
ad20: 6e 20 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c 6f  n makes a shallo
ad30: 77 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61  w copy of the va
ad40: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 76 61 6c  lue.  If the val
ad50: 75 65 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e  ue.** is a strin
ad60: 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20  g or blob, then 
ad70: 74 68 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c 79  the copy is only
ad80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
ad90: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61 6e  e.** original an
ada0: 64 20 68 65 6e 63 65 20 69 66 20 74 68 65 20 6f  d hence if the o
adb0: 72 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 20  riginal changes 
adc0: 73 6f 20 77 69 6c 6c 20 74 68 65 20 63 6f 70 79  so will the copy
add0: 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20 74  ..** Worse, if t
ade0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 73 20 64  he original is d
adf0: 65 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 20  eallocated, the 
ae00: 63 6f 70 79 20 62 65 63 6f 6d 65 73 20 69 6e 76  copy becomes inv
ae10: 61 6c 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74 68  alid..** Thus th
ae20: 65 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 67  e program must g
ae30: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
ae40: 65 20 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c 20  e original will 
ae50: 6e 6f 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64 75  not change.** du
ae60: 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d  ring the lifetim
ae70: 65 20 6f 66 20 74 68 65 20 63 6f 70 79 2e 20 20  e of the copy.  
ae80: 55 73 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20 6d  Use OP_Copy to m
ae90: 61 6b 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a 2a  ake a complete.*
aea0: 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20  * copy..*/.case 
aeb0: 4f 50 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20 20  OP_SCopy: {     
aec0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
aed0: 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
aee0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75  [pOp->p1];.  pOu
aef0: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
af00: 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  2];.  assert( pO
af10: 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73 71  ut!=pIn1 );.  sq
af20: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
af30: 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49  lowCopy(pOut, pI
af40: 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  n1, MEM_Ephem);.
af50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
af60: 42 55 47 0a 20 20 70 4f 75 74 2d 3e 70 53 63 6f  BUG.  pOut->pSco
af70: 70 79 46 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 20  pyFrom = pIn1;. 
af80: 20 70 4f 75 74 2d 3e 6d 53 63 6f 70 79 46 6c 61   pOut->mScopyFla
af90: 67 73 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73  gs = pIn1->flags
afa0: 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72 65 61 6b  ;.#endif.  break
afb0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
afc0: 49 6e 74 43 6f 70 79 20 50 31 20 50 32 20 2a 20  IntCopy P1 P2 * 
afd0: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
afe0: 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a   r[P2]=r[P1].**.
aff0: 2a 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  ** Transfer the 
b000: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 68 65  integer value he
b010: 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ld in register P
b020: 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  1 into register 
b030: 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
b040: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
b050: 65 72 73 69 6f 6e 20 6f 66 20 53 43 6f 70 79 20  ersion of SCopy 
b060: 74 68 61 74 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  that works only 
b070: 66 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 76  for integer.** v
b080: 61 6c 75 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  alues..*/.case O
b090: 50 5f 49 6e 74 43 6f 70 79 3a 20 7b 20 20 20 20  P_IntCopy: {    
b0a0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
b0b0: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
b0c0: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
b0d0: 73 65 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61  sert( (pIn1->fla
b0e0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  gs & MEM_Int)!=0
b0f0: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d   );.  pOut = &aM
b100: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73  em[pOp->p2];.  s
b110: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
b120: 49 6e 74 36 34 28 70 4f 75 74 2c 20 70 49 6e 31  Int64(pOut, pIn1
b130: 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b  ->u.i);.  break;
b140: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
b150: 65 73 75 6c 74 52 6f 77 20 50 31 20 50 32 20 2a  esultRow P1 P2 *
b160: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
b170: 3a 20 6f 75 74 70 75 74 3d 72 5b 50 31 40 50 32  : output=r[P1@P2
b180: 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69  ].**.** The regi
b190: 73 74 65 72 73 20 50 31 20 74 68 72 6f 75 67 68  sters P1 through
b1a0: 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e   P1+P2-1 contain
b1b0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
b1c0: 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69  .** results. Thi
b1d0: 73 20 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20  s opcode causes 
b1e0: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  the sqlite3_step
b1f0: 28 29 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69  () call to termi
b200: 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20  nate.** with an 
b210: 53 51 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72  SQLITE_ROW retur
b220: 6e 20 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65  n code and it se
b230: 74 73 20 75 70 20 74 68 65 20 73 71 6c 69 74 65  ts up the sqlite
b240: 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74  3_stmt.** struct
b250: 75 72 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ure to provide a
b260: 63 63 65 73 73 20 74 6f 20 74 68 65 20 72 28 50  ccess to the r(P
b270: 31 29 2e 2e 72 28 50 31 2b 50 32 2d 31 29 20 76  1)..r(P1+P2-1) v
b280: 61 6c 75 65 73 20 61 73 0a 2a 2a 20 74 68 65 20  alues as.** the 
b290: 72 65 73 75 6c 74 20 72 6f 77 2e 0a 2a 2f 0a 63  result row..*/.c
b2a0: 61 73 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  ase OP_ResultRow
b2b0: 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  : {.  Mem *pMem;
b2c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
b2d0: 72 74 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  rt( p->nResColum
b2e0: 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20  n==pOp->p2 );.  
b2f0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
b300: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
b310: 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 3c 3d  Op->p1+pOp->p2<=
b320: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
b330: 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 0a 20  nCursor)+1 );.. 
b340: 20 2f 2a 20 49 66 20 74 68 69 73 20 73 74 61 74   /* If this stat
b350: 65 6d 65 6e 74 20 68 61 73 20 76 69 6f 6c 61 74  ement has violat
b360: 65 64 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  ed immediate for
b370: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
b380: 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f  ints, do.  ** no
b390: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  t return the num
b3a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 6d 6f 64 69  ber of rows modi
b3b0: 66 69 65 64 2e 20 41 6e 64 20 64 6f 20 6e 6f 74  fied. And do not
b3c0: 20 52 45 4c 45 41 53 45 20 74 68 65 20 73 74 61   RELEASE the sta
b3d0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
b3e0: 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e 65 65 64  saction. It need
b3f0: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
b400: 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53  ack.  */.  if( S
b410: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
b420: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
b430: 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a 20 20 20  Fk(p, 0)) ){.   
b440: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 66 6c 61   assert( db->fla
b450: 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  gs&SQLITE_CountR
b460: 6f 77 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ows );.    asser
b470: 74 28 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  t( p->usesStmtJo
b480: 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 67 6f 74  urnal );.    got
b490: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
b4a0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
b4b0: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 43 6f  If the SQLITE_Co
b4c0: 75 6e 74 52 6f 77 73 20 66 6c 61 67 20 69 73 20  untRows flag is 
b4d0: 73 65 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66  set in sqlite3.f
b4e0: 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e 20  lags mask, then 
b4f0: 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74 65 6d  .  ** DML statem
b500: 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68 69 73  ents invoke this
b510: 20 6f 70 63 6f 64 65 20 74 6f 20 72 65 74 75 72   opcode to retur
b520: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b530: 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  rows .  ** modif
b540: 69 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ied to the user.
b550: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   This is the onl
b560: 79 20 77 61 79 20 74 68 61 74 20 61 20 56 4d 20  y way that a VM 
b570: 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e 73 20  that.  ** opens 
b580: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
b590: 73 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e 76 6f  saction may invo
b5a0: 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a  ke this opcode..
b5b0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73    **.  ** In cas
b5c0: 65 20 74 68 69 73 20 69 73 20 73 75 63 68 20 61  e this is such a
b5d0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c 6f 73   statement, clos
b5e0: 65 20 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20  e any statement 
b5f0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
b600: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
b610: 56 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  VM before return
b620: 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  ing control to t
b630: 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69 73  he user. This is
b640: 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   to.  ** ensure 
b650: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2d 74  that statement-t
b660: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
b670: 61 6c 77 61 79 73 20 6e 65 73 74 65 64 2c 20 6e  always nested, n
b680: 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 2e 0a  ot overlapping..
b690: 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 6e    ** If the open
b6a0: 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
b6b0: 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6c  action is not cl
b6c0: 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65 6e 20  osed here, then 
b6d0: 74 68 65 20 75 73 65 72 0a 20 20 2a 2a 20 6d 61  the user.  ** ma
b6e0: 79 20 73 74 65 70 20 61 6e 6f 74 68 65 72 20 56  y step another V
b6f0: 4d 20 74 68 61 74 20 6f 70 65 6e 73 20 69 74 73  M that opens its
b700: 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74 20 74   own statement t
b710: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
b720: 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64 20 74  .  ** may lead t
b730: 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73 74  o overlapping st
b740: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
b750: 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
b760: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  The statement tr
b770: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 76  ansaction is nev
b780: 65 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20 74  er a top-level t
b790: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48 65 6e  ransaction.  Hen
b7a0: 63 65 0a 20 20 2a 2a 20 74 68 65 20 52 45 4c 45  ce.  ** the RELE
b7b0: 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77 20 63  ASE call below c
b7c0: 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 20  an never fail.. 
b7d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
b7e0: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 7c  >iStatement==0 |
b7f0: 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  | db->flags&SQLI
b800: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a  TE_CountRows );.
b810: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
b820: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
b830: 28 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  (p, SAVEPOINT_RE
b840: 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74  LEASE);.  assert
b850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b860: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64  );..  /* Invalid
b870: 61 74 65 20 61 6c 6c 20 65 70 68 65 6d 65 72 61  ate all ephemera
b880: 6c 20 63 75 72 73 6f 72 20 72 6f 77 20 63 61 63  l cursor row cac
b890: 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63 61 63 68  hes */.  p->cach
b8a0: 65 43 74 72 20 3d 20 28 70 2d 3e 63 61 63 68 65  eCtr = (p->cache
b8b0: 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f  Ctr + 2)|1;..  /
b8c0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
b8d0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63  results of the c
b8e0: 75 72 72 65 6e 74 20 72 6f 77 20 61 72 65 20 5c  urrent row are \
b8f0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 0a 20  000 terminated. 
b900: 20 2a 2a 20 61 6e 64 20 68 61 76 65 20 61 6e 20   ** and have an 
b910: 61 73 73 69 67 6e 65 64 20 74 79 70 65 2e 20 20  assigned type.  
b920: 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
b930: 64 65 2d 65 70 68 65 6d 65 72 61 6c 69 7a 65 64  de-ephemeralized
b940: 20 61 73 0a 20 20 2a 2a 20 61 20 73 69 64 65 20   as.  ** a side 
b950: 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 70  effect..  */.  p
b960: 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74  Mem = p->pResult
b970: 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Set = &aMem[pOp-
b980: 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >p1];.  for(i=0;
b990: 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29   i<pOp->p2; i++)
b9a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  {.    assert( me
b9b0: 6d 49 73 56 61 6c 69 64 28 26 70 4d 65 6d 5b 69  mIsValid(&pMem[i
b9c0: 5d 29 20 29 3b 0a 20 20 20 20 44 65 65 70 68 65  ]) );.    Deephe
b9d0: 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65 6d 5b 69  meralize(&pMem[i
b9e0: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
b9f0: 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26  (pMem[i].flags &
ba00: 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d 30 0a 20   MEM_Ephem)==0. 
ba10: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
ba20: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28  Mem[i].flags & (
ba30: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
ba40: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ))==0 );.    sql
ba50: 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65  ite3VdbeMemNulTe
ba60: 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d 5b 69 5d  rminate(&pMem[i]
ba70: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
ba80: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c  TRACE(pOp->p1+i,
ba90: 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a   &pMem[i]);.  }.
baa0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bab0: 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f  Failed ) goto no
bac0: 5f 6d 65 6d 3b 0a 0a 20 20 69 66 28 20 64 62 2d  _mem;..  if( db-
bad0: 3e 6d 54 72 61 63 65 20 26 20 53 51 4c 49 54 45  >mTrace & SQLITE
bae0: 5f 54 52 41 43 45 5f 52 4f 57 20 29 7b 0a 20 20  _TRACE_ROW ){.  
baf0: 20 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c    db->xTrace(SQL
bb00: 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 2c 20 64  ITE_TRACE_ROW, d
bb10: 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 70 2c  b->pTraceArg, p,
bb20: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   0);.  }..  /* R
bb30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f 57  eturn SQLITE_ROW
bb40: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d 20  .  */.  p->pc = 
bb50: 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
bb60: 20 2b 20 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c   + 1;.  rc = SQL
bb70: 49 54 45 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20  ITE_ROW;.  goto 
bb80: 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a  vdbe_return;.}..
bb90: 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61  /* Opcode: Conca
bba0: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
bbb0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
bbc0: 5d 3d 72 5b 50 32 5d 2b 72 5b 50 31 5d 0a 2a 2a  ]=r[P2]+r[P1].**
bbd0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 65 78 74  .** Add the text
bbe0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
bbf0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
bc00: 74 68 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20 72  the text in.** r
bc10: 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 73  egister P2 and s
bc20: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
bc30: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
bc40: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  ** If either the
bc50: 20 50 31 20 6f 72 20 50 32 20 74 65 78 74 20 61   P1 or P2 text a
bc60: 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f  re NULL then sto
bc70: 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a  re NULL in P3..*
bc80: 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50 32 20 7c  *.**   P3 = P2 |
bc90: 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  | P1.**.** It is
bca0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31 20   illegal for P1 
bcb0: 61 6e 64 20 50 33 20 74 6f 20 62 65 20 74 68 65  and P3 to be the
bcc0: 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 20   same register. 
bcd0: 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69 66  Sometimes,.** if
bce0: 20 50 33 20 69 73 20 74 68 65 20 73 61 6d 65 20   P3 is the same 
bcf0: 72 65 67 69 73 74 65 72 20 61 73 20 50 32 2c 20  register as P2, 
bd00: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
bd10: 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74 6f  on is able.** to
bd20: 20 61 76 6f 69 64 20 61 20 6d 65 6d 63 70 79 28   avoid a memcpy(
bd30: 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  )..*/.case OP_Co
bd40: 6e 63 61 74 3a 20 7b 20 20 20 20 20 20 20 20 20  ncat: {         
bd50: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
bd60: 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e 32  CONCAT, in1, in2
bd70: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20  , out3 */.  i64 
bd80: 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e 31 20 3d  nByte;..  pIn1 =
bd90: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
bda0: 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
bdb0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74  pOp->p2];.  pOut
bdc0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
bdd0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
bde0: 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66 28  1!=pOut );.  if(
bdf0: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20   (pIn1->flags | 
be00: 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d  pIn2->flags) & M
be10: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
be20: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
be30: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20  Null(pOut);.    
be40: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
be50: 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31   ExpandBlob(pIn1
be60: 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c 6f 62 28  ) || ExpandBlob(
be70: 70 49 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  pIn2) ) goto no_
be80: 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67 69 66 79  mem;.  Stringify
be90: 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn1, encoding)
bea0: 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70 49  ;.  Stringify(pI
beb0: 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n2, encoding);. 
bec0: 20 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e 6e   nByte = pIn1->n
bed0: 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66   + pIn2->n;.  if
bee0: 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d  ( nByte>db->aLim
bef0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
bf00: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
bf10: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
bf20: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
bf30: 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20  beMemGrow(pOut, 
bf40: 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20 70 4f  (int)nByte+2, pO
bf50: 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20 20 20  ut==pIn2) ){.   
bf60: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
bf70: 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  }.  MemSetTypeFl
bf80: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72  ag(pOut, MEM_Str
bf90: 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 21 3d 70  );.  if( pOut!=p
bfa0: 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  In2 ){.    memcp
bfb0: 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d  y(pOut->z, pIn2-
bfc0: 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20  >z, pIn2->n);.  
bfd0: 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 4f 75 74  }.  memcpy(&pOut
bfe0: 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70 49  ->z[pIn2->n], pI
bff0: 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29 3b  n1->z, pIn1->n);
c000: 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65  .  pOut->z[nByte
c010: 5d 3d 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e  ]=0;.  pOut->z[n
c020: 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  Byte+1] = 0;.  p
c030: 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Out->flags |= ME
c040: 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e  M_Term;.  pOut->
c050: 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a  n = (int)nByte;.
c060: 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e    pOut->enc = en
c070: 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45  coding;.  UPDATE
c080: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
c090: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
c0a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 20  ./* Opcode: Add 
c0b0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
c0c0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
c0d0: 72 5b 50 31 5d 2b 72 5b 50 32 5d 0a 2a 2a 0a 2a  r[P1]+r[P2].**.*
c0e0: 2a 20 41 64 64 20 74 68 65 20 76 61 6c 75 65 20  * Add the value 
c0f0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
c100: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  o the value in r
c110: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e  egister P2.** an
c120: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
c130: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
c140: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
c150: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
c160: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
c170: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
c180: 20 4d 75 6c 74 69 70 6c 79 20 50 31 20 50 32 20   Multiply P1 P2 
c190: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
c1a0: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2a  is: r[P3]=r[P1]*
c1b0: 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d  r[P2].**.**.** M
c1c0: 75 6c 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75  ultiply the valu
c1d0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
c1e0: 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e   by the value in
c1f0: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20   register P2.** 
c200: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
c210: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
c220: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
c230: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
c240: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
c250: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
c260: 65 3a 20 53 75 62 74 72 61 63 74 20 50 31 20 50  e: Subtract P1 P
c270: 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
c280: 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32  psis: r[P3]=r[P2
c290: 5d 2d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 75  ]-r[P1].**.** Su
c2a0: 62 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  btract the value
c2b0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
c2c0: 66 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69  from the value i
c2d0: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
c2e0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
c2f0: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
c300: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
c310: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
c320: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
c330: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
c340: 64 65 3a 20 44 69 76 69 64 65 20 50 31 20 50 32  de: Divide P1 P2
c350: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
c360: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d  sis: r[P3]=r[P2]
c370: 2f 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 44 69 76  /r[P1].**.** Div
c380: 69 64 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ide the value in
c390: 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20   register P1 by 
c3a0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
c3b0: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
c3c0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
c3d0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
c3e0: 28 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20 74  (P3=P2/P1). If t
c3f0: 68 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20  he value in .** 
c400: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a  register P1 is z
c410: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
c420: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66  sult is NULL. If
c430: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
c440: 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72   .** NULL, the r
c450: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
c460: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d  /./* Opcode: Rem
c470: 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33 20  ainder P1 P2 P3 
c480: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
c490: 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 25 72 5b 50   r[P3]=r[P2]%r[P
c4a0: 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  1].**.** Compute
c4b0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 61   the remainder a
c4c0: 66 74 65 72 20 69 6e 74 65 67 65 72 20 72 65 67  fter integer reg
c4d0: 69 73 74 65 72 20 50 32 20 69 73 20 64 69 76 69  ister P2 is divi
c4e0: 64 65 64 20 62 79 20 0a 2a 2a 20 72 65 67 69 73  ded by .** regis
c4f0: 74 65 72 20 50 31 20 61 6e 64 20 73 74 6f 72 65  ter P1 and store
c500: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
c510: 65 67 69 73 74 65 72 20 50 33 2e 20 0a 2a 2a 20  egister P3. .** 
c520: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  If the value in 
c530: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a  register P1 is z
c540: 65 72 6f 20 74 68 65 20 72 65 73 75 6c 74 20 69  ero the result i
c550: 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69  s NULL..** If ei
c560: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
c570: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
c580: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73   is NULL..*/.cas
c590: 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20  e OP_Add:       
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
c5b0: 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20  ame as TK_PLUS, 
c5c0: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
c5d0: 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61  /.case OP_Subtra
c5e0: 63 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ct:             
c5f0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d   /* same as TK_M
c600: 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  INUS, in1, in2, 
c610: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
c620: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 20 20 20  Multiply:       
c630: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
c640: 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20  s TK_STAR, in1, 
c650: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
c660: 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 20 20 20  e OP_Divide:    
c670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
c680: 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c  ame as TK_SLASH,
c690: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
c6a0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d 61 69  */.case OP_Remai
c6b0: 6e 64 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20  nder: {         
c6c0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
c6d0: 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  REM, in1, in2, o
c6e0: 75 74 33 20 2a 2f 0a 20 20 63 68 61 72 20 62 49  ut3 */.  char bI
c6f0: 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53 74 61 72  ntint;   /* Star
c700: 74 65 64 20 6f 75 74 20 61 73 20 74 77 6f 20 69  ted out as two i
c710: 6e 74 65 67 65 72 20 6f 70 65 72 61 6e 64 73 20  nteger operands 
c720: 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 3b 20  */.  u16 flags; 
c730: 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
c740: 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20 66 72 6f   MEM_* flags fro
c750: 6d 20 62 6f 74 68 20 69 6e 70 75 74 73 20 2a 2f  m both inputs */
c760: 0a 20 20 75 31 36 20 74 79 70 65 31 3b 20 20 20  .  u16 type1;   
c770: 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79     /* Numeric ty
c780: 70 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61  pe of left opera
c790: 6e 64 20 2a 2f 0a 20 20 75 31 36 20 74 79 70 65  nd */.  u16 type
c7a0: 32 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72  2;      /* Numer
c7b0: 69 63 20 74 79 70 65 20 6f 66 20 72 69 67 68 74  ic type of right
c7c0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36   operand */.  i6
c7d0: 34 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  4 iA;         /*
c7e0: 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f   Integer value o
c7f0: 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  f left operand *
c800: 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20 20  /.  i64 iB;     
c810: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76      /* Integer v
c820: 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f 70  alue of right op
c830: 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c  erand */.  doubl
c840: 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52 65  e rA;      /* Re
c850: 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74  al value of left
c860: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f   operand */.  do
c870: 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f 2a  uble rB;      /*
c880: 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 72   Real value of r
c890: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
c8a0: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
c8b0: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74 79 70 65  pOp->p1];.  type
c8c0: 31 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65 28  1 = numericType(
c8d0: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20  pIn1);.  pIn2 = 
c8e0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
c8f0: 20 20 74 79 70 65 32 20 3d 20 6e 75 6d 65 72 69    type2 = numeri
c900: 63 54 79 70 65 28 70 49 6e 32 29 3b 0a 20 20 70  cType(pIn2);.  p
c910: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
c920: 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20  >p3];.  flags = 
c930: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49  pIn1->flags | pI
c940: 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  n2->flags;.  if(
c950: 20 28 74 79 70 65 31 20 26 20 74 79 70 65 32 20   (type1 & type2 
c960: 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  & MEM_Int)!=0 ){
c970: 0a 20 20 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e  .    iA = pIn1->
c980: 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d 20 70 49  u.i;.    iB = pI
c990: 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 62 49 6e  n2->u.i;.    bIn
c9a0: 74 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 73 77  tint = 1;.    sw
c9b0: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
c9c0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
c9d0: 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 69 66  OP_Add:       if
c9e0: 28 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36  ( sqlite3AddInt6
c9f0: 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f  4(&iB,iA) ) goto
ca00: 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b   fp_math;  break
ca10: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
ca20: 53 75 62 74 72 61 63 74 3a 20 20 69 66 28 20 73  Subtract:  if( s
ca30: 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34 28 26  qlite3SubInt64(&
ca40: 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70  iB,iA) ) goto fp
ca50: 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20  _math;  break;. 
ca60: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c       case OP_Mul
ca70: 74 69 70 6c 79 3a 20 20 69 66 28 20 73 71 6c 69  tiply:  if( sqli
ca80: 74 65 33 4d 75 6c 49 6e 74 36 34 28 26 69 42 2c  te3MulInt64(&iB,
ca90: 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  iA) ) goto fp_ma
caa0: 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  th;  break;.    
cab0: 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65    case OP_Divide
cac0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
cad0: 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69  iA==0 ) goto ari
cae0: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
caf0: 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  s_null;.        
cb00: 69 66 28 20 69 41 3d 3d 2d 31 20 26 26 20 69 42  if( iA==-1 && iB
cb10: 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
cb20: 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b   ) goto fp_math;
cb30: 0a 20 20 20 20 20 20 20 20 69 42 20 2f 3d 20 69  .        iB /= i
cb40: 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  A;.        break
cb50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cb60: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
cb70: 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67     if( iA==0 ) g
cb80: 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72  oto arithmetic_r
cb90: 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20  esult_is_null;. 
cba0: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 2d         if( iA==-
cbb0: 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20 20  1 ) iA = 1;.    
cbc0: 20 20 20 20 69 42 20 25 3d 20 69 41 3b 0a 20 20      iB %= iA;.  
cbd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cbe0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
cbf0: 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a 20  Out->u.i = iB;. 
cc00: 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61     MemSetTypeFla
cc10: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29  g(pOut, MEM_Int)
cc20: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66  ;.  }else if( (f
cc30: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
cc40: 21 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  !=0 ){.    goto 
cc50: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
cc60: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 7d 65 6c  t_is_null;.  }el
cc70: 73 65 7b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20  se{.    bIntint 
cc80: 3d 20 30 3b 0a 66 70 5f 6d 61 74 68 3a 0a 20 20  = 0;.fp_math:.  
cc90: 20 20 72 41 20 3d 20 73 71 6c 69 74 65 33 56 64    rA = sqlite3Vd
cca0: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31  beRealValue(pIn1
ccb0: 29 3b 0a 20 20 20 20 72 42 20 3d 20 73 71 6c 69  );.    rB = sqli
ccc0: 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65  te3VdbeRealValue
ccd0: 28 70 49 6e 32 29 3b 0a 20 20 20 20 73 77 69 74  (pIn2);.    swit
cce0: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
ccf0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
cd00: 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20 72 42  _Add:         rB
cd10: 20 2b 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72   += rA;       br
cd20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
cd30: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20  OP_Subtract:    
cd40: 72 42 20 2d 3d 20 72 41 3b 20 20 20 20 20 20 20  rB -= rA;       
cd50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
cd60: 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20  e OP_Multiply:  
cd70: 20 20 72 42 20 2a 3d 20 72 41 3b 20 20 20 20 20    rB *= rA;     
cd80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
cd90: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b  ase OP_Divide: {
cda0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75  .        /* (dou
cdb0: 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
cdc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
cdd0: 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
cde0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 41  /.        if( rA
cdf0: 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29 20 67 6f  ==(double)0 ) go
ce00: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
ce10: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
ce20: 20 20 20 20 20 20 72 42 20 2f 3d 20 72 41 3b 0a        rB /= rA;.
ce30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ce40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
ce50: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
ce60: 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  iA = sqlite3Vdbe
ce70: 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a  IntValue(pIn1);.
ce80: 20 20 20 20 20 20 20 20 69 42 20 3d 20 73 71 6c          iB = sql
ce90: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
cea0: 28 70 49 6e 32 29 3b 0a 20 20 20 20 20 20 20 20  (pIn2);.        
ceb0: 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f  if( iA==0 ) goto
cec0: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
ced0: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
cee0: 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29      if( iA==-1 )
cef0: 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   iA = 1;.       
cf00: 20 72 42 20 3d 20 28 64 6f 75 62 6c 65 29 28 69   rB = (double)(i
cf10: 42 20 25 20 69 41 29 3b 0a 20 20 20 20 20 20 20  B % iA);.       
cf20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
cf30: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
cf40: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
cf50: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 70 4f 75 74  G_POINT.    pOut
cf60: 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a 20 20 20 20  ->u.i = rB;.    
cf70: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
cf80: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23  Out, MEM_Int);.#
cf90: 65 6c 73 65 0a 20 20 20 20 69 66 28 20 73 71 6c  else.    if( sql
cfa0: 69 74 65 33 49 73 4e 61 4e 28 72 42 29 20 29 7b  ite3IsNaN(rB) ){
cfb0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 72 69 74  .      goto arit
cfc0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
cfd0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _null;.    }.   
cfe0: 20 70 4f 75 74 2d 3e 75 2e 72 20 3d 20 72 42 3b   pOut->u.r = rB;
cff0: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
d000: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 52 65  lag(pOut, MEM_Re
d010: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 28 74  al);.    if( ((t
d020: 79 70 65 31 7c 74 79 70 65 32 29 26 4d 45 4d 5f  ype1|type2)&MEM_
d030: 52 65 61 6c 29 3d 3d 30 20 26 26 20 21 62 49 6e  Real)==0 && !bIn
d040: 74 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  tint ){.      sq
d050: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
d060: 41 66 66 69 6e 69 74 79 28 70 4f 75 74 29 3b 0a  Affinity(pOut);.
d070: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
d080: 0a 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74 68  .  break;..arith
d090: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
d0a0: 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56  null:.  sqlite3V
d0b0: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
d0c0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
d0d0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c  ./* Opcode: Coll
d0e0: 53 65 71 20 50 31 20 2a 20 2a 20 50 34 0a 2a 2a  Seq P1 * * P4.**
d0f0: 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
d100: 74 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53 65 71  ter to a CollSeq
d110: 20 6f 62 6a 65 63 74 2e 20 49 66 20 74 68 65 20   object. If the 
d120: 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 20 75  next call to a u
d130: 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ser function.** 
d140: 6f 72 20 61 67 67 72 65 67 61 74 65 20 63 61 6c  or aggregate cal
d150: 6c 73 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e  ls sqlite3GetFun
d160: 63 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68 69 73  cCollSeq(), this
d170: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d180: 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72  nce will.** be r
d190: 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69 73  eturned. This is
d1a0: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 75 69   used by the bui
d1b0: 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d 61 78  lt-in min(), max
d1c0: 28 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29 0a  () and nullif().
d1d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  ** functions..**
d1e0: 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 74  .** If P1 is not
d1f0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69   zero, then it i
d200: 73 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  s a register tha
d210: 74 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6d  t a subsequent m
d220: 69 6e 28 29 20 6f 72 0a 2a 2a 20 6d 61 78 28 29  in() or.** max()
d230: 20 61 67 67 72 65 67 61 74 65 20 77 69 6c 6c 20   aggregate will 
d240: 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20  set to 1 if the 
d250: 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 6e  current row is n
d260: 6f 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  ot the minimum o
d270: 72 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20 20 54  r.** maximum.  T
d280: 68 65 20 50 31 20 72 65 67 69 73 74 65 72 20 69  he P1 register i
d290: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
d2a0: 20 30 20 62 79 20 74 68 69 73 20 69 6e 73 74 72   0 by this instr
d2b0: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  uction..**.** Th
d2c0: 65 20 69 6e 74 65 72 66 61 63 65 20 75 73 65 64  e interface used
d2d0: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
d2e0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 66  tation of the af
d2f0: 6f 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66 75 6e  orementioned fun
d300: 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74  ctions.** to ret
d310: 72 69 65 76 65 20 74 68 65 20 63 6f 6c 6c 61 74  rieve the collat
d320: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 65 74  ion sequence set
d330: 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20   by this opcode 
d340: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
d350: 0a 2a 2a 20 70 75 62 6c 69 63 6c 79 2e 20 20 4f  .** publicly.  O
d360: 6e 6c 79 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  nly built-in fun
d370: 63 74 69 6f 6e 73 20 68 61 76 65 20 61 63 63 65  ctions have acce
d380: 73 73 20 74 6f 20 74 68 69 73 20 66 65 61 74 75  ss to this featu
d390: 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  re..*/.case OP_C
d3a0: 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73 65  ollSeq: {.  asse
d3b0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
d3c0: 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20  =P4_COLLSEQ );. 
d3d0: 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a   if( pOp->p1 ){.
d3e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
d3f0: 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d  emSetInt64(&aMem
d400: 5b 70 4f 70 2d 3e 70 31 5d 2c 20 30 29 3b 0a 20  [pOp->p1], 0);. 
d410: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
d420: 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 41 6e 64  * Opcode: BitAnd
d430: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
d440: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
d450: 3d 72 5b 50 31 5d 26 72 5b 50 32 5d 0a 2a 2a 0a  =r[P1]&r[P2].**.
d460: 2a 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74 2d  ** Take the bit-
d470: 77 69 73 65 20 41 4e 44 20 6f 66 20 74 68 65 20  wise AND of the 
d480: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
d490: 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  er P1 and P2 and
d4a0: 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65  .** store the re
d4b0: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
d4c0: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
d4d0: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
d4e0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
d4f0: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
d500: 65 3a 20 42 69 74 4f 72 20 50 31 20 50 32 20 50  e: BitOr P1 P2 P
d510: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
d520: 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 7c 72  s: r[P3]=r[P1]|r
d530: 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20  [P2].**.** Take 
d540: 74 68 65 20 62 69 74 2d 77 69 73 65 20 4f 52 20  the bit-wise OR 
d550: 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  of the values in
d560: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
d570: 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65   P2 and.** store
d580: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
d590: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
d5a0: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
d5b0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
d5c0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
d5d0: 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 4c  * Opcode: ShiftL
d5e0: 65 66 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  eft P1 P2 P3 * *
d5f0: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
d600: 50 33 5d 3d 72 5b 50 32 5d 3c 3c 72 5b 50 31 5d  P3]=r[P2]<<r[P1]
d610: 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65  .**.** Shift the
d620: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69   integer value i
d630: 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 74 6f  n register P2 to
d640: 20 74 68 65 20 6c 65 66 74 20 62 79 20 74 68 65   the left by the
d650: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  .** number of bi
d660: 74 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ts specified by 
d670: 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72  the integer in r
d680: 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53  egister P1..** S
d690: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
d6a0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
d6b0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
d6c0: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
d6d0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
d6e0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68  */./* Opcode: Sh
d6f0: 69 66 74 52 69 67 68 74 20 50 31 20 50 32 20 50  iftRight P1 P2 P
d700: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
d710: 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 3e 3e  s: r[P3]=r[P2]>>
d720: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66  r[P1].**.** Shif
d730: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  t the integer va
d740: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
d750: 50 32 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  P2 to the right 
d760: 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  by the.** number
d770: 20 6f 66 20 62 69 74 73 20 73 70 65 63 69 66 69   of bits specifi
d780: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65  ed by the intege
d790: 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  r in register P1
d7a0: 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72  ..** Store the r
d7b0: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
d7c0: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
d7d0: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
d7e0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
d7f0: 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  NULL..*/.case OP
d800: 5f 42 69 74 41 6e 64 3a 20 20 20 20 20 20 20 20  _BitAnd:        
d810: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
d820: 20 61 73 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69   as TK_BITAND, i
d830: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
d840: 0a 63 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20  .case OP_BitOr: 
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42   /* same as TK_B
d870: 49 54 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  ITOR, in1, in2, 
d880: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
d890: 53 68 69 66 74 4c 65 66 74 3a 20 20 20 20 20 20  ShiftLeft:      
d8a0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
d8b0: 61 73 20 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e  as TK_LSHIFT, in
d8c0: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
d8d0: 63 61 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67  case OP_ShiftRig
d8e0: 68 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ht: {           
d8f0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 53  /* same as TK_RS
d900: 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  HIFT, in1, in2, 
d910: 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 69 41  out3 */.  i64 iA
d920: 3b 0a 20 20 75 36 34 20 75 41 3b 0a 20 20 69 36  ;.  u64 uA;.  i6
d930: 34 20 69 42 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a  4 iB;.  u8 op;..
d940: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
d950: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20  Op->p1];.  pIn2 
d960: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
d970: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
d980: 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28  [pOp->p3];.  if(
d990: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20   (pIn1->flags | 
d9a0: 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d  pIn2->flags) & M
d9b0: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
d9c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
d9d0: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20  Null(pOut);.    
d9e0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 41 20  break;.  }.  iA 
d9f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
da00: 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 69  Value(pIn2);.  i
da10: 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  B = sqlite3VdbeI
da20: 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20  ntValue(pIn1);. 
da30: 20 6f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64   op = pOp->opcod
da40: 65 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f  e;.  if( op==OP_
da50: 42 69 74 41 6e 64 20 29 7b 0a 20 20 20 20 69 41  BitAnd ){.    iA
da60: 20 26 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20   &= iB;.  }else 
da70: 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72  if( op==OP_BitOr
da80: 20 29 7b 0a 20 20 20 20 69 41 20 7c 3d 20 69 42   ){.    iA |= iB
da90: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 42  ;.  }else if( iB
daa0: 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
dab0: 74 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 52  t( op==OP_ShiftR
dac0: 69 67 68 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53  ight || op==OP_S
dad0: 68 69 66 74 4c 65 66 74 20 29 3b 0a 0a 20 20 20  hiftLeft );..   
dae0: 20 2f 2a 20 49 66 20 73 68 69 66 74 69 6e 67 20   /* If shifting 
daf0: 62 79 20 61 20 6e 65 67 61 74 69 76 65 20 61 6d  by a negative am
db00: 6f 75 6e 74 2c 20 73 68 69 66 74 20 69 6e 20 74  ount, shift in t
db10: 68 65 20 6f 74 68 65 72 20 64 69 72 65 63 74 69  he other directi
db20: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 42  on */.    if( iB
db30: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
db40: 72 74 28 20 4f 50 5f 53 68 69 66 74 52 69 67 68  rt( OP_ShiftRigh
db50: 74 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 2b  t==OP_ShiftLeft+
db60: 31 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  1 );.      op = 
db70: 32 2a 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 2b  2*OP_ShiftLeft +
db80: 20 31 20 2d 20 6f 70 3b 0a 20 20 20 20 20 20 69   1 - op;.      i
db90: 42 20 3d 20 69 42 3e 28 2d 36 34 29 20 3f 20 2d  B = iB>(-64) ? -
dba0: 69 42 20 3a 20 36 34 3b 0a 20 20 20 20 7d 0a 0a  iB : 64;.    }..
dbb0: 20 20 20 20 69 66 28 20 69 42 3e 3d 36 34 20 29      if( iB>=64 )
dbc0: 7b 0a 20 20 20 20 20 20 69 41 20 3d 20 28 69 41  {.      iA = (iA
dbd0: 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68  >=0 || op==OP_Sh
dbe0: 69 66 74 4c 65 66 74 29 20 3f 20 30 20 3a 20 2d  iftLeft) ? 0 : -
dbf0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
dc00: 20 20 20 20 6d 65 6d 63 70 79 28 26 75 41 2c 20      memcpy(&uA, 
dc10: 26 69 41 2c 20 73 69 7a 65 6f 66 28 75 41 29 29  &iA, sizeof(uA))
dc20: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
dc30: 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 7b 0a  OP_ShiftLeft ){.
dc40: 20 20 20 20 20 20 20 20 75 41 20 3c 3c 3d 20 69          uA <<= i
dc50: 42 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  B;.      }else{.
dc60: 20 20 20 20 20 20 20 20 75 41 20 3e 3e 3d 20 69          uA >>= i
dc70: 42 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  B;.        /* Si
dc80: 67 6e 2d 65 78 74 65 6e 64 20 6f 6e 20 61 20 72  gn-extend on a r
dc90: 69 67 68 74 20 73 68 69 66 74 20 6f 66 20 61 20  ight shift of a 
dca0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
dcb0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
dcc0: 41 3c 30 20 29 20 75 41 20 7c 3d 20 28 28 28 28  A<0 ) uA |= ((((
dcd0: 75 36 34 29 30 78 66 66 66 66 66 66 66 66 29 3c  u64)0xffffffff)<
dce0: 3c 33 32 29 7c 30 78 66 66 66 66 66 66 66 66 29  <32)|0xffffffff)
dcf0: 20 3c 3c 20 28 36 34 2d 69 42 29 3b 0a 20 20 20   << (64-iB);.   
dd00: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
dd10: 79 28 26 69 41 2c 20 26 75 41 2c 20 73 69 7a 65  y(&iA, &uA, size
dd20: 6f 66 28 69 41 29 29 3b 0a 20 20 20 20 7d 0a 20  of(iA));.    }. 
dd30: 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d   }.  pOut->u.i =
dd40: 20 69 41 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70   iA;.  MemSetTyp
dd50: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
dd60: 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Int);.  break;.}
dd70: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64  ../* Opcode: Add
dd80: 49 6d 6d 20 20 50 31 20 50 32 20 2a 20 2a 20 2a  Imm  P1 P2 * * *
dd90: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
dda0: 50 31 5d 3d 72 5b 50 31 5d 2b 50 32 0a 2a 2a 20  P1]=r[P1]+P2.** 
ddb0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 63 6f 6e 73  .** Add the cons
ddc0: 74 61 6e 74 20 50 32 20 74 6f 20 74 68 65 20 76  tant P2 to the v
ddd0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
dde0: 20 50 31 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75   P1..** The resu
ddf0: 6c 74 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20  lt is always an 
de00: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  integer..**.** T
de10: 6f 20 66 6f 72 63 65 20 61 6e 79 20 72 65 67 69  o force any regi
de20: 73 74 65 72 20 74 6f 20 62 65 20 61 6e 20 69 6e  ster to be an in
de30: 74 65 67 65 72 2c 20 6a 75 73 74 20 61 64 64 20  teger, just add 
de40: 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64  0..*/.case OP_Ad
de50: 64 49 6d 6d 3a 20 7b 20 20 20 20 20 20 20 20 20  dImm: {         
de60: 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70     /* in1 */.  p
de70: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
de80: 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  >p1];.  memAbout
de90: 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31  ToChange(p, pIn1
dea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
deb0: 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49  MemIntegerify(pI
dec0: 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69  n1);.  pIn1->u.i
ded0: 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 62   += pOp->p2;.  b
dee0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
def0: 64 65 3a 20 4d 75 73 74 42 65 49 6e 74 20 50 31  de: MustBeInt P1
df00: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a   P2 * * *.** .**
df10: 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65   Force the value
df20: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
df30: 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  to be an integer
df40: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a  .  If the value.
df50: 2a 2a 20 69 6e 20 50 31 20 69 73 20 6e 6f 74 20  ** in P1 is not 
df60: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 63  an integer and c
df70: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  annot be convert
df80: 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67  ed into an integ
df90: 65 72 0a 2a 2a 20 77 69 74 68 6f 75 74 20 64 61  er.** without da
dfa0: 74 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20 6a 75  ta loss, then ju
dfb0: 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
dfc0: 6f 20 50 32 2c 20 6f 72 20 69 66 20 50 32 3d 3d  o P2, or if P2==
dfd0: 30 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51  0.** raise an SQ
dfe0: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 65 78  LITE_MISMATCH ex
dff0: 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ception..*/.case
e000: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a 20 7b   OP_MustBeInt: {
e010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
e020: 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  ump, in1 */.  pI
e030: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
e040: 70 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  p1];.  if( (pIn1
e050: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
e060: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70  t)==0 ){.    app
e070: 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c  lyAffinity(pIn1,
e080: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
e090: 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  RIC, encoding);.
e0a0: 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
e0b0: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d  lags & MEM_Int)=
e0c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65  =0 ){.      Vdbe
e0d0: 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 20 32  BranchTaken(1, 2
e0e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  );.      if( pOp
e0f0: 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->p2==0 ){.     
e100: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d     rc = SQLITE_M
e110: 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20  ISMATCH;.       
e120: 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
e130: 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
e140: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67  }else{.        g
e150: 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
e160: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e170: 7d 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  }.  VdbeBranchTa
e180: 6b 65 6e 28 30 2c 20 32 29 3b 0a 20 20 4d 65 6d  ken(0, 2);.  Mem
e190: 53 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31  SetTypeFlag(pIn1
e1a0: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72  , MEM_Int);.  br
e1b0: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
e1c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
e1d0: 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70  TING_POINT./* Op
e1e0: 63 6f 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69  code: RealAffini
e1f0: 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  ty P1 * * * *.**
e200: 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20  .** If register 
e210: 50 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65  P1 holds an inte
e220: 67 65 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74  ger convert it t
e230: 6f 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  o a real value..
e240: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
e250: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 65  e is used when e
e260: 78 74 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d  xtracting inform
e270: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c  ation from a col
e280: 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  umn that.** has 
e290: 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20  REAL affinity.  
e2a0: 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  Such column valu
e2b0: 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  es may still be 
e2c0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74  stored as.** int
e2d0: 65 67 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65  egers, for space
e2e0: 20 65 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74   efficiency, but
e2f0: 20 61 66 74 65 72 20 65 78 74 72 61 63 74 69 6f   after extractio
e300: 6e 20 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a  n we want them.*
e310: 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61  * to have only a
e320: 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a   real value..*/.
e330: 63 61 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69  case OP_RealAffi
e340: 6e 69 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20  nity: {         
e350: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20           /* in1 
e360: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
e370: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
e380: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
e390: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73  MEM_Int ){.    s
e3a0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61  qlite3VdbeMemRea
e3b0: 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a  lify(pIn1);.  }.
e3c0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
e3d0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
e3e0: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f  E_OMIT_CAST./* O
e3f0: 70 63 6f 64 65 3a 20 43 61 73 74 20 50 31 20 50  pcode: Cast P1 P
e400: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
e410: 73 69 73 3a 20 61 66 66 69 6e 69 74 79 28 72 5b  sis: affinity(r[
e420: 50 31 5d 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65  P1]).**.** Force
e430: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
e440: 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20  gister P1 to be 
e450: 74 68 65 20 74 79 70 65 20 64 65 66 69 6e 65 64  the type defined
e460: 20 62 79 20 50 32 2e 0a 2a 2a 20 0a 2a 2a 20 3c   by P2..** .** <
e470: 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d  ul>.** <li> P2==
e480: 27 41 27 20 26 72 61 72 72 3b 20 42 4c 4f 42 0a  'A' &rarr; BLOB.
e490: 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 42 27 20  ** <li> P2=='B' 
e4a0: 26 72 61 72 72 3b 20 54 45 58 54 0a 2a 2a 20 3c  &rarr; TEXT.** <
e4b0: 6c 69 3e 20 50 32 3d 3d 27 43 27 20 26 72 61 72  li> P2=='C' &rar
e4c0: 72 3b 20 4e 55 4d 45 52 49 43 0a 2a 2a 20 3c 6c  r; NUMERIC.** <l
e4d0: 69 3e 20 50 32 3d 3d 27 44 27 20 26 72 61 72 72  i> P2=='D' &rarr
e4e0: 3b 20 49 4e 54 45 47 45 52 0a 2a 2a 20 3c 6c 69  ; INTEGER.** <li
e4f0: 3e 20 50 32 3d 3d 27 45 27 20 26 72 61 72 72 3b  > P2=='E' &rarr;
e500: 20 52 45 41 4c 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a   REAL.** </ul>.*
e510: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75  *.** A NULL valu
e520: 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
e530: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
e540: 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55  .  It remains NU
e550: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  LL..*/.case OP_C
e560: 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ast: {          
e570: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
e580: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
e590: 3e 70 32 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f  >p2>=SQLITE_AFF_
e5a0: 42 4c 4f 42 20 26 26 20 70 4f 70 2d 3e 70 32 3c  BLOB && pOp->p2<
e5b0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
e5c0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e5d0: 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
e5e0: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 74 65  AFF_TEXT );.  te
e5f0: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d  stcase( pOp->p2=
e600: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
e610: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e620: 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
e630: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
e640: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
e650: 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  p2==SQLITE_AFF_I
e660: 4e 54 45 47 45 52 20 29 3b 0a 20 20 74 65 73 74  NTEGER );.  test
e670: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
e680: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
e690: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
e6a0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d  [pOp->p1];.  mem
e6b0: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
e6c0: 20 70 49 6e 31 29 3b 0a 20 20 72 63 20 3d 20 45   pIn1);.  rc = E
e6d0: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b  xpandBlob(pIn1);
e6e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
e6f0: 6d 43 61 73 74 28 70 49 6e 31 2c 20 70 4f 70 2d  mCast(pIn1, pOp-
e700: 3e 70 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  >p2, encoding);.
e710: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
e720: 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 69  BSIZE(pIn1);.  i
e730: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
e740: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
e750: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
e760: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e770: 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70  T_CAST */../* Op
e780: 63 6f 64 65 3a 20 45 71 20 50 31 20 50 32 20 50  code: Eq P1 P2 P
e790: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
e7a0: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3d 3d 72  sis: IF r[P3]==r
e7b0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  [P1].**.** Compa
e7c0: 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  re the values in
e7d0: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
e7e0: 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29   P3.  If reg(P3)
e7f0: 3d 3d 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a  ==reg(P1) then.*
e800: 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  * jump to addres
e810: 73 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65  s P2.  Or if the
e820: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
e830: 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 50  flag is set in P
e840: 35 2c 20 74 68 65 6e 0a 2a 2a 20 73 74 6f 72 65  5, then.** store
e850: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
e860: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 72 65 67  omparison in reg
e870: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
e880: 54 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  The SQLITE_AFF_M
e890: 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50  ASK portion of P
e8a0: 35 20 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66  5 must be an aff
e8b0: 69 6e 69 74 79 20 63 68 61 72 61 63 74 65 72 20  inity character 
e8c0: 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  -.** SQLITE_AFF_
e8d0: 54 45 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46  TEXT, SQLITE_AFF
e8e0: 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f  _INTEGER, and so
e8f0: 20 66 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d   forth. An attem
e900: 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74  pt is made .** t
e910: 6f 20 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e  o coerce both in
e920: 70 75 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74  puts according t
e930: 6f 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 20  o this affinity 
e940: 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f  before the.** co
e950: 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
e960: 2e 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  . If the SQLITE_
e970: 41 46 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30  AFF_MASK is 0x00
e980: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a  , then numeric.*
e990: 2a 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  * affinity is us
e9a0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
e9b0: 65 20 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65  e affinity conve
e9c0: 72 73 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65  rsions are store
e9d0: 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74  d.** back into t
e9e0: 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65  he input registe
e9f0: 72 73 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53  rs P1 and P3.  S
ea00: 6f 20 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61  o this opcode ca
ea10: 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69  n cause.** persi
ea20: 73 74 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f  stent changes to
ea30: 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
ea40: 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  d P3..**.** Once
ea50: 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73   any conversions
ea60: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
ea70: 65 2c 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76  e, and neither v
ea80: 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a  alue is NULL, .*
ea90: 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  * the values are
eaa0: 20 63 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f   compared. If bo
eab0: 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c  th values are bl
eac0: 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28  obs then memcmp(
ead0: 29 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  ) is.** used to 
eae0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65  determine the re
eaf0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d  sults of the com
eb00: 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74  parison.  If bot
eb10: 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20  h values.** are 
eb20: 74 65 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61  text, then the a
eb30: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
eb40: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70  ting function sp
eb50: 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34  ecified in.** P4
eb60: 20 69 73 20 75 73 65 64 20 74 6f 20 64 6f 20 74   is used to do t
eb70: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
eb80: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65  If P4 is not spe
eb90: 63 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d  cified then.** m
eba0: 65 6d 63 6d 70 28 29 20 69 73 20 75 73 65 64 20  emcmp() is used 
ebb0: 74 6f 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20  to compare text 
ebc0: 73 74 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68  string.  If both
ebd0: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e   values are.** n
ebe0: 75 6d 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e  umeric, then a n
ebf0: 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f  umeric compariso
ec00: 6e 20 69 73 20 75 73 65 64 2e 20 49 66 20 74 68  n is used. If th
ec10: 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
ec20: 61 72 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  are of different
ec30: 20 74 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d   types, then num
ec40: 62 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65  bers are conside
ec50: 72 65 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a  red less than.**
ec60: 20 73 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72   strings and str
ec70: 69 6e 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ings are conside
ec80: 72 65 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c  red less than bl
ec90: 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  obs..**.** If SQ
eca0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73  LITE_NULLEQ is s
ecb0: 65 74 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68  et in P5 then th
ecc0: 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
ecd0: 61 72 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73  arison is always
ece0: 20 65 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20   either.** true 
ecf0: 6f 72 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20  or false and is 
ed00: 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20  never NULL.  If 
ed10: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
ed20: 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  e NULL then the 
ed30: 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d  result.** of com
ed40: 70 61 72 69 73 6f 6e 20 69 73 20 74 72 75 65 2e  parison is true.
ed50: 20 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72    If either oper
ed60: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  and is NULL then
ed70: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 66   the result is f
ed80: 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74  alse..** If neit
ed90: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
eda0: 55 4c 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69  ULL the result i
edb0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 74  s the same as it
edc0: 20 77 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20   would be if.** 
edd0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  the SQLITE_NULLE
ede0: 51 20 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74  Q flag were omit
edf0: 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2a 0a  ted from P5..**.
ee00: 2a 2a 20 49 66 20 62 6f 74 68 20 53 51 4c 49 54  ** If both SQLIT
ee10: 45 5f 53 54 4f 52 45 50 32 20 61 6e 64 20 53 51  E_STOREP2 and SQ
ee20: 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c  LITE_KEEPNULL fl
ee30: 61 67 73 20 61 72 65 20 73 65 74 20 74 68 65 6e  ags are set then
ee40: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
ee50: 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79  of r[P2] is only
ee60: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20   changed if the 
ee70: 6e 65 77 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  new value is NUL
ee80: 4c 20 6f 72 20 30 20 28 66 61 6c 73 65 29 2e 0a  L or 0 (false)..
ee90: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
eea0: 73 2c 20 61 20 70 72 69 6f 72 20 72 5b 50 32 5d  s, a prior r[P2]
eeb0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
eec0: 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
eed0: 79 20 31 20 28 74 72 75 65 29 2e 0a 2a 2f 0a 2f  y 1 (true)..*/./
eee0: 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31 20  * Opcode: Ne P1 
eef0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
ef00: 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33  ynopsis: IF r[P3
ef10: 5d 21 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  ]!=r[P1].**.** T
ef20: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
ef30: 69 6b 65 20 74 68 65 20 45 71 20 6f 70 63 6f 64  ike the Eq opcod
ef40: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
ef50: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
ef60: 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e  if.** the operan
ef70: 64 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ds in registers 
ef80: 50 31 20 61 6e 64 20 50 33 20 61 72 65 20 6e 6f  P1 and P3 are no
ef90: 74 20 65 71 75 61 6c 2e 20 20 53 65 65 20 74 68  t equal.  See th
efa0: 65 20 45 71 20 6f 70 63 6f 64 65 20 66 6f 72 0a  e Eq opcode for.
efb0: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  ** additional in
efc0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
efd0: 20 49 66 20 62 6f 74 68 20 53 51 4c 49 54 45 5f   If both SQLITE_
efe0: 53 54 4f 52 45 50 32 20 61 6e 64 20 53 51 4c 49  STOREP2 and SQLI
eff0: 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67  TE_KEEPNULL flag
f000: 73 20 61 72 65 20 73 65 74 20 74 68 65 6e 20 74  s are set then t
f010: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
f020: 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79 20 63   r[P2] is only c
f030: 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 6e 65  hanged if the ne
f040: 77 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20  w value is NULL 
f050: 6f 72 20 31 20 28 74 72 75 65 29 2e 0a 2a 2a 20  or 1 (true)..** 
f060: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
f070: 61 20 70 72 69 6f 72 20 72 5b 50 32 5d 20 76 61  a prior r[P2] va
f080: 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lue will not be 
f090: 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 30  overwritten by 0
f0a0: 20 28 66 61 6c 73 65 29 2e 0a 2a 2f 0a 2f 2a 20   (false)..*/./* 
f0b0: 4f 70 63 6f 64 65 3a 20 4c 74 20 50 31 20 50 32  Opcode: Lt P1 P2
f0c0: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
f0d0: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3c  opsis: IF r[P3]<
f0e0: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  r[P1].**.** Comp
f0f0: 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69  are the values i
f100: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e  n register P1 an
f110: 64 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33  d P3.  If reg(P3
f120: 29 3c 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a  )<reg(P1) then.*
f130: 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  * jump to addres
f140: 73 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65  s P2.  Or if the
f150: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
f160: 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 50  flag is set in P
f170: 35 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72  5 store.** the r
f180: 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
f190: 73 6f 6e 20 28 30 20 6f 72 20 31 20 6f 72 20 4e  son (0 or 1 or N
f1a0: 55 4c 4c 29 20 69 6e 74 6f 20 72 65 67 69 73 74  ULL) into regist
f1b0: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P2..**.** If 
f1c0: 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  the SQLITE_JUMPI
f1d0: 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20  FNULL bit of P5 
f1e0: 69 73 20 73 65 74 20 61 6e 64 20 65 69 74 68 65  is set and eithe
f1f0: 72 20 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20  r reg(P1) or.** 
f200: 72 65 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20  reg(P3) is NULL 
f210: 74 68 65 6e 20 74 68 65 20 74 61 6b 65 20 74 68  then the take th
f220: 65 20 6a 75 6d 70 2e 20 20 49 66 20 74 68 65 20  e jump.  If the 
f230: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
f240: 4c 20 0a 2a 2a 20 62 69 74 20 69 73 20 63 6c 65  L .** bit is cle
f250: 61 72 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  ar then fall thr
f260: 6f 75 67 68 20 69 66 20 65 69 74 68 65 72 20 6f  ough if either o
f270: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a  perand is NULL..
f280: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
f290: 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f  _AFF_MASK portio
f2a0: 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20  n of P5 must be 
f2b0: 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 72  an affinity char
f2c0: 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54  acter -.** SQLIT
f2d0: 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49  E_AFF_TEXT, SQLI
f2e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20  TE_AFF_INTEGER, 
f2f0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e  and so forth. An
f300: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
f310: 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62   .** to coerce b
f320: 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72  oth inputs accor
f330: 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66  ding to this aff
f340: 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68 65  inity before the
f350: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  .** comparison i
f360: 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53  s made. If the S
f370: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69  QLITE_AFF_MASK i
f380: 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d  s 0x00, then num
f390: 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79  eric.** affinity
f3a0: 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74   is used. Note t
f3b0: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
f3c0: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
f3d0: 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20   stored.** back 
f3e0: 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72  into the input r
f3f0: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
f400: 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63  P3.  So this opc
f410: 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a  ode can cause.**
f420: 20 70 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e   persistent chan
f430: 67 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73  ges to registers
f440: 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a   P1 and P3..**.*
f450: 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65  * Once any conve
f460: 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65  rsions have take
f470: 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69  n place, and nei
f480: 74 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55  ther value is NU
f490: 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75  LL, .** the valu
f4a0: 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e  es are compared.
f4b0: 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20   If both values 
f4c0: 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d  are blobs then m
f4d0: 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73  emcmp() is.** us
f4e0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
f4f0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
f500: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
f510: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a  If both values.*
f520: 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e  * are text, then
f530: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
f540: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
f550: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
f560: 0a 2a 2a 20 50 34 20 69 73 20 20 75 73 65 64 20  .** P4 is  used 
f570: 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72  to do the compar
f580: 69 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20  ison.  If P4 is 
f590: 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 68  not specified th
f5a0: 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69  en.** memcmp() i
f5b0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
f5c0: 65 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20  e text string.  
f5d0: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61  If both values a
f5e0: 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74  re.** numeric, t
f5f0: 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f  hen a numeric co
f600: 6d 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64  mparison is used
f610: 2e 20 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c  . If the two val
f620: 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69  ues.** are of di
f630: 66 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74  fferent types, t
f640: 68 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20  hen numbers are 
f650: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
f660: 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20  than.** strings 
f670: 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
f680: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
f690: 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 2f  than blobs..*/./
f6a0: 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20 50 31 20  * Opcode: Le P1 
f6b0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
f6c0: 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33  ynopsis: IF r[P3
f6d0: 5d 3c 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  ]<=r[P1].**.** T
f6e0: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
f6f0: 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  ike the Lt opcod
f700: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
f710: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
f720: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  if.** the conten
f730: 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33  t of register P3
f740: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
f750: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f   equal to the co
f760: 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69  ntent of.** regi
f770: 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68  ster P1.  See th
f780: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
f790: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
f7a0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  mation..*/./* Op
f7b0: 63 6f 64 65 3a 20 47 74 20 50 31 20 50 32 20 50  code: Gt P1 P2 P
f7c0: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
f7d0: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e 72 5b  sis: IF r[P3]>r[
f7e0: 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  P1].**.** This w
f7f0: 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74  orks just like t
f800: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63  he Lt opcode exc
f810: 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d  ept that the jum
f820: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a  p is taken if.**
f830: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
f840: 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 67  register P3 is g
f850: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
f860: 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65  content of.** re
f870: 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20  gister P1.  See 
f880: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f  the Lt opcode fo
f890: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
f8a0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  ormation..*/./* 
f8b0: 4f 70 63 6f 64 65 3a 20 47 65 20 50 31 20 50 32  Opcode: Ge P1 P2
f8c0: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
f8d0: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e  opsis: IF r[P3]>
f8e0: 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  =r[P1].**.** Thi
f8f0: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
f900: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
f910: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
f920: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
f930: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
f940: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
f950: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
f960: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63  r equal to the c
f970: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67  ontent of.** reg
f980: 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74  ister P1.  See t
f990: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72  he Lt opcode for
f9a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
f9b0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  rmation..*/.case
f9c0: 20 4f 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20   OP_Eq:         
f9d0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
f9e0: 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e   TK_EQ, jump, in
f9f0: 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  1, in3 */.case O
fa00: 50 5f 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20  P_Ne:           
fa10: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
fa20: 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_NE, jump, in1,
fa30: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
fa40: 4c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Lt:             
fa50: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
fa60: 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  LT, jump, in1, i
fa70: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65  n3 */.case OP_Le
fa80: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
fa90: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45  /* same as TK_LE
faa0: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
fab0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20   */.case OP_Gt: 
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fad0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20   same as TK_GT, 
fae0: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
faf0: 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20  /.case OP_Ge: { 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
fb10: 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75  ame as TK_GE, ju
fb20: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
fb30: 20 20 69 6e 74 20 72 65 73 2c 20 72 65 73 32 3b    int res, res2;
fb40: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
fb50: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
fb60: 6e 20 6f 66 20 70 49 6e 31 20 61 67 61 69 6e 73  n of pIn1 agains
fb70: 74 20 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61 72  t pIn3 */.  char
fb80: 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
fb90: 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75  /* Affinity to u
fba0: 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  se for compariso
fbb0: 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73  n */.  u16 flags
fbc0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
fbd0: 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61  py of initial va
fbe0: 6c 75 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c 61  lue of pIn1->fla
fbf0: 67 73 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67  gs */.  u16 flag
fc00: 73 33 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  s3;         /* C
fc10: 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76  opy of initial v
fc20: 61 6c 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66 6c  alue of pIn3->fl
fc30: 61 67 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d  ags */..  pIn1 =
fc40: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
fc50: 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
fc60: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67  pOp->p3];.  flag
fc70: 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73  s1 = pIn1->flags
fc80: 3b 0a 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e  ;.  flags3 = pIn
fc90: 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  3->flags;.  if( 
fca0: 28 66 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33  (flags1 | flags3
fcb0: 29 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  )&MEM_Null ){.  
fcc0: 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68    /* One or both
fcd0: 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55   operands are NU
fce0: 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f  LL */.    if( pO
fcf0: 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e  p->p5 & SQLITE_N
fd00: 55 4c 4c 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  ULLEQ ){.      /
fd10: 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  * If SQLITE_NULL
fd20: 45 51 20 69 73 20 73 65 74 20 28 77 68 69 63 68  EQ is set (which
fd30: 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65   will only happe
fd40: 6e 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f  n if the operato
fd50: 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 4f 50  r is.      ** OP
fd60: 5f 45 71 20 6f 72 20 4f 50 5f 4e 65 29 20 74 68  _Eq or OP_Ne) th
fd70: 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
fd80: 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e   or not dependin
fd90: 67 20 6f 6e 20 77 68 65 74 68 65 72 0a 20 20 20  g on whether.   
fda0: 20 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 62 6f 74     ** or not bot
fdb0: 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 6e  h operands are n
fdc0: 75 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ull..      */.  
fdd0: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
fde0: 67 73 31 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65  gs1 & MEM_Cleare
fdf0: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  d)==0 );.      a
fe00: 73 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20  ssert( (pOp->p5 
fe10: 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  & SQLITE_JUMPIFN
fe20: 55 4c 4c 29 3d 3d 30 20 7c 7c 20 43 4f 52 52 55  ULL)==0 || CORRU
fe30: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 74  PT_DB );.      t
fe40: 65 73 74 63 61 73 65 28 20 28 70 4f 70 2d 3e 70  estcase( (pOp->p
fe50: 35 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  5 & SQLITE_JUMPI
fe60: 46 4e 55 4c 4c 29 21 3d 30 20 29 3b 0a 20 20 20  FNULL)!=0 );.   
fe70: 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 26 66     if( (flags1&f
fe80: 6c 61 67 73 33 26 4d 45 4d 5f 4e 75 6c 6c 29 21  lags3&MEM_Null)!
fe90: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 66 6c  =0.       && (fl
fea0: 61 67 73 33 26 4d 45 4d 5f 43 6c 65 61 72 65 64  ags3&MEM_Cleared
feb0: 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
fec0: 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 20 20        res = 0;  
fed0: 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20  /* Operands are 
fee0: 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7d  equal */.      }
fef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
ff00: 73 20 3d 20 28 28 66 6c 61 67 73 33 20 26 20 4d  s = ((flags3 & M
ff10: 45 4d 5f 4e 75 6c 6c 29 20 3f 20 2d 31 20 3a 20  EM_Null) ? -1 : 
ff20: 2b 31 29 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64  +1);  /* Operand
ff30: 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20  s are not equal 
ff40: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
ff50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53  else{.      /* S
ff60: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20  QLITE_NULLEQ is 
ff70: 63 6c 65 61 72 20 61 6e 64 20 61 74 20 6c 65 61  clear and at lea
ff80: 73 74 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69  st one operand i
ff90: 73 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a  s NULL,.      **
ffa0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
ffb0: 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e   is always NULL.
ffc0: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75  .      ** The ju
ffd0: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74  mp is taken if t
ffe0: 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  he SQLITE_JUMPIF
fff0: 4e 55 4c 4c 20 62 69 74 20 69 73 20 73 65 74 2e  NULL bit is set.
10000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10010 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
10020 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a  LITE_STOREP2 ){.
10030 20 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26          pOut = &
10040 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
10050 20 20 20 20 20 20 20 69 43 6f 6d 70 61 72 65 20         iCompare 
10060 3d 20 31 3b 20 20 20 20 2f 2a 20 4f 70 65 72 61  = 1;    /* Opera
10070 6e 64 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61  nds are not equa
10080 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
10090 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
100a0 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20   pOut);.        
100b0 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
100c0 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  Out, MEM_Null);.
100d0 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
100e0 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
100f0 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pOut);.      }el
10100 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
10110 42 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29  BranchTaken(2,3)
10120 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
10130 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a  p->p5 & SQLITE_J
10140 55 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20  UMPIFNULL ){.   
10150 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70         goto jump
10160 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20 20  _to_p2;.        
10170 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10180 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
10190 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69  else{.    /* Nei
101a0 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
101b0 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70  NULL.  Do a comp
101c0 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61  arison. */.    a
101d0 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70  ffinity = pOp->p
101e0 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  5 & SQLITE_AFF_M
101f0 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61 66 66  ASK;.    if( aff
10200 69 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46  inity>=SQLITE_AF
10210 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
10220 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c     if( (flags1 |
10230 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 53 74 72   flags3)&MEM_Str
10240 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10250 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f 49  (flags1 & (MEM_I
10260 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
10270 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29  Str))==MEM_Str )
10280 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 6c  {.          appl
10290 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  yNumericAffinity
102a0 28 70 49 6e 31 2c 30 29 3b 0a 20 20 20 20 20 20  (pIn1,0);.      
102b0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
102c0 73 33 3d 3d 70 49 6e 33 2d 3e 66 6c 61 67 73 20  s3==pIn3->flags 
102d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
102e0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 33  testcase( flags3
102f0 21 3d 70 49 6e 33 2d 3e 66 6c 61 67 73 20 29 3b  !=pIn3->flags );
10300 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
10310 69 73 20 75 73 65 64 20 74 6f 20 62 65 20 70 6f  is used to be po
10320 73 73 69 62 6c 65 20 77 69 74 68 20 70 49 6e 31  ssible with pIn1
10330 3d 3d 70 49 6e 33 2c 20 62 75 74 20 6e 6f 74 20  ==pIn3, but not 
10340 73 69 6e 63 65 0a 20 20 20 20 20 20 20 20 20 20  since.          
10350 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ** the column ca
10360 63 68 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e  che was removed.
10370 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
10380 61 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 20  assignment.     
10390 20 20 20 20 20 2a 2a 20 69 73 20 65 73 73 65 6e       ** is essen
103a0 74 69 61 6c 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20  tially a no-op. 
103b0 20 42 75 74 2c 20 69 74 20 70 72 6f 76 69 64 65   But, it provide
103c0 73 20 64 65 66 65 6e 73 65 2d 69 6e 2d 64 65 70  s defense-in-dep
103d0 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  th.          ** 
103e0 69 6e 20 63 61 73 65 20 6f 75 72 20 61 6e 61 6c  in case our anal
103f0 79 73 69 73 20 69 73 20 69 6e 63 6f 72 72 65 63  ysis is incorrec
10400 74 2c 20 73 6f 20 69 74 20 69 73 20 6c 65 66 74  t, so it is left
10410 20 69 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   in. */.        
10420 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e 33 2d    flags3 = pIn3-
10430 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
10440 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 66  }.        if( (f
10450 6c 61 67 73 33 20 26 20 28 4d 45 4d 5f 49 6e 74  lags3 & (MEM_Int
10460 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74  |MEM_Real|MEM_St
10470 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a  r))==MEM_Str ){.
10480 20 20 20 20 20 20 20 20 20 20 61 70 70 6c 79 4e            applyN
10490 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70  umericAffinity(p
104a0 49 6e 33 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  In3,0);.        
104b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
104c0 2f 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 63 6f  /* Handle the co
104d0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 69 6e 74  mmon case of int
104e0 65 67 65 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20  eger comparison 
104f0 68 65 72 65 2c 20 61 73 20 61 6e 0a 20 20 20 20  here, as an.    
10500 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
10510 6e 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 63 61  n, to avoid a ca
10520 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4d 65 6d  ll to sqlite3Mem
10530 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 20  Compare() */.   
10540 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c     if( (pIn1->fl
10550 61 67 73 20 26 20 70 49 6e 33 2d 3e 66 6c 61 67  ags & pIn3->flag
10560 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  s & MEM_Int)!=0 
10570 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10580 49 6e 33 2d 3e 75 2e 69 20 3e 20 70 49 6e 31 2d  In3->u.i > pIn1-
10590 3e 75 2e 69 20 29 7b 20 72 65 73 20 3d 20 2b 31  >u.i ){ res = +1
105a0 3b 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f  ; goto compare_o
105b0 70 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  p; }.        if(
105c0 20 70 49 6e 33 2d 3e 75 2e 69 20 3c 20 70 49 6e   pIn3->u.i < pIn
105d0 31 2d 3e 75 2e 69 20 29 7b 20 72 65 73 20 3d 20  1->u.i ){ res = 
105e0 2d 31 3b 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65  -1; goto compare
105f0 5f 6f 70 3b 20 7d 0a 20 20 20 20 20 20 20 20 72  _op; }.        r
10600 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
10610 67 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b  goto compare_op;
10620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
10630 73 65 20 69 66 28 20 61 66 66 69 6e 69 74 79 3d  se if( affinity=
10640 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
10650 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
10660 6c 61 67 73 31 20 26 20 4d 45 4d 5f 53 74 72 29  lags1 & MEM_Str)
10670 3d 3d 30 20 26 26 20 28 66 6c 61 67 73 31 20 26  ==0 && (flags1 &
10680 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65   (MEM_Int|MEM_Re
10690 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  al))!=0 ){.     
106a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e     testcase( pIn
106b0 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  1->flags & MEM_I
106c0 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  nt );.        te
106d0 73 74 63 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c  stcase( pIn1->fl
106e0 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
106f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10700 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
10710 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67  y(pIn1, encoding
10720 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65  , 1);.        te
10730 73 74 63 61 73 65 28 20 28 66 6c 61 67 73 31 26  stcase( (flags1&
10740 4d 45 4d 5f 44 79 6e 29 20 21 3d 20 28 70 49 6e  MEM_Dyn) != (pIn
10750 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  1->flags&MEM_Dyn
10760 29 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  ) );.        fla
10770 67 73 31 20 3d 20 28 70 49 6e 31 2d 3e 66 6c 61  gs1 = (pIn1->fla
10780 67 73 20 26 20 7e 4d 45 4d 5f 54 79 70 65 4d 61  gs & ~MEM_TypeMa
10790 73 6b 29 20 7c 20 28 66 6c 61 67 73 31 20 26 20  sk) | (flags1 & 
107a0 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20  MEM_TypeMask);. 
107b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
107c0 49 6e 31 21 3d 70 49 6e 33 20 29 3b 0a 20 20 20  In1!=pIn3 );.   
107d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
107e0 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 53 74 72  flags3 & MEM_Str
107f0 29 3d 3d 30 20 26 26 20 28 66 6c 61 67 73 33 20  )==0 && (flags3 
10800 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
10810 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  eal))!=0 ){.    
10820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
10830 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
10840 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  Int );.        t
10850 65 73 74 63 61 73 65 28 20 70 49 6e 33 2d 3e 66  estcase( pIn3->f
10860 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
10870 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10880 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69  e3VdbeMemStringi
10890 66 79 28 70 49 6e 33 2c 20 65 6e 63 6f 64 69 6e  fy(pIn3, encodin
108a0 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 74  g, 1);.        t
108b0 65 73 74 63 61 73 65 28 20 28 66 6c 61 67 73 33  estcase( (flags3
108c0 26 4d 45 4d 5f 44 79 6e 29 20 21 3d 20 28 70 49  &MEM_Dyn) != (pI
108d0 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79  n3->flags&MEM_Dy
108e0 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6c  n) );.        fl
108f0 61 67 73 33 20 3d 20 28 70 49 6e 33 2d 3e 66 6c  ags3 = (pIn3->fl
10900 61 67 73 20 26 20 7e 4d 45 4d 5f 54 79 70 65 4d  ags & ~MEM_TypeM
10910 61 73 6b 29 20 7c 20 28 66 6c 61 67 73 33 20 26  ask) | (flags3 &
10920 20 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a   MEM_TypeMask);.
10930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10940 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
10950 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45  4type==P4_COLLSE
10960 51 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  Q || pOp->p4.pCo
10970 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 73  ll==0 );.    res
10980 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
10990 70 61 72 65 28 70 49 6e 33 2c 20 70 49 6e 31 2c  pare(pIn3, pIn1,
109a0 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 29 3b   pOp->p4.pColl);
109b0 0a 20 20 7d 0a 63 6f 6d 70 61 72 65 5f 6f 70 3a  .  }.compare_op:
109c0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
109d0 69 6e 74 2c 20 72 65 73 20 69 73 20 6e 65 67 61  int, res is nega
109e0 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
109f0 6f 73 69 74 69 76 65 20 69 66 20 72 65 67 5b 50  ositive if reg[P
10a00 31 5d 20 69 73 0a 20 20 2a 2a 20 6c 65 73 73 20  1] is.  ** less 
10a10 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
10a20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
10a30 72 65 67 5b 50 33 5d 2c 20 72 65 73 70 65 63 74  reg[P3], respect
10a40 69 76 65 6c 79 2e 20 20 43 6f 6d 70 75 74 65 0a  ively.  Compute.
10a50 20 20 2a 2a 20 74 68 65 20 61 6e 73 77 65 72 20    ** the answer 
10a60 74 6f 20 74 68 69 73 20 6f 70 65 72 61 74 6f 72  to this operator
10a70 20 69 6e 20 72 65 73 32 2c 20 64 65 70 65 6e 64   in res2, depend
10a80 69 6e 67 20 6f 6e 20 77 68 61 74 20 74 68 65 20  ing on what the 
10a90 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 2a 2a 20  comparison.  ** 
10aa0 6f 70 65 72 61 74 6f 72 20 61 63 74 75 61 6c 6c  operator actuall
10ab0 79 20 69 73 2e 20 20 54 68 65 20 6e 65 78 74 20  y is.  The next 
10ac0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 64 65  block of code de
10ad0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
10ae0 74 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  t.  ** that the 
10af0 36 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  6 comparison ope
10b00 72 61 74 6f 72 73 20 61 72 65 20 63 6f 6e 73 65  rators are conse
10b10 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 20  cutive integers 
10b20 69 6e 20 74 68 69 73 0a 20 20 2a 2a 20 6f 72 64  in this.  ** ord
10b30 65 72 3a 20 20 4e 45 2c 20 45 51 2c 20 47 54 2c  er:  NE, EQ, GT,
10b40 20 4c 45 2c 20 4c 54 2c 20 47 45 20 2a 2f 0a 20   LE, LT, GE */. 
10b50 20 61 73 73 65 72 74 28 20 4f 50 5f 45 71 3d 3d   assert( OP_Eq==
10b60 4f 50 5f 4e 65 2b 31 20 29 3b 20 61 73 73 65 72  OP_Ne+1 ); asser
10b70 74 28 20 4f 50 5f 47 74 3d 3d 4f 50 5f 4e 65 2b  t( OP_Gt==OP_Ne+
10b80 32 20 29 3b 20 61 73 73 65 72 74 28 20 4f 50 5f  2 ); assert( OP_
10b90 4c 65 3d 3d 4f 50 5f 4e 65 2b 33 20 29 3b 0a 20  Le==OP_Ne+3 );. 
10ba0 20 61 73 73 65 72 74 28 20 4f 50 5f 4c 74 3d 3d   assert( OP_Lt==
10bb0 4f 50 5f 4e 65 2b 34 20 29 3b 20 61 73 73 65 72  OP_Ne+4 ); asser
10bc0 74 28 20 4f 50 5f 47 65 3d 3d 4f 50 5f 4e 65 2b  t( OP_Ge==OP_Ne+
10bd0 35 20 29 3b 0a 20 20 69 66 28 20 72 65 73 3c 30  5 );.  if( res<0
10be0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
10bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
10c00 2c 20 65 71 2c 20 67 74 2c 20 6c 65 2c 20 6c 74  , eq, gt, le, lt
10c10 2c 20 67 65 20 2a 2f 0a 20 20 20 20 73 74 61 74  , ge */.    stat
10c20 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
10c30 64 20 63 68 61 72 20 61 4c 54 62 5b 5d 20 3d 20  d char aLTb[] = 
10c40 7b 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c  { 1,  0,  0,  1,
10c50 20 20 31 2c 20 20 30 20 7d 3b 0a 20 20 20 20 72    1,  0 };.    r
10c60 65 73 32 20 3d 20 61 4c 54 62 5b 70 4f 70 2d 3e  es2 = aLTb[pOp->
10c70 6f 70 63 6f 64 65 20 2d 20 4f 50 5f 4e 65 5d 3b  opcode - OP_Ne];
10c80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73  .  }else if( res
10c90 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
10ca0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
10cb0 20 63 68 61 72 20 61 45 51 62 5b 5d 20 3d 20 7b   char aEQb[] = {
10cc0 20 30 2c 20 20 31 2c 20 20 30 2c 20 20 31 2c 20   0,  1,  0,  1, 
10cd0 20 30 2c 20 20 31 20 7d 3b 0a 20 20 20 20 72 65   0,  1 };.    re
10ce0 73 32 20 3d 20 61 45 51 62 5b 70 4f 70 2d 3e 6f  s2 = aEQb[pOp->o
10cf0 70 63 6f 64 65 20 2d 20 4f 50 5f 4e 65 5d 3b 0a  pcode - OP_Ne];.
10d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
10d10 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
10d20 65 64 20 63 68 61 72 20 61 47 54 62 5b 5d 20 3d  ed char aGTb[] =
10d30 20 7b 20 31 2c 20 20 30 2c 20 20 31 2c 20 20 30   { 1,  0,  1,  0
10d40 2c 20 20 30 2c 20 20 31 20 7d 3b 0a 20 20 20 20  ,  0,  1 };.    
10d50 72 65 73 32 20 3d 20 61 47 54 62 5b 70 4f 70 2d  res2 = aGTb[pOp-
10d60 3e 6f 70 63 6f 64 65 20 2d 20 4f 50 5f 4e 65 5d  >opcode - OP_Ne]
10d70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f  ;.  }..  /* Undo
10d80 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
10d90 65 20 62 79 20 61 70 70 6c 79 41 66 66 69 6e 69  e by applyAffini
10da0 74 79 28 29 20 74 6f 20 74 68 65 20 69 6e 70 75  ty() to the inpu
10db0 74 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  t registers. */.
10dc0 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d    assert( (pIn1-
10dd0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
10de0 29 20 3d 3d 20 28 66 6c 61 67 73 31 20 26 20 4d  ) == (flags1 & M
10df0 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 70 49 6e  EM_Dyn) );.  pIn
10e00 31 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  1->flags = flags
10e10 31 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  1;.  assert( (pI
10e20 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
10e30 44 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73 33 20  Dyn) == (flags3 
10e40 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20  & MEM_Dyn) );.  
10e50 70 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  pIn3->flags = fl
10e60 61 67 73 33 3b 0a 0a 20 20 69 66 28 20 70 4f 70  ags3;..  if( pOp
10e70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54  ->p5 & SQLITE_ST
10e80 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 70 4f 75  OREP2 ){.    pOu
10e90 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
10ea0 32 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65  2];.    iCompare
10eb0 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20   = res;.    if( 
10ec0 28 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54  (pOp->p5 & SQLIT
10ed0 45 5f 4b 45 45 50 4e 55 4c 4c 29 21 3d 30 20 29  E_KEEPNULL)!=0 )
10ee0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4b  {.      /* The K
10ef0 45 45 50 4e 55 4c 4c 20 66 6c 61 67 20 70 72 65  EEPNULL flag pre
10f00 76 65 6e 74 73 20 4f 50 5f 45 71 20 66 72 6f 6d  vents OP_Eq from
10f10 20 6f 76 65 72 77 72 69 74 69 6e 67 20 61 20 4e   overwriting a N
10f20 55 4c 4c 20 77 69 74 68 20 31 0a 20 20 20 20 20  ULL with 1.     
10f30 20 2a 2a 20 61 6e 64 20 70 72 65 76 65 6e 74 73   ** and prevents
10f40 20 4f 50 5f 4e 65 20 66 72 6f 6d 20 6f 76 65 72   OP_Ne from over
10f50 77 72 69 74 69 6e 67 20 4e 55 4c 4c 20 77 69 74  writing NULL wit
10f60 68 20 30 2e 20 20 54 68 69 73 20 66 6c 61 67 0a  h 0.  This flag.
10f70 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 6e 6c 79        ** is only
10f80 20 75 73 65 64 20 69 6e 20 63 6f 6e 74 65 78 74   used in context
10f90 73 20 77 68 65 72 65 20 65 69 74 68 65 72 3a 0a  s where either:.
10fa0 20 20 20 20 20 20 2a 2a 20 20 20 28 31 29 20 6f        **   (1) o
10fb0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 28 72 5b 50  p==OP_Eq && (r[P
10fc0 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32  2]==NULL || r[P2
10fd0 5d 3d 3d 30 29 0a 20 20 20 20 20 20 2a 2a 20 20  ]==0).      **  
10fe0 20 28 32 29 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26   (2) op==OP_Ne &
10ff0 26 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c  & (r[P2]==NULL |
11000 7c 20 72 5b 50 32 5d 3d 3d 31 29 0a 20 20 20 20  | r[P2]==1).    
11010 20 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 69    ** Therefore i
11020 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
11030 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20  ry to check the 
11040 63 6f 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d  content of r[P2]
11050 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 4e 55   for.      ** NU
11060 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  LL. */.      ass
11070 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
11080 3d 3d 4f 50 5f 4e 65 20 7c 7c 20 70 4f 70 2d 3e  ==OP_Ne || pOp->
11090 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b  opcode==OP_Eq );
110a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
110b0 65 73 32 3d 3d 30 20 7c 7c 20 72 65 73 32 3d 3d  es2==0 || res2==
110c0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
110d0 61 73 65 28 20 72 65 73 32 3d 3d 30 20 26 26 20  ase( res2==0 && 
110e0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
110f0 45 71 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Eq );.      test
11100 63 61 73 65 28 20 72 65 73 32 3d 3d 31 20 26 26  case( res2==1 &&
11110 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
11120 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Eq );.      tes
11130 74 63 61 73 65 28 20 72 65 73 32 3d 3d 30 20 26  tcase( res2==0 &
11140 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  & pOp->opcode==O
11150 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
11160 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d 31 20  stcase( res2==1 
11170 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  && pOp->opcode==
11180 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 69  OP_Ne );.      i
11190 66 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  f( (pOp->opcode=
111a0 3d 4f 50 5f 45 71 29 3d 3d 72 65 73 32 20 29 20  =OP_Eq)==res2 ) 
111b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
111c0 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
111d0 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  e(p, pOut);.    
111e0 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
111f0 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
11200 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72     pOut->u.i = r
11210 65 73 32 3b 0a 20 20 20 20 52 45 47 49 53 54 45  es2;.    REGISTE
11220 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
11230 20 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b   pOut);.  }else{
11240 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
11250 61 6b 65 6e 28 72 65 73 32 21 3d 30 2c 20 28 70  aken(res2!=0, (p
11260 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f  Op->p5 & SQLITE_
11270 4e 55 4c 4c 45 51 29 3f 32 3a 33 29 3b 0a 20 20  NULLEQ)?2:3);.  
11280 20 20 69 66 28 20 72 65 73 32 20 29 7b 0a 20 20    if( res2 ){.  
11290 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
112a0 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _p2;.    }.  }. 
112b0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
112c0 63 6f 64 65 3a 20 45 6c 73 65 4e 6f 74 45 71 20  code: ElseNotEq 
112d0 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  * P2 * * *.**.**
112e0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6d 75 73   This opcode mus
112f0 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
11300 6c 6c 6f 77 20 61 6e 20 4f 50 5f 4c 74 20 6f 72  llow an OP_Lt or
11310 20 4f 50 5f 47 74 20 63 6f 6d 70 61 72 69 73 6f   OP_Gt compariso
11320 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49  n operator..** I
11330 66 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f  f result of an O
11340 50 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f 6e 20  P_Eq comparison 
11350 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 77 6f 20  on the same two 
11360 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c  operands.** woul
11370 64 20 68 61 76 65 20 62 65 20 4e 55 4c 4c 20 6f  d have be NULL o
11380 72 20 66 61 6c 73 65 20 28 30 29 2c 20 74 68 65  r false (0), the
11390 6e 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  n then jump to P
113a0 32 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  2. .** If the re
113b0 73 75 6c 74 20 6f 66 20 61 6e 20 4f 50 5f 45 71  sult of an OP_Eq
113c0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 6e 20 74   comparison on t
113d0 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73 20  he two previous 
113e0 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c  operands.** woul
113f0 64 20 68 61 76 65 20 62 65 65 6e 20 74 72 75 65  d have been true
11400 20 28 31 29 2c 20 74 68 65 6e 20 66 61 6c 6c 20   (1), then fall 
11410 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65  through..*/.case
11420 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 3a 20 7b   OP_ElseNotEq: {
11430 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
11440 73 20 54 4b 5f 45 53 43 41 50 45 2c 20 6a 75 6d  s TK_ESCAPE, jum
11450 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  p */.  assert( p
11460 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 61 73 73 65  Op>aOp );.  asse
11470 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
11480 64 65 3d 3d 4f 50 5f 4c 74 20 7c 7c 20 70 4f 70  de==OP_Lt || pOp
11490 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
114a0 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
114b0 70 4f 70 5b 2d 31 5d 2e 70 35 20 26 20 53 51 4c  pOp[-1].p5 & SQL
114c0 49 54 45 5f 53 54 4f 52 45 50 32 20 29 3b 0a 20  ITE_STOREP2 );. 
114d0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
114e0 28 69 43 6f 6d 70 61 72 65 21 3d 30 2c 20 32 29  (iCompare!=0, 2)
114f0 3b 0a 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65  ;.  if( iCompare
11500 21 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  !=0 ) goto jump_
11510 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a  to_p2;.  break;.
11520 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  }.../* Opcode: P
11530 65 72 6d 75 74 61 74 69 6f 6e 20 2a 20 2a 20 2a  ermutation * * *
11540 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20   P4 *.**.** Set 
11550 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  the permutation 
11560 75 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 43  used by the OP_C
11570 6f 6d 70 61 72 65 20 6f 70 65 72 61 74 6f 72 20  ompare operator 
11580 69 6e 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69  in the next.** i
11590 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 65  nstruction.  The
115a0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20   permutation is 
115b0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 34  stored in the P4
115c0 20 6f 70 65 72 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   operand..**.** 
115d0 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  The permutation 
115e0 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e  is only valid un
115f0 74 69 6c 20 74 68 65 20 6e 65 78 74 20 4f 50 5f  til the next OP_
11600 43 6f 6d 70 61 72 65 20 74 68 61 74 20 68 61 73  Compare that has
11610 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f 50  .** the OPFLAG_P
11620 45 52 4d 55 54 45 20 62 69 74 20 73 65 74 20 69  ERMUTE bit set i
11630 6e 20 50 35 2e 20 54 79 70 69 63 61 6c 6c 79 20  n P5. Typically 
11640 74 68 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  the OP_Permutati
11650 6f 6e 20 73 68 6f 75 6c 64 20 0a 2a 2a 20 6f 63  on should .** oc
11660 63 75 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  cur immediately 
11670 70 72 69 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f  prior to the OP_
11680 43 6f 6d 70 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  Compare..**.** T
11690 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
116a0 20 69 6e 20 74 68 65 20 50 34 20 69 6e 74 65 67   in the P4 integ
116b0 65 72 20 61 72 72 61 79 20 69 73 20 74 68 65 20  er array is the 
116c0 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 61 72  length of the ar
116d0 72 61 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  ray.** and does 
116e0 6e 6f 74 20 62 65 63 6f 6d 65 20 70 61 72 74 20  not become part 
116f0 6f 66 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  of the permutati
11700 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  on..*/.case OP_P
11710 65 72 6d 75 74 61 74 69 6f 6e 3a 20 7b 0a 20 20  ermutation: {.  
11720 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
11730 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59  ype==P4_INTARRAY
11740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
11750 70 2d 3e 70 34 2e 61 69 20 29 3b 0a 20 20 61 73  p->p4.ai );.  as
11760 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 6f 70 63  sert( pOp[1].opc
11770 6f 64 65 3d 3d 4f 50 5f 43 6f 6d 70 61 72 65 20  ode==OP_Compare 
11780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
11790 5b 31 5d 2e 70 35 20 26 20 4f 50 46 4c 41 47 5f  [1].p5 & OPFLAG_
117a0 50 45 52 4d 55 54 45 20 29 3b 0a 20 20 62 72 65  PERMUTE );.  bre
117b0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
117c0 3a 20 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20  : Compare P1 P2 
117d0 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
117e0 70 73 69 73 3a 20 72 5b 50 31 40 50 33 5d 20 3c  psis: r[P1@P3] <
117f0 2d 3e 20 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a  -> r[P2@P3].**.*
11800 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 76 65  * Compare two ve
11810 63 74 6f 72 73 20 6f 66 20 72 65 67 69 73 74 65  ctors of registe
11820 72 73 20 69 6e 20 72 65 67 28 50 31 29 2e 2e 72  rs in reg(P1)..r
11830 65 67 28 50 31 2b 50 33 2d 31 29 20 28 63 61 6c  eg(P1+P3-1) (cal
11840 6c 20 74 68 69 73 0a 2a 2a 20 76 65 63 74 6f 72  l this.** vector
11850 20 22 41 22 29 20 61 6e 64 20 69 6e 20 72 65 67   "A") and in reg
11860 28 50 32 29 2e 2e 72 65 67 28 50 32 2b 50 33 2d  (P2)..reg(P2+P3-
11870 31 29 20 28 22 42 22 29 2e 20 20 53 61 76 65 20  1) ("B").  Save 
11880 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
11890 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
118a0 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 6e  for use by the n
118b0 65 78 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73 74  ext OP_Jump inst
118c0 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  ruct..**.** If P
118d0 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47  5 has the OPFLAG
118e0 5f 50 45 52 4d 55 54 45 20 62 69 74 20 73 65 74  _PERMUTE bit set
118f0 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 64 65 72  , then the order
11900 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
11910 73 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  s.** determined 
11920 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
11930 6e 74 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  nt OP_Permutatio
11940 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  n operator.  If 
11950 74 68 65 0a 2a 2a 20 4f 50 46 4c 41 47 5f 50 45  the.** OPFLAG_PE
11960 52 4d 55 54 45 20 62 69 74 20 69 73 20 63 6c 65  RMUTE bit is cle
11970 61 72 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65  ar, then registe
11980 72 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20 69  r are compared i
11990 6e 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20  n sequential.** 
119a0 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  order..**.** P4 
119b0 69 73 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  is a KeyInfo str
119c0 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
119d0 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  nes collating se
119e0 71 75 65 6e 63 65 73 20 61 6e 64 20 73 6f 72 74  quences and sort
119f0 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f 72 20 74  .** orders for t
11a00 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
11a10 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  The permutation 
11a20 61 70 70 6c 69 65 73 20 74 6f 20 72 65 67 69 73  applies to regis
11a30 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54  ters.** only.  T
11a40 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d 65  he KeyInfo eleme
11a50 6e 74 73 20 61 72 65 20 75 73 65 64 20 73 65 71  nts are used seq
11a60 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  uentially..**.**
11a70 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
11a80 69 73 20 61 20 73 6f 72 74 20 63 6f 6d 70 61 72  is a sort compar
11a90 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20 63  ison, so NULLs c
11aa0 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a  ompare equal,.**
11ab0 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65 73 73 20   NULLs are less 
11ac0 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e 75  than numbers, nu
11ad0 6d 62 65 72 73 20 61 72 65 20 6c 65 73 73 20 74  mbers are less t
11ae0 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a 20  han strings,.** 
11af0 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
11b00 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e  less than blobs.
11b10 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 70  .*/.case OP_Comp
11b20 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  are: {.  int n;.
11b30 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 70    int i;.  int p
11b40 31 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20 63  1;.  int p2;.  c
11b50 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  onst KeyInfo *pK
11b60 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69 64  eyInfo;.  int id
11b70 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  x;.  CollSeq *pC
11b80 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61  oll;    /* Colla
11b90 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
11ba0 20 75 73 65 20 6f 6e 20 74 68 69 73 20 74 65 72   use on this ter
11bb0 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b  m */.  int bRev;
11bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11bd0 65 20 66 6f 72 20 44 45 53 43 45 4e 44 49 4e 47  e for DESCENDING
11be0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
11bf0 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20   int *aPermute; 
11c00 20 20 20 20 2f 2a 20 54 68 65 20 70 65 72 6d 75      /* The permu
11c10 74 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  tation */..  if(
11c20 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
11c30 41 47 5f 50 45 52 4d 55 54 45 29 3d 3d 30 20 29  AG_PERMUTE)==0 )
11c40 7b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 20 3d  {.    aPermute =
11c50 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11c60 20 61 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70   assert( pOp>aOp
11c70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11c80 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
11c90 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 29  OP_Permutation )
11ca0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
11cb0 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34  p[-1].p4type==P4
11cc0 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a 20 20 20  _INTARRAY );.   
11cd0 20 61 50 65 72 6d 75 74 65 20 3d 20 70 4f 70 5b   aPermute = pOp[
11ce0 2d 31 5d 2e 70 34 2e 61 69 20 2b 20 31 3b 0a 20  -1].p4.ai + 1;. 
11cf0 20 20 20 61 73 73 65 72 74 28 20 61 50 65 72 6d     assert( aPerm
11d00 75 74 65 21 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ute!=0 );.  }.  
11d10 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70  n = pOp->p3;.  p
11d20 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
11d30 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73  4.pKeyInfo;.  as
11d40 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 61  sert( n>0 );.  a
11d50 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21  ssert( pKeyInfo!
11d60 3d 30 20 29 3b 0a 20 20 70 31 20 3d 20 70 4f 70  =0 );.  p1 = pOp
11d70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70  ->p1;.  p2 = pOp
11d80 2d 3e 70 32 3b 0a 23 69 66 64 65 66 20 53 51 4c  ->p2;.#ifdef SQL
11d90 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
11da0 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
11db0 69 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a 20  int k, mx = 0;. 
11dc0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b     for(k=0; k<n;
11dd0 20 6b 2b 2b 29 20 69 66 28 20 61 50 65 72 6d 75   k++) if( aPermu
11de0 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d 20  te[k]>mx ) mx = 
11df0 61 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20 20  aPermute[k];.   
11e00 20 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26   assert( p1>0 &&
11e10 20 70 31 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d   p1+mx<=(p->nMem
11e20 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
11e30 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
11e40 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c  ( p2>0 && p2+mx<
11e50 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
11e60 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20  >nCursor)+1 );. 
11e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
11e80 72 74 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6e  rt( p1>0 && p1+n
11e90 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
11ea0 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a  ->nCursor)+1 );.
11eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e 30      assert( p2>0
11ec0 20 26 26 20 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d   && p2+n<=(p->nM
11ed0 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
11ee0 72 29 2b 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  r)+1 );.  }.#end
11ef0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
11f00 55 47 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  UG */.  for(i=0;
11f10 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
11f20 69 64 78 20 3d 20 61 50 65 72 6d 75 74 65 20 3f  idx = aPermute ?
11f30 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20 69   aPermute[i] : i
11f40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
11f50 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
11f60 31 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 61  1+idx]) );.    a
11f70 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
11f80 64 28 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29  d(&aMem[p2+idx])
11f90 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52   );.    REGISTER
11fa0 5f 54 52 41 43 45 28 70 31 2b 69 64 78 2c 20 26  _TRACE(p1+idx, &
11fb0 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 3b 0a 20  aMem[p1+idx]);. 
11fc0 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
11fd0 45 28 70 32 2b 69 64 78 2c 20 26 61 4d 65 6d 5b  E(p2+idx, &aMem[
11fe0 70 32 2b 69 64 78 5d 29 3b 0a 20 20 20 20 61 73  p2+idx]);.    as
11ff0 73 65 72 74 28 20 69 3c 70 4b 65 79 49 6e 66 6f  sert( i<pKeyInfo
12000 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 29 3b 0a 20  ->nKeyField );. 
12010 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49     pColl = pKeyI
12020 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a 20  nfo->aColl[i];. 
12030 20 20 20 62 52 65 76 20 3d 20 70 4b 65 79 49 6e     bRev = pKeyIn
12040 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
12050 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65 20  ];.    iCompare 
12060 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
12070 61 72 65 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78  are(&aMem[p1+idx
12080 5d 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d  ], &aMem[p2+idx]
12090 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66  , pColl);.    if
120a0 28 20 69 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20  ( iCompare ){.  
120b0 20 20 20 20 69 66 28 20 62 52 65 76 20 29 20 69      if( bRev ) i
120c0 43 6f 6d 70 61 72 65 20 3d 20 2d 69 43 6f 6d 70  Compare = -iComp
120d0 61 72 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  are;.      break
120e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
120f0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
12100 65 3a 20 4a 75 6d 70 20 50 31 20 50 32 20 50 33  e: Jump P1 P2 P3
12110 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20   * *.**.** Jump 
12120 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  to the instructi
12130 6f 6e 20 61 74 20 61 64 64 72 65 73 73 20 50 31  on at address P1
12140 2c 20 50 32 2c 20 6f 72 20 50 33 20 64 65 70 65  , P2, or P3 depe
12150 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
12160 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 6f 73 74 20  .** in the most 
12170 72 65 63 65 6e 74 20 4f 50 5f 43 6f 6d 70 61 72  recent OP_Compar
12180 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  e instruction th
12190 65 20 50 31 20 76 65 63 74 6f 72 20 77 61 73 20  e P1 vector was 
121a0 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 65 71 75  less than.** equ
121b0 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
121c0 72 20 74 68 61 6e 20 74 68 65 20 50 32 20 76 65  r than the P2 ve
121d0 63 74 6f 72 2c 20 72 65 73 70 65 63 74 69 76 65  ctor, respective
121e0 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a  ly..*/.case OP_J
121f0 75 6d 70 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ump: {          
12200 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
12210 69 66 28 20 69 43 6f 6d 70 61 72 65 3c 30 20 29  if( iCompare<0 )
12220 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  {.    VdbeBranch
12230 54 61 6b 65 6e 28 30 2c 34 29 3b 20 70 4f 70 20  Taken(0,4); pOp 
12240 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 31 20 2d  = &aOp[pOp->p1 -
12250 20 31 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   1];.  }else if(
12260 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a   iCompare==0 ){.
12270 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
12280 6b 65 6e 28 31 2c 34 29 3b 20 70 4f 70 20 3d 20  ken(1,4); pOp = 
12290 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31  &aOp[pOp->p2 - 1
122a0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
122b0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
122c0 32 2c 34 29 3b 20 70 4f 70 20 3d 20 26 61 4f 70  2,4); pOp = &aOp
122d0 5b 70 4f 70 2d 3e 70 33 20 2d 20 31 5d 3b 0a 20  [pOp->p3 - 1];. 
122e0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
122f0 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50 31  * Opcode: And P1
12300 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
12310 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28 72  nopsis: r[P3]=(r
12320 5b 50 31 5d 20 26 26 20 72 5b 50 32 5d 29 0a 2a  [P1] && r[P2]).*
12330 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f  *.** Take the lo
12340 67 69 63 61 6c 20 41 4e 44 20 6f 66 20 74 68 65  gical AND of the
12350 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73   values in regis
12360 74 65 72 73 20 50 31 20 61 6e 64 20 50 32 20 61  ters P1 and P2 a
12370 6e 64 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  nd.** write the 
12380 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69  result into regi
12390 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49  ster P3..**.** I
123a0 66 20 65 69 74 68 65 72 20 50 31 20 6f 72 20 50  f either P1 or P
123b0 32 20 69 73 20 30 20 28 66 61 6c 73 65 29 20 74  2 is 0 (false) t
123c0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
123d0 73 20 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  s 0 even if.** t
123e0 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69  he other input i
123f0 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20  s NULL.  A NULL 
12400 61 6e 64 20 74 72 75 65 20 6f 72 20 74 77 6f 20  and true or two 
12410 4e 55 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20  NULLs give.** a 
12420 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  NULL output..*/.
12430 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31  /* Opcode: Or P1
12440 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
12450 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28 72  nopsis: r[P3]=(r
12460 5b 50 31 5d 20 7c 7c 20 72 5b 50 32 5d 29 0a 2a  [P1] || r[P2]).*
12470 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f  *.** Take the lo
12480 67 69 63 61 6c 20 4f 52 20 6f 66 20 74 68 65 20  gical OR of the 
12490 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
124a0 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  er P1 and P2 and
124b0 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 61 6e  .** store the an
124c0 73 77 65 72 20 69 6e 20 72 65 67 69 73 74 65 72  swer in register
124d0 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69   P3..**.** If ei
124e0 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69 73  ther P1 or P2 is
124f0 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29 20   nonzero (true) 
12500 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
12510 69 73 20 31 20 28 74 72 75 65 29 0a 2a 2a 20 65  is 1 (true).** e
12520 76 65 6e 20 69 66 20 74 68 65 20 6f 74 68 65 72  ven if the other
12530 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20   input is NULL. 
12540 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c 73   A NULL and fals
12550 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a 2a  e or two NULLs.*
12560 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f 75  * give a NULL ou
12570 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tput..*/.case OP
12580 5f 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20  _And:           
12590 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
125a0 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  _AND, in1, in2, 
125b0 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
125c0 4f 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  Or: {           
125d0 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
125e0 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  OR, in1, in2, ou
125f0 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b 20  t3 */.  int v1; 
12600 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
12610 6e 64 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20 31  nd:  0==FALSE, 1
12620 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f  ==TRUE, 2==UNKNO
12630 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  WN or NULL */.  
12640 69 6e 74 20 76 32 3b 20 20 20 20 2f 2a 20 52 69  int v2;    /* Ri
12650 67 68 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d 3d  ght operand: 0==
12660 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20  FALSE, 1==TRUE, 
12670 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55  2==UNKNOWN or NU
12680 4c 4c 20 2a 2f 0a 0a 20 20 76 31 20 3d 20 73 71  LL */..  v1 = sq
12690 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e  lite3VdbeBoolean
126a0 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70 4f 70 2d  Value(&aMem[pOp-
126b0 3e 70 31 5d 2c 20 32 29 3b 0a 20 20 76 32 20 3d  >p1], 2);.  v2 =
126c0 20 73 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c   sqlite3VdbeBool
126d0 65 61 6e 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70  eanValue(&aMem[p
126e0 4f 70 2d 3e 70 32 5d 2c 20 32 29 3b 0a 20 20 69  Op->p2], 2);.  i
126f0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
12700 4f 50 5f 41 6e 64 20 29 7b 0a 20 20 20 20 73 74  OP_And ){.    st
12710 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
12720 6e 65 64 20 63 68 61 72 20 61 6e 64 5f 6c 6f 67  ned char and_log
12730 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 30 2c 20 30  ic[] = { 0, 0, 0
12740 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 32 2c  , 0, 1, 2, 0, 2,
12750 20 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 61   2 };.    v1 = a
12760 6e 64 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32  nd_logic[v1*3+v2
12770 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
12780 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
12790 69 67 6e 65 64 20 63 68 61 72 20 6f 72 5f 6c 6f  igned char or_lo
127a0 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  gic[] = { 0, 1, 
127b0 32 2c 20 31 2c 20 31 2c 20 31 2c 20 32 2c 20 31  2, 1, 1, 1, 2, 1
127c0 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20  , 2 };.    v1 = 
127d0 6f 72 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32  or_logic[v1*3+v2
127e0 5d 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20  ];.  }.  pOut = 
127f0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
12800 20 20 69 66 28 20 76 31 3d 3d 32 20 29 7b 0a 20    if( v1==2 ){. 
12810 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61     MemSetTypeFla
12820 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c  g(pOut, MEM_Null
12830 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12840 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 31 3b 0a  pOut->u.i = v1;.
12850 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
12860 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
12870 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
12880 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73  }../* Opcode: Is
12890 54 72 75 65 20 50 31 20 50 32 20 50 33 20 50 34  True P1 P2 P3 P4
128a0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
128b0 72 5b 50 32 5d 20 3d 20 63 6f 61 6c 65 73 63 65  r[P2] = coalesce
128c0 28 72 5b 50 31 5d 3d 3d 54 52 55 45 2c 50 33 29  (r[P1]==TRUE,P3)
128d0 20 5e 20 50 34 0a 2a 2a 0a 2a 2a 20 54 68 69 73   ^ P4.**.** This
128e0 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e   opcode implemen
128f0 74 73 20 74 68 65 20 49 53 20 54 52 55 45 2c 20  ts the IS TRUE, 
12900 49 53 20 46 41 4c 53 45 2c 20 49 53 20 4e 4f 54  IS FALSE, IS NOT
12910 20 54 52 55 45 2c 20 61 6e 64 0a 2a 2a 20 49 53   TRUE, and.** IS
12920 20 4e 4f 54 20 46 41 4c 53 45 20 6f 70 65 72 61   NOT FALSE opera
12930 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  tors..**.** Inte
12940 72 70 72 65 74 20 74 68 65 20 76 61 6c 75 65 20  rpret the value 
12950 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
12960 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  s a boolean valu
12970 65 2e 20 20 53 74 6f 72 65 20 74 68 61 74 0a 2a  e.  Store that.*
12980 2a 20 62 6f 6f 6c 65 61 6e 20 28 61 20 30 20 6f  * boolean (a 0 o
12990 72 20 31 29 20 69 6e 20 72 65 67 69 73 74 65 72  r 1) in register
129a0 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65 20   P2.  Or if the 
129b0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
129c0 72 20 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c  r P1 is .** NULL
129d0 2c 20 74 68 65 6e 20 74 68 65 20 50 33 20 69 73  , then the P3 is
129e0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
129f0 74 65 72 20 50 32 2e 20 20 49 6e 76 65 72 74 20  ter P2.  Invert 
12a00 74 68 65 20 61 6e 73 77 65 72 20 69 66 20 50 34  the answer if P4
12a10 0a 2a 2a 20 69 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  .** is 1..**.** 
12a20 54 68 65 20 6c 6f 67 69 63 20 69 73 20 73 75 6d  The logic is sum
12a30 6d 61 72 69 7a 65 64 20 6c 69 6b 65 20 74 68 69  marized like thi
12a40 73 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 20 0a 2a  s:.**.** <ul> .*
12a50 2a 20 3c 6c 69 3e 20 49 66 20 50 33 3d 3d 30 20  * <li> If P3==0 
12a60 61 6e 64 20 50 34 3d 3d 30 20 20 74 68 65 6e 20  and P4==0  then 
12a70 20 72 5b 50 32 5d 20 3a 3d 20 72 5b 50 31 5d 20   r[P2] := r[P1] 
12a80 49 53 20 54 52 55 45 0a 2a 2a 20 3c 6c 69 3e 20  IS TRUE.** <li> 
12a90 49 66 20 50 33 3d 3d 31 20 61 6e 64 20 50 34 3d  If P3==1 and P4=
12aa0 3d 31 20 20 74 68 65 6e 20 20 72 5b 50 32 5d 20  =1  then  r[P2] 
12ab0 3a 3d 20 72 5b 50 31 5d 20 49 53 20 46 41 4c 53  := r[P1] IS FALS
12ac0 45 0a 2a 2a 20 3c 6c 69 3e 20 49 66 20 50 33 3d  E.** <li> If P3=
12ad0 3d 30 20 61 6e 64 20 50 34 3d 3d 31 20 20 74 68  =0 and P4==1  th
12ae0 65 6e 20 20 72 5b 50 32 5d 20 3a 3d 20 72 5b 50  en  r[P2] := r[P
12af0 31 5d 20 49 53 20 4e 4f 54 20 54 52 55 45 0a 2a  1] IS NOT TRUE.*
12b00 2a 20 3c 6c 69 3e 20 49 66 20 50 33 3d 3d 31 20  * <li> If P3==1 
12b10 61 6e 64 20 50 34 3d 3d 30 20 20 74 68 65 6e 20  and P4==0  then 
12b20 20 72 5b 50 32 5d 20 3a 3d 20 72 5b 50 31 5d 20   r[P2] := r[P1] 
12b30 49 53 20 4e 4f 54 20 46 41 4c 53 45 0a 2a 2a 20  IS NOT FALSE.** 
12b40 3c 2f 75 6c 3e 0a 2a 2f 0a 63 61 73 65 20 4f 50  </ul>.*/.case OP
12b50 5f 49 73 54 72 75 65 3a 20 7b 20 20 20 20 20 20  _IsTrue: {      
12b60 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c           /* in1,
12b70 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72   out2 */.  asser
12b80 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
12b90 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73  P4_INT32 );.  as
12ba0 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 69 3d  sert( pOp->p4.i=
12bb0 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 69 3d  =0 || pOp->p4.i=
12bc0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
12bd0 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 70 4f  pOp->p3==0 || pO
12be0 70 2d 3e 70 33 3d 3d 31 20 29 3b 0a 20 20 73 71  p->p3==1 );.  sq
12bf0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49  lite3VdbeMemSetI
12c00 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  nt64(&aMem[pOp->
12c10 70 32 5d 2c 0a 20 20 20 20 20 20 73 71 6c 69 74  p2],.      sqlit
12c20 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e 56 61 6c  e3VdbeBooleanVal
12c30 75 65 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31  ue(&aMem[pOp->p1
12c40 5d 2c 20 70 4f 70 2d 3e 70 33 29 20 5e 20 70 4f  ], pOp->p3) ^ pO
12c50 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 62 72 65 61  p->p4.i);.  brea
12c60 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
12c70 20 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a   Not P1 P2 * * *
12c80 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
12c90 50 32 5d 3d 20 21 72 5b 50 31 5d 0a 2a 2a 0a 2a  P2]= !r[P1].**.*
12ca0 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
12cb0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
12cc0 72 20 50 31 20 61 73 20 61 20 62 6f 6f 6c 65 61  r P1 as a boolea
12cd0 6e 20 76 61 6c 75 65 2e 20 20 53 74 6f 72 65 20  n value.  Store 
12ce0 74 68 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63  the.** boolean c
12cf0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 20 72 65 67  omplement in reg
12d00 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 74 68  ister P2.  If th
12d10 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
12d20 74 65 72 20 50 31 20 69 73 20 0a 2a 2a 20 4e 55  ter P1 is .** NU
12d30 4c 4c 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20  LL, then a NULL 
12d40 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 32 2e  is stored in P2.
12d50 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 3a  .*/.case OP_Not:
12d60 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
12d70 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
12d80 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a  NOT, in1, out2 *
12d90 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
12da0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75  [pOp->p1];.  pOu
12db0 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
12dc0 32 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  2];.  if( (pIn1-
12dd0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
12de0 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  l)==0 ){.    sql
12df0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e  ite3VdbeMemSetIn
12e00 74 36 34 28 70 4f 75 74 2c 20 21 73 71 6c 69 74  t64(pOut, !sqlit
12e10 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e 56 61 6c  e3VdbeBooleanVal
12e20 75 65 28 70 49 6e 31 2c 30 29 29 3b 0a 20 20 7d  ue(pIn1,0));.  }
12e30 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
12e40 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
12e50 70 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 62 72 65  pOut);.  }.  bre
12e60 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
12e70 3a 20 42 69 74 4e 6f 74 20 50 31 20 50 32 20 2a  : BitNot P1 P2 *
12e80 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
12e90 3a 20 72 5b 50 32 5d 3d 20 7e 72 5b 50 31 5d 0a  : r[P2]= ~r[P1].
12ea0 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  **.** Interpret 
12eb0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
12ec0 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61 6e  egister P1 as an
12ed0 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f 72 65   integer.  Store
12ee0 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63 6f 6d   the.** ones-com
12ef0 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 50  plement of the P
12f00 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  1 value into reg
12f10 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 50 31  ister P2.  If P1
12f20 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55 4c 4c   holds.** a NULL
12f30 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20 4e 55   then store a NU
12f40 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73  LL in P2..*/.cas
12f50 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 20 20  e OP_BitNot: {  
12f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
12f70 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f 54 2c  me as TK_BITNOT,
12f80 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20   in1, out2 */.  
12f90 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
12fa0 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
12fb0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
12fc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
12fd0 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
12fe0 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
12ff0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
13000 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c   ){.    pOut->fl
13010 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
13020 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 7e     pOut->u.i = ~
13030 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
13040 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20  lue(pIn1);.  }. 
13050 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
13060 63 6f 64 65 3a 20 4f 6e 63 65 20 50 31 20 50 32  code: Once P1 P2
13070 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 61 6c   * * *.**.** Fal
13080 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
13090 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
130a0 6e 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  n the first time
130b0 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 0a   this opcode is.
130c0 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 6f  ** encountered o
130d0 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
130e0 6e 20 6f 66 20 74 68 65 20 62 79 74 65 2d 63 6f  n of the byte-co
130f0 64 65 20 70 72 6f 67 72 61 6d 2e 20 20 4a 75 6d  de program.  Jum
13100 70 20 74 6f 20 50 32 0a 2a 2a 20 6f 6e 20 74 68  p to P2.** on th
13110 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 61 6c 6c  e second and all
13120 20 73 75 62 73 65 71 75 65 6e 74 20 65 6e 63 6f   subsequent enco
13130 75 6e 74 65 72 73 20 64 75 72 69 6e 67 20 74 68  unters during th
13140 65 20 73 61 6d 65 20 69 6e 76 6f 63 61 74 69 6f  e same invocatio
13150 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 70 2d 6c 65 76  n..**.** Top-lev
13160 65 6c 20 70 72 6f 67 72 61 6d 73 20 64 65 74 65  el programs dete
13170 72 6d 69 6e 65 20 66 69 72 73 74 20 69 6e 76 6f  rmine first invo
13180 63 61 74 69 6f 6e 20 62 79 20 63 6f 6d 70 61 72  cation by compar
13190 69 6e 67 20 74 68 65 20 50 31 0a 2a 2a 20 6f 70  ing the P1.** op
131a0 65 72 61 6e 64 20 61 67 61 69 6e 73 74 20 74 68  erand against th
131b0 65 20 50 31 20 6f 70 65 72 61 6e 64 20 6f 6e 20  e P1 operand on 
131c0 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f  the OP_Init opco
131d0 64 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  de at the beginn
131e0 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 70 72  ing.** of the pr
131f0 6f 67 72 61 6d 2e 20 20 49 66 20 74 68 65 20 50  ogram.  If the P
13200 31 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 2c  1 values differ,
13210 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
13220 67 68 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 74  gh and make.** t
13230 68 65 20 50 31 20 6f 66 20 74 68 69 73 20 6f 70  he P1 of this op
13240 63 6f 64 65 20 65 71 75 61 6c 20 74 6f 20 74 68  code equal to th
13250 65 20 50 31 20 6f 66 20 4f 50 5f 49 6e 69 74 2e  e P1 of OP_Init.
13260 20 20 49 66 20 50 31 20 76 61 6c 75 65 73 20 61    If P1 values a
13270 72 65 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 74  re.** the same t
13280 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  hen take the jum
13290 70 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 75 62  p..**.** For sub
132a0 70 72 6f 67 72 61 6d 73 2c 20 74 68 65 72 65 20  programs, there 
132b0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 20  is a bitmask in 
132c0 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 74 68  the VdbeFrame th
132d0 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a  at determines.**
132e0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
132f0 74 68 65 20 6a 75 6d 70 20 73 68 6f 75 6c 64 20  the jump should 
13300 62 65 20 74 61 6b 65 6e 2e 20 20 54 68 65 20 62  be taken.  The b
13310 69 74 6d 61 73 6b 20 69 73 20 6e 65 63 65 73 73  itmask is necess
13320 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ary.** because t
13330 68 65 20 73 65 6c 66 2d 61 6c 74 65 72 69 6e 67  he self-altering
13340 20 63 6f 64 65 20 74 72 69 63 6b 20 64 6f 65 73   code trick does
13350 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 72 20 72 65   not work for re
13360 63 75 72 73 69 76 65 0a 2a 2a 20 74 72 69 67 67  cursive.** trigg
13370 65 72 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ers..*/.case OP_
13380 4f 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20  Once: {         
13390 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
133a0 20 75 33 32 20 69 41 64 64 72 3b 20 20 20 20 20   u32 iAddr;     
133b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
133c0 64 72 65 73 73 20 6f 66 20 74 68 69 73 20 69 6e  dress of this in
133d0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 61  struction */.  a
133e0 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b 30 5d  ssert( p->aOp[0]
133f0 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  .opcode==OP_Init
13400 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72   );.  if( p->pFr
13410 61 6d 65 20 29 7b 0a 20 20 20 20 69 41 64 64 72  ame ){.    iAddr
13420 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70   = (int)(pOp - p
13430 2d 3e 61 4f 70 29 3b 0a 20 20 20 20 69 66 28 20  ->aOp);.    if( 
13440 28 70 2d 3e 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  (p->pFrame->aOnc
13450 65 5b 69 41 64 64 72 2f 38 5d 20 26 20 28 31 3c  e[iAddr/8] & (1<
13460 3c 28 69 41 64 64 72 20 26 20 37 29 29 29 21 3d  <(iAddr & 7)))!=
13470 30 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 42  0 ){.      VdbeB
13480 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 20 32 29  ranchTaken(1, 2)
13490 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d  ;.      goto jum
134a0 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20  p_to_p2;.    }. 
134b0 20 20 20 70 2d 3e 70 46 72 61 6d 65 2d 3e 61 4f     p->pFrame->aO
134c0 6e 63 65 5b 69 41 64 64 72 2f 38 5d 20 7c 3d 20  nce[iAddr/8] |= 
134d0 31 3c 3c 28 69 41 64 64 72 20 26 20 37 29 3b 0a  1<<(iAddr & 7);.
134e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
134f0 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3d 3d 70   p->aOp[0].p1==p
13500 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 20 20  Op->p1 ){.      
13510 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
13520 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 67 6f 74  1, 2);.      got
13530 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
13540 20 20 7d 0a 20 20 7d 0a 20 20 56 64 62 65 42 72    }.  }.  VdbeBr
13550 61 6e 63 68 54 61 6b 65 6e 28 30 2c 20 32 29 3b  anchTaken(0, 2);
13560 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 2d 3e  .  pOp->p1 = p->
13570 61 4f 70 5b 30 5d 2e 70 31 3b 0a 20 20 62 72 65  aOp[0].p1;.  bre
13580 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
13590 3a 20 49 66 20 50 31 20 50 32 20 50 33 20 2a 20  : If P1 P2 P3 * 
135a0 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  *.**.** Jump to 
135b0 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  P2 if the value 
135c0 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
135d0 73 20 74 72 75 65 2e 20 20 54 68 65 20 76 61 6c  s true.  The val
135e0 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ue.** is conside
135f0 72 65 64 20 74 72 75 65 20 69 66 20 69 74 20 69  red true if it i
13600 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20 6e 6f  s numeric and no
13610 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20  n-zero.  If the 
13620 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69  value.** in P1 i
13630 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65  s NULL then take
13640 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61 6e 64   the jump if and
13650 20 6f 6e 6c 79 20 69 66 20 50 33 20 69 73 20 6e   only if P3 is n
13660 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65  on-zero..*/.case
13670 20 4f 50 5f 49 66 3a 20 20 7b 20 20 20 20 20 20   OP_If:  {      
13680 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
13690 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63  , in1 */.  int c
136a0 3b 0a 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56  ;.  c = sqlite3V
136b0 64 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  dbeBooleanValue(
136c0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20  &aMem[pOp->p1], 
136d0 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 56 64 62 65  pOp->p3);.  Vdbe
136e0 42 72 61 6e 63 68 54 61 6b 65 6e 28 63 21 3d 30  BranchTaken(c!=0
136f0 2c 20 32 29 3b 0a 20 20 69 66 28 20 63 20 29 20  , 2);.  if( c ) 
13700 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
13710 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
13720 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74 20 50 31  Opcode: IfNot P1
13730 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
13740 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
13750 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
13760 73 74 65 72 20 50 31 20 69 73 20 46 61 6c 73 65  ster P1 is False
13770 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20  .  The value.** 
13780 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 66 61  is considered fa
13790 6c 73 65 20 69 66 20 69 74 20 68 61 73 20 61 20  lse if it has a 
137a0 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20 6f 66  numeric value of
137b0 20 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 76   zero.  If the v
137c0 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73  alue.** in P1 is
137d0 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20   NULL then take 
137e0 74 68 65 20 6a 75 6d 70 20 69 66 20 61 6e 64 20  the jump if and 
137f0 6f 6e 6c 79 20 69 66 20 50 33 20 69 73 20 6e 6f  only if P3 is no
13800 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20  n-zero..*/.case 
13810 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20  OP_IfNot: {     
13820 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
13830 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a  in1 */.  int c;.
13840 20 20 63 20 3d 20 21 73 71 6c 69 74 65 33 56 64    c = !sqlite3Vd
13850 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 26  beBooleanValue(&
13860 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 21  aMem[pOp->p1], !
13870 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 56 64 62 65  pOp->p3);.  Vdbe
13880 42 72 61 6e 63 68 54 61 6b 65 6e 28 63 21 3d 30  BranchTaken(c!=0
13890 2c 20 32 29 3b 0a 20 20 69 66 28 20 63 20 29 20  , 2);.  if( c ) 
138a0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
138b0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
138c0 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20 50  Opcode: IsNull P
138d0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
138e0 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d  nopsis: if r[P1]
138f0 3d 3d 4e 55 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a  ==NULL goto P2.*
13900 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20  *.** Jump to P2 
13910 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
13920 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 4e  register P1 is N
13930 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
13940 49 73 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  IsNull: {       
13950 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
13960 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c  TK_ISNULL, jump,
13970 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
13980 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
13990 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
139a0 65 6e 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  en( (pIn1->flags
139b0 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 2c   & MEM_Null)!=0,
139c0 20 32 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31   2);.  if( (pIn1
139d0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
139e0 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ll)!=0 ){.    go
139f0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
13a00 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
13a10 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75 6c  * Opcode: NotNul
13a20 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  l P1 P2 * * *.**
13a30 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b   Synopsis: if r[
13a40 50 31 5d 21 3d 4e 55 4c 4c 20 67 6f 74 6f 20 50  P1]!=NULL goto P
13a50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  2.**.** Jump to 
13a60 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  P2 if the value 
13a70 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
13a80 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20 0a 2a 2f  s not NULL.  .*/
13a90 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  .case OP_NotNull
13aa0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
13ab0 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54  * same as TK_NOT
13ac0 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20  NULL, jump, in1 
13ad0 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
13ae0 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64  m[pOp->p1];.  Vd
13af0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 28  beBranchTaken( (
13b00 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
13b10 4d 5f 4e 75 6c 6c 29 3d 3d 30 2c 20 32 29 3b 0a  M_Null)==0, 2);.
13b20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
13b30 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
13b40 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
13b50 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
13b60 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
13b70 6f 64 65 3a 20 49 66 4e 75 6c 6c 52 6f 77 20 50  ode: IfNullRow P
13b80 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
13b90 79 6e 6f 70 73 69 73 3a 20 69 66 20 50 31 2e 6e  ynopsis: if P1.n
13ba0 75 6c 6c 52 6f 77 20 74 68 65 6e 20 72 5b 50 33  ullRow then r[P3
13bb0 5d 3d 4e 55 4c 4c 2c 20 67 6f 74 6f 20 50 32 0a  ]=NULL, goto P2.
13bc0 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  **.** Check the 
13bd0 63 75 72 73 6f 72 20 50 31 20 74 6f 20 73 65 65  cursor P1 to see
13be0 20 69 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   if it is curren
13bf0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  tly pointing at 
13c00 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 20 49  a NULL row..** I
13c10 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 73 65  f it is, then se
13c20 74 20 72 65 67 69 73 74 65 72 20 50 33 20 74 6f  t register P3 to
13c30 20 4e 55 4c 4c 20 61 6e 64 20 6a 75 6d 70 20 69   NULL and jump i
13c40 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
13c50 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f  ..** If P1 is no
13c60 74 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 2c  t on a NULL row,
13c70 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
13c80 67 68 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  gh without makin
13c90 67 20 61 6e 79 0a 2a 2a 20 63 68 61 6e 67 65 73  g any.** changes
13ca0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e  ..*/.case OP_IfN
13cb0 75 6c 6c 52 6f 77 3a 20 7b 20 20 20 20 20 20 20  ullRow: {       
13cc0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61    /* jump */.  a
13cd0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
13ce0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
13cf0 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73  nCursor );.  ass
13d00 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ert( p->apCsr[pO
13d10 70 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20 69  p->p1]!=0 );.  i
13d20 66 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  f( p->apCsr[pOp-
13d30 3e 70 31 5d 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  >p1]->nullRow ){
13d40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13d50 4d 65 6d 53 65 74 4e 75 6c 6c 28 61 4d 65 6d 20  MemSetNull(aMem 
13d60 2b 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20  + pOp->p3);.    
13d70 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
13d80 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
13d90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13da0 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
13db0 5f 46 55 4e 43 0a 2f 2a 20 4f 70 63 6f 64 65 3a  _FUNC./* Opcode:
13dc0 20 4f 66 66 73 65 74 20 50 31 20 50 32 20 50 33   Offset P1 P2 P3
13dd0 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
13de0 3a 20 72 5b 50 33 5d 20 3d 20 73 71 6c 69 74 65  : r[P3] = sqlite
13df0 5f 6f 66 66 73 65 74 28 50 31 29 0a 2a 2a 0a 2a  _offset(P1).**.*
13e00 2a 20 53 74 6f 72 65 20 69 6e 20 72 65 67 69 73  * Store in regis
13e10 74 65 72 20 72 5b 50 33 5d 20 74 68 65 20 62 79  ter r[P3] the by
13e20 74 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74  te offset into t
13e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13e40 20 74 68 61 74 20 69 73 20 74 68 65 0a 2a 2a 20   that is the.** 
13e50 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 79  start of the pay
13e60 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 65 63  load for the rec
13e70 6f 72 64 20 61 74 20 77 68 69 63 68 20 74 68 61  ord at which tha
13e80 74 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 63  t cursor P1 is c
13e90 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
13ea0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69  ting..**.** P2 i
13eb0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  s the column num
13ec0 62 65 72 20 66 6f 72 20 74 68 65 20 61 72 67 75  ber for the argu
13ed0 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69  ment to the sqli
13ee0 74 65 5f 6f 66 66 73 65 74 28 29 20 66 75 6e 63  te_offset() func
13ef0 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 6f 70  tion..** This op
13f00 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
13f10 65 20 50 32 20 69 74 73 65 6c 66 2c 20 62 75 74  e P2 itself, but
13f20 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 69 73   the P2 value is
13f30 20 75 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20   used by the.** 
13f40 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 2e 20  code generator. 
13f50 20 54 68 65 20 50 31 2c 20 50 32 2c 20 61 6e 64   The P1, P2, and
13f60 20 50 33 20 6f 70 65 72 61 6e 64 73 20 74 6f 20   P3 operands to 
13f70 74 68 69 73 20 6f 70 63 6f 64 65 20 61 72 65 20  this opcode are 
13f80 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 66  the.** same as f
13f90 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 2e 0a 2a 2a  or OP_Column..**
13fa0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
13fb0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
13fc0 65 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 63  e if SQLite is c
13fd0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
13fe0 0a 2a 2a 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  .** -DSQLITE_ENA
13ff0 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
14000 55 4e 43 20 6f 70 74 69 6f 6e 2e 0a 2a 2f 0a 63  UNC option..*/.c
14010 61 73 65 20 4f 50 5f 4f 66 66 73 65 74 3a 20 7b  ase OP_Offset: {
14020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
14030 33 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  3 */.  VdbeCurso
14040 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65  r *pC;    /* The
14050 20 56 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a   VDBE cursor */.
14060 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
14070 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
14080 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
14090 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
140a0 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
140b0 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
140c0 33 5d 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  3];.  if( NEVER(
140d0 70 43 3d 3d 30 29 20 7c 7c 20 70 43 2d 3e 65 43  pC==0) || pC->eC
140e0 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f  urType!=CURTYPE_
140f0 42 54 52 45 45 20 29 7b 0a 20 20 20 20 73 71 6c  BTREE ){.    sql
14100 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
14110 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73  ll(pOut);.  }els
14120 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
14130 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4f  beMemSetInt64(pO
14140 75 74 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65  ut, sqlite3Btree
14150 4f 66 66 73 65 74 28 70 43 2d 3e 75 63 2e 70 43  Offset(pC->uc.pC
14160 75 72 73 6f 72 29 29 3b 0a 20 20 7d 0a 20 20 62  ursor));.  }.  b
14170 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
14180 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
14190 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20  OFFSET_SQL_FUNC 
141a0 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  */../* Opcode: C
141b0 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20 50  olumn P1 P2 P3 P
141c0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
141d0 3a 20 72 5b 50 33 5d 3d 50 58 0a 2a 2a 0a 2a 2a  : r[P3]=PX.**.**
141e0 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 64   Interpret the d
141f0 61 74 61 20 74 68 61 74 20 63 75 72 73 6f 72 20  ata that cursor 
14200 50 31 20 70 6f 69 6e 74 73 20 74 6f 20 61 73 20  P1 points to as 
14210 61 20 73 74 72 75 63 74 75 72 65 20 62 75 69 6c  a structure buil
14220 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 4d  t using.** the M
14230 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75  akeRecord instru
14240 63 74 69 6f 6e 2e 20 20 28 53 65 65 20 74 68 65  ction.  (See the
14250 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f   MakeRecord opco
14260 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
14270 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
14280 20 61 62 6f 75 74 20 74 68 65 20 66 6f 72 6d 61   about the forma
14290 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e 29 20  t of the data.) 
142a0 20 45 78 74 72 61 63 74 20 74 68 65 20 50 32 2d   Extract the P2-
142b0 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66 72 6f  th column.** fro
142c0 6d 20 74 68 69 73 20 72 65 63 6f 72 64 2e 20 20  m this record.  
142d0 49 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  If there are les
142e0 73 20 74 68 61 74 20 28 50 32 2b 31 29 20 0a 2a  s that (P2+1) .*
142f0 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  * values in the 
14300 72 65 63 6f 72 64 2c 20 65 78 74 72 61 63 74 20  record, extract 
14310 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  a NULL..**.** Th
14320 65 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65  e value extracte
14330 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  d is stored in r
14340 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a  egister P3..**.*
14350 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
14360 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
14370 68 61 6e 20 50 32 20 66 69 65 6c 64 73 2c 20 74  han P2 fields, t
14380 68 65 6e 20 65 78 74 72 61 63 74 20 61 20 4e 55  hen extract a NU
14390 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66 20 74  LL.  Or,.** if t
143a0 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69  he P4 argument i
143b0 73 20 61 20 50 34 5f 4d 45 4d 20 75 73 65 20 74  s a P4_MEM use t
143c0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
143d0 50 34 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a  P4 argument as.*
143e0 2a 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  * the result..**
143f0 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
14400 47 5f 43 4c 45 41 52 43 41 43 48 45 20 62 69 74  G_CLEARCACHE bit
14410 20 69 73 20 73 65 74 20 6f 6e 20 50 35 20 61 6e   is set on P5 an
14420 64 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f  d P1 is a pseudo
14430 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 0a 2a  -table cursor,.*
14440 2a 20 74 68 65 6e 20 74 68 65 20 63 61 63 68 65  * then the cache
14450 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   of the cursor i
14460 73 20 72 65 73 65 74 20 70 72 69 6f 72 20 74 6f  s reset prior to
14470 20 65 78 74 72 61 63 74 69 6e 67 20 74 68 65 20   extracting the 
14480 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 66  column..** The f
14490 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61  irst OP_Column a
144a0 67 61 69 6e 73 74 20 61 20 70 73 65 75 64 6f 2d  gainst a pseudo-
144b0 74 61 62 6c 65 20 61 66 74 65 72 20 74 68 65 20  table after the 
144c0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6e  value of the con
144d0 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  tent.** register
144e0 20 68 61 73 20 63 68 61 6e 67 65 64 20 73 68 6f   has changed sho
144f0 75 6c 64 20 68 61 76 65 20 74 68 69 73 20 62 69  uld have this bi
14500 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t set..**.** If 
14510 74 68 65 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  the OPFLAG_LENGT
14520 48 41 52 47 20 61 6e 64 20 4f 50 46 4c 41 47 5f  HARG and OPFLAG_
14530 54 59 50 45 4f 46 41 52 47 20 62 69 74 73 20 61  TYPEOFARG bits a
14540 72 65 20 73 65 74 20 6f 6e 20 50 35 20 74 68 65  re set on P5 the
14550 6e 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  n.** the result 
14560 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
14570 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61 73   only be used as
14580 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6f 66   the argument of
14590 20 61 20 6c 65 6e 67 74 68 28 29 0a 2a 2a 20 6f   a length().** o
145a0 72 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  r typeof() funct
145b0 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ion, respectivel
145c0 79 2e 20 20 54 68 65 20 6c 6f 61 64 69 6e 67 20  y.  The loading 
145d0 6f 66 20 6c 61 72 67 65 20 62 6c 6f 62 73 20 63  of large blobs c
145e0 61 6e 20 62 65 0a 2a 2a 20 73 6b 69 70 70 65 64  an be.** skipped
145f0 20 66 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   for length() an
14600 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 6c 6f  d all content lo
14610 61 64 69 6e 67 20 63 61 6e 20 62 65 20 73 6b 69  ading can be ski
14620 70 70 65 64 20 66 6f 72 20 74 79 70 65 6f 66 28  pped for typeof(
14630 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  )..*/.case OP_Co
14640 6c 75 6d 6e 3a 20 7b 0a 20 20 69 6e 74 20 70 32  lumn: {.  int p2
14650 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14660 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74 6f  column number to
14670 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 56   retrieve */.  V
14680 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20  dbeCursor *pC;  
14690 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
146a0 72 73 6f 72 20 2a 2f 0a 20 20 42 74 43 75 72 73  rsor */.  BtCurs
146b0 6f 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a 20  or *pCrsr;   /* 
146c0 54 68 65 20 42 54 72 65 65 20 63 75 72 73 6f 72  The BTree cursor
146d0 20 2a 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66 73   */.  u32 *aOffs
146e0 65 74 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66 66  et;      /* aOff
146f0 73 65 74 5b 69 5d 20 69 73 20 6f 66 66 73 65 74  set[i] is offset
14700 20 74 6f 20 73 74 61 72 74 20 6f 66 20 64 61 74   to start of dat
14710 61 20 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75 6d  a for i-th colum
14720 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20  n */.  int len; 
14730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14740 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
14750 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 66  erialized data f
14760 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  or the column */
14770 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
14780 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14790 75 6e 74 65 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a  unter */.  Mem *
147a0 70 44 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  pDest;        /*
147b0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
147c0 74 68 65 20 65 78 74 72 61 63 74 65 64 20 76 61  the extracted va
147d0 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 73 4d 65  lue */.  Mem sMe
147e0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
147f0 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20 72  or storing the r
14800 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
14810 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ded */.  const u
14820 38 20 2a 7a 44 61 74 61 3b 20 20 20 2f 2a 20 50  8 *zData;   /* P
14830 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
14840 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20  d being decoded 
14850 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  */.  const u8 *z
14860 48 64 72 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  Hdr;    /* Next 
14870 75 6e 70 61 72 73 65 64 20 62 79 74 65 20 6f 66  unparsed byte of
14880 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
14890 20 63 6f 6e 73 74 20 75 38 20 2a 7a 45 6e 64 48   const u8 *zEndH
148a0 64 72 3b 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  dr; /* Pointer t
148b0 6f 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  o first byte aft
148c0 65 72 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  er the header */
148d0 0a 20 20 75 36 34 20 6f 66 66 73 65 74 36 34 3b  .  u64 offset64;
148e0 20 20 20 20 20 20 2f 2a 20 36 34 2d 62 69 74 20        /* 64-bit 
148f0 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
14900 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
14910 2a 20 41 20 74 79 70 65 20 63 6f 64 65 20 66 72  * A type code fr
14920 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20 68 65  om the record he
14930 61 64 65 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ader */.  Mem *p
14940 52 65 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Reg;         /* 
14950 50 73 65 75 64 6f 54 61 62 6c 65 20 69 6e 70 75  PseudoTable inpu
14960 74 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  t register */.. 
14970 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
14980 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 32 20 3d 20  Op->p1];.  p2 = 
14990 70 4f 70 2d 3e 70 32 3b 0a 0a 20 20 2f 2a 20 49  pOp->p2;..  /* I
149a0 66 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 63  f the cursor cac
149b0 68 65 20 69 73 20 73 74 61 6c 65 20 28 6d 65 61  he is stale (mea
149c0 6e 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 63  ning it is not c
149d0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 61  urrently point a
149e0 74 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  t.  ** the corre
149f0 63 74 20 72 6f 77 29 20 74 68 65 6e 20 62 72 69  ct row) then bri
14a00 6e 67 20 69 74 20 75 70 2d 74 6f 2d 64 61 74 65  ng it up-to-date
14a10 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20 6e 65   by doing the ne
14a20 63 65 73 73 61 72 79 20 0a 20 20 2a 2a 20 42 2d  cessary .  ** B-
14a30 54 72 65 65 20 73 65 65 6b 2e 20 2a 2f 0a 20 20  Tree seek. */.  
14a40 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
14a50 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 26 70 43  CursorMoveto(&pC
14a60 2c 20 26 70 32 29 3b 0a 20 20 69 66 28 20 72 63  , &p2);.  if( rc
14a70 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
14a80 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 61  e_to_error;..  a
14a90 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
14aa0 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d   && pOp->p3<=(p-
14ab0 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
14ac0 72 73 6f 72 29 20 29 3b 0a 20 20 70 44 65 73 74  rsor) );.  pDest
14ad0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
14ae0 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
14af0 68 61 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b  hange(p, pDest);
14b00 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
14b10 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
14b20 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
14b30 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
14b40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 32 3c 70  ;.  assert( p2<p
14b50 43 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20 61  C->nField );.  a
14b60 4f 66 66 73 65 74 20 3d 20 70 43 2d 3e 61 4f 66  Offset = pC->aOf
14b70 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
14b80 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55  pC->eCurType!=CU
14b90 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20  RTYPE_VTAB );.  
14ba0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
14bb0 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53  Type!=CURTYPE_PS
14bc0 45 55 44 4f 20 7c 7c 20 70 43 2d 3e 6e 75 6c 6c  EUDO || pC->null
14bd0 52 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Row );.  assert(
14be0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43   pC->eCurType!=C
14bf0 55 52 54 59 50 45 5f 53 4f 52 54 45 52 20 29 3b  URTYPE_SORTER );
14c00 0a 0a 20 20 69 66 28 20 70 43 2d 3e 63 61 63 68  ..  if( pC->cach
14c10 65 53 74 61 74 75 73 21 3d 70 2d 3e 63 61 63 68  eStatus!=p->cach
14c20 65 43 74 72 20 29 7b 20 20 20 20 20 20 20 20 20  eCtr ){         
14c30 20 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a         /*OPTIMIZ
14c40 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
14c50 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c  .    if( pC->nul
14c60 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 66  lRow ){.      if
14c70 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
14c80 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 29  CURTYPE_PSEUDO )
14c90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
14ca0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
14cb0 65 20 6f 66 20 61 73 20 70 73 65 75 64 6f 2d 63  e of as pseudo-c
14cc0 75 72 73 6f 72 2c 20 74 68 65 20 73 65 65 6b 52  ursor, the seekR
14cd0 65 73 75 6c 74 20 66 69 65 6c 64 0a 20 20 20 20  esult field.    
14ce0 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 66 69 65      ** identifie
14cf0 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  s the register t
14d00 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 72 65  hat holds the re
14d10 63 6f 72 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  cord */.        
14d20 61 73 73 65 72 74 28 20 70 43 2d 3e 73 65 65 6b  assert( pC->seek
14d30 52 65 73 75 6c 74 3e 30 20 29 3b 0a 20 20 20 20  Result>0 );.    
14d40 20 20 20 20 70 52 65 67 20 3d 20 26 61 4d 65 6d      pReg = &aMem
14d50 5b 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 5d  [pC->seekResult]
14d60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14d70 28 20 70 52 65 67 2d 3e 66 6c 61 67 73 20 26 20  ( pReg->flags & 
14d80 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
14d90 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
14da0 73 56 61 6c 69 64 28 70 52 65 67 29 20 29 3b 0a  sValid(pReg) );.
14db0 20 20 20 20 20 20 20 20 70 43 2d 3e 70 61 79 6c          pC->payl
14dc0 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e 73 7a  oadSize = pC->sz
14dd0 52 6f 77 20 3d 20 70 52 65 67 2d 3e 6e 3b 0a 20  Row = pReg->n;. 
14de0 20 20 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20         pC->aRow 
14df0 3d 20 28 75 38 2a 29 70 52 65 67 2d 3e 7a 3b 0a  = (u8*)pReg->z;.
14e00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14e20 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74  MemSetNull(pDest
14e30 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
14e40 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20  op_column_out;. 
14e50 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14e60 7b 0a 20 20 20 20 20 20 70 43 72 73 72 20 3d 20  {.      pCrsr = 
14e70 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
14e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
14e90 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
14ea0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  YPE_BTREE );.   
14eb0 20 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72     assert( pCrsr
14ec0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14ed0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
14ee0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 72 73  rsorIsValid(pCrs
14ef0 72 29 20 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e  r) );.      pC->
14f00 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 73 71  payloadSize = sq
14f10 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
14f20 64 53 69 7a 65 28 70 43 72 73 72 29 3b 0a 20 20  dSize(pCrsr);.  
14f30 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 73      pC->aRow = s
14f40 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
14f50 61 64 46 65 74 63 68 28 70 43 72 73 72 2c 20 26  adFetch(pCrsr, &
14f60 70 43 2d 3e 73 7a 52 6f 77 29 3b 0a 20 20 20 20  pC->szRow);.    
14f70 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 73 7a    assert( pC->sz
14f80 52 6f 77 3c 3d 70 43 2d 3e 70 61 79 6c 6f 61 64  Row<=pC->payload
14f90 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
14fa0 73 65 72 74 28 20 70 43 2d 3e 73 7a 52 6f 77 3c  sert( pC->szRow<
14fb0 3d 36 35 35 33 36 20 29 3b 20 20 2f 2a 20 4d 61  =65536 );  /* Ma
14fc0 78 69 6d 75 6d 20 70 61 67 65 20 73 69 7a 65 20  ximum page size 
14fd0 69 73 20 36 34 4b 69 42 20 2a 2f 0a 20 20 20 20  is 64KiB */.    
14fe0 20 20 69 66 28 20 70 43 2d 3e 70 61 79 6c 6f 61    if( pC->payloa
14ff0 64 53 69 7a 65 20 3e 20 28 75 33 32 29 64 62 2d  dSize > (u32)db-
15000 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
15010 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a  IMIT_LENGTH] ){.
15020 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f          goto too
15030 5f 62 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _big;.      }.  
15040 20 20 7d 0a 20 20 20 20 70 43 2d 3e 63 61 63 68    }.    pC->cach
15050 65 53 74 61 74 75 73 20 3d 20 70 2d 3e 63 61 63  eStatus = p->cac
15060 68 65 43 74 72 3b 0a 20 20 20 20 70 43 2d 3e 69  heCtr;.    pC->i
15070 48 64 72 4f 66 66 73 65 74 20 3d 20 67 65 74 56  HdrOffset = getV
15080 61 72 69 6e 74 33 32 28 70 43 2d 3e 61 52 6f 77  arint32(pC->aRow
15090 2c 20 61 4f 66 66 73 65 74 5b 30 5d 29 3b 0a 20  , aOffset[0]);. 
150a0 20 20 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65     pC->nHdrParse
150b0 64 20 3d 20 30 3b 0a 0a 0a 20 20 20 20 69 66 28  d = 0;...    if(
150c0 20 70 43 2d 3e 73 7a 52 6f 77 3c 61 4f 66 66 73   pC->szRow<aOffs
150d0 65 74 5b 30 5d 20 29 7b 20 20 20 20 20 20 2f 2a  et[0] ){      /*
150e0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d  OPTIMIZATION-IF-
150f0 46 41 4c 53 45 2a 2f 0a 20 20 20 20 20 20 2f 2a  FALSE*/.      /*
15100 20 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73 20 6e   pC->aRow does n
15110 6f 74 20 68 61 76 65 20 74 6f 20 68 6f 6c 64 20  ot have to hold 
15120 74 68 65 20 65 6e 74 69 72 65 20 72 6f 77 2c 20  the entire row, 
15130 62 75 74 20 69 74 20 64 6f 65 73 20 61 74 20 6c  but it does at l
15140 65 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65  east.      ** ne
15150 65 64 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20  ed to cover the 
15160 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 72 65  header of the re
15170 63 6f 72 64 2e 20 20 49 66 20 70 43 2d 3e 61 52  cord.  If pC->aR
15180 6f 77 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ow does not cont
15190 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ain.      ** the
151a0 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
151b0 2c 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f  , then set it to
151c0 20 7a 65 72 6f 2c 20 66 6f 72 63 69 6e 67 20 74   zero, forcing t
151d0 68 65 20 68 65 61 64 65 72 20 74 6f 20 62 65 0a  he header to be.
151e0 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63        ** dynamic
151f0 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20  ally allocated. 
15200 2a 2f 0a 20 20 20 20 20 20 70 43 2d 3e 61 52 6f  */.      pC->aRo
15210 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 2d  w = 0;.      pC-
15220 3e 73 7a 52 6f 77 20 3d 20 30 3b 0a 0a 20 20 20  >szRow = 0;..   
15230 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
15240 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
15250 73 65 20 68 61 73 20 6e 6f 74 20 67 69 76 65 6e  se has not given
15260 20 75 73 20 61 6e 20 6f 76 65 72 73 69 7a 65 20   us an oversize 
15270 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a  header..      **
15280 20 44 6f 20 74 68 69 73 20 6e 6f 77 20 74 6f 20   Do this now to 
15290 61 76 6f 69 64 20 61 6e 20 6f 76 65 72 73 69 7a  avoid an oversiz
152a0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
152b0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ion..      **.  
152c0 20 20 20 20 2a 2a 20 54 79 70 65 20 65 6e 74 72      ** Type entr
152d0 69 65 73 20 63 61 6e 20 62 65 20 62 65 74 77 65  ies can be betwe
152e0 65 6e 20 31 20 61 6e 64 20 35 20 62 79 74 65 73  en 1 and 5 bytes
152f0 20 65 61 63 68 2e 20 20 42 75 74 20 34 20 61 6e   each.  But 4 an
15300 64 20 35 20 62 79 74 65 0a 20 20 20 20 20 20 2a  d 5 byte.      *
15310 2a 20 74 79 70 65 73 20 75 73 65 20 73 6f 20 6d  * types use so m
15320 75 63 68 20 64 61 74 61 20 73 70 61 63 65 20 74  uch data space t
15330 68 61 74 20 74 68 65 72 65 20 63 61 6e 20 6f 6e  hat there can on
15340 6c 79 20 62 65 20 34 30 39 36 20 61 6e 64 20 33  ly be 4096 and 3
15350 32 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  2 of.      ** th
15360 65 6d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  em, respectively
15370 2e 20 20 53 6f 20 74 68 65 20 6d 61 78 69 6d 75  .  So the maximu
15380 6d 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  m header length 
15390 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 0a 20  results from a. 
153a0 20 20 20 20 20 2a 2a 20 33 2d 62 79 74 65 20 74       ** 3-byte t
153b0 79 70 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20  ype for each of 
153c0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 33  the maximum of 3
153d0 32 37 36 38 20 63 6f 6c 75 6d 6e 73 20 70 6c 75  2768 columns plu
153e0 73 20 74 68 72 65 65 0a 20 20 20 20 20 20 2a 2a  s three.      **
153f0 20 65 78 74 72 61 20 62 79 74 65 73 20 66 6f 72   extra bytes for
15400 20 74 68 65 20 68 65 61 64 65 72 20 6c 65 6e 67   the header leng
15410 74 68 20 69 74 73 65 6c 66 2e 20 20 33 32 37 36  th itself.  3276
15420 38 2a 33 20 2b 20 33 20 3d 20 39 38 33 30 37 2e  8*3 + 3 = 98307.
15430 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15440 69 66 28 20 61 4f 66 66 73 65 74 5b 30 5d 20 3e  if( aOffset[0] >
15450 20 39 38 33 30 37 20 7c 7c 20 61 4f 66 66 73 65   98307 || aOffse
15460 74 5b 30 5d 20 3e 20 70 43 2d 3e 70 61 79 6c 6f  t[0] > pC->paylo
15470 61 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  adSize ){.      
15480 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e    goto op_column
15490 5f 63 6f 72 72 75 70 74 3b 0a 20 20 20 20 20 20  _corrupt;.      
154a0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
154b0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
154c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
154d0 42 79 20 73 6b 69 70 70 69 6e 67 20 6f 76 65 72  By skipping over
154e0 20 74 68 65 20 66 69 72 73 74 20 66 65 77 20 74   the first few t
154f0 65 73 74 73 0a 20 20 20 20 20 20 2a 2a 20 28 65  ests.      ** (e
15500 78 3a 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65  x: pC->nHdrParse
15510 64 3c 3d 70 32 29 20 69 6e 20 74 68 65 20 6e 65  d<=p2) in the ne
15520 78 74 20 73 65 63 74 69 6f 6e 2c 20 77 65 20 61  xt section, we a
15530 63 68 69 65 76 65 20 61 0a 20 20 20 20 20 20 2a  chieve a.      *
15540 2a 20 6d 65 61 73 75 72 61 62 6c 65 20 70 65 72  * measurable per
15550 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20  formance gain.. 
15560 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
15570 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
15580 74 61 6b 65 6e 20 65 76 65 6e 20 69 66 20 61 4f  taken even if aO
15590 66 66 73 65 74 5b 30 5d 3d 3d 30 2e 20 20 53 75  ffset[0]==0.  Su
155a0 63 68 20 61 20 72 65 63 6f 72 64 20 69 73 20 6e  ch a record is n
155b0 65 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 67 65  ever.      ** ge
155c0 6e 65 72 61 74 65 64 20 62 79 20 53 51 4c 69 74  nerated by SQLit
155d0 65 2c 20 61 6e 64 20 63 6f 75 6c 64 20 62 65 20  e, and could be 
155e0 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
155f0 70 74 69 6f 6e 2c 20 62 75 74 20 77 65 0a 20 20  ption, but we.  
15600 20 20 20 20 2a 2a 20 61 63 63 65 70 74 20 69 74      ** accept it
15610 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
15620 72 65 61 73 6f 6e 73 2e 20 20 57 68 65 6e 20 61  reasons.  When a
15630 4f 66 66 73 65 74 5b 30 5d 3d 3d 30 2c 20 74 68  Offset[0]==0, th
15640 65 20 63 6f 64 65 20 74 68 69 73 0a 20 20 20 20  e code this.    
15650 20 20 2a 2a 20 62 72 61 6e 63 68 20 6a 75 6d 70    ** branch jump
15660 73 20 74 6f 20 72 65 61 64 73 20 70 61 73 74 20  s to reads past 
15670 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
15680 65 63 6f 72 64 2c 20 62 75 74 20 6e 65 76 65 72  ecord, but never
15690 20 6d 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74   more.      ** t
156a0 68 61 6e 20 61 20 66 65 77 20 62 79 74 65 73 2e  han a few bytes.
156b0 20 20 45 76 65 6e 20 69 66 20 74 68 65 20 72 65    Even if the re
156c0 63 6f 72 64 20 6f 63 63 75 72 73 20 61 74 20 74  cord occurs at t
156d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
156e0 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  ge.      ** cont
156f0 65 6e 74 20 61 72 65 61 2c 20 74 68 65 20 22 70  ent area, the "p
15700 61 67 65 20 68 65 61 64 65 72 22 20 63 6f 6d 65  age header" come
15710 73 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65  s after the page
15720 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 73 6f 0a   content and so.
15730 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 76        ** this ov
15740 65 72 72 65 61 64 20 69 73 20 68 61 72 6d 6c 65  erread is harmle
15750 73 73 2e 20 20 53 69 6d 69 6c 61 72 20 6f 76 65  ss.  Similar ove
15760 72 72 65 61 64 73 20 63 61 6e 20 6f 63 63 75 72  rreads can occur
15770 20 66 6f 72 20 61 20 63 6f 72 72 75 70 74 0a 20   for a corrupt. 
15780 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
15790 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
157a0 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 70 43        zData = pC
157b0 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20 20 61 73  ->aRow;.      as
157c0 73 65 72 74 28 20 70 43 2d 3e 6e 48 64 72 50 61  sert( pC->nHdrPa
157d0 72 73 65 64 3c 3d 70 32 20 29 3b 20 20 20 20 20  rsed<=p2 );     
157e0 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
157f0 61 6c 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20  al skipped */.  
15800 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4f      testcase( aO
15810 66 66 73 65 74 5b 30 5d 3d 3d 30 20 29 3b 0a 20  ffset[0]==0 );. 
15820 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c       goto op_col
15830 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65 72 3b  umn_read_header;
15840 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15850 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
15860 61 73 74 20 74 68 65 20 66 69 72 73 74 20 70 32  ast the first p2
15870 2b 31 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  +1 entries of th
15880 65 20 68 65 61 64 65 72 20 68 61 76 65 20 62 65  e header have be
15890 65 6e 0a 20 20 2a 2a 20 70 61 72 73 65 64 20 61  en.  ** parsed a
158a0 6e 64 20 76 61 6c 69 64 20 69 6e 66 6f 72 6d 61  nd valid informa
158b0 74 69 6f 6e 20 69 73 20 69 6e 20 61 4f 66 66 73  tion is in aOffs
158c0 65 74 5b 5d 20 61 6e 64 20 70 43 2d 3e 61 54 79  et[] and pC->aTy
158d0 70 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pe[]..  */.  if(
158e0 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c   pC->nHdrParsed<
158f0 3d 70 32 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  =p2 ){.    /* If
15900 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 68   there is more h
15910 65 61 64 65 72 20 61 76 61 69 6c 61 62 6c 65 20  eader available 
15920 66 6f 72 20 70 61 72 73 69 6e 67 20 69 6e 20 74  for parsing in t
15930 68 65 20 72 65 63 6f 72 64 2c 20 74 72 79 0a 20  he record, try. 
15940 20 20 20 2a 2a 20 74 6f 20 65 78 74 72 61 63 74     ** to extract
15950 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 69 65 6c   additional fiel
15960 64 73 20 75 70 20 74 68 72 6f 75 67 68 20 74 68  ds up through th
15970 65 20 70 32 2b 31 2d 74 68 20 66 69 65 6c 64 20  e p2+1-th field 
15980 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15990 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 3c 61  pC->iHdrOffset<a
159a0 4f 66 66 73 65 74 5b 30 5d 20 29 7b 0a 20 20 20  Offset[0] ){.   
159b0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
159c0 7a 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20  zData points to 
159d0 65 6e 6f 75 67 68 20 6f 66 20 74 68 65 20 72 65  enough of the re
159e0 63 6f 72 64 20 74 6f 20 63 6f 76 65 72 20 74 68  cord to cover th
159f0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
15a00 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d     if( pC->aRow=
15a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
15a20 6d 73 65 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73  mset(&sMem, 0, s
15a30 69 7a 65 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20  izeof(sMem));.  
15a40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15a50 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
15a60 65 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ee(pC->uc.pCurso
15a70 72 2c 20 30 2c 20 61 4f 66 66 73 65 74 5b 30 5d  r, 0, aOffset[0]
15a80 2c 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20  , &sMem);.      
15a90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15aa0 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  _OK ) goto abort
15ab0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
15ac0 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 28         zData = (
15ad0 75 38 2a 29 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20  u8*)sMem.z;.    
15ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15af0 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f   zData = pC->aRo
15b00 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  w;.      }.  .  
15b10 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70      /* Fill in p
15b20 43 2d 3e 61 54 79 70 65 5b 69 5d 20 61 6e 64 20  C->aType[i] and 
15b30 61 4f 66 66 73 65 74 5b 69 5d 20 76 61 6c 75 65  aOffset[i] value
15b40 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 32  s through the p2
15b50 2d 74 68 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  -th field. */.  
15b60 20 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64    op_column_read
15b70 5f 68 65 61 64 65 72 3a 0a 20 20 20 20 20 20 69  _header:.      i
15b80 20 3d 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65   = pC->nHdrParse
15b90 64 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 36  d;.      offset6
15ba0 34 20 3d 20 61 4f 66 66 73 65 74 5b 69 5d 3b 0a  4 = aOffset[i];.
15bb0 20 20 20 20 20 20 7a 48 64 72 20 3d 20 7a 44 61        zHdr = zDa
15bc0 74 61 20 2b 20 70 43 2d 3e 69 48 64 72 4f 66 66  ta + pC->iHdrOff
15bd0 73 65 74 3b 0a 20 20 20 20 20 20 7a 45 6e 64 48  set;.      zEndH
15be0 64 72 20 3d 20 7a 44 61 74 61 20 2b 20 61 4f 66  dr = zData + aOf
15bf0 66 73 65 74 5b 30 5d 3b 0a 20 20 20 20 20 20 74  fset[0];.      t
15c00 65 73 74 63 61 73 65 28 20 7a 48 64 72 3e 3d 7a  estcase( zHdr>=z
15c10 45 6e 64 48 64 72 20 29 3b 0a 20 20 20 20 20 20  EndHdr );.      
15c20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
15c30 28 70 43 2d 3e 61 54 79 70 65 5b 69 5d 20 3d 20  (pC->aType[i] = 
15c40 74 20 3d 20 7a 48 64 72 5b 30 5d 29 3c 30 78 38  t = zHdr[0])<0x8
15c50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
15c60 48 64 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Hdr++;.         
15c70 20 6f 66 66 73 65 74 36 34 20 2b 3d 20 73 71 6c   offset64 += sql
15c80 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53  ite3VdbeOneByteS
15c90 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29 3b  erialTypeLen(t);
15ca0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15cb0 20 20 20 20 20 20 20 20 20 20 7a 48 64 72 20 2b            zHdr +
15cc0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
15cd0 6e 74 33 32 28 7a 48 64 72 2c 20 26 74 29 3b 0a  nt32(zHdr, &t);.
15ce0 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 61 54            pC->aT
15cf0 79 70 65 5b 69 5d 20 3d 20 74 3b 0a 20 20 20 20  ype[i] = t;.    
15d00 20 20 20 20 20 20 6f 66 66 73 65 74 36 34 20 2b        offset64 +
15d10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
15d20 69 61 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20  ialTypeLen(t);. 
15d30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15d40 20 61 4f 66 66 73 65 74 5b 2b 2b 69 5d 20 3d 20   aOffset[++i] = 
15d50 28 75 33 32 29 28 6f 66 66 73 65 74 36 34 20 26  (u32)(offset64 &
15d60 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
15d70 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 3d 70      }while( i<=p
15d80 32 20 26 26 20 7a 48 64 72 3c 7a 45 6e 64 48 64  2 && zHdr<zEndHd
15d90 72 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  r );..      /* T
15da0 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
15db0 72 75 70 74 20 69 66 20 61 6e 79 20 6f 66 20 74  rupt if any of t
15dc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
15dd0 20 74 72 75 65 3a 0a 20 20 20 20 20 20 2a 2a 20   true:.      ** 
15de0 28 31 29 20 74 68 65 20 62 79 74 65 73 20 6f 66  (1) the bytes of
15df0 20 74 68 65 20 68 65 61 64 65 72 20 65 78 74 65   the header exte
15e00 6e 64 20 70 61 73 74 20 74 68 65 20 64 65 63 6c  nd past the decl
15e10 61 72 65 64 20 68 65 61 64 65 72 20 73 69 7a 65  ared header size
15e20 0a 20 20 20 20 20 20 2a 2a 20 28 32 29 20 74 68  .      ** (2) th
15e30 65 20 65 6e 74 69 72 65 20 68 65 61 64 65 72 20  e entire header 
15e40 77 61 73 20 75 73 65 64 20 62 75 74 20 6e 6f 74  was used but not
15e50 20 61 6c 6c 20 64 61 74 61 20 77 61 73 20 75 73   all data was us
15e60 65 64 0a 20 20 20 20 20 20 2a 2a 20 28 33 29 20  ed.      ** (3) 
15e70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
15e80 61 74 61 20 65 78 74 65 6e 64 73 20 62 65 79 6f  ata extends beyo
15e90 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
15ea0 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20 20  e record..      
15eb0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 7a 48  */.      if( (zH
15ec0 64 72 3e 3d 7a 45 6e 64 48 64 72 20 26 26 20 28  dr>=zEndHdr && (
15ed0 7a 48 64 72 3e 7a 45 6e 64 48 64 72 20 7c 7c 20  zHdr>zEndHdr || 
15ee0 6f 66 66 73 65 74 36 34 21 3d 70 43 2d 3e 70 61  offset64!=pC->pa
15ef0 79 6c 6f 61 64 53 69 7a 65 29 29 0a 20 20 20 20  yloadSize)).    
15f00 20 20 20 7c 7c 20 28 6f 66 66 73 65 74 36 34 20     || (offset64 
15f10 3e 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a  > pC->payloadSiz
15f20 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
15f30 20 20 20 20 69 66 28 20 61 4f 66 66 73 65 74 5b      if( aOffset[
15f40 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
15f50 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20     i = 0;.      
15f60 20 20 20 20 7a 48 64 72 20 3d 20 7a 45 6e 64 48      zHdr = zEndH
15f70 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dr;.        }els
15f80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
15f90 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 20 73   pC->aRow==0 ) s
15fa0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
15fb0 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 20  ease(&sMem);.   
15fc0 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63         goto op_c
15fd0 6f 6c 75 6d 6e 5f 63 6f 72 72 75 70 74 3b 0a 20  olumn_corrupt;. 
15fe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15ff0 0a 0a 20 20 20 20 20 20 70 43 2d 3e 6e 48 64 72  ..      pC->nHdr
16000 50 61 72 73 65 64 20 3d 20 69 3b 0a 20 20 20 20  Parsed = i;.    
16010 20 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74    pC->iHdrOffset
16020 20 3d 20 28 75 33 32 29 28 7a 48 64 72 20 2d 20   = (u32)(zHdr - 
16030 7a 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  zData);.      if
16040 28 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 20  ( pC->aRow==0 ) 
16050 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
16060 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20  lease(&sMem);.  
16070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
16080 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
16090 20 2f 2a 20 49 66 20 61 66 74 65 72 20 74 72 79   /* If after try
160a0 69 6e 67 20 74 6f 20 65 78 74 72 61 63 74 20 6e  ing to extract n
160b0 65 77 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ew entries from 
160c0 74 68 65 20 68 65 61 64 65 72 2c 20 6e 48 64 72  the header, nHdr
160d0 50 61 72 73 65 64 20 69 73 0a 20 20 20 20 2a 2a  Parsed is.    **
160e0 20 73 74 69 6c 6c 20 6e 6f 74 20 75 70 20 74 6f   still not up to
160f0 20 70 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 20   p2, that means 
16100 74 68 61 74 20 74 68 65 20 72 65 63 6f 72 64 20  that the record 
16110 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 70  has fewer than p
16120 32 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  2.    ** columns
16130 2e 20 20 53 6f 20 74 68 65 20 72 65 73 75 6c 74  .  So the result
16140 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
16150 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
16160 65 20 6f 72 20 61 20 4e 55 4c 4c 2e 0a 20 20 20  e or a NULL..   
16170 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 2d 3e   */.    if( pC->
16180 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29  nHdrParsed<=p2 )
16190 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
161a0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4d 45 4d 20  >p4type==P4_MEM 
161b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
161c0 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
161d0 43 6f 70 79 28 70 44 65 73 74 2c 20 70 4f 70 2d  Copy(pDest, pOp-
161e0 3e 70 34 2e 70 4d 65 6d 2c 20 4d 45 4d 5f 53 74  >p4.pMem, MEM_St
161f0 61 74 69 63 29 3b 0a 20 20 20 20 20 20 7d 65 6c  atic);.      }el
16200 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
16210 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
16220 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  l(pDest);.      
16230 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f  }.      goto op_
16240 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20  column_out;.    
16250 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  }.  }else{.    t
16260 20 3d 20 70 43 2d 3e 61 54 79 70 65 5b 70 32 5d   = pC->aType[p2]
16270 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72  ;.  }..  /* Extr
16280 61 63 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  act the content 
16290 66 6f 72 20 74 68 65 20 70 32 2b 31 2d 74 68 20  for the p2+1-th 
162a0 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6e 74 72 6f 6c  column.  Control
162b0 20 63 61 6e 20 6f 6e 6c 79 0a 20 20 2a 2a 20 72   can only.  ** r
162c0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
162d0 69 66 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20  if aOffset[p2], 
162e0 61 4f 66 66 73 65 74 5b 70 32 2b 31 5d 2c 20 61  aOffset[p2+1], a
162f0 6e 64 20 70 43 2d 3e 61 54 79 70 65 5b 70 32 5d  nd pC->aType[p2]
16300 20 61 72 65 0a 20 20 2a 2a 20 61 6c 6c 20 76 61   are.  ** all va
16310 6c 69 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  lid..  */.  asse
16320 72 74 28 20 70 32 3c 70 43 2d 3e 6e 48 64 72 50  rt( p2<pC->nHdrP
16330 61 72 73 65 64 20 29 3b 0a 20 20 61 73 73 65 72  arsed );.  asser
16340 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
16350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
16360 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65  lite3VdbeCheckMe
16370 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 44 65 73  mInvariants(pDes
16380 74 29 20 29 3b 0a 20 20 69 66 28 20 56 64 62 65  t) );.  if( Vdbe
16390 4d 65 6d 44 79 6e 61 6d 69 63 28 70 44 65 73 74  MemDynamic(pDest
163a0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
163b0 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
163c0 44 65 73 74 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Dest);.  }.  ass
163d0 65 72 74 28 20 74 3d 3d 70 43 2d 3e 61 54 79 70  ert( t==pC->aTyp
163e0 65 5b 70 32 5d 20 29 3b 0a 20 20 69 66 28 20 70  e[p2] );.  if( p
163f0 43 2d 3e 73 7a 52 6f 77 3e 3d 61 4f 66 66 73 65  C->szRow>=aOffse
16400 74 5b 70 32 2b 31 5d 20 29 7b 0a 20 20 20 20 2f  t[p2+1] ){.    /
16410 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f  * This is the co
16420 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
16430 74 68 65 20 64 65 73 69 72 65 64 20 63 6f 6e 74  the desired cont
16440 65 6e 74 20 66 69 74 73 20 6f 6e 20 74 68 65 20  ent fits on the 
16450 6f 72 69 67 69 6e 61 6c 0a 20 20 20 20 2a 2a 20  original.    ** 
16460 70 61 67 65 20 2d 20 77 68 65 72 65 20 74 68 65  page - where the
16470 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
16480 6f 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  on an overflow p
16490 61 67 65 20 2a 2f 0a 20 20 20 20 7a 44 61 74 61  age */.    zData
164a0 20 3d 20 70 43 2d 3e 61 52 6f 77 20 2b 20 61 4f   = pC->aRow + aO
164b0 66 66 73 65 74 5b 70 32 5d 3b 0a 20 20 20 20 69  ffset[p2];.    i
164c0 66 28 20 74 3c 31 32 20 29 7b 0a 20 20 20 20 20  f( t<12 ){.     
164d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
164e0 61 6c 47 65 74 28 7a 44 61 74 61 2c 20 74 2c 20  alGet(zData, t, 
164f0 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  pDest);.    }els
16500 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e{.      /* If t
16510 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
16520 69 73 20 61 20 73 74 72 69 6e 67 2c 20 77 65 20  is a string, we 
16530 6e 65 65 64 20 61 20 70 65 72 73 69 73 74 65 6e  need a persisten
16540 74 20 76 61 6c 75 65 2c 20 6e 6f 74 0a 20 20 20  t value, not.   
16550 20 20 20 2a 2a 20 61 20 4d 45 4d 5f 45 70 68 65     ** a MEM_Ephe
16560 6d 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 62  m value.  This b
16570 72 61 6e 63 68 20 69 73 20 61 20 66 61 73 74 20  ranch is a fast 
16580 73 68 6f 72 74 2d 63 75 74 20 74 68 61 74 20 69  short-cut that i
16590 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  s equivalent.   
165a0 20 20 20 2a 2a 20 74 6f 20 63 61 6c 6c 69 6e 67     ** to calling
165b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
165c0 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
165d0 74 65 33 56 64 62 65 44 65 65 70 68 65 6d 65 72  te3VdbeDeephemer
165e0 61 6c 69 7a 65 28 29 2e 0a 20 20 20 20 20 20 2a  alize()..      *
165f0 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
16600 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d  onst u16 aFlag[]
16610 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 2c 20 4d   = { MEM_Blob, M
16620 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 20  EM_Str|MEM_Term 
16630 7d 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  };.      pDest->
16640 6e 20 3d 20 6c 65 6e 20 3d 20 28 74 2d 31 32 29  n = len = (t-12)
16650 2f 32 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d  /2;.      pDest-
16660 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  >enc = encoding;
16670 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
16680 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3c 20 6c 65 6e  ->szMalloc < len
16690 2b 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  +2 ){.        pD
166a0 65 73 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  est->flags = MEM
166b0 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  _Null;.        i
166c0 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
166d0 6d 47 72 6f 77 28 70 44 65 73 74 2c 20 6c 65 6e  mGrow(pDest, len
166e0 2b 32 2c 20 30 29 20 29 20 67 6f 74 6f 20 6e 6f  +2, 0) ) goto no
166f0 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _mem;.      }els
16700 65 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  e{.        pDest
16710 2d 3e 7a 20 3d 20 70 44 65 73 74 2d 3e 7a 4d 61  ->z = pDest->zMa
16720 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
16730 20 20 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74      memcpy(pDest
16740 2d 3e 7a 2c 20 7a 44 61 74 61 2c 20 6c 65 6e 29  ->z, zData, len)
16750 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a  ;.      pDest->z
16760 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [len] = 0;.     
16770 20 70 44 65 73 74 2d 3e 7a 5b 6c 65 6e 2b 31 5d   pDest->z[len+1]
16780 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 65 73   = 0;.      pDes
16790 74 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  t->flags = aFlag
167a0 5b 74 26 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [t&1];.    }.  }
167b0 65 6c 73 65 7b 0a 20 20 20 20 70 44 65 73 74 2d  else{.    pDest-
167c0 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  >enc = encoding;
167d0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
167e0 6e 63 68 20 68 61 70 70 65 6e 73 20 6f 6e 6c 79  nch happens only
167f0 20 77 68 65 6e 20 63 6f 6e 74 65 6e 74 20 69 73   when content is
16800 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
16810 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28  es */.    if( ((
16820 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41  pOp->p5 & (OPFLA
16830 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c  G_LENGTHARG|OPFL
16840 41 47 5f 54 59 50 45 4f 46 41 52 47 29 29 21 3d  AG_TYPEOFARG))!=
16850 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
16860 28 74 3e 3d 31 32 20 26 26 20 28 74 26 31 29 3d  (t>=12 && (t&1)=
16870 3d 30 29 20 7c 7c 20 28 70 4f 70 2d 3e 70 35 20  =0) || (pOp->p5 
16880 26 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  & OPFLAG_TYPEOFA
16890 52 47 29 21 3d 30 29 29 0a 20 20 20 20 20 7c 7c  RG)!=0)).     ||
168a0 20 28 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56   (len = sqlite3V
168b0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
168c0 28 74 29 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  (t))==0.    ){. 
168d0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
168e0 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  is irrelevant fo
168f0 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 31 2e  r.      **    1.
16900 20 74 68 65 20 74 79 70 65 6f 66 28 29 20 66 75   the typeof() fu
16910 6e 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 2a 2a  nction,.      **
16920 20 20 20 20 32 2e 20 74 68 65 20 6c 65 6e 67 74      2. the lengt
16930 68 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 66  h(X) function if
16940 20 58 20 69 73 20 61 20 62 6c 6f 62 2c 20 61 6e   X is a blob, an
16950 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 33 2e  d.      **    3.
16960 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   if the content 
16970 6c 65 6e 67 74 68 20 69 73 20 7a 65 72 6f 2e 0a  length is zero..
16980 20 20 20 20 20 20 2a 2a 20 53 6f 20 77 65 20 6d        ** So we m
16990 69 67 68 74 20 61 73 20 77 65 6c 6c 20 75 73 65  ight as well use
169a0 20 62 6f 67 75 73 20 63 6f 6e 74 65 6e 74 20 72   bogus content r
169b0 61 74 68 65 72 20 74 68 61 6e 20 72 65 61 64 69  ather than readi
169c0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  ng.      ** cont
169d0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 0a  ent from disk. .
169e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
169f0 2a 20 41 6c 74 68 6f 75 67 68 20 73 71 6c 69 74  * Although sqlit
16a00 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16a10 29 20 6d 61 79 20 72 65 61 64 20 61 74 20 6d 6f  ) may read at mo
16a20 73 74 20 38 20 62 79 74 65 73 20 66 72 6f 6d 20  st 8 bytes from 
16a30 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 66  the.      ** buf
16a40 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 69 74  fer passed to it
16a50 2c 20 64 65 62 75 67 67 69 6e 67 20 66 75 6e 63  , debugging func
16a60 74 69 6f 6e 20 56 64 62 65 4d 65 6d 50 72 65 74  tion VdbeMemPret
16a70 74 79 50 72 69 6e 74 28 29 20 6d 61 79 0a 20 20  tyPrint() may.  
16a80 20 20 20 20 2a 2a 20 72 65 61 64 20 75 70 20 74      ** read up t
16a90 6f 20 31 36 2e 20 53 6f 20 31 36 20 62 79 74 65  o 16. So 16 byte
16aa0 73 20 6f 66 20 62 6f 67 75 73 20 63 6f 6e 74 65  s of bogus conte
16ab0 6e 74 20 69 73 20 73 75 70 70 6c 69 65 64 2e 0a  nt is supplied..
16ac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
16ad0 74 61 74 69 63 20 75 38 20 61 5a 65 72 6f 5b 31  tatic u8 aZero[1
16ae0 36 5d 3b 20 20 2f 2a 20 54 68 69 73 20 69 73 20  6];  /* This is 
16af0 74 68 65 20 62 6f 67 75 73 20 63 6f 6e 74 65 6e  the bogus conten
16b00 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
16b10 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16b20 61 5a 65 72 6f 2c 20 74 2c 20 70 44 65 73 74 29  aZero, t, pDest)
16b30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16b40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
16b50 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
16b60 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
16b70 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65 6e  aOffset[p2], len
16b80 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  , pDest);.      
16b90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16ba0 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  K ) goto abort_d
16bb0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
16bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
16bd0 72 69 61 6c 47 65 74 28 28 63 6f 6e 73 74 20 75  rialGet((const u
16be0 38 2a 29 70 44 65 73 74 2d 3e 7a 2c 20 74 2c 20  8*)pDest->z, t, 
16bf0 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44  pDest);.      pD
16c00 65 73 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d  est->flags &= ~M
16c10 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 7d 0a  EM_Ephem;.    }.
16c20 20 20 7d 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f    }..op_column_o
16c30 75 74 3a 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  ut:.  UPDATE_MAX
16c40 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29  _BLOBSIZE(pDest)
16c50 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
16c60 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73  CE(pOp->p3, pDes
16c70 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 0a 6f 70  t);.  break;..op
16c80 5f 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75 70 74 3a  _column_corrupt:
16c90 0a 20 20 69 66 28 20 61 4f 70 5b 30 5d 2e 70 33  .  if( aOp[0].p3
16ca0 3e 30 20 29 7b 0a 20 20 20 20 70 4f 70 20 3d 20  >0 ){.    pOp = 
16cb0 26 61 4f 70 5b 61 4f 70 5b 30 5d 2e 70 33 2d 31  &aOp[aOp[0].p3-1
16cc0 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];.    break;.  
16cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
16ce0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
16cf0 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  KPT;.    goto ab
16d00 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
16d10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  ;.  }.}../* Opco
16d20 64 65 3a 20 41 66 66 69 6e 69 74 79 20 50 31 20  de: Affinity P1 
16d30 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  P2 * P4 *.** Syn
16d40 6f 70 73 69 73 3a 20 61 66 66 69 6e 69 74 79 28  opsis: affinity(
16d50 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  r[P1@P2]).**.** 
16d60 41 70 70 6c 79 20 61 66 66 69 6e 69 74 69 65 73  Apply affinities
16d70 20 74 6f 20 61 20 72 61 6e 67 65 20 6f 66 20 50   to a range of P
16d80 32 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  2 registers star
16d90 74 69 6e 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a  ting with P1..**
16da0 0a 2a 2a 20 50 34 20 69 73 20 61 20 73 74 72 69  .** P4 is a stri
16db0 6e 67 20 74 68 61 74 20 69 73 20 50 32 20 63 68  ng that is P2 ch
16dc0 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54  aracters long. T
16dd0 68 65 20 4e 2d 74 68 20 63 68 61 72 61 63 74 65  he N-th characte
16de0 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69  r of the.** stri
16df0 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ng indicates the
16e00 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
16e10 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
16e20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4e 2d 74  used for the N-t
16e30 68 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  h.** memory cell
16e40 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a 2a   in the range..*
16e50 2f 0a 63 61 73 65 20 4f 50 5f 41 66 66 69 6e 69  /.case OP_Affini
16e60 74 79 3a 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ty: {.  const ch
16e70 61 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20  ar *zAffinity;  
16e80 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79   /* The affinity
16e90 20 74 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a   to be applied *
16ea0 2f 0a 0a 20 20 7a 41 66 66 69 6e 69 74 79 20 3d  /..  zAffinity =
16eb0 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73   pOp->p4.z;.  as
16ec0 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79 21  sert( zAffinity!
16ed0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
16ee0 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61  pOp->p2>0 );.  a
16ef0 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79  ssert( zAffinity
16f00 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b 0a  [pOp->p2]==0 );.
16f10 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
16f20 4f 70 2d 3e 70 31 5d 3b 0a 20 20 64 6f 7b 0a 20  Op->p1];.  do{. 
16f30 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 20     assert( pIn1 
16f40 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 28 70 2d 3e  <= &p->aMem[(p->
16f50 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
16f60 73 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61 73 73  sor)] );.    ass
16f70 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
16f80 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 61 70 70  pIn1) );.    app
16f90 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c  lyAffinity(pIn1,
16fa0 20 2a 28 7a 41 66 66 69 6e 69 74 79 2b 2b 29 2c   *(zAffinity++),
16fb0 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
16fc0 70 49 6e 31 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  pIn1++;.  }while
16fd0 28 20 7a 41 66 66 69 6e 69 74 79 5b 30 5d 20 29  ( zAffinity[0] )
16fe0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
16ff0 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65 52 65 63   Opcode: MakeRec
17000 6f 72 64 20 50 31 20 50 32 20 50 33 20 50 34 20  ord P1 P2 P3 P4 
17010 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
17020 5b 50 33 5d 3d 6d 6b 72 65 63 28 72 5b 50 31 40  [P3]=mkrec(r[P1@
17030 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65  P2]).**.** Conve
17040 72 74 20 50 32 20 72 65 67 69 73 74 65 72 73 20  rt P2 registers 
17050 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50  beginning with P
17060 31 20 69 6e 74 6f 20 74 68 65 20 5b 72 65 63 6f  1 into the [reco
17070 72 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20 75 73  rd format].** us
17080 65 20 61 73 20 61 20 64 61 74 61 20 72 65 63 6f  e as a data reco
17090 72 64 20 69 6e 20 61 20 64 61 74 61 62 61 73 65  rd in a database
170a0 20 74 61 62 6c 65 20 6f 72 20 61 73 20 61 20 6b   table or as a k
170b0 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 64 65  ey.** in an inde
170c0 78 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d  x.  The OP_Colum
170d0 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20 64 65 63  n opcode can dec
170e0 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64 20 6c  ode the record l
170f0 61 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d  ater..**.** P4 m
17100 61 79 20 62 65 20 61 20 73 74 72 69 6e 67 20 74  ay be a string t
17110 68 61 74 20 69 73 20 50 32 20 63 68 61 72 61 63  hat is P2 charac
17120 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68 65 20  ters long.  The 
17130 4e 2d 74 68 20 63 68 61 72 61 63 74 65 72 20 6f  N-th character o
17140 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20  f the.** string 
17150 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63 6f  indicates the co
17160 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68  lumn affinity th
17170 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
17180 64 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 0a 2a  d for the N-th.*
17190 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  * field of the i
171a0 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  ndex key..**.** 
171b0 54 68 65 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  The mapping from
171c0 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61 66   character to af
171d0 66 69 6e 69 74 79 20 69 73 20 67 69 76 65 6e 20  finity is given 
171e0 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  by the SQLITE_AF
171f0 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65 66  F_.** macros def
17200 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
17210 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  t.h..**.** If P4
17220 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   is NULL then al
17230 6c 20 69 6e 64 65 78 20 66 69 65 6c 64 73 20 68  l index fields h
17240 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ave the affinity
17250 20 42 4c 4f 42 2e 0a 2a 2f 0a 63 61 73 65 20 4f   BLOB..*/.case O
17260 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b 0a  P_MakeRecord: {.
17270 20 20 75 38 20 2a 7a 4e 65 77 52 65 63 6f 72 64    u8 *zNewRecord
17280 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75  ;        /* A bu
17290 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
172a0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65   data for the ne
172b0 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65  w record */.  Me
172c0 6d 20 2a 70 52 65 63 3b 20 20 20 20 20 20 20 20  m *pRec;        
172d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
172e0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20  record */.  u64 
172f0 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
17300 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17310 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 73 70  bytes of data sp
17320 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64  ace */.  int nHd
17330 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
17340 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
17350 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70 61  es of header spa
17360 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74  ce */.  i64 nByt
17370 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
17380 2a 20 44 61 74 61 20 73 70 61 63 65 20 72 65 71  * Data space req
17390 75 69 72 65 64 20 66 6f 72 20 74 68 69 73 20 72  uired for this r
173a0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 6e  ecord */.  i64 n
173b0 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Zero;           
173c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a    /* Number of z
173d0 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
173e0 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f   end of the reco
173f0 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  rd */.  int nVar
17400 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  int;           /
17410 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
17420 73 20 69 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f  s in a varint */
17430 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
17440 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 79 70  pe;       /* Typ
17450 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d  e field */.  Mem
17460 20 2a 70 44 61 74 61 30 3b 20 20 20 20 20 20 20   *pData0;       
17470 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 69 65      /* First fie
17480 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65  ld to be combine
17490 64 20 69 6e 74 6f 20 74 68 65 20 72 65 63 6f 72  d into the recor
174a0 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73  d */.  Mem *pLas
174b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
174c0 20 4c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   Last field of t
174d0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
174e0 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
174f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17500 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  of fields in the
17510 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61   record */.  cha
17520 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20  r *zAffinity;   
17530 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e      /* The affin
17540 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ity string for t
17550 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
17560 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20  nt file_format; 
17570 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f        /* File fo
17580 72 6d 61 74 20 74 6f 20 75 73 65 20 66 6f 72 20  rmat to use for 
17590 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
175a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
175b0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73       /* Space us
175c0 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64  ed in zNewRecord
175d0 5b 5d 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  [] header */.  i
175e0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
175f0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75        /* Space u
17600 73 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72  sed in zNewRecor
17610 64 5b 5d 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  d[] content */. 
17620 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
17630 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
17640 68 20 6f 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a  h of a field */.
17650 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 74  .  /* Assuming t
17660 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69  he record contai
17670 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 74 68 65  ns N fields, the
17680 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 6c   record format l
17690 6f 6f 6b 73 0a 20 20 2a 2a 20 6c 69 6b 65 20 74  ooks.  ** like t
176a0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d  his:.  **.  ** -
176b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176f0 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68  -------.  ** | h
17700 64 72 2d 73 69 7a 65 20 7c 20 74 79 70 65 20 30  dr-size | type 0
17710 20 7c 20 74 79 70 65 20 31 20 7c 20 2e 2e 2e 20   | type 1 | ... 
17720 7c 20 74 79 70 65 20 4e 2d 31 20 7c 20 64 61 74  | type N-1 | dat
17730 61 30 20 7c 20 2e 2e 2e 20 7c 20 64 61 74 61 20  a0 | ... | data 
17740 4e 2d 31 20 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d  N-1 | .  ** ----
17750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17790 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ----.  **.  ** D
177a0 61 74 61 28 30 29 20 69 73 20 74 61 6b 65 6e 20  ata(0) is taken 
177b0 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31  from register P1
177c0 2e 20 20 44 61 74 61 28 31 29 20 63 6f 6d 65 73  .  Data(1) comes
177d0 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
177e0 31 2b 31 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20  1+1.  ** and so 
177f0 66 6f 72 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  forth..  **.  **
17800 20 45 61 63 68 20 74 79 70 65 20 66 69 65 6c 64   Each type field
17810 20 69 73 20 61 20 76 61 72 69 6e 74 20 72 65 70   is a varint rep
17820 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 73 65  resenting the se
17830 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
17840 20 0a 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e   .  ** correspon
17850 64 69 6e 67 20 64 61 74 61 20 65 6c 65 6d 65 6e  ding data elemen
17860 74 20 28 73 65 65 20 73 71 6c 69 74 65 33 56 64  t (see sqlite3Vd
17870 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 29 2e  beSerialType()).
17880 20 54 68 65 0a 20 20 2a 2a 20 68 64 72 2d 73 69   The.  ** hdr-si
17890 7a 65 20 66 69 65 6c 64 20 69 73 20 61 6c 73 6f  ze field is also
178a0 20 61 20 76 61 72 69 6e 74 20 77 68 69 63 68 20   a varint which 
178b0 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 66 72  is the offset fr
178c0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
178d0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63  .  ** of the rec
178e0 6f 72 64 20 74 6f 20 64 61 74 61 30 2e 0a 20 20  ord to data0..  
178f0 2a 2f 0a 20 20 6e 44 61 74 61 20 3d 20 30 3b 20  */.  nData = 0; 
17900 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17910 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
17920 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 48  ta space */.  nH
17930 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
17940 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
17950 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70  tes of header sp
17960 61 63 65 20 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d  ace */.  nZero =
17970 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
17980 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79  umber of zero by
17990 74 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tes at the end o
179a0 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
179b0 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e    nField = pOp->
179c0 70 31 3b 0a 20 20 7a 41 66 66 69 6e 69 74 79 20  p1;.  zAffinity 
179d0 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61  = pOp->p4.z;.  a
179e0 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20  ssert( nField>0 
179f0 26 26 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20  && pOp->p2>0 && 
17a00 70 4f 70 2d 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d  pOp->p2+nField<=
17a10 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
17a20 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
17a30 70 44 61 74 61 30 20 3d 20 26 61 4d 65 6d 5b 6e  pData0 = &aMem[n
17a40 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69 65 6c 64  Field];.  nField
17a50 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c   = pOp->p2;.  pL
17a60 61 73 74 20 3d 20 26 70 44 61 74 61 30 5b 6e 46  ast = &pData0[nF
17a70 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f  ield-1];.  file_
17a80 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d 69 6e 57  format = p->minW
17a90 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 3b 0a  riteFileFormat;.
17aa0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 74  .  /* Identify t
17ab0 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
17ac0 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
17ad0 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 31 20  pOp->p3<pOp->p1 
17ae0 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d  || pOp->p3>=pOp-
17af0 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29 3b 0a 20  >p1+pOp->p2 );. 
17b00 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
17b10 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f  p->p3];.  memAbo
17b20 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
17b30 75 74 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 6c 79  ut);..  /* Apply
17b40 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 61   the requested a
17b50 66 66 69 6e 69 74 79 20 74 6f 20 61 6c 6c 20 69  ffinity to all i
17b60 6e 70 75 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  nputs.  */.  ass
17b70 65 72 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61  ert( pData0<=pLa
17b80 73 74 20 29 3b 0a 20 20 69 66 28 20 7a 41 66 66  st );.  if( zAff
17b90 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 70 52 65  inity ){.    pRe
17ba0 63 20 3d 20 70 44 61 74 61 30 3b 0a 20 20 20 20  c = pData0;.    
17bb0 64 6f 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41  do{.      applyA
17bc0 66 66 69 6e 69 74 79 28 70 52 65 63 2b 2b 2c 20  ffinity(pRec++, 
17bd0 2a 28 7a 41 66 66 69 6e 69 74 79 2b 2b 29 2c 20  *(zAffinity++), 
17be0 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20  encoding);.     
17bf0 20 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69   assert( zAffini
17c00 74 79 5b 30 5d 3d 3d 30 20 7c 7c 20 70 52 65 63  ty[0]==0 || pRec
17c10 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 20 20 7d  <=pLast );.    }
17c20 77 68 69 6c 65 28 20 7a 41 66 66 69 6e 69 74 79  while( zAffinity
17c30 5b 30 5d 20 29 3b 0a 20 20 7d 0a 0a 23 69 66 64  [0] );.  }..#ifd
17c40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17c50 5f 4e 55 4c 4c 5f 54 52 49 4d 0a 20 20 2f 2a 20  _NULL_TRIM.  /* 
17c60 4e 55 4c 4c 73 20 63 61 6e 20 62 65 20 73 61 66  NULLs can be saf
17c70 65 6c 79 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d  ely trimmed from
17c80 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
17c90 72 65 63 6f 72 64 2c 20 61 73 20 6c 6f 6e 67 20  record, as long 
17ca0 61 73 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 73  as.  ** as the s
17cb0 63 68 65 6d 61 20 66 6f 72 6d 61 74 20 69 73 20  chema format is 
17cc0 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 6e 6f  2 or more and no
17cd0 6e 65 20 6f 66 20 74 68 65 20 6f 6d 69 74 74 65  ne of the omitte
17ce0 64 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2a 20 68  d columns.  ** h
17cf0 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 64  ave a non-NULL d
17d00 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 20 41  efault value.  A
17d10 6c 73 6f 2c 20 74 68 65 20 72 65 63 6f 72 64 20  lso, the record 
17d20 6d 75 73 74 20 62 65 20 6c 65 66 74 20 77 69 74  must be left wit
17d30 68 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  h.  ** at least 
17d40 6f 6e 65 20 66 69 65 6c 64 2e 20 20 49 66 20 50  one field.  If P
17d50 35 3e 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  5>0 then it will
17d60 20 62 65 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   be one more tha
17d70 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
17d80 20 6f 66 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   of the right-mo
17d90 73 74 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61  st column with a
17da0 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c   non-NULL defaul
17db0 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28  t value */.  if(
17dc0 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20   pOp->p5 ){.    
17dd0 77 68 69 6c 65 28 20 28 70 4c 61 73 74 2d 3e 66  while( (pLast->f
17de0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
17df0 21 3d 30 20 26 26 20 6e 46 69 65 6c 64 3e 70 4f  !=0 && nField>pO
17e00 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 70  p->p5 ){.      p
17e10 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 46  Last--;.      nF
17e20 69 65 6c 64 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ield--;.    }.  
17e30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c  }.#endif..  /* L
17e40 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
17e50 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 77 69  elements that wi
17e60 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68 65 20 72  ll make up the r
17e70 65 63 6f 72 64 20 74 6f 20 66 69 67 75 72 65 0a  ecord to figure.
17e80 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20 6d 75 63    ** out how muc
17e90 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
17ea0 72 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  red for the new 
17eb0 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 70  record..  */.  p
17ec0 52 65 63 20 3d 20 70 4c 61 73 74 3b 0a 20 20 64  Rec = pLast;.  d
17ed0 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  o{.    assert( m
17ee0 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63 29 20  emIsValid(pRec) 
17ef0 29 3b 0a 20 20 20 20 73 65 72 69 61 6c 5f 74 79  );.    serial_ty
17f00 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
17f10 53 65 72 69 61 6c 54 79 70 65 28 70 52 65 63 2c  SerialType(pRec,
17f20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 26 6c   file_format, &l
17f30 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  en);.    if( pRe
17f40 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  c->flags & MEM_Z
17f50 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ero ){.      if(
17f60 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
17f70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
17f80 6c 75 65 73 20 77 69 74 68 20 4d 45 4d 5f 4e 75  lues with MEM_Nu
17f90 6c 6c 20 61 6e 64 20 4d 45 4d 5f 5a 65 72 6f 20  ll and MEM_Zero 
17fa0 61 72 65 20 63 72 65 61 74 65 64 20 62 79 20 78  are created by x
17fb0 43 6f 6c 75 6d 6e 20 76 69 72 74 75 61 6c 0a 20  Column virtual. 
17fc0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
17fd0 6d 65 74 68 6f 64 73 20 74 68 61 74 20 6e 65 76  methods that nev
17fe0 65 72 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  er invoke sqlite
17ff0 33 5f 72 65 73 75 6c 74 5f 78 78 78 78 78 28 29  3_result_xxxxx()
18000 20 77 68 69 6c 65 0a 20 20 20 20 20 20 20 20 2a   while.        *
18010 2a 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 75  * computing an u
18020 6e 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75 6d 6e  nchanging column
18030 20 76 61 6c 75 65 20 69 6e 20 61 6e 20 55 50 44   value in an UPD
18040 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ATE statement.. 
18050 20 20 20 20 20 20 20 2a 2a 20 47 69 76 65 20 73         ** Give s
18060 75 63 68 20 76 61 6c 75 65 73 20 61 20 73 70 65  uch values a spe
18070 63 69 61 6c 20 69 6e 74 65 72 6e 61 6c 2d 75 73  cial internal-us
18080 65 2d 6f 6e 6c 79 20 73 65 72 69 61 6c 2d 74 79  e-only serial-ty
18090 70 65 20 6f 66 20 31 30 0a 20 20 20 20 20 20 20  pe of 10.       
180a0 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79   ** so that they
180b0 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 20 74   can be passed t
180c0 68 72 6f 75 67 68 20 74 6f 20 78 55 70 64 61 74  hrough to xUpdat
180d0 65 20 61 6e 64 20 68 61 76 65 0a 20 20 20 20 20  e and have.     
180e0 20 20 20 2a 2a 20 61 20 74 72 75 65 20 73 71 6c     ** a true sql
180f0 69 74 65 33 5f 76 61 6c 75 65 5f 6e 6f 63 68 61  ite3_value_nocha
18100 6e 67 65 28 29 2e 20 2a 2f 0a 20 20 20 20 20 20  nge(). */.      
18110 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
18120 35 3d 3d 4f 50 46 4c 41 47 5f 4e 4f 43 48 4e 47  5==OPFLAG_NOCHNG
18130 5f 4d 41 47 49 43 20 7c 7c 20 43 4f 52 52 55 50  _MAGIC || CORRUP
18140 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20  T_DB );.        
18150 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 31 30  serial_type = 10
18160 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
18170 28 20 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( nData ){.     
18180 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
18190 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28  beMemExpandBlob(
181a0 70 52 65 63 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  pRec) ) goto no_
181b0 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mem;.      }else
181c0 7b 0a 20 20 20 20 20 20 20 20 6e 5a 65 72 6f 20  {.        nZero 
181d0 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f  += pRec->u.nZero
181e0 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d  ;.        len -=
181f0 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pRec->u.nZero;.
18200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18210 20 20 6e 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a    nData += len;.
18220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
18230 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 37 20 29  rial_type==127 )
18240 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
18250 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 38  serial_type==128
18260 20 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20   );.    nHdr += 
18270 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 31 32 37  serial_type<=127
18280 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 56 61   ? 1 : sqlite3Va
18290 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
182a0 79 70 65 29 3b 0a 20 20 20 20 70 52 65 63 2d 3e  ype);.    pRec->
182b0 75 54 65 6d 70 20 3d 20 73 65 72 69 61 6c 5f 74  uTemp = serial_t
182c0 79 70 65 3b 0a 20 20 20 20 69 66 28 20 70 52 65  ype;.    if( pRe
182d0 63 3d 3d 70 44 61 74 61 30 20 29 20 62 72 65 61  c==pData0 ) brea
182e0 6b 3b 0a 20 20 20 20 70 52 65 63 2d 2d 3b 0a 20  k;.    pRec--;. 
182f0 20 7d 77 68 69 6c 65 28 31 29 3b 0a 0a 20 20 2f   }while(1);..  /
18300 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18310 2d 32 32 35 36 34 2d 31 31 36 34 37 20 54 68 65  -22564-11647 The
18320 20 68 65 61 64 65 72 20 62 65 67 69 6e 73 20 77   header begins w
18330 69 74 68 20 61 20 73 69 6e 67 6c 65 20 76 61 72  ith a single var
18340 69 6e 74 0a 20 20 2a 2a 20 77 68 69 63 68 20 64  int.  ** which d
18350 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 6f  etermines the to
18360 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
18370 74 65 73 20 69 6e 20 74 68 65 20 68 65 61 64 65  tes in the heade
18380 72 2e 20 54 68 65 20 76 61 72 69 6e 74 0a 20 20  r. The varint.  
18390 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  ** value is the 
183a0 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
183b0 65 72 20 69 6e 20 62 79 74 65 73 20 69 6e 63 6c  er in bytes incl
183c0 75 64 69 6e 67 20 74 68 65 20 73 69 7a 65 20 76  uding the size v
183d0 61 72 69 6e 74 0a 20 20 2a 2a 20 69 74 73 65 6c  arint.  ** itsel
183e0 66 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  f. */.  testcase
183f0 28 20 6e 48 64 72 3d 3d 31 32 36 20 29 3b 0a 20  ( nHdr==126 );. 
18400 20 74 65 73 74 63 61 73 65 28 20 6e 48 64 72 3d   testcase( nHdr=
18410 3d 31 32 37 20 29 3b 0a 20 20 69 66 28 20 6e 48  =127 );.  if( nH
18420 64 72 3c 3d 31 32 36 20 29 7b 0a 20 20 20 20 2f  dr<=126 ){.    /
18430 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
18440 65 20 2a 2f 0a 20 20 20 20 6e 48 64 72 20 2b 3d  e */.    nHdr +=
18450 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
18460 20 2f 2a 20 52 61 72 65 20 63 61 73 65 20 6f 66   /* Rare case of
18470 20 61 20 72 65 61 6c 6c 79 20 6c 61 72 67 65 20   a really large 
18480 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 6e 56  header */.    nV
18490 61 72 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  arint = sqlite3V
184a0 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b 0a  arintLen(nHdr);.
184b0 20 20 20 20 6e 48 64 72 20 2b 3d 20 6e 56 61 72      nHdr += nVar
184c0 69 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e 56 61  int;.    if( nVa
184d0 72 69 6e 74 3c 73 71 6c 69 74 65 33 56 61 72 69  rint<sqlite3Vari
184e0 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29 20 6e 48  ntLen(nHdr) ) nH
184f0 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  dr++;.  }.  nByt
18500 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61 3b 0a  e = nHdr+nData;.
18510 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
18520 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73  the output regis
18530 74 65 72 20 68 61 73 20 61 20 62 75 66 66 65 72  ter has a buffer
18540 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
18550 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65   store .  ** the
18560 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68 65   new record. The
18570 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   output register
18580 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f   (pOp->p3) is no
18590 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a  t allowed to.  *
185a0 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  * be one of the 
185b0 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20  input registers 
185c0 28 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 6c  (because the fol
185d0 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20  lowing call to. 
185e0 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d   ** sqlite3VdbeM
185f0 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
18600 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62 65 72  () could clobber
18610 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
18620 65 20 69 74 20 69 73 20 75 73 65 64 29 2e 0a 20  e it is used).. 
18630 20 2a 2f 0a 20 20 69 66 28 20 6e 42 79 74 65 2b   */.  if( nByte+
18640 6e 5a 65 72 6f 3c 3d 70 4f 75 74 2d 3e 73 7a 4d  nZero<=pOut->szM
18650 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 2f 2a 20  alloc ){.    /* 
18660 54 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73  The output regis
18670 74 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 6c  ter is already l
18680 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
18690 6f 6c 64 20 74 68 65 20 72 65 63 6f 72 64 2e 0a  old the record..
186a0 20 20 20 20 2a 2a 20 4e 6f 20 65 72 72 6f 72 20      ** No error 
186b0 63 68 65 63 6b 73 20 6f 72 20 62 75 66 66 65 72  checks or buffer
186c0 20 65 6e 6c 61 72 67 65 6d 65 6e 74 20 69 73 20   enlargement is 
186d0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
186e0 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 75 74 2d 3e  pOut->z = pOut->
186f0 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 65 6c 73 65  zMalloc;.  }else
18700 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
18710 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
18720 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 6e 6f  the output is no
18730 74 20 74 6f 6f 20 62 69 67 20 61 6e 64 20 74 68  t too big and th
18740 65 6e 20 65 6e 6c 61 72 67 65 0a 20 20 20 20 2a  en enlarge.    *
18750 2a 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67  * the output reg
18760 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  ister to hold th
18770 65 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 2a 2f  e full result */
18780 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 2b 6e  .    if( nByte+n
18790 5a 65 72 6f 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Zero>db->aLimit[
187a0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
187b0 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67 6f  GTH] ){.      go
187c0 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20  to too_big;.    
187d0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
187e0 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
187f0 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 28 69 6e  Resize(pOut, (in
18800 74 29 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  t)nByte) ){.    
18810 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
18820 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4e 65 77 52     }.  }.  zNewR
18830 65 63 6f 72 64 20 3d 20 28 75 38 20 2a 29 70 4f  ecord = (u8 *)pO
18840 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72 69  ut->z;..  /* Wri
18850 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  te the record */
18860 0a 20 20 69 20 3d 20 70 75 74 56 61 72 69 6e 74  .  i = putVarint
18870 33 32 28 7a 4e 65 77 52 65 63 6f 72 64 2c 20 6e  32(zNewRecord, n
18880 48 64 72 29 3b 0a 20 20 6a 20 3d 20 6e 48 64 72  Hdr);.  j = nHdr
18890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74  ;.  assert( pDat
188a0 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 70  a0<=pLast );.  p
188b0 52 65 63 20 3d 20 70 44 61 74 61 30 3b 0a 20 20  Rec = pData0;.  
188c0 64 6f 7b 0a 20 20 20 20 73 65 72 69 61 6c 5f 74  do{.    serial_t
188d0 79 70 65 20 3d 20 70 52 65 63 2d 3e 75 54 65 6d  ype = pRec->uTem
188e0 70 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  p;.    /* EVIDEN
188f0 43 45 2d 4f 46 3a 20 52 2d 30 36 35 32 39 2d 34  CE-OF: R-06529-4
18900 37 33 36 32 20 46 6f 6c 6c 6f 77 69 6e 67 20 74  7362 Following t
18910 68 65 20 73 69 7a 65 20 76 61 72 69 6e 74 20 61  he size varint a
18920 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 20  re one or more. 
18930 20 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c     ** additional
18940 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 70 65   varints, one pe
18950 72 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 20  r column. */.   
18960 20 69 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33   i += putVarint3
18970 32 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69 5d  2(&zNewRecord[i]
18980 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 20  , serial_type); 
18990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65             /* se
189a0 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20 20  rial type */.   
189b0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
189c0 20 52 2d 36 34 35 33 36 2d 35 31 37 32 38 20 54   R-64536-51728 T
189d0 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 65 61  he values for ea
189e0 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ch column in the
189f0 20 72 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 69   record.    ** i
18a00 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
18a10 77 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  w the header. */
18a20 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65  .    j += sqlite
18a30 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 26  3VdbeSerialPut(&
18a40 7a 4e 65 77 52 65 63 6f 72 64 5b 6a 5d 2c 20 70  zNewRecord[j], p
18a50 52 65 63 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  Rec, serial_type
18a60 29 3b 20 2f 2a 20 63 6f 6e 74 65 6e 74 20 2a 2f  ); /* content */
18a70 0a 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 52  .  }while( (++pR
18a80 65 63 29 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20  ec)<=pLast );.  
18a90 61 73 73 65 72 74 28 20 69 3d 3d 6e 48 64 72 20  assert( i==nHdr 
18aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  );.  assert( j==
18ab0 6e 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73 65  nByte );..  asse
18ac0 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
18ad0 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
18ae0 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
18af0 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20  r) );.  pOut->n 
18b00 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20  = (int)nByte;.  
18b10 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
18b20 4d 5f 42 6c 6f 62 3b 0a 20 20 69 66 28 20 6e 5a  M_Blob;.  if( nZ
18b30 65 72 6f 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d  ero ){.    pOut-
18b40 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e 5a 65 72 6f  >u.nZero = nZero
18b50 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  ;.    pOut->flag
18b60 73 20 7c 3d 20 4d 45 4d 5f 5a 65 72 6f 3b 0a 20  s |= MEM_Zero;. 
18b70 20 7d 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52   }.  REGISTER_TR
18b80 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75  ACE(pOp->p3, pOu
18b90 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  t);.  UPDATE_MAX
18ba0 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
18bb0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
18bc0 4f 70 63 6f 64 65 3a 20 43 6f 75 6e 74 20 50 31  Opcode: Count P1
18bd0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
18be0 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 63 6f 75  opsis: r[P2]=cou
18bf0 6e 74 28 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65  nt().**.** Store
18c00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
18c10 6e 74 72 69 65 73 20 28 61 6e 20 69 6e 74 65 67  ntries (an integ
18c20 65 72 20 76 61 6c 75 65 29 20 69 6e 20 74 68 65  er value) in the
18c30 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
18c40 0a 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 63 75  .** opened by cu
18c50 72 73 6f 72 20 50 31 20 69 6e 20 72 65 67 69 73  rsor P1 in regis
18c60 74 65 72 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65  ter P2.*/.#ifnde
18c70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
18c80 52 45 45 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50  REECOUNT.case OP
18c90 5f 43 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20 20  _Count: {       
18ca0 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69    /* out2 */.  i
18cb0 36 34 20 6e 45 6e 74 72 79 3b 0a 20 20 42 74 43  64 nEntry;.  BtC
18cc0 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20  ursor *pCrsr;.. 
18cd0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
18ce0 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75 72  r[pOp->p1]->eCur
18cf0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
18d00 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  REE );.  pCrsr =
18d10 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
18d20 31 5d 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  1]->uc.pCursor;.
18d30 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72 20    assert( pCrsr 
18d40 29 3b 0a 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b  );.  nEntry = 0;
18d50 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e    /* Not needed.
18d60 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73    Only used to s
18d70 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67  ilence a warning
18d80 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
18d90 74 65 33 42 74 72 65 65 43 6f 75 6e 74 28 70 43  te3BtreeCount(pC
18da0 72 73 72 2c 20 26 6e 45 6e 74 72 79 29 3b 0a 20  rsr, &nEntry);. 
18db0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
18dc0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
18dd0 72 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  r;.  pOut = out2
18de0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
18df0 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  p);.  pOut->u.i 
18e00 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65 61  = nEntry;.  brea
18e10 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
18e20 4f 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e  Opcode: Savepoin
18e30 74 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  t P1 * * P4 *.**
18e40 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73  .** Open, releas
18e50 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e or rollback th
18e60 65 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65  e savepoint name
18e70 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 50  d by parameter P
18e80 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  4, depending.** 
18e90 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
18ea0 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65  P1. To open a ne
18eb0 77 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d  w savepoint, P1=
18ec0 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20 28  =0. To release (
18ed0 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78  commit) an.** ex
18ee0 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  isting savepoint
18ef0 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72  , P1==1, or to r
18f00 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73 74  ollback an exist
18f10 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50 31  ing savepoint P1
18f20 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ==2..*/.case OP_
18f30 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69  Savepoint: {.  i
18f40 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20  nt p1;          
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18f60 2a 20 56 61 6c 75 65 20 6f 66 20 50 31 20 6f 70  * Value of P1 op
18f70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20  erand */.  char 
18f80 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
18f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
18fa0 6d 65 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 20  me of savepoint 
18fb0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  */.  int nName;.
18fc0 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65    Savepoint *pNe
18fd0 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  w;.  Savepoint *
18fe0 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61  pSavepoint;.  Sa
18ff0 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20  vepoint *pTmp;. 
19000 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 3b   int iSavepoint;
19010 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31  .  int ii;..  p1
19020 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e   = pOp->p1;.  zN
19030 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ame = pOp->p4.z;
19040 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
19050 61 74 20 74 68 65 20 70 31 20 70 61 72 61 6d 65  at the p1 parame
19060 74 65 72 20 69 73 20 76 61 6c 69 64 2e 20 41 6c  ter is valid. Al
19070 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 72 65  so that if there
19080 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a   is no open.  **
19090 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
190a0 65 6e 20 74 68 65 72 65 20 63 61 6e 6e 6f 74 20  en there cannot 
190b0 62 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  be any savepoint
190c0 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s. .  */.  asser
190d0 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  t( db->pSavepoin
190e0 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  t==0 || db->auto
190f0 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61  Commit==0 );.  a
19100 73 73 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50  ssert( p1==SAVEP
19110 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d  OINT_BEGIN||p1==
19120 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
19130 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  E||p1==SAVEPOINT
19140 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61  _ROLLBACK );.  a
19150 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65  ssert( db->pSave
19160 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54  point || db->isT
19170 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
19180 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  int==0 );.  asse
19190 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
191a0 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 20  ntCount(db) );. 
191b0 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
191c0 65 61 64 65 72 20 29 3b 0a 0a 20 20 69 66 28 20  eader );..  if( 
191d0 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45  p1==SAVEPOINT_BE
191e0 47 49 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 64  GIN ){.    if( d
191f0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20  b->nVdbeWrite>0 
19200 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 65  ){.      /* A ne
19210 77 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 6e  w savepoint cann
19220 6f 74 20 62 65 20 63 72 65 61 74 65 64 20 69 66  ot be created if
19230 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
19240 65 20 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a  e write .      *
19250 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 28 69 2e  * statements (i.
19260 65 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77 72 69  e. open read/wri
19270 74 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  te incremental b
19280 6c 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20 20  lob handles)..  
19290 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
192a0 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
192b0 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61   "cannot open sa
192c0 76 65 70 6f 69 6e 74 20 2d 20 53 51 4c 20 73 74  vepoint - SQL st
192d0 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67  atements in prog
192e0 72 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63  ress");.      rc
192f0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
19300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19310 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
19320 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
19330 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19340 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
19350 4c 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  LE.      /* This
19360 20 63 61 6c 6c 20 69 73 20 4f 6b 20 65 76 65 6e   call is Ok even
19370 20 69 66 20 74 68 69 73 20 73 61 76 65 70 6f 69   if this savepoi
19380 6e 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  nt is actually a
19390 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
193a0 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20     ** savepoint 
193b0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 73  (and therefore s
193c0 68 6f 75 6c 64 20 6e 6f 74 20 70 72 6f 6d 70 74  hould not prompt
193d0 20 78 53 61 76 65 70 6f 69 6e 74 28 29 29 20 63   xSavepoint()) c
193e0 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 20 20 20 20  allbacks..      
193f0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
19400 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
19410 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 6e  point being open
19420 65 64 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  ed, it is guaran
19430 74 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 68  teed.      ** th
19440 61 74 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  at the db->aVTra
19450 6e 73 5b 5d 20 61 72 72 61 79 20 69 73 20 65 6d  ns[] array is em
19460 70 74 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  pty.  */.      a
19470 73 73 65 72 74 28 20 64 62 2d 3e 61 75 74 6f 43  ssert( db->autoC
19480 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ommit==0 || db->
19490 6e 56 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20 20  nVTrans==0 );.  
194a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
194b0 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
194c0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49  , SAVEPOINT_BEGI
194d0 4e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N,.             
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
19500 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
19510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19530 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
19540 72 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rror;.#endif..  
19550 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
19560 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 73 74  new savepoint st
19570 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
19580 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
19590 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
195a0 2c 20 73 69 7a 65 6f 66 28 53 61 76 65 70 6f 69  , sizeof(Savepoi
195b0 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  nt)+nName+1);.  
195c0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
195d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e          pNew->zN
195e0 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ame = (char *)&p
195f0 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  New[1];.        
19600 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61  memcpy(pNew->zNa
19610 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
19620 2b 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  +1);.    .      
19630 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
19640 20 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   no open transac
19650 74 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b 20  tion, then mark 
19660 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61  this as a specia
19670 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 74 72  l.        ** "tr
19680 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
19690 69 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20  int". */.       
196a0 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
196b0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
196c0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
196d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
196e0 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
196f0 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20  Savepoint = 1;. 
19700 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
19710 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76          db->nSav
19720 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  epoint++;.      
19730 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
19740 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 73 61 76  Link the new sav
19750 65 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20  epoint into the 
19760 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 27  database handle'
19770 73 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20  s list. */.     
19780 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
19790 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
197a0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61  .        db->pSa
197b0 76 65 70 6f 69 6e 74 20 3d 20 70 4e 65 77 3b 0a  vepoint = pNew;.
197c0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44          pNew->nD
197d0 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 64 62  eferredCons = db
197e0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b  ->nDeferredCons;
197f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
19800 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
19810 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  = db->nDeferredI
19820 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a  mmCons;.      }.
19830 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
19840 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20     iSavepoint = 
19850 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  0;..    /* Find 
19860 74 68 65 20 6e 61 6d 65 64 20 73 61 76 65 70 6f  the named savepo
19870 69 6e 74 2e 20 49 66 20 74 68 65 72 65 20 69 73  int. If there is
19880 20 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69   no such savepoi
19890 6e 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20 20  nt, then an.    
198a0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ** an error is r
198b0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
198c0 73 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ser.  */.    for
198d0 28 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69  (.      pSavepoi
198e0 6e 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  nt = db->pSavepo
198f0 69 6e 74 3b 20 0a 20 20 20 20 20 20 70 53 61 76  int; .      pSav
19900 65 70 6f 69 6e 74 20 26 26 20 73 71 6c 69 74 65  epoint && sqlite
19910 33 53 74 72 49 43 6d 70 28 70 53 61 76 65 70 6f  3StrICmp(pSavepo
19920 69 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  int->zName, zNam
19930 65 29 3b 0a 20 20 20 20 20 20 70 53 61 76 65 70  e);.      pSavep
19940 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  oint = pSavepoin
19950 74 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a  t->pNext.    ){.
19960 20 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74        iSavepoint
19970 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
19980 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  ( !pSavepoint ){
19990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
199a0 62 65 45 72 72 6f 72 28 70 2c 20 22 6e 6f 20 73  beError(p, "no s
199b0 75 63 68 20 73 61 76 65 70 6f 69 6e 74 3a 20 25  uch savepoint: %
199c0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
199d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
199e0 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
199f0 66 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  f( db->nVdbeWrit
19a00 65 3e 30 20 26 26 20 70 31 3d 3d 53 41 56 45 50  e>0 && p1==SAVEP
19a10 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
19a20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
19a30 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  ot possible to r
19a40 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
19a50 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66 20 74  a savepoint if t
19a60 68 65 72 65 20 61 72 65 20 0a 20 20 20 20 20 20  here are .      
19a70 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74 65 20  ** active write 
19a80 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
19a90 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
19aa0 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
19ab0 63 61 6e 6e 6f 74 20 72 65 6c 65 61 73 65 20 73  cannot release s
19ac0 61 76 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20  avepoint - ".   
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74         "SQL stat
19af0 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
19b00 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ss");.      rc =
19b10 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
19b20 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20    }else{..      
19b30 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  /* Determine whe
19b40 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
19b50 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
19b60 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20  n savepoint. If 
19b70 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  so,.      ** and
19b80 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45 41   this is a RELEA
19b90 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e  SE command, then
19ba0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
19bb0 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  nsaction .      
19bc0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  ** is committed.
19bd0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
19be0 20 69 6e 74 20 69 73 54 72 61 6e 73 61 63 74 69   int isTransacti
19bf0 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  on = pSavepoint-
19c00 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20 64 62 2d  >pNext==0 && db-
19c10 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
19c20 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 69  vepoint;.      i
19c30 66 28 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  f( isTransaction
19c40 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e   && p1==SAVEPOIN
19c50 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
19c60 20 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73       if( (rc = s
19c70 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
19c80 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  k(p, 1))!=SQLITE
19c90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
19ca0 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
19cb0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
19cc0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
19cd0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
19ce0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
19cf0 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Halt(p)==SQLITE_
19d00 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
19d10 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28    p->pc = (int)(
19d20 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20  pOp - aOp);.    
19d30 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
19d40 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
19d50 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d      p->rc = rc =
19d60 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
19d70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62          goto vdb
19d80 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  e_return;.      
19d90 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e    }.        db->
19da0 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76  isTransactionSav
19db0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  epoint = 0;.    
19dc0 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a      rc = p->rc;.
19dd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19de0 20 20 20 20 20 69 6e 74 20 69 73 53 63 68 65 6d       int isSchem
19df0 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 20  aChange;.       
19e00 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62   iSavepoint = db
19e10 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 69  ->nSavepoint - i
19e20 53 61 76 65 70 6f 69 6e 74 20 2d 20 31 3b 0a 20  Savepoint - 1;. 
19e30 20 20 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53         if( p1==S
19e40 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
19e50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
19e60 73 53 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20  sSchemaChange = 
19e70 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
19e80 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
19e90 6e 67 65 29 21 3d 30 3b 0a 20 20 20 20 20 20 20  nge)!=0;.       
19ea0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
19eb0 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a  db->nDb; ii++){.
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
19ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
19ee0 70 41 6c 6c 43 75 72 73 6f 72 73 28 64 62 2d 3e  pAllCursors(db->
19ef0 61 44 62 5b 69 69 5d 2e 70 42 74 2c 0a 20 20 20  aDb[ii].pBt,.   
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f20 20 20 20 20 53 51 4c 49 54 45 5f 41 42 4f 52 54      SQLITE_ABORT
19f30 5f 52 4f 4c 4c 42 41 43 4b 2c 0a 20 20 20 20 20  _ROLLBACK,.     
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 20 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65    isSchemaChange
19f70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==0);.          
19f80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19f90 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  _OK ) goto abort
19fa0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
19fb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19fc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19fd0 20 20 20 20 69 73 53 63 68 65 6d 61 43 68 61 6e      isSchemaChan
19fe0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
19ff0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  }.        for(ii
1a000 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
1a010 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
1a020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1a030 65 65 53 61 76 65 70 6f 69 6e 74 28 64 62 2d 3e  eeSavepoint(db->
1a040 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 70 31 2c  aDb[ii].pBt, p1,
1a050 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
1a060 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1a070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a080 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62           goto ab
1a090 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1a0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1a0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a0c0 69 66 28 20 69 73 53 63 68 65 6d 61 43 68 61 6e  if( isSchemaChan
1a0d0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
1a0e0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
1a0f0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
1a100 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  db, 0);.        
1a110 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
1a120 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
1a130 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20  tion(db);.      
1a140 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
1a150 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
1a160 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 20  aChange;.       
1a170 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
1a180 20 20 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73      /* Regardles
1a190 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 69  s of whether thi
1a1a0 73 20 69 73 20 61 20 52 45 4c 45 41 53 45 20 6f  s is a RELEASE o
1a1b0 72 20 52 4f 4c 4c 42 41 43 4b 2c 20 64 65 73 74  r ROLLBACK, dest
1a1c0 72 6f 79 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a  roy all .      *
1a1d0 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 6e 65 73  * savepoints nes
1a1e0 74 65 64 20 69 6e 73 69 64 65 20 6f 66 20 74 68  ted inside of th
1a1f0 65 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e  e savepoint bein
1a200 67 20 6f 70 65 72 61 74 65 64 20 6f 6e 2e 20 2a  g operated on. *
1a210 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 64  /.      while( d
1a220 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 21 3d 70  b->pSavepoint!=p
1a230 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
1a240 20 20 20 20 20 70 54 6d 70 20 3d 20 64 62 2d 3e       pTmp = db->
1a250 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
1a260 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69      db->pSavepoi
1a270 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74  nt = pTmp->pNext
1a280 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a290 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70  3DbFree(db, pTmp
1a2a0 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  );.        db->n
1a2b0 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20  Savepoint--;.   
1a2c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1a2d0 66 20 69 74 20 69 73 20 61 20 52 45 4c 45 41 53  f it is a RELEAS
1a2e0 45 2c 20 74 68 65 6e 20 64 65 73 74 72 6f 79 20  E, then destroy 
1a2f0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 62 65  the savepoint be
1a300 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f 6e 20  ing operated on 
1a310 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6f 2e 20 49  .      ** too. I
1a320 66 20 69 74 20 69 73 20 61 20 52 4f 4c 4c 42 41  f it is a ROLLBA
1a330 43 4b 20 54 4f 2c 20 74 68 65 6e 20 73 65 74 20  CK TO, then set 
1a340 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 65  the number of de
1a350 66 65 72 72 65 64 20 0a 20 20 20 20 20 20 2a 2a  ferred .      **
1a360 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
1a370 61 74 69 6f 6e 73 20 70 72 65 73 65 6e 74 20 69  ations present i
1a380 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
1a390 6f 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  o the value stor
1a3a0 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  ed.      ** when
1a3b0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77   the savepoint w
1a3c0 61 73 20 63 72 65 61 74 65 64 2e 20 20 2a 2f 0a  as created.  */.
1a3d0 20 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53 41        if( p1==SA
1a3e0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
1a3f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1a400 74 28 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 64  t( pSavepoint==d
1a410 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->pSavepoint );
1a420 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61  .        db->pSa
1a430 76 65 70 6f 69 6e 74 20 3d 20 70 53 61 76 65 70  vepoint = pSavep
1a440 6f 69 6e 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  oint->pNext;.   
1a450 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1a460 65 65 28 64 62 2c 20 70 53 61 76 65 70 6f 69 6e  ee(db, pSavepoin
1a470 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1a480 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  !isTransaction )
1a490 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  {.          db->
1a4a0 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20  nSavepoint--;.  
1a4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1a4c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  lse{.        db-
1a4d0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
1a4e0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65   pSavepoint->nDe
1a4f0 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20  ferredCons;.    
1a500 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
1a510 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 53 61 76 65  dImmCons = pSave
1a520 70 6f 69 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64  point->nDeferred
1a530 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d  ImmCons;.      }
1a540 0a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54  ..      if( !isT
1a550 72 61 6e 73 61 63 74 69 6f 6e 20 7c 7c 20 70 31  ransaction || p1
1a560 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1a570 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
1a580 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
1a590 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 70 31  Savepoint(db, p1
1a5a0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
1a5b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1a5c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a5d0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1a5e0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
1a5f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  }.  }.  if( rc )
1a600 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1a610 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 62 72 65  to_error;..  bre
1a620 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1a630 3a 20 41 75 74 6f 43 6f 6d 6d 69 74 20 50 31 20  : AutoCommit P1 
1a640 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  P2 * * *.**.** S
1a650 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
1a660 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
1a670 20 74 6f 20 50 31 20 28 31 20 6f 72 20 30 29 2e   to P1 (1 or 0).
1a680 20 49 66 20 50 32 20 69 73 20 74 72 75 65 2c 20   If P2 is true, 
1a690 72 6f 6c 6c 0a 2a 2a 20 62 61 63 6b 20 61 6e 79  roll.** back any
1a6a0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1a6b0 65 20 62 74 72 65 65 20 74 72 61 6e 73 61 63 74  e btree transact
1a6c0 69 6f 6e 73 2e 20 49 66 20 74 68 65 72 65 20 61  ions. If there a
1a6d0 72 65 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  re any active.**
1a6e0 20 56 4d 73 20 28 61 70 61 72 74 20 66 72 6f 6d   VMs (apart from
1a6f0 20 74 68 69 73 20 6f 6e 65 29 2c 20 74 68 65 6e   this one), then
1a700 20 61 20 52 4f 4c 4c 42 41 43 4b 20 66 61 69 6c   a ROLLBACK fail
1a710 73 2e 20 20 41 20 43 4f 4d 4d 49 54 20 66 61 69  s.  A COMMIT fai
1a720 6c 73 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61  ls if.** there a
1a730 72 65 20 61 63 74 69 76 65 20 77 72 69 74 69 6e  re active writin
1a740 67 20 56 4d 73 20 6f 72 20 61 63 74 69 76 65 20  g VMs or active 
1a750 56 4d 73 20 74 68 61 74 20 75 73 65 20 73 68 61  VMs that use sha
1a760 72 65 64 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  red cache..**.**
1a770 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
1a780 6e 20 63 61 75 73 65 73 20 74 68 65 20 56 4d 20  n causes the VM 
1a790 74 6f 20 68 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65  to halt..*/.case
1a7a0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 20   OP_AutoCommit: 
1a7b0 7b 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 41  {.  int desiredA
1a7c0 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 69 6e 74  utoCommit;.  int
1a7d0 20 69 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 64   iRollback;..  d
1a7e0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
1a7f0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 52   = pOp->p1;.  iR
1a800 6f 6c 6c 62 61 63 6b 20 3d 20 70 4f 70 2d 3e 70  ollback = pOp->p
1a810 32 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 73  2;.  assert( des
1a820 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d  iredAutoCommit==
1a830 31 20 7c 7c 20 64 65 73 69 72 65 64 41 75 74 6f  1 || desiredAuto
1a840 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61  Commit==0 );.  a
1a850 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75  ssert( desiredAu
1a860 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69  toCommit==1 || i
1a870 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20  Rollback==0 );. 
1a880 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
1a890 62 65 41 63 74 69 76 65 3e 30 20 29 3b 20 20 2f  beActive>0 );  /
1a8a0 2a 20 41 74 20 6c 65 61 73 74 20 74 68 69 73 20  * At least this 
1a8b0 6f 6e 65 20 56 4d 20 69 73 20 61 63 74 69 76 65  one VM is active
1a8c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1a8d0 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 0a 20  >bIsReader );.. 
1a8e0 20 69 66 28 20 64 65 73 69 72 65 64 41 75 74 6f   if( desiredAuto
1a8f0 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e 61 75 74 6f  Commit!=db->auto
1a900 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 69 66  Commit ){.    if
1a910 28 20 69 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  ( iRollback ){. 
1a920 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
1a930 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d  iredAutoCommit==
1a940 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
1a950 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
1a960 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
1a970 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
1a980 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
1a990 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
1a9a0 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
1a9b0 6d 69 74 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  mit && db->nVdbe
1a9c0 57 72 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20  Write>0 ){.     
1a9d0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 73 74   /* If this inst
1a9e0 72 75 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  ruction implemen
1a9f0 74 73 20 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20  ts a COMMIT and 
1aa00 6f 74 68 65 72 20 56 4d 73 20 61 72 65 20 77 72  other VMs are wr
1aa10 69 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 72  iting.      ** r
1aa20 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
1aa30 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
1aa40 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73  he other VMs mus
1aa50 74 20 63 6f 6d 70 6c 65 74 65 20 66 69 72 73 74  t complete first
1aa60 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1aa70 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
1aa80 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  or(p, "cannot co
1aa90 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  mmit transaction
1aaa0 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1aac0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
1aad0 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
1aae0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1aaf0 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BUSY;.      goto
1ab00 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1ab10 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ror;.    }else i
1ab20 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
1ab30 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
1ab40 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
1ab50 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65  .      goto vdbe
1ab60 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c  _return;.    }el
1ab70 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75  se{.      db->au
1ab80 74 6f 43 6f 6d 6d 69 74 20 3d 20 28 75 38 29 64  toCommit = (u8)d
1ab90 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
1aba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1abb0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
1abc0 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  p)==SQLITE_BUSY 
1abd0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63 20 3d  ){.      p->pc =
1abe0 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
1abf0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74  );.      db->aut
1ac00 6f 43 6f 6d 6d 69 74 20 3d 20 28 75 38 29 28 31  oCommit = (u8)(1
1ac10 2d 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d  -desiredAutoComm
1ac20 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  it);.      p->rc
1ac30 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
1ac40 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  USY;.      goto 
1ac50 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
1ac60 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64   }.    assert( d
1ac70 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
1ac80 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1ac90 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
1aca0 62 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  b);.    if( p->r
1acb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1acc0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1acd0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73  E_DONE;.    }els
1ace0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1acf0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1ad00 7d 0a 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f  }.    goto vdbe_
1ad10 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b  return;.  }else{
1ad20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ad30 45 72 72 6f 72 28 70 2c 0a 20 20 20 20 20 20 20  Error(p,.       
1ad40 20 28 21 64 65 73 69 72 65 64 41 75 74 6f 43 6f   (!desiredAutoCo
1ad50 6d 6d 69 74 29 3f 22 63 61 6e 6e 6f 74 20 73 74  mmit)?"cannot st
1ad60 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
1ad70 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  n within a trans
1ad80 61 63 74 69 6f 6e 22 3a 28 0a 20 20 20 20 20 20  action":(.      
1ad90 20 20 28 69 52 6f 6c 6c 62 61 63 6b 29 3f 22 63    (iRollback)?"c
1ada0 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d  annot rollback -
1adb0 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
1adc0 69 73 20 61 63 74 69 76 65 22 3a 0a 20 20 20 20  is active":.    
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ade0 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20  cannot commit - 
1adf0 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
1ae00 73 20 61 63 74 69 76 65 22 29 29 3b 0a 20 20 20  s active"));.   
1ae10 20 20 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20        .    rc = 
1ae20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1ae30 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1ae40 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
1ae50 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1ae60 63 6f 64 65 3a 20 54 72 61 6e 73 61 63 74 69 6f  code: Transactio
1ae70 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  n P1 P2 P3 P4 P5
1ae80 0a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  .**.** Begin a t
1ae90 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 64 61  ransaction on da
1aea0 74 61 62 61 73 65 20 50 31 20 69 66 20 61 20 74  tabase P1 if a t
1aeb0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
1aec0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 61 63 74  t already.** act
1aed0 69 76 65 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73  ive..** If P2 is
1aee0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1aef0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1af00 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
1af10 6f 72 20 69 66 20 61 20 0a 2a 2a 20 72 65 61 64  or if a .** read
1af20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1af30 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20  already active, 
1af40 69 74 20 69 73 20 75 70 67 72 61 64 65 64 20 74  it is upgraded t
1af50 6f 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  o a write-transa
1af60 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 50 32 20  ction..** If P2 
1af70 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  is zero, then a 
1af80 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1af90 20 69 73 20 73 74 61 72 74 65 64 2e 0a 2a 2a 0a   is started..**.
1afa0 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64  ** P1 is the ind
1afb0 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
1afc0 73 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68  se file on which
1afd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1afe0 20 69 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20   is.** started. 
1aff0 20 49 6e 64 65 78 20 30 20 69 73 20 74 68 65 20   Index 0 is the 
1b000 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1b010 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 31 20 69  le and index 1 i
1b020 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73  s the.** file us
1b030 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
1b040 20 74 61 62 6c 65 73 2e 20 20 49 6e 64 69 63 65   tables.  Indice
1b050 73 20 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20 61  s of 2 or more a
1b060 72 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61  re used for.** a
1b070 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
1b080 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72  s..**.** If a wr
1b090 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1b0a0 69 73 20 73 74 61 72 74 65 64 20 61 6e 64 20 74  is started and t
1b0b0 68 65 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74  he Vdbe.usesStmt
1b0c0 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a  Journal flag is.
1b0d0 2a 2a 20 74 72 75 65 20 28 74 68 69 73 20 66 6c  ** true (this fl
1b0e0 61 67 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ag is set if the
1b0f0 20 56 64 62 65 20 6d 61 79 20 6d 6f 64 69 66 79   Vdbe may modify
1b100 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
1b110 6f 77 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68  ow and may.** th
1b120 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
1b130 65 70 74 69 6f 6e 29 2c 20 61 20 73 74 61 74 65  eption), a state
1b140 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1b150 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 6f 70 65   may also be ope
1b160 6e 65 64 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ned..** More spe
1b170 63 69 66 69 63 61 6c 6c 79 2c 20 61 20 73 74 61  cifically, a sta
1b180 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1b190 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 69 66 66  on is opened iff
1b1a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1b1b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
1b1c0 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20  urrently not in 
1b1d0 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
1b1e0 20 6f 72 20 69 66 20 74 68 65 72 65 20 61 72 65   or if there are
1b1f0 20 6f 74 68 65 72 0a 2a 2a 20 61 63 74 69 76 65   other.** active
1b200 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 41 20 73   statements. A s
1b210 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1b220 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20  tion allows the 
1b230 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
1b240 74 68 69 73 0a 2a 2a 20 56 44 42 45 20 74 6f 20  this.** VDBE to 
1b250 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1b260 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 77 69  fter an error wi
1b270 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1b280 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a  roll back the.**
1b290 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1b2a0 69 6f 6e 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ion. If no error
1b2b0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1b2c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1b2d0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
1b2e0 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
1b2f0 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20 74 68 65   commit when the
1b300 20 56 44 42 45 20 68 61 6c 74 73 2e 0a 2a 2a 0a   VDBE halts..**.
1b310 2a 2a 20 49 66 20 50 35 21 3d 30 20 74 68 65 6e  ** If P5!=0 then
1b320 20 74 68 69 73 20 6f 70 63 6f 64 65 20 61 6c 73   this opcode als
1b330 6f 20 63 68 65 63 6b 73 20 74 68 65 20 73 63 68  o checks the sch
1b340 65 6d 61 20 63 6f 6f 6b 69 65 20 61 67 61 69 6e  ema cookie again
1b350 73 74 20 50 33 0a 2a 2a 20 61 6e 64 20 74 68 65  st P3.** and the
1b360 20 73 63 68 65 6d 61 20 67 65 6e 65 72 61 74 69   schema generati
1b370 6f 6e 20 63 6f 75 6e 74 65 72 20 61 67 61 69 6e  on counter again
1b380 73 74 20 50 34 2e 0a 2a 2a 20 54 68 65 20 63 6f  st P4..** The co
1b390 6f 6b 69 65 20 63 68 61 6e 67 65 73 20 69 74 73  okie changes its
1b3a0 20 76 61 6c 75 65 20 77 68 65 6e 65 76 65 72 20   value whenever 
1b3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1b3c0 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 20  ema changes..** 
1b3d0 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69  This operation i
1b3e0 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 63 74  s used to detect
1b3f0 20 77 68 65 6e 20 74 68 61 74 20 74 68 65 20 63   when that the c
1b400 6f 6f 6b 69 65 20 68 61 73 20 63 68 61 6e 67 65  ookie has change
1b410 64 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68  d.** and that th
1b420 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
1b430 73 20 6e 65 65 64 73 20 74 6f 20 72 65 72 65 61  s needs to rerea
1b440 64 20 74 68 65 20 73 63 68 65 6d 61 2e 20 20 49  d the schema.  I
1b450 66 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20  f the schema.** 
1b460 63 6f 6f 6b 69 65 20 69 6e 20 50 33 20 64 69 66  cookie in P3 dif
1b470 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 63  fers from the sc
1b480 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 6e 20 74  hema cookie in t
1b490 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
1b4a0 65 72 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 20  er or.** if the 
1b4b0 73 63 68 65 6d 61 20 67 65 6e 65 72 61 74 69 6f  schema generatio
1b4c0 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 50 34 20  n counter in P4 
1b4d0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
1b4e0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 67 65 6e 65   current.** gene
1b4f0 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 2c 20  ration counter, 
1b500 74 68 65 6e 20 61 6e 20 53 51 4c 49 54 45 5f 53  then an SQLITE_S
1b510 43 48 45 4d 41 20 65 72 72 6f 72 20 69 73 20 72  CHEMA error is r
1b520 61 69 73 65 64 20 61 6e 64 20 65 78 65 63 75 74  aised and execut
1b530 69 6f 6e 0a 2a 2a 20 68 61 6c 74 73 2e 20 20 54  ion.** halts.  T
1b540 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  he sqlite3_step(
1b550 29 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69  ) wrapper functi
1b560 6f 6e 20 6d 69 67 68 74 20 74 68 65 6e 20 72 65  on might then re
1b570 70 72 65 70 61 72 65 20 74 68 65 0a 2a 2a 20 73  prepare the.** s
1b580 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 72  tatement and rer
1b590 75 6e 20 69 74 20 66 72 6f 6d 20 74 68 65 20 62  un it from the b
1b5a0 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 63 61 73  eginning..*/.cas
1b5b0 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
1b5c0 3a 20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  : {.  Btree *pBt
1b5d0 3b 0a 20 20 69 6e 74 20 69 4d 65 74 61 20 3d 20  ;.  int iMeta = 
1b5e0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
1b5f0 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20  >bIsReader );.  
1b600 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
1b610 6e 6c 79 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  nly==0 || pOp->p
1b620 32 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  2==0 );.  assert
1b630 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1b640 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
1b650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  );.  assert( DbM
1b660 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
1b670 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29  Mask, pOp->p1) )
1b680 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20  ;.  if( pOp->p2 
1b690 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
1b6a0 53 51 4c 49 54 45 5f 51 75 65 72 79 4f 6e 6c 79  SQLITE_QueryOnly
1b6b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )!=0 ){.    rc =
1b6c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1b6d0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
1b6e0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1b6f0 20 7d 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61   }.  pBt = db->a
1b700 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b  Db[pOp->p1].pBt;
1b710 0a 0a 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20  ..  if( pBt ){. 
1b720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b730 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
1b740 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 26 69 4d  Bt, pOp->p2, &iM
1b750 65 74 61 29 3b 0a 20 20 20 20 74 65 73 74 63 61  eta);.    testca
1b760 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  se( rc==SQLITE_B
1b770 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 29 3b 0a  USY_SNAPSHOT );.
1b780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1b790 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  ==SQLITE_BUSY_RE
1b7a0 43 4f 56 45 52 59 20 29 3b 0a 20 20 20 20 69 66  COVERY );.    if
1b7b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b7c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 72 63  ){.      if( (rc
1b7d0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xff)==SQLITE_B
1b7e0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
1b7f0 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70  ->pc = (int)(pOp
1b800 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 20   - aOp);.       
1b810 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
1b820 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72       goto vdbe_r
1b830 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
1b840 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
1b850 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1b860 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70    }..    if( pOp
1b870 2d 3e 70 32 20 26 26 20 70 2d 3e 75 73 65 73 53  ->p2 && p->usesS
1b880 74 6d 74 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  tmtJournal .    
1b890 20 26 26 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d   && (db->autoCom
1b8a0 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56  mit==0 || db->nV
1b8b0 64 62 65 52 65 61 64 3e 31 29 20 0a 20 20 20 20  dbeRead>1) .    
1b8c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b8d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
1b8e0 6e 54 72 61 6e 73 28 70 42 74 29 20 29 3b 0a 20  nTrans(pBt) );. 
1b8f0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 53 74 61       if( p->iSta
1b900 74 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  tement==0 ){.   
1b910 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
1b920 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20 26  >nStatement>=0 &
1b930 26 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  & db->nSavepoint
1b940 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 64  >=0 );.        d
1b950 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b 3b  b->nStatement++;
1b960 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 53 74   .        p->iSt
1b970 61 74 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e 53  atement = db->nS
1b980 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 6e  avepoint + db->n
1b990 53 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 20  Statement;.     
1b9a0 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73   }..      rc = s
1b9b0 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
1b9c0 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
1b9d0 54 5f 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74 61  T_BEGIN, p->iSta
1b9e0 74 65 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20 20  tement-1);.     
1b9f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ba00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1ba10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
1ba20 65 67 69 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d  eginStmt(pBt, p-
1ba30 3e 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  >iStatement);.  
1ba40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1ba50 53 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  Store the curren
1ba60 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  t value of the d
1ba70 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
1ba80 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
1ba90 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75  int.      ** cou
1baa0 6e 74 65 72 2e 20 49 66 20 74 68 65 20 73 74 61  nter. If the sta
1bab0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1bac0 6f 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  on needs to be r
1bad0 6f 6c 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20 20  olled back,.    
1bae0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1baf0 66 20 74 68 69 73 20 63 6f 75 6e 74 65 72 20 6e  f this counter n
1bb00 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
1bb10 72 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20  red too.  */.   
1bb20 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f     p->nStmtDefCo
1bb30 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72  ns = db->nDeferr
1bb40 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 70 2d  edCons;.      p-
1bb50 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
1bb60 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64   = db->nDeferred
1bb70 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20  ImmCons;.    }. 
1bb80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   }.  assert( pOp
1bb90 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e  ->p5==0 || pOp->
1bba0 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
1bbb0 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
1bbc0 35 0a 20 20 20 26 26 20 28 69 4d 65 74 61 21 3d  5.   && (iMeta!=
1bbd0 70 4f 70 2d 3e 70 33 0a 20 20 20 20 20 20 7c 7c  pOp->p3.      ||
1bbe0 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
1bbf0 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1bc00 72 61 74 69 6f 6e 21 3d 70 4f 70 2d 3e 70 34 2e  ration!=pOp->p4.
1bc10 69 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49  i).  ){.    /* I
1bc20 66 20 74 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f  f the schema-coo
1bc30 6b 69 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  kie from the dat
1bc40 61 62 61 73 65 20 66 69 6c 65 20 6d 61 74 63 68  abase file match
1bc50 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 0a 20  es the cookie . 
1bc60 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 77 69 74     ** stored wit
1bc70 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
1bc80 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1bc90 66 20 74 68 65 20 73 63 68 65 6d 61 2c 20 64 6f  f the schema, do
1bca0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 65 6c 6f  .    ** not relo
1bcb0 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 66 72  ad the schema fr
1bcc0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1bcd0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
1bce0 20 2a 2a 20 49 66 20 76 69 72 74 75 61 6c 2d 74   ** If virtual-t
1bcf0 61 62 6c 65 73 20 61 72 65 20 69 6e 20 75 73 65  ables are in use
1bd00 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20 6a 75  , this is not ju
1bd10 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  st an optimizati
1bd20 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66 74 65 6e  on..    ** Often
1bd30 2c 20 76 2d 74 61 62 6c 65 73 20 73 74 6f 72 65  , v-tables store
1bd40 20 74 68 65 69 72 20 64 61 74 61 20 69 6e 20 6f   their data in o
1bd50 74 68 65 72 20 53 51 4c 69 74 65 20 74 61 62 6c  ther SQLite tabl
1bd60 65 73 2c 20 77 68 69 63 68 0a 20 20 20 20 2a 2a  es, which.    **
1bd70 20 61 72 65 20 71 75 65 72 69 65 64 20 66 72 6f   are queried fro
1bd80 6d 20 77 69 74 68 69 6e 20 78 4e 65 78 74 28 29  m within xNext()
1bd90 20 61 6e 64 20 6f 74 68 65 72 20 76 2d 74 61 62   and other v-tab
1bda0 6c 65 20 6d 65 74 68 6f 64 73 20 75 73 69 6e 67  le methods using
1bdb0 0a 20 20 20 20 2a 2a 20 70 72 65 70 61 72 65 64  .    ** prepared
1bdc0 20 71 75 65 72 69 65 73 2e 20 49 66 20 73 75 63   queries. If suc
1bdd0 68 20 61 20 71 75 65 72 79 20 69 73 20 6f 75 74  h a query is out
1bde0 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20 64 6f 20  -of-date, we do 
1bdf0 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20 20 20 20  not want to.    
1be00 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65 20 64  ** discard the d
1be10 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2c 20  atabase schema, 
1be20 61 73 20 74 68 65 20 75 73 65 72 20 63 6f 64 65  as the user code
1be30 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
1be40 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61 62 6c 65  e.    ** v-table
1be50 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 62   would have to b
1be60 65 20 72 65 61 64 79 20 66 6f 72 20 74 68 65 20  e ready for the 
1be70 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
1be80 75 63 74 75 72 65 20 69 74 73 65 6c 66 0a 20 20  ucture itself.  
1be90 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
1bea0 69 64 61 74 65 64 20 77 68 65 6e 65 76 65 72 20  idated whenever 
1beb0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69  sqlite3_step() i
1bec0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  s called from wi
1bed0 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 61 20 76  thin .    ** a v
1bee0 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 20  -table method.. 
1bef0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
1bf00 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
1bf10 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
1bf20 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20 29 7b 0a  ookie!=iMeta ){.
1bf30 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
1bf40 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c 20  etOneSchema(db, 
1bf50 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 7d 0a  pOp->p1);.    }.
1bf60 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 4d      /*.    ** IM
1bf70 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1bf80 20 52 2d 30 33 31 38 39 2d 35 31 31 33 35 20 41   R-03189-51135 A
1bf90 73 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  s each SQL state
1bfa0 6d 65 6e 74 20 72 75 6e 73 2c 20 74 68 65 20 73  ment runs, the s
1bfb0 63 68 65 6d 61 0a 20 20 20 20 2a 2a 20 76 65 72  chema.    ** ver
1bfc0 73 69 6f 6e 20 69 73 20 63 68 65 63 6b 65 64 20  sion is checked 
1bfd0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1bfe0 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
1bff0 74 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  t changed since 
1c000 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73  the.    ** SQL s
1c010 74 61 74 65 6d 65 6e 74 20 77 61 73 20 70 72 65  tatement was pre
1c020 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
1c030 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c040 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
1c050 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
1c060 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1c070 70 28 64 62 2c 20 22 64 61 74 61 62 61 73 65 20  p(db, "database 
1c080 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67  schema has chang
1c090 65 64 22 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70  ed");.    p->exp
1c0a0 69 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 63  ired = 1;.    rc
1c0b0 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41   = SQLITE_SCHEMA
1c0c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
1c0d0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1c0e0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
1c0f0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1c100 20 52 65 61 64 43 6f 6f 6b 69 65 20 50 31 20 50   ReadCookie P1 P
1c110 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52  2 P3 * *.**.** R
1c120 65 61 64 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65  ead cookie numbe
1c130 72 20 50 33 20 66 72 6f 6d 20 64 61 74 61 62 61  r P3 from databa
1c140 73 65 20 50 31 20 61 6e 64 20 77 72 69 74 65 20  se P1 and write 
1c150 69 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  it into register
1c160 20 50 32 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73   P2..** P3==1 is
1c170 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73   the schema vers
1c180 69 6f 6e 2e 20 20 50 33 3d 3d 32 20 69 73 20 74  ion.  P3==2 is t
1c190 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d  he database form
1c1a0 61 74 2e 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20  at..** P3==3 is 
1c1b0 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  the recommended 
1c1c0 70 61 67 65 72 20 63 61 63 68 65 20 73 69 7a 65  pager cache size
1c1d0 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
1c1e0 20 50 31 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65   P1==0 is.** the
1c1f0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1c200 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73  ile and P1==1 is
1c210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c220 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  le used to store
1c230 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61  .** temporary ta
1c240 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  bles..**.** Ther
1c250 65 20 6d 75 73 74 20 62 65 20 61 20 72 65 61 64  e must be a read
1c260 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1c270 61 62 61 73 65 20 28 65 69 74 68 65 72 20 61 20  abase (either a 
1c280 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d  transaction.** m
1c290 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 6f  ust be started o
1c2a0 72 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  r there must be 
1c2b0 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 29 20  an open cursor) 
1c2c0 62 65 66 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74  before.** execut
1c2d0 69 6e 67 20 74 68 69 73 20 69 6e 73 74 72 75 63  ing this instruc
1c2e0 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
1c2f0 5f 52 65 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20  _ReadCookie: {  
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c310 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  out2 */.  int iM
1c320 65 74 61 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  eta;.  int iDb;.
1c330 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 0a 0a    int iCookie;..
1c340 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
1c350 52 65 61 64 65 72 20 29 3b 0a 20 20 69 44 62 20  Reader );.  iDb 
1c360 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f  = pOp->p1;.  iCo
1c370 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  okie = pOp->p3;.
1c380 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1c390 33 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45  3<SQLITE_N_BTREE
1c3a0 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72  _META );.  asser
1c3b0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
1c3c0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
1c3d0 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
1c3e0 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  b].pBt!=0 );.  a
1c3f0 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73  ssert( DbMaskTes
1c400 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
1c410 69 44 62 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  iDb) );..  sqlit
1c420 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 64  e3BtreeGetMeta(d
1c430 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c  b->aDb[iDb].pBt,
1c440 20 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a   iCookie, (u32 *
1c450 29 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74  )&iMeta);.  pOut
1c460 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
1c470 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
1c480 74 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a  t->u.i = iMeta;.
1c490 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1c4a0 70 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65  pcode: SetCookie
1c4b0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
1c4c0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e  .** Write the in
1c4d0 74 65 67 65 72 20 76 61 6c 75 65 20 50 33 20 69  teger value P3 i
1c4e0 6e 74 6f 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65  nto cookie numbe
1c4f0 72 20 50 32 20 6f 66 20 64 61 74 61 62 61 73 65  r P2 of database
1c500 20 50 31 2e 0a 2a 2a 20 50 32 3d 3d 31 20 69 73   P1..** P2==1 is
1c510 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73   the schema vers
1c520 69 6f 6e 2e 20 20 50 32 3d 3d 32 20 69 73 20 74  ion.  P2==2 is t
1c530 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d  he database form
1c540 61 74 2e 0a 2a 2a 20 50 32 3d 3d 33 20 69 73 20  at..** P2==3 is 
1c550 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  the recommended 
1c560 70 61 67 65 72 20 63 61 63 68 65 20 0a 2a 2a 20  pager cache .** 
1c570 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72  size, and so for
1c580 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 20 74 68  th.  P1==0 is th
1c590 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1c5a0 66 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69  file and P1==1 i
1c5b0 73 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  s the .** databa
1c5c0 73 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  se file used to 
1c5d0 73 74 6f 72 65 20 74 65 6d 70 6f 72 61 72 79 20  store temporary 
1c5e0 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  tables..**.** A 
1c5f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1c600 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1c610 72 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69  re executing thi
1c620 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73  s opcode..*/.cas
1c630 65 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20  e OP_SetCookie: 
1c640 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  {.  Db *pDb;..  
1c650 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57  sqlite3VdbeIncrW
1c660 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30  riteCounter(p, 0
1c670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1c680 2d 3e 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54  ->p2<SQLITE_N_BT
1c690 52 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73  REE_META );.  as
1c6a0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1c6b0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e   && pOp->p1<db->
1c6c0 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
1c6d0 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
1c6e0 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70  treeMask, pOp->p
1c6f0 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
1c700 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
1c710 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
1c720 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  Db[pOp->p1];.  a
1c730 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21  ssert( pDb->pBt!
1c740 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c750 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1c760 65 78 48 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e  exHeld(db, pOp->
1c770 70 31 2c 20 30 29 20 29 3b 0a 20 20 2f 2a 20 53  p1, 0) );.  /* S
1c780 65 65 20 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e  ee note about in
1c790 64 65 78 20 73 68 69 66 74 69 6e 67 20 6f 6e 20  dex shifting on 
1c7a0 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f  OP_ReadCookie */
1c7b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1c7c0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
1c7d0 44 62 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32  Db->pBt, pOp->p2
1c7e0 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 69 66  , pOp->p3);.  if
1c7f0 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45  ( pOp->p2==BTREE
1c800 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20  _SCHEMA_VERSION 
1c810 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ){.    /* When t
1c820 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
1c830 20 63 68 61 6e 67 65 73 2c 20 72 65 63 6f 72 64   changes, record
1c840 20 74 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20   the new cookie 
1c850 69 6e 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20  internally */.  
1c860 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
1c870 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20  schema_cookie = 
1c880 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 64 62 2d  pOp->p3;.    db-
1c890 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
1c8a0 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
1c8b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
1c8c0 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 46 49 4c  p->p2==BTREE_FIL
1c8d0 45 5f 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20  E_FORMAT ){.    
1c8e0 2f 2a 20 52 65 63 6f 72 64 20 63 68 61 6e 67 65  /* Record change
1c8f0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  s in the file fo
1c900 72 6d 61 74 20 2a 2f 0a 20 20 20 20 70 44 62 2d  rmat */.    pDb-
1c910 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
1c920 6f 72 6d 61 74 20 3d 20 70 4f 70 2d 3e 70 33 3b  ormat = pOp->p3;
1c930 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .  }.  if( pOp->
1c940 70 31 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  p1==1 ){.    /* 
1c950 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  Invalidate all p
1c960 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1c970 74 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ts whenever the 
1c980 54 45 4d 50 20 64 61 74 61 62 61 73 65 0a 20 20  TEMP database.  
1c990 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20 63    ** schema is c
1c9a0 68 61 6e 67 65 64 2e 20 20 54 69 63 6b 65 74 20  hanged.  Ticket 
1c9b0 23 31 36 34 34 20 2a 2f 0a 20 20 20 20 73 71 6c  #1644 */.    sql
1c9c0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
1c9d0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c  edStatements(db,
1c9e0 20 30 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69   0);.    p->expi
1c9f0 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  red = 0;.  }.  i
1ca00 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
1ca10 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1ca20 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1ca30 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52 65 61 64  Opcode: OpenRead
1ca40 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
1ca50 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 6f  ** Synopsis: roo
1ca60 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a 0a 2a  t=P2 iDb=P3.**.*
1ca70 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
1ca80 6c 79 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ly cursor for th
1ca90 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
1caa0 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65   whose root page
1cab0 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20 61 20 64   is.** P2 in a d
1cac0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
1cad0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cae0 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
1caf0 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d 30 20  y P3. .** P3==0 
1cb00 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
1cb10 61 74 61 62 61 73 65 2c 20 50 33 3d 3d 31 20 6d  atabase, P3==1 m
1cb20 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1cb30 65 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 74  e used for .** t
1cb40 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2c  emporary tables,
1cb50 20 61 6e 64 20 50 33 3e 31 20 6d 65 61 6e 73 20   and P3>1 means 
1cb60 75 73 65 64 20 74 68 65 20 63 6f 72 72 65 73 70  used the corresp
1cb70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68 65 64 0a  onding attached.
1cb80 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 47 69  ** database.  Gi
1cb90 76 65 20 74 68 65 20 6e 65 77 20 63 75 72 73 6f  ve the new curso
1cba0 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  r an identifier 
1cbb0 6f 66 20 50 31 2e 20 20 54 68 65 20 50 31 0a 2a  of P1.  The P1.*
1cbc0 2a 20 76 61 6c 75 65 73 20 6e 65 65 64 20 6e 6f  * values need no
1cbd0 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 20  t be contiguous 
1cbe0 62 75 74 20 61 6c 6c 20 50 31 20 76 61 6c 75 65  but all P1 value
1cbf0 73 20 73 68 6f 75 6c 64 20 62 65 20 73 6d 61 6c  s should be smal
1cc00 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 49  l integers..** I
1cc10 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f  t is an error fo
1cc20 72 20 50 31 20 74 6f 20 62 65 20 6e 65 67 61 74  r P1 to be negat
1cc30 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77  ive..**.** Allow
1cc40 65 64 20 50 35 20 62 69 74 73 3a 0a 2a 2a 20 3c  ed P5 bits:.** <
1cc50 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 20 3c 62 3e  ul>.** <li>  <b>
1cc60 30 78 30 32 20 4f 50 46 4c 41 47 5f 53 45 45 4b  0x02 OPFLAG_SEEK
1cc70 45 51 3c 2f 62 3e 3a 20 54 68 69 73 20 63 75 72  EQ</b>: This cur
1cc80 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  sor will only be
1cc90 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20   used for.**    
1cca0 20 20 20 65 71 75 61 6c 69 74 79 20 6c 6f 6f 6b     equality look
1ccb0 75 70 73 20 28 69 6d 70 6c 65 6d 65 6e 74 65 64  ups (implemented
1ccc0 20 61 73 20 61 20 70 61 69 72 20 6f 66 20 6f 70   as a pair of op
1ccd0 63 6f 64 65 73 20 4f 50 5f 53 65 65 6b 47 45 2f  codes OP_SeekGE/
1cce0 4f 50 5f 49 64 78 47 54 0a 2a 2a 20 20 20 20 20  OP_IdxGT.**     
1ccf0 20 20 6f 66 20 4f 50 5f 53 65 65 6b 4c 45 2f 4f    of OP_SeekLE/O
1cd00 50 5f 49 64 78 47 54 29 0a 2a 2a 20 3c 2f 75 6c  P_IdxGT).** </ul
1cd10 3e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76  >.**.** The P4 v
1cd20 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74 68  alue may be eith
1cd30 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50  er an integer (P
1cd40 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f  4_INT32) or a po
1cd50 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65  inter to.** a Ke
1cd60 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
1cd70 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66  (P4_KEYINFO). If
1cd80 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72   it is a pointer
1cd90 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a   to a KeyInfo .*
1cda0 2a 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e 20 74  * object, then t
1cdb0 61 62 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  able being opene
1cdc0 64 20 6d 75 73 74 20 62 65 20 61 6e 20 5b 69 6e  d must be an [in
1cdd0 64 65 78 20 62 2d 74 72 65 65 5d 20 77 68 65 72  dex b-tree] wher
1cde0 65 20 74 68 65 0a 2a 2a 20 4b 65 79 49 6e 66 6f  e the.** KeyInfo
1cdf0 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65 73 20   object defines 
1ce00 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  the content and 
1ce10 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65  collating .** se
1ce20 71 75 65 6e 63 65 20 6f 66 20 74 68 61 74 20 69  quence of that i
1ce30 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
1ce40 65 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 73  erwise, if P4 is
1ce50 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20   an integer .** 
1ce60 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
1ce70 74 61 62 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e  table being open
1ce80 65 64 20 6d 75 73 74 20 62 65 20 61 20 5b 74 61  ed must be a [ta
1ce90 62 6c 65 20 62 2d 74 72 65 65 5d 20 77 69 74 68  ble b-tree] with
1cea0 20 61 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20   a.** number of 
1ceb0 63 6f 6c 75 6d 6e 73 20 6e 6f 20 6c 65 73 73 20  columns no less 
1cec0 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  than the value o
1ced0 66 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  f P4..**.** See 
1cee0 61 6c 73 6f 3a 20 4f 70 65 6e 57 72 69 74 65 2c  also: OpenWrite,
1cef0 20 52 65 6f 70 65 6e 49 64 78 0a 2a 2f 0a 2f 2a   ReopenIdx.*/./*
1cf00 20 4f 70 63 6f 64 65 3a 20 52 65 6f 70 65 6e 49   Opcode: ReopenI
1cf10 64 78 20 50 31 20 50 32 20 50 33 20 50 34 20 50  dx P1 P2 P3 P4 P
1cf20 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  5.** Synopsis: r
1cf30 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a  oot=P2 iDb=P3.**
1cf40 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65 6e 49 64  .** The ReopenId
1cf50 78 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6c  x opcode works l
1cf60 69 6b 65 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  ike OP_OpenRead 
1cf70 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 66  except that it f
1cf80 69 72 73 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74  irst.** checks t
1cf90 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 75 72  o see if the cur
1cfa0 73 6f 72 20 6f 6e 20 50 31 20 69 73 20 61 6c 72  sor on P1 is alr
1cfb0 65 61 64 79 20 6f 70 65 6e 20 6f 6e 20 74 68 65  eady open on the
1cfc0 20 73 61 6d 65 0a 2a 2a 20 62 2d 74 72 65 65 20   same.** b-tree 
1cfd0 61 6e 64 20 69 66 20 69 74 20 69 73 20 74 68 69  and if it is thi
1cfe0 73 20 6f 70 63 6f 64 65 20 62 65 63 6f 6d 65 73  s opcode becomes
1cff0 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 6e 20 6f 74   a no-op.  In ot
1d000 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 69 66  her words,.** if
1d010 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
1d020 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 64 6f 20  lready open, do 
1d030 6e 6f 74 20 72 65 6f 70 65 6e 20 69 74 2e 0a 2a  not reopen it..*
1d040 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65 6e 49  *.** The ReopenI
1d050 64 78 20 6f 70 63 6f 64 65 20 6d 61 79 20 6f 6e  dx opcode may on
1d060 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
1d070 50 35 3d 3d 30 20 6f 72 20 50 35 3d 3d 4f 50 46  P5==0 or P5==OPF
1d080 4c 41 47 5f 53 45 45 4b 45 51 0a 2a 2a 20 61 6e  LAG_SEEKEQ.** an
1d090 64 20 77 69 74 68 20 50 34 20 62 65 69 6e 67 20  d with P4 being 
1d0a0 61 20 50 34 5f 4b 45 59 49 4e 46 4f 20 6f 62 6a  a P4_KEYINFO obj
1d0b0 65 63 74 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ect.  Furthermor
1d0c0 65 2c 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  e, the P3 value 
1d0d0 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73  must.** be the s
1d0e0 61 6d 65 20 61 73 20 65 76 65 72 79 20 6f 74 68  ame as every oth
1d0f0 65 72 20 52 65 6f 70 65 6e 49 64 78 20 6f 72 20  er ReopenIdx or 
1d100 4f 70 65 6e 52 65 61 64 20 66 6f 72 20 74 68 65  OpenRead for the
1d110 20 73 61 6d 65 20 63 75 72 73 6f 72 0a 2a 2a 20   same cursor.** 
1d120 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c  number..**.** Al
1d130 6c 6f 77 65 64 20 50 35 20 62 69 74 73 3a 0a 2a  lowed P5 bits:.*
1d140 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 20  * <ul>.** <li>  
1d150 3c 62 3e 30 78 30 32 20 4f 50 46 4c 41 47 5f 53  <b>0x02 OPFLAG_S
1d160 45 45 4b 45 51 3c 2f 62 3e 3a 20 54 68 69 73 20  EEKEQ</b>: This 
1d170 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79  cursor will only
1d180 20 62 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   be used for.** 
1d190 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 6c        equality l
1d1a0 6f 6f 6b 75 70 73 20 28 69 6d 70 6c 65 6d 65 6e  ookups (implemen
1d1b0 74 65 64 20 61 73 20 61 20 70 61 69 72 20 6f 66  ted as a pair of
1d1c0 20 6f 70 63 6f 64 65 73 20 4f 50 5f 53 65 65 6b   opcodes OP_Seek
1d1d0 47 45 2f 4f 50 5f 49 64 78 47 54 0a 2a 2a 20 20  GE/OP_IdxGT.**  
1d1e0 20 20 20 20 20 6f 66 20 4f 50 5f 53 65 65 6b 4c       of OP_SeekL
1d1f0 45 2f 4f 50 5f 49 64 78 47 54 29 0a 2a 2a 20 3c  E/OP_IdxGT).** <
1d200 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  /ul>.**.** See a
1d210 6c 73 6f 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64  lso: OP_OpenRead
1d220 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 0a 2a  , OP_OpenWrite.*
1d230 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  /./* Opcode: Ope
1d240 6e 57 72 69 74 65 20 50 31 20 50 32 20 50 33 20  nWrite P1 P2 P3 
1d250 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
1d260 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50  s: root=P2 iDb=P
1d270 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72  3.**.** Open a r
1d280 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
1d290 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74 68 65   named P1 on the
1d2a0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1d2b0 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  whose root.** pa
1d2c0 67 65 20 69 73 20 50 32 20 28 6f 72 20 77 68 6f  ge is P2 (or who
1d2d0 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  se root page is 
1d2e0 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72  held in register
1d2f0 20 50 32 20 69 66 20 74 68 65 0a 2a 2a 20 4f 50   P2 if the.** OP
1d300 46 4c 41 47 5f 50 32 49 53 52 45 47 20 62 69 74  FLAG_P2ISREG bit
1d310 20 69 73 20 73 65 74 20 69 6e 20 50 35 20 2d 20   is set in P5 - 
1d320 73 65 65 20 62 65 6c 6f 77 29 2e 0a 2a 2a 0a 2a  see below)..**.*
1d330 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d  * The P4 value m
1d340 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  ay be either an 
1d350 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33  integer (P4_INT3
1d360 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  2) or a pointer 
1d370 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20  to.** a KeyInfo 
1d380 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45  structure (P4_KE
1d390 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73  YINFO). If it is
1d3a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1d3b0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 6f 62 6a 65  KeyInfo .** obje
1d3c0 63 74 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 62  ct, then table b
1d3d0 65 69 6e 67 20 6f 70 65 6e 65 64 20 6d 75 73 74  eing opened must
1d3e0 20 62 65 20 61 6e 20 5b 69 6e 64 65 78 20 62 2d   be an [index b-
1d3f0 74 72 65 65 5d 20 77 68 65 72 65 20 74 68 65 0a  tree] where the.
1d400 2a 2a 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  ** KeyInfo objec
1d410 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f  t defines the co
1d420 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74  ntent and collat
1d430 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ing .** sequence
1d440 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 20 62   of that index b
1d450 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
1d460 2c 20 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e  , if P4 is an in
1d470 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c  teger .** value,
1d480 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   then the table 
1d490 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 6d 75 73  being opened mus
1d4a0 74 20 62 65 20 61 20 5b 74 61 62 6c 65 20 62 2d  t be a [table b-
1d4b0 74 72 65 65 5d 20 77 69 74 68 20 61 0a 2a 2a 20  tree] with a.** 
1d4c0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1d4d0 73 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20 74  s no less than t
1d4e0 68 65 20 76 61 6c 75 65 20 6f 66 20 50 34 2e 0a  he value of P4..
1d4f0 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 50 35  **.** Allowed P5
1d500 20 62 69 74 73 3a 0a 2a 2a 20 3c 75 6c 3e 0a 2a   bits:.** <ul>.*
1d510 2a 20 3c 6c 69 3e 20 20 3c 62 3e 30 78 30 32 20  * <li>  <b>0x02 
1d520 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 3c 2f 62  OPFLAG_SEEKEQ</b
1d530 3e 3a 20 54 68 69 73 20 63 75 72 73 6f 72 20 77  >: This cursor w
1d540 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  ill only be used
1d550 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 65 71   for.**       eq
1d560 75 61 6c 69 74 79 20 6c 6f 6f 6b 75 70 73 20 28  uality lookups (
1d570 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1d580 20 70 61 69 72 20 6f 66 20 6f 70 63 6f 64 65 73   pair of opcodes
1d590 20 4f 50 5f 53 65 65 6b 47 45 2f 4f 50 5f 49 64   OP_SeekGE/OP_Id
1d5a0 78 47 54 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  xGT.**       of 
1d5b0 4f 50 5f 53 65 65 6b 4c 45 2f 4f 50 5f 49 64 78  OP_SeekLE/OP_Idx
1d5c0 47 54 29 0a 2a 2a 20 3c 6c 69 3e 20 20 3c 62 3e  GT).** <li>  <b>
1d5d0 30 78 30 38 20 4f 50 46 4c 41 47 5f 46 4f 52 44  0x08 OPFLAG_FORD
1d5e0 45 4c 45 54 45 3c 2f 62 3e 3a 20 54 68 69 73 20  ELETE</b>: This 
1d5f0 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
1d600 6e 6c 79 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 20  nly to seek.**  
1d610 20 20 20 20 20 61 6e 64 20 73 75 62 73 65 71 75       and subsequ
1d620 65 6e 74 6c 79 20 64 65 6c 65 74 65 20 65 6e 74  ently delete ent
1d630 72 69 65 73 20 69 6e 20 61 6e 20 69 6e 64 65 78  ries in an index
1d640 20 62 74 72 65 65 2e 20 20 54 68 69 73 20 69 73   btree.  This is
1d650 20 61 0a 2a 2a 20 20 20 20 20 20 20 68 69 6e 74   a.**       hint
1d660 20 74 6f 20 74 68 65 20 73 74 6f 72 61 67 65 20   to the storage 
1d670 65 6e 67 69 6e 65 20 74 68 61 74 20 74 68 65 20  engine that the 
1d680 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 69  storage engine i
1d690 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20  s allowed to.** 
1d6a0 20 20 20 20 20 20 69 67 6e 6f 72 65 2e 20 20 54        ignore.  T
1d6b0 68 65 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75  he hint is not u
1d6c0 73 65 64 20 62 79 20 74 68 65 20 6f 66 66 69 63  sed by the offic
1d6d0 69 61 6c 20 53 51 4c 69 74 65 20 62 2a 74 72 65  ial SQLite b*tre
1d6e0 65 20 73 74 6f 72 61 67 65 0a 2a 2a 20 20 20 20  e storage.**    
1d6f0 20 20 20 65 6e 67 69 6e 65 2c 20 62 75 74 20 69     engine, but i
1d700 73 20 75 73 65 64 20 62 79 20 43 4f 4d 44 42 32  s used by COMDB2
1d710 2e 0a 2a 2a 20 3c 6c 69 3e 20 20 3c 62 3e 30 78  ..** <li>  <b>0x
1d720 31 30 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45  10 OPFLAG_P2ISRE
1d730 47 3c 2f 62 3e 3a 20 55 73 65 20 74 68 65 20 63  G</b>: Use the c
1d740 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
1d750 65 72 20 50 32 0a 2a 2a 20 20 20 20 20 20 20 61  er P2.**       a
1d760 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  s the root page,
1d770 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f   not the value o
1d780 66 20 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  f P2 itself..** 
1d790 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  </ul>.**.** This
1d7a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 6f 72   instruction wor
1d7b0 6b 73 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61 64  ks like OpenRead
1d7c0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
1d7d0 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f 72  opens the cursor
1d7e0 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69 74  .** in read/writ
1d7f0 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  e mode..**.** Se
1d800 65 20 61 6c 73 6f 3a 20 4f 50 5f 4f 70 65 6e 52  e also: OP_OpenR
1d810 65 61 64 2c 20 4f 50 5f 52 65 6f 70 65 6e 49 64  ead, OP_ReopenId
1d820 78 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6f  x.*/.case OP_Reo
1d830 70 65 6e 49 64 78 3a 20 7b 0a 20 20 69 6e 74 20  penIdx: {.  int 
1d840 6e 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66  nField;.  KeyInf
1d850 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
1d860 6e 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62  nt p2;.  int iDb
1d870 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a  ;.  int wrFlag;.
1d880 20 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56    Btree *pX;.  V
1d890 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
1d8a0 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
1d8b0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d  ssert( pOp->p5==
1d8c0 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50  0 || pOp->p5==OP
1d8d0 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20  FLAG_SEEKEQ );. 
1d8e0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1d8f0 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
1d900 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e   );.  pCur = p->
1d910 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1d920 20 20 69 66 28 20 70 43 75 72 20 26 26 20 70 43    if( pCur && pC
1d930 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 75  ur->pgnoRoot==(u
1d940 33 32 29 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20  32)pOp->p2 ){.  
1d950 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d960 69 44 62 3d 3d 70 4f 70 2d 3e 70 33 20 29 3b 20  iDb==pOp->p3 ); 
1d970 20 20 20 20 20 2f 2a 20 47 75 61 72 61 6e 74 65       /* Guarante
1d980 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 67  ed by the code g
1d990 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  enerator */.    
1d9a0 67 6f 74 6f 20 6f 70 65 6e 5f 63 75 72 73 6f 72  goto open_cursor
1d9b0 5f 73 65 74 5f 68 69 6e 74 73 3b 0a 20 20 7d 0a  _set_hints;.  }.
1d9c0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1d9d0 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
1d9e0 74 6c 79 20 6f 70 65 6e 20 6f 72 20 69 73 20 6f  tly open or is o
1d9f0 70 65 6e 20 6f 6e 20 61 20 64 69 66 66 65 72 65  pen on a differe
1da00 6e 74 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  nt.  ** index, t
1da10 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
1da20 20 69 6e 74 6f 20 4f 50 5f 4f 70 65 6e 52 65 61   into OP_OpenRea
1da30 64 20 74 6f 20 66 6f 72 63 65 20 61 20 72 65 6f  d to force a reo
1da40 70 65 6e 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  pen */.case OP_O
1da50 70 65 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50  penRead:.case OP
1da60 5f 4f 70 65 6e 57 72 69 74 65 3a 0a 0a 20 20 61  _OpenWrite:..  a
1da70 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
1da80 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  de==OP_OpenWrite
1da90 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c   || pOp->p5==0 |
1daa0 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41  | pOp->p5==OPFLA
1dab0 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20 61 73  G_SEEKEQ );.  as
1dac0 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
1dad0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
1dae0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1daf0 4f 70 65 6e 52 65 61 64 20 7c 7c 20 70 4f 70 2d  OpenRead || pOp-
1db00 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 65 6f 70  >opcode==OP_Reop
1db10 65 6e 49 64 78 0a 20 20 20 20 20 20 20 20 20 20  enIdx.          
1db20 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  || p->readOnly==
1db30 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65  0 );..  if( p->e
1db40 78 70 69 72 65 64 3d 3d 31 20 29 7b 0a 20 20 20  xpired==1 ){.   
1db50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f   rc = SQLITE_ABO
1db60 52 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  RT_ROLLBACK;.   
1db70 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1db80 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  to_error;.  }.. 
1db90 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 70   nField = 0;.  p
1dba0 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 70  KeyInfo = 0;.  p
1dbb0 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69  2 = pOp->p2;.  i
1dbc0 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  Db = pOp->p3;.  
1dbd0 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
1dbe0 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
1dbf0 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
1dc00 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61  kTest(p->btreeMa
1dc10 73 6b 2c 20 69 44 62 29 20 29 3b 0a 20 20 70 44  sk, iDb) );.  pD
1dc20 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
1dc30 5d 3b 0a 20 20 70 58 20 3d 20 70 44 62 2d 3e 70  ];.  pX = pDb->p
1dc40 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 58  Bt;.  assert( pX
1dc50 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  !=0 );.  if( pOp
1dc60 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65  ->opcode==OP_Ope
1dc70 6e 57 72 69 74 65 20 29 7b 0a 20 20 20 20 61 73  nWrite ){.    as
1dc80 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 46 4f 52  sert( OPFLAG_FOR
1dc90 44 45 4c 45 54 45 3d 3d 42 54 52 45 45 5f 46 4f  DELETE==BTREE_FO
1dca0 52 44 45 4c 45 54 45 20 29 3b 0a 20 20 20 20 77  RDELETE );.    w
1dcb0 72 46 6c 61 67 20 3d 20 42 54 52 45 45 5f 57 52  rFlag = BTREE_WR
1dcc0 43 53 52 20 7c 20 28 70 4f 70 2d 3e 70 35 20 26  CSR | (pOp->p5 &
1dcd0 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
1dce0 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E);.    assert( 
1dcf0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1dd00 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
1dd10 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 44  0) );.    if( pD
1dd20 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
1dd30 5f 66 6f 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e  _format < p->min
1dd40 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
1dd50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57  ){.      p->minW
1dd60 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
1dd70 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
1dd80 69 6c 65 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20  ile_format;.    
1dd90 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  }.  }else{.    w
1dda0 72 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  rFlag = 0;.  }. 
1ddb0 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f   if( pOp->p5 & O
1ddc0 50 46 4c 41 47 5f 50 32 49 53 52 45 47 20 29 7b  PFLAG_P2ISREG ){
1ddd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e  .    assert( p2>
1dde0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1ddf0 20 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20   p2<=(p->nMem+1 
1de00 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
1de10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
1de20 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65  ->opcode==OP_Ope
1de30 6e 57 72 69 74 65 20 29 3b 0a 20 20 20 20 70 49  nWrite );.    pI
1de40 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a  n2 = &aMem[p2];.
1de50 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
1de60 73 56 61 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a  sValid(pIn2) );.
1de70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49 6e      assert( (pIn
1de80 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  2->flags & MEM_I
1de90 6e 74 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  nt)!=0 );.    sq
1dea0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
1deb0 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20  gerify(pIn2);.  
1dec0 20 20 70 32 20 3d 20 28 69 6e 74 29 70 49 6e 32    p2 = (int)pIn2
1ded0 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68  ->u.i;.    /* Th
1dee0 65 20 70 32 20 76 61 6c 75 65 20 61 6c 77 61 79  e p2 value alway
1def0 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70  s comes from a p
1df00 72 69 6f 72 20 4f 50 5f 43 72 65 61 74 65 42 74  rior OP_CreateBt
1df10 72 65 65 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20  ree opcode and. 
1df20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64     ** that opcod
1df30 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 73 65  e will always se
1df40 74 20 74 68 65 20 70 32 20 76 61 6c 75 65 20 74  t the p2 value t
1df50 6f 20 32 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65  o 2 or more or e
1df60 6c 73 65 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a  lse fail..    **
1df70 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 61   If there were a
1df80 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 70 72   failure, the pr
1df90 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1dfa0 20 77 6f 75 6c 64 20 68 61 76 65 20 68 61 6c 74   would have halt
1dfb0 65 64 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ed.    ** before
1dfc0 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 69   reaching this i
1dfd0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20  nstruction. */. 
1dfe0 20 20 20 61 73 73 65 72 74 28 20 70 32 3e 3d 32     assert( p2>=2
1dff0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f   );.  }.  if( pO
1e000 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
1e010 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65  YINFO ){.    pKe
1e020 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
1e030 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73  pKeyInfo;.    as
1e040 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1e050 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a  enc==ENC(db) );.
1e060 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
1e070 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  Info->db==db );.
1e080 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65      nField = pKe
1e090 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1e0a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
1e0b0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
1e0c0 54 33 32 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c  T32 ){.    nFiel
1e0d0 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  d = pOp->p4.i;. 
1e0e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   }.  assert( pOp
1e0f0 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73  ->p1>=0 );.  ass
1e100 65 72 74 28 20 6e 46 69 65 6c 64 3e 3d 30 20 29  ert( nField>=0 )
1e110 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 46  ;.  testcase( nF
1e120 69 65 6c 64 3d 3d 30 20 29 3b 20 20 2f 2a 20 54  ield==0 );  /* T
1e130 61 62 6c 65 20 77 69 74 68 20 49 4e 54 45 47 45  able with INTEGE
1e140 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e  R PRIMARY KEY an
1e150 64 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 2a  d nothing else *
1e160 2f 0a 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63  /.  pCur = alloc
1e170 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70  ateCursor(p, pOp
1e180 2d 3e 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44  ->p1, nField, iD
1e190 62 2c 20 43 55 52 54 59 50 45 5f 42 54 52 45 45  b, CURTYPE_BTREE
1e1a0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30  );.  if( pCur==0
1e1b0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
1e1c0 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20    pCur->nullRow 
1e1d0 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 73 4f  = 1;.  pCur->isO
1e1e0 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 70 43  rdered = 1;.  pC
1e1f0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 70  ur->pgnoRoot = p
1e200 32 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  2;.#ifdef SQLITE
1e210 5f 44 45 42 55 47 0a 20 20 70 43 75 72 2d 3e 77  _DEBUG.  pCur->w
1e220 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a  rFlag = wrFlag;.
1e230 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 73 71  #endif.  rc = sq
1e240 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1e250 28 70 58 2c 20 70 32 2c 20 77 72 46 6c 61 67 2c  (pX, p2, wrFlag,
1e260 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 2d   pKeyInfo, pCur-
1e270 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
1e280 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1e290 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 2f 2a 20   pKeyInfo;.  /* 
1e2a0 53 65 74 20 74 68 65 20 56 64 62 65 43 75 72 73  Set the VdbeCurs
1e2b0 6f 72 2e 69 73 54 61 62 6c 65 20 76 61 72 69 61  or.isTable varia
1e2c0 62 6c 65 2e 20 50 72 65 76 69 6f 75 73 20 76 65  ble. Previous ve
1e2d0 72 73 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53  rsions of.  ** S
1e2e0 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 63 68  QLite used to ch
1e2f0 65 63 6b 20 69 66 20 74 68 65 20 72 6f 6f 74 2d  eck if the root-
1e300 70 61 67 65 20 66 6c 61 67 73 20 77 65 72 65 20  page flags were 
1e310 73 61 6e 65 20 61 74 20 74 68 69 73 20 70 6f 69  sane at this poi
1e320 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f  nt.  ** and repo
1e330 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  rt database corr
1e340 75 70 74 69 6f 6e 20 69 66 20 74 68 65 79 20 77  uption if they w
1e350 65 72 65 20 6e 6f 74 2c 20 62 75 74 20 74 68 69  ere not, but thi
1e360 73 20 63 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a  s check has.  **
1e370 20 73 69 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74   since moved int
1e380 6f 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  o the btree laye
1e390 72 2e 20 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d  r.  */  .  pCur-
1e3a0 3e 69 73 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e  >isTable = pOp->
1e3b0 70 34 74 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e  p4type!=P4_KEYIN
1e3c0 46 4f 3b 0a 0a 6f 70 65 6e 5f 63 75 72 73 6f 72  FO;..open_cursor
1e3d0 5f 73 65 74 5f 68 69 6e 74 73 3a 0a 20 20 61 73  _set_hints:.  as
1e3e0 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 42 55 4c  sert( OPFLAG_BUL
1e3f0 4b 43 53 52 3d 3d 42 54 52 45 45 5f 42 55 4c 4b  KCSR==BTREE_BULK
1e400 4c 4f 41 44 20 29 3b 0a 20 20 61 73 73 65 72 74  LOAD );.  assert
1e410 28 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 3d  ( OPFLAG_SEEKEQ=
1e420 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 29  =BTREE_SEEK_EQ )
1e430 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
1e440 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 42  p->p5 & OPFLAG_B
1e450 55 4c 4b 43 53 52 20 29 3b 0a 23 69 66 64 65 66  ULKCSR );.#ifdef
1e460 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
1e470 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 74 65  URSOR_HINTS.  te
1e480 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 20  stcase( pOp->p2 
1e490 26 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20  & OPFLAG_SEEKEQ 
1e4a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
1e4b0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69  te3BtreeCursorHi
1e4c0 6e 74 46 6c 61 67 73 28 70 43 75 72 2d 3e 75 63  ntFlags(pCur->uc
1e4d0 2e 70 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20  .pCursor,.      
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4f0 20 20 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70           (pOp->p
1e500 35 20 26 20 28 4f 50 46 4c 41 47 5f 42 55 4c 4b  5 & (OPFLAG_BULK
1e510 43 53 52 7c 4f 50 46 4c 41 47 5f 53 45 45 4b 45  CSR|OPFLAG_SEEKE
1e520 51 29 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Q)));.  if( rc )
1e530 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1e540 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
1e550 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1e560 20 4f 70 65 6e 44 75 70 20 50 31 20 50 32 20 2a   OpenDup P1 P2 *
1e570 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20   * *.**.** Open 
1e580 61 20 6e 65 77 20 63 75 72 73 6f 72 20 50 31 20  a new cursor P1 
1e590 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  that points to t
1e5a0 68 65 20 73 61 6d 65 20 65 70 68 65 6d 65 72 61  he same ephemera
1e5b0 6c 20 74 61 62 6c 65 20 61 73 0a 2a 2a 20 63 75  l table as.** cu
1e5c0 72 73 6f 72 20 50 32 2e 20 20 54 68 65 20 50 32  rsor P2.  The P2
1e5d0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
1e5e0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  e been opened by
1e5f0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
1e600 45 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 6f 70 63  Ephemeral.** opc
1e610 6f 64 65 2e 20 20 4f 6e 6c 79 20 65 70 68 65 6d  ode.  Only ephem
1e620 65 72 61 6c 20 63 75 72 73 6f 72 73 20 6d 61 79  eral cursors may
1e630 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 2e 0a   be duplicated..
1e640 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
1e650 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72  ephemeral cursor
1e660 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 73  s are used for s
1e670 65 6c 66 2d 6a 6f 69 6e 73 20 6f 66 20 6d 61 74  elf-joins of mat
1e680 65 72 69 61 6c 69 7a 65 64 20 76 69 65 77 73 2e  erialized views.
1e690 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  .*/.case OP_Open
1e6a0 44 75 70 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  Dup: {.  VdbeCur
1e6b0 73 6f 72 20 2a 70 4f 72 69 67 3b 20 20 20 20 2f  sor *pOrig;    /
1e6c0 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63  * The original c
1e6d0 75 72 73 6f 72 20 74 6f 20 62 65 20 64 75 70 6c  ursor to be dupl
1e6e0 69 63 61 74 65 64 20 2a 2f 0a 20 20 56 64 62 65  icated */.  Vdbe
1e6f0 43 75 72 73 6f 72 20 2a 70 43 78 3b 20 20 20 20  Cursor *pCx;    
1e700 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 63 75 72    /* The new cur
1e710 73 6f 72 20 2a 2f 0a 0a 20 20 70 4f 72 69 67 20  sor */..  pOrig 
1e720 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1e730 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
1e740 4f 72 69 67 2d 3e 70 42 74 78 21 3d 30 20 29 3b  Orig->pBtx!=0 );
1e750 20 20 2f 2a 20 4f 6e 6c 79 20 65 70 68 65 6d 65    /* Only epheme
1e760 72 61 6c 20 63 75 72 73 6f 72 73 20 63 61 6e 20  ral cursors can 
1e770 62 65 20 64 75 70 6c 69 63 61 74 65 64 20 2a 2f  be duplicated */
1e780 0a 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61  ..  pCx = alloca
1e790 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d  teCursor(p, pOp-
1e7a0 3e 70 31 2c 20 70 4f 72 69 67 2d 3e 6e 46 69 65  >p1, pOrig->nFie
1e7b0 6c 64 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f  ld, -1, CURTYPE_
1e7c0 42 54 52 45 45 29 3b 0a 20 20 69 66 28 20 70 43  BTREE);.  if( pC
1e7d0 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  x==0 ) goto no_m
1e7e0 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52  em;.  pCx->nullR
1e7f0 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69  ow = 1;.  pCx->i
1e800 73 45 70 68 65 6d 65 72 61 6c 20 3d 20 31 3b 0a  sEphemeral = 1;.
1e810 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20    pCx->pKeyInfo 
1e820 3d 20 70 4f 72 69 67 2d 3e 70 4b 65 79 49 6e 66  = pOrig->pKeyInf
1e830 6f 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c  o;.  pCx->isTabl
1e840 65 20 3d 20 70 4f 72 69 67 2d 3e 69 73 54 61 62  e = pOrig->isTab
1e850 6c 65 3b 0a 20 20 70 43 78 2d 3e 70 67 6e 6f 52  le;.  pCx->pgnoR
1e860 6f 6f 74 20 3d 20 70 4f 72 69 67 2d 3e 70 67 6e  oot = pOrig->pgn
1e870 6f 52 6f 6f 74 3b 0a 20 20 70 43 78 2d 3e 69 73  oRoot;.  pCx->is
1e880 4f 72 64 65 72 65 64 20 3d 20 70 4f 72 69 67 2d  Ordered = pOrig-
1e890 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 72 63  >isOrdered;.  rc
1e8a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1e8b0 75 72 73 6f 72 28 70 4f 72 69 67 2d 3e 70 42 74  ursor(pOrig->pBt
1e8c0 78 2c 20 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74  x, pCx->pgnoRoot
1e8d0 2c 20 42 54 52 45 45 5f 57 52 43 53 52 2c 0a 20  , BTREE_WRCSR,. 
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8f0 20 20 20 20 20 20 20 20 20 70 43 78 2d 3e 70 4b           pCx->pK
1e900 65 79 49 6e 66 6f 2c 20 70 43 78 2d 3e 75 63 2e  eyInfo, pCx->uc.
1e910 70 43 75 72 73 6f 72 29 3b 0a 20 20 2f 2a 20 54  pCursor);.  /* T
1e920 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1e930 75 72 73 6f 72 28 29 20 72 6f 75 74 69 6e 65 20  ursor() routine 
1e940 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 66 6f  can only fail fo
1e950 72 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73  r the first curs
1e960 6f 72 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 20 66  or.  ** opened f
1e970 6f 72 20 61 20 64 61 74 61 62 61 73 65 2e 20 20  or a database.  
1e980 53 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 61  Since there is a
1e990 6c 72 65 61 64 79 20 61 6e 20 6f 70 65 6e 20 63  lready an open c
1e9a0 75 72 73 6f 72 20 77 68 65 6e 20 74 68 69 73 0a  ursor when this.
1e9b0 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20 72    ** opcode is r
1e9c0 75 6e 2c 20 74 68 65 20 73 71 6c 69 74 65 33 42  un, the sqlite3B
1e9d0 74 72 65 65 43 75 72 73 6f 72 28 29 20 63 61 6e  treeCursor() can
1e9e0 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73  not fail */.  as
1e9f0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1ea00 5f 4f 4b 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  _OK );.  break;.
1ea10 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  }.../* Opcode: O
1ea20 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 50 31 20  penEphemeral P1 
1ea30 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a 20 53 79  P2 * P4 P5.** Sy
1ea40 6e 6f 70 73 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d  nopsis: nColumn=
1ea50 50 32 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  P2.**.** Open a 
1ea60 6e 65 77 20 63 75 72 73 6f 72 20 50 31 20 74 6f  new cursor P1 to
1ea70 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
1ea80 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  le..** The curso
1ea90 72 20 69 73 20 61 6c 77 61 79 73 20 6f 70 65 6e  r is always open
1eaa0 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 65 76  ed read/write ev
1eab0 65 6e 20 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61  en if .** the ma
1eac0 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 72  in database is r
1ead0 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65  ead-only.  The e
1eae0 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c  phemeral.** tabl
1eaf0 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 75 74  e is deleted aut
1eb00 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
1eb10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c  the cursor is cl
1eb20 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  osed..**.** If t
1eb30 68 65 20 63 75 72 73 6f 72 20 50 31 20 69 73 20  he cursor P1 is 
1eb40 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 6f  already opened o
1eb50 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  n an ephemeral t
1eb60 61 62 6c 65 2c 20 74 68 65 20 74 61 62 6c 65 0a  able, the table.
1eb70 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 28 61  ** is cleared (a
1eb80 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 65 72  ll content is er
1eb90 61 73 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 50 32 20  ased)..**.** P2 
1eba0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1ebb0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1ebc0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
1ebd0 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70  .** The cursor p
1ebe0 6f 69 6e 74 73 20 74 6f 20 61 20 42 54 72 65 65  oints to a BTree
1ebf0 20 74 61 62 6c 65 20 69 66 20 50 34 3d 3d 30 20   table if P4==0 
1ec00 61 6e 64 20 74 6f 20 61 20 42 54 72 65 65 20 69  and to a BTree i
1ec10 6e 64 65 78 0a 2a 2a 20 69 66 20 50 34 20 69 73  ndex.** if P4 is
1ec20 20 6e 6f 74 20 30 2e 20 20 49 66 20 50 34 20 69   not 0.  If P4 i
1ec30 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70  s not NULL, it p
1ec40 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e  oints to a KeyIn
1ec50 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  fo structure.** 
1ec60 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1ec70 20 66 6f 72 6d 61 74 20 6f 66 20 6b 65 79 73 20   format of keys 
1ec80 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1ec90 0a 2a 2a 20 54 68 65 20 50 35 20 70 61 72 61 6d  .** The P5 param
1eca0 65 74 65 72 20 63 61 6e 20 62 65 20 61 20 6d 61  eter can be a ma
1ecb0 73 6b 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  sk of the BTREE_
1ecc0 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 0a  * flags defined.
1ecd0 2a 2a 20 69 6e 20 62 74 72 65 65 2e 68 2e 20 20  ** in btree.h.  
1ece0 54 68 65 73 65 20 66 6c 61 67 73 20 63 6f 6e 74  These flags cont
1ecf0 72 6f 6c 20 61 73 70 65 63 74 73 20 6f 66 20 74  rol aspects of t
1ed00 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 0a  he operation of.
1ed10 2a 2a 20 74 68 65 20 62 74 72 65 65 2e 20 20 54  ** the btree.  T
1ed20 68 65 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  he BTREE_OMIT_JO
1ed30 55 52 4e 41 4c 20 61 6e 64 20 42 54 52 45 45 5f  URNAL and BTREE_
1ed40 53 49 4e 47 4c 45 20 66 6c 61 67 73 20 61 72 65  SINGLE flags are
1ed50 0a 2a 2a 20 61 64 64 65 64 20 61 75 74 6f 6d 61  .** added automa
1ed60 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f 2a 20 4f  tically..*/./* O
1ed70 70 63 6f 64 65 3a 20 4f 70 65 6e 41 75 74 6f 69  pcode: OpenAutoi
1ed80 6e 64 65 78 20 50 31 20 50 32 20 2a 20 50 34 20  ndex P1 P2 * P4 
1ed90 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6e  *.** Synopsis: n
1eda0 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20  Column=P2.**.** 
1edb0 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
1edc0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4f 50  s the same as OP
1edd0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2e 20  _OpenEphemeral. 
1ede0 20 49 74 20 68 61 73 20 61 0a 2a 2a 20 64 69 66   It has a.** dif
1edf0 66 65 72 65 6e 74 20 6e 61 6d 65 20 74 6f 20 64  ferent name to d
1ee00 69 73 74 69 6e 67 75 69 73 68 20 69 74 73 20 75  istinguish its u
1ee10 73 65 2e 20 20 54 61 62 6c 65 73 20 63 72 65 61  se.  Tables crea
1ee20 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 62 79 20  ted using.** by 
1ee30 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c  this opcode will
1ee40 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 75 74   be used for aut
1ee50 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
1ee60 65 64 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20  ed transient.** 
1ee70 69 6e 64 69 63 65 73 20 69 6e 20 6a 6f 69 6e 73  indices in joins
1ee80 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ..*/.case OP_Ope
1ee90 6e 41 75 74 6f 69 6e 64 65 78 3a 20 0a 63 61 73  nAutoindex: .cas
1eea0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
1eeb0 61 6c 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  al: {.  VdbeCurs
1eec0 6f 72 20 2a 70 43 78 3b 0a 20 20 4b 65 79 49 6e  or *pCx;.  KeyIn
1eed0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 0a 20  fo *pKeyInfo;.. 
1eee0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
1eef0 74 20 76 66 73 46 6c 61 67 73 20 3d 20 0a 20 20  t vfsFlags = .  
1ef00 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1ef10 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20  READWRITE |.    
1ef20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1ef30 45 41 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  EATE |.      SQL
1ef40 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1ef50 56 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  VE |.      SQLIT
1ef60 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1ef70 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  LOSE |.      SQL
1ef80 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1ef90 4e 54 5f 44 42 3b 0a 20 20 61 73 73 65 72 74 28  NT_DB;.  assert(
1efa0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20   pOp->p1>=0 );. 
1efb0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
1efc0 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 70  >=0 );.  pCx = p
1efd0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1efe0 3b 0a 20 20 69 66 28 20 70 43 78 20 29 7b 0a 20  ;.  if( pCx ){. 
1eff0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 70 68     /* If the eph
1f000 65 72 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73  ermeral table is
1f010 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 65   already open, e
1f020 72 61 73 65 20 61 6c 6c 20 65 78 69 73 74 69 6e  rase all existin
1f030 67 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  g content.    **
1f040 20 73 6f 20 74 68 61 74 20 74 68 65 20 74 61 62   so that the tab
1f050 6c 65 20 69 73 20 65 6d 70 74 79 20 61 67 61 69  le is empty agai
1f060 6e 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  n, rather than c
1f070 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  reating a new ta
1f080 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ble. */.    rc =
1f090 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1f0a0 61 72 54 61 62 6c 65 28 70 43 78 2d 3e 70 42 74  arTable(pCx->pBt
1f0b0 78 2c 20 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74  x, pCx->pgnoRoot
1f0c0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1f0d0 20 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74     pCx = allocat
1f0e0 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
1f0f0 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c  p1, pOp->p2, -1,
1f100 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b   CURTYPE_BTREE);
1f110 0a 20 20 20 20 69 66 28 20 70 43 78 3d 3d 30 20  .    if( pCx==0 
1f120 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
1f130 20 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20     pCx->nullRow 
1f140 3d 20 31 3b 0a 20 20 20 20 70 43 78 2d 3e 69 73  = 1;.    pCx->is
1f150 45 70 68 65 6d 65 72 61 6c 20 3d 20 31 3b 0a 20  Ephemeral = 1;. 
1f160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f170 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1f180 73 2c 20 30 2c 20 64 62 2c 20 26 70 43 78 2d 3e  s, 0, db, &pCx->
1f190 70 42 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20  pBtx, .         
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
1f1c0 4e 41 4c 20 7c 20 42 54 52 45 45 5f 53 49 4e 47  NAL | BTREE_SING
1f1d0 4c 45 20 7c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  LE | pOp->p5,.  
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1f0 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73          vfsFlags
1f200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1f230 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 43  reeBeginTrans(pC
1f240 78 2d 3e 70 42 74 78 2c 20 31 2c 20 30 29 3b 0a  x->pBtx, 1, 0);.
1f250 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f270 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72 61       /* If a tra
1f280 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 69 73 20  nsient index is 
1f290 72 65 71 75 69 72 65 64 2c 20 63 72 65 61 74 65  required, create
1f2a0 20 69 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20   it by calling. 
1f2b0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42       ** sqlite3B
1f2c0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1f2d0 29 20 77 69 74 68 20 74 68 65 20 42 54 52 45 45  ) with the BTREE
1f2e0 5f 42 4c 4f 42 4b 45 59 20 66 6c 61 67 20 62 65  _BLOBKEY flag be
1f2f0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 6f 70  fore.      ** op
1f300 65 6e 69 6e 67 20 69 74 2e 20 49 66 20 61 20 74  ening it. If a t
1f310 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 69  ransient table i
1f320 73 20 72 65 71 75 69 72 65 64 2c 20 6a 75 73 74  s required, just
1f330 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
1f340 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1f350 63 72 65 61 74 65 64 20 74 61 62 6c 65 20 77 69  created table wi
1f360 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 31 20 28  th root-page 1 (
1f370 61 6e 20 42 4c 4f 42 5f 49 4e 54 4b 45 59 20 74  an BLOB_INTKEY t
1f380 61 62 6c 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  able)..      */.
1f390 20 20 20 20 20 20 69 66 28 20 28 70 43 78 2d 3e        if( (pCx->
1f3a0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1f3b0 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
1f3c0 65 79 49 6e 66 6f 29 21 3d 30 20 29 7b 0a 20 20  eyInfo)!=0 ){.  
1f3d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1f3e0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
1f3f0 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20  YINFO );.       
1f400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1f410 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 43  eeCreateTable(pC
1f420 78 2d 3e 70 42 74 78 2c 20 28 69 6e 74 2a 29 26  x->pBtx, (int*)&
1f430 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 0a 20  pCx->pgnoRoot,. 
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 20 20 20 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45      BTREE_BLOBKE
1f470 59 20 7c 20 70 4f 70 2d 3e 70 35 29 3b 20 0a 20  Y | pOp->p5); . 
1f480 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f4a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1f4b0 78 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 4d 41 53  x->pgnoRoot==MAS
1f4c0 54 45 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20  TER_ROOT+1 );.  
1f4d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f4e0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62  pKeyInfo->db==db
1f4f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
1f500 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1f510 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a  enc==ENC(db) );.
1f520 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f530 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1f540 72 28 70 43 78 2d 3e 70 42 74 78 2c 20 70 43 78  r(pCx->pBtx, pCx
1f550 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 42 54 52 45  ->pgnoRoot, BTRE
1f560 45 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20  E_WRCSR,.       
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f580 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49             pKeyI
1f590 6e 66 6f 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75  nfo, pCx->uc.pCu
1f5a0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  rsor);.        }
1f5b0 0a 20 20 20 20 20 20 20 20 70 43 78 2d 3e 69 73  .        pCx->is
1f5c0 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  Table = 0;.     
1f5d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f5e0 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  pCx->pgnoRoot = 
1f5f0 4d 41 53 54 45 52 5f 52 4f 4f 54 3b 0a 20 20 20  MASTER_ROOT;.   
1f600 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f610 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78  3BtreeCursor(pCx
1f620 2d 3e 70 42 74 78 2c 20 4d 41 53 54 45 52 5f 52  ->pBtx, MASTER_R
1f630 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52 43 53 52  OOT, BTREE_WRCSR
1f640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f660 20 20 30 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75    0, pCx->uc.pCu
1f670 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 70  rsor);.        p
1f680 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b  Cx->isTable = 1;
1f690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f6a0 20 20 20 70 43 78 2d 3e 69 73 4f 72 64 65 72 65     pCx->isOrdere
1f6b0 64 20 3d 20 28 70 4f 70 2d 3e 70 35 21 3d 42 54  d = (pOp->p5!=BT
1f6c0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
1f6d0 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67    }.  if( rc ) g
1f6e0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1f6f0 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
1f700 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
1f710 6f 72 74 65 72 4f 70 65 6e 20 50 31 20 50 32 20  orterOpen P1 P2 
1f720 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  P3 P4 *.**.** Th
1f730 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  is opcode works 
1f740 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65  like OP_OpenEphe
1f750 6d 65 72 61 6c 20 65 78 63 65 70 74 20 74 68 61  meral except tha
1f760 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a 20 61 20  t it opens.** a 
1f770 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
1f780 74 68 61 74 20 69 73 20 73 70 65 63 69 66 69 63  that is specific
1f790 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20 74 6f  ally designed to
1f7a0 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a 2a 20 74   sort large.** t
1f7b0 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e 20 65  ables using an e
1f7c0 78 74 65 72 6e 61 6c 20 6d 65 72 67 65 2d 73 6f  xternal merge-so
1f7d0 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a  rt algorithm..**
1f7e0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1f7f0 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P3 is non-zero, 
1f800 74 68 65 6e 20 69 74 20 69 6e 64 69 63 61 74 65  then it indicate
1f810 73 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 65  s that the sorte
1f820 72 20 6d 61 79 0a 2a 2a 20 61 73 73 75 6d 65 20  r may.** assume 
1f830 74 68 61 74 20 61 20 73 74 61 62 6c 65 20 73 6f  that a stable so
1f840 72 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  rt considering t
1f850 68 65 20 66 69 72 73 74 20 50 33 20 66 69 65 6c  he first P3 fiel
1f860 64 73 20 6f 66 20 65 61 63 68 0a 2a 2a 20 6b 65  ds of each.** ke
1f870 79 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  y is sufficient 
1f880 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20 72  to produce the r
1f890 65 71 75 69 72 65 64 20 72 65 73 75 6c 74 73 2e  equired results.
1f8a0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74  .*/.case OP_Sort
1f8b0 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65  erOpen: {.  Vdbe
1f8c0 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20  Cursor *pCx;..  
1f8d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1f8e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f8f0 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20  pOp->p2>=0 );.  
1f900 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75  pCx = allocateCu
1f910 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c  rsor(p, pOp->p1,
1f920 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 43 55   pOp->p2, -1, CU
1f930 52 54 59 50 45 5f 53 4f 52 54 45 52 29 3b 0a 20  RTYPE_SORTER);. 
1f940 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f   if( pCx==0 ) go
1f950 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78  to no_mem;.  pCx
1f960 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70  ->pKeyInfo = pOp
1f970 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
1f980 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 4b   assert( pCx->pK
1f990 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29  eyInfo->db==db )
1f9a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d  ;.  assert( pCx-
1f9b0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d  >pKeyInfo->enc==
1f9c0 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 72 63 20  ENC(db) );.  rc 
1f9d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
1f9e0 74 65 72 49 6e 69 74 28 64 62 2c 20 70 4f 70 2d  terInit(db, pOp-
1f9f0 3e 70 33 2c 20 70 43 78 29 3b 0a 20 20 69 66 28  >p3, pCx);.  if(
1fa00 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
1fa10 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1fa20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1fa30 63 6f 64 65 3a 20 53 65 71 75 65 6e 63 65 54 65  code: SequenceTe
1fa40 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  st P1 P2 * * *.*
1fa50 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 28 20  * Synopsis: if( 
1fa60 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b  cursor[P1].ctr++
1fa70 20 29 20 70 63 20 3d 20 50 32 0a 2a 2a 0a 2a 2a   ) pc = P2.**.**
1fa80 20 50 31 20 69 73 20 61 20 73 6f 72 74 65 72 20   P1 is a sorter 
1fa90 63 75 72 73 6f 72 2e 20 49 66 20 74 68 65 20 73  cursor. If the s
1faa0 65 71 75 65 6e 63 65 20 63 6f 75 6e 74 65 72 20  equence counter 
1fab0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72  is currently zer
1fac0 6f 2c 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20 50 32  o, jump.** to P2
1fad0 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
1fae0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1faf0 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
1fb00 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a  , increment the.
1fb10 2a 2a 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  ** the sequence 
1fb20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  value..*/.case O
1fb30 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74 3a 20  P_SequenceTest: 
1fb40 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
1fb50 70 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  pC;.  assert( pO
1fb60 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1fb70 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
1fb80 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1fb90 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
1fba0 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70  sert( isSorter(p
1fbb0 43 29 20 29 3b 0a 20 20 69 66 28 20 28 70 43 2d  C) );.  if( (pC-
1fbc0 3e 73 65 71 43 6f 75 6e 74 2b 2b 29 3d 3d 30 20  >seqCount++)==0 
1fbd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
1fbe0 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
1fbf0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1fc00 65 3a 20 4f 70 65 6e 50 73 65 75 64 6f 20 50 31  e: OpenPseudo P1
1fc10 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
1fc20 6e 6f 70 73 69 73 3a 20 50 33 20 63 6f 6c 75 6d  nopsis: P3 colum
1fc30 6e 73 20 69 6e 20 72 5b 50 32 5d 0a 2a 2a 0a 2a  ns in r[P2].**.*
1fc40 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72  * Open a new cur
1fc50 73 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  sor that points 
1fc60 74 6f 20 61 20 66 61 6b 65 20 74 61 62 6c 65 20  to a fake table 
1fc70 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
1fc80 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 66  single.** row of
1fc90 20 64 61 74 61 2e 20 20 54 68 65 20 63 6f 6e 74   data.  The cont
1fca0 65 6e 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ent of that one 
1fcb0 72 6f 77 20 69 73 20 74 68 65 20 63 6f 6e 74 65  row is the conte
1fcc0 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  nt of memory.** 
1fcd0 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 6e  register P2.  In
1fce0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63 75   other words, cu
1fcf0 72 73 6f 72 20 50 31 20 62 65 63 6f 6d 65 73 20  rsor P1 becomes 
1fd00 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  an alias for the
1fd10 20 0a 2a 2a 20 4d 45 4d 5f 42 6c 6f 62 20 63 6f   .** MEM_Blob co
1fd20 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e 65 64 20  ntent contained 
1fd30 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
1fd40 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64 6f 2d 74  **.** A pseudo-t
1fd50 61 62 6c 65 20 63 72 65 61 74 65 64 20 62 79 20  able created by 
1fd60 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75  this opcode is u
1fd70 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 73 69  sed to hold a si
1fd80 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75 74 70  ngle.** row outp
1fd90 75 74 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  ut from the sort
1fda0 65 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  er so that the r
1fdb0 6f 77 20 63 61 6e 20 62 65 20 64 65 63 6f 6d 70  ow can be decomp
1fdc0 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64  osed into.** ind
1fdd0 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e 73 20  ividual columns 
1fde0 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 43 6f 6c  using the OP_Col
1fdf0 75 6d 6e 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  umn opcode.  The
1fe00 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
1fe10 65 0a 2a 2a 20 69 73 20 74 68 65 20 6f 6e 6c 79  e.** is the only
1fe20 20 63 75 72 73 6f 72 20 6f 70 63 6f 64 65 20 74   cursor opcode t
1fe30 68 61 74 20 77 6f 72 6b 73 20 77 69 74 68 20 61  hat works with a
1fe40 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a   pseudo-table..*
1fe50 2a 0a 2a 2a 20 50 33 20 69 73 20 74 68 65 20 6e  *.** P3 is the n
1fe60 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
1fe70 69 6e 20 74 68 65 20 72 65 63 6f 72 64 73 20 74  in the records t
1fe80 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  hat will be stor
1fe90 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 73 65  ed by.** the pse
1fea0 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  udo-table..*/.ca
1feb0 73 65 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  se OP_OpenPseudo
1fec0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1fed0 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73 65 72 74   *pCx;..  assert
1fee0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a  ( pOp->p1>=0 );.
1fef0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1ff00 33 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20  3>=0 );.  pCx = 
1ff10 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70  allocateCursor(p
1ff20 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
1ff30 70 33 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f  p3, -1, CURTYPE_
1ff40 50 53 45 55 44 4f 29 3b 0a 20 20 69 66 28 20 70  PSEUDO);.  if( p
1ff50 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  Cx==0 ) goto no_
1ff60 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c  mem;.  pCx->null
1ff70 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e  Row = 1;.  pCx->
1ff80 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 70 4f 70  seekResult = pOp
1ff90 2d 3e 70 32 3b 0a 20 20 70 43 78 2d 3e 69 73 54  ->p2;.  pCx->isT
1ffa0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 2f 2a 20 47  able = 1;.  /* G
1ffb0 69 76 65 20 74 68 69 73 20 70 73 65 75 64 6f 2d  ive this pseudo-
1ffc0 63 75 72 73 6f 72 20 61 20 66 61 6b 65 20 42 74  cursor a fake Bt
1ffd0 43 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 73  Cursor pointer s
1ffe0 6f 20 74 68 61 74 20 70 43 78 0a 20 20 2a 2a 20  o that pCx.  ** 
1fff0 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 70 61  can be safely pa
20000 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 56  ssed to sqlite3V
20010 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
20020 29 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  ).  This avoids 
20030 61 20 74 65 73 74 0a 20 20 2a 2a 20 66 6f 72 20  a test.  ** for 
20040 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  pCx->eCurType==C
20050 55 52 54 59 50 45 5f 42 54 52 45 45 20 69 6e 73  URTYPE_BTREE ins
20060 69 64 65 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ide of sqlite3Vd
20070 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29  beCursorMoveto()
20080 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 61  .  ** which is a
20090 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
200a0 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 70  imization */.  p
200b0 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 20 3d  Cx->uc.pCursor =
200c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b   sqlite3BtreeFak
200d0 65 56 61 6c 69 64 43 75 72 73 6f 72 28 29 3b 0a  eValidCursor();.
200e0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
200f0 35 3d 3d 30 20 29 3b 0a 20 20 62 72 65 61 6b 3b  5==0 );.  break;
20100 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
20110 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  lose P1 * * * *.
20120 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  **.** Close a cu
20130 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c 79 20  rsor previously 
20140 6f 70 65 6e 65 64 20 61 73 20 50 31 2e 20 20 49  opened as P1.  I
20150 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  f P1 is not.** c
20160 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74  urrently open, t
20170 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
20180 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63  is a no-op..*/.c
20190 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a  ase OP_Close: {.
201a0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
201b0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
201c0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
201d0 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
201e0 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73  ursor(p, p->apCs
201f0 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 70  r[pOp->p1]);.  p
20200 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
20210 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
20220 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20230 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
20240 45 44 5f 4d 41 53 4b 0a 2f 2a 20 4f 70 63 6f 64  ED_MASK./* Opcod
20250 65 3a 20 43 6f 6c 75 6d 6e 73 55 73 65 64 20 50  e: ColumnsUsed P
20260 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
20270 20 54 68 69 73 20 6f 70 63 6f 64 65 20 28 77 68   This opcode (wh
20280 69 63 68 20 6f 6e 6c 79 20 65 78 69 73 74 73 20  ich only exists 
20290 69 66 20 53 51 4c 69 74 65 20 77 61 73 20 63 6f  if SQLite was co
202a0 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a 20 53  mpiled with.** S
202b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
202c0 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 29 20 69  UMN_USED_MASK) i
202d0 64 65 6e 74 69 66 69 65 73 20 77 68 69 63 68 20  dentifies which 
202e0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a 2a  columns of the.*
202f0 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  * table or index
20300 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 20 61   for cursor P1 a
20310 72 65 20 75 73 65 64 2e 20 20 50 34 20 69 73 20  re used.  P4 is 
20320 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
20330 0a 2a 2a 20 28 50 34 5f 49 4e 54 36 34 29 20 69  .** (P4_INT64) i
20340 6e 20 77 68 69 63 68 20 74 68 65 20 66 69 72 73  n which the firs
20350 74 20 36 33 20 62 69 74 73 20 61 72 65 20 6f 6e  t 63 bits are on
20360 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  e for each of th
20370 65 0a 2a 2a 20 66 69 72 73 74 20 36 33 20 63 6f  e.** first 63 co
20380 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
20390 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
203a0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73   are actually us
203b0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72  ed.** by the cur
203c0 73 6f 72 2e 20 20 54 68 65 20 68 69 67 68 2d 6f  sor.  The high-o
203d0 72 64 65 72 20 62 69 74 20 69 73 20 73 65 74 20  rder bit is set 
203e0 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 61 66  if any column af
203f0 74 65 72 0a 2a 2a 20 74 68 65 20 36 34 74 68 20  ter.** the 64th 
20400 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 63 61 73 65  is used..*/.case
20410 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 3a   OP_ColumnsUsed:
20420 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20   {.  VdbeCursor 
20430 2a 70 43 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  *pC;.  pC = p->a
20440 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
20450 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
20460 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
20470 54 52 45 45 20 29 3b 0a 20 20 70 43 2d 3e 6d 61  TREE );.  pC->ma
20480 73 6b 55 73 65 64 20 3d 20 2a 28 75 36 34 2a 29  skUsed = *(u64*)
20490 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20  pOp->p4.pI64;.  
204a0 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  break;.}.#endif.
204b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
204c0 47 45 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  GE P1 P2 P3 P4 *
204d0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
204e0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
204f0 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
20500 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74  fers to an SQL t
20510 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61  able (B-Tree tha
20520 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b  t uses integer k
20530 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68  eys), .** use th
20540 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
20550 74 65 72 20 50 33 20 61 73 20 74 68 65 20 6b 65  ter P3 as the ke
20560 79 2e 20 20 49 66 20 63 75 72 73 6f 72 20 50 31  y.  If cursor P1
20570 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61   refers .** to a
20580 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65  n SQL index, the
20590 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  n P3 is the firs
205a0 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
205b0 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a   P4 registers .*
205c0 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  * that are used 
205d0 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  as an unpacked i
205e0 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a  ndex key. .**.**
205f0 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73   Reposition curs
20600 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20 69  or P1 so that  i
20610 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
20620 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20 74  smallest entry t
20630 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61 74  hat .** is great
20640 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
20650 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75   to the key valu
20660 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  e. If there are 
20670 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 67  no records .** g
20680 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
20690 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
206a0 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65  and P2 is not ze
206b0 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ro, then jump to
206c0 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P2..**.** If th
206d0 65 20 63 75 72 73 6f 72 20 50 31 20 77 61 73 20  e cursor P1 was 
206e0 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65  opened using the
206f0 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 66   OPFLAG_SEEKEQ f
20700 6c 61 67 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  lag, then this.*
20710 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c  * opcode will al
20720 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20 61 20 72  ways land on a r
20730 65 63 6f 72 64 20 74 68 61 74 20 65 71 75 61 6c  ecord that equal
20740 6c 79 20 65 71 75 61 6c 73 20 74 68 65 20 6b 65  ly equals the ke
20750 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65 20 6a 75  y, or.** else ju
20760 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
20770 6f 20 50 32 2e 20 20 57 68 65 6e 20 74 68 65 20  o P2.  When the 
20780 63 75 72 73 6f 72 20 69 73 20 4f 50 46 4c 41 47  cursor is OPFLAG
20790 5f 53 45 45 4b 45 51 2c 20 74 68 69 73 0a 2a 2a  _SEEKEQ, this.**
207a0 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 62 65 20   opcode must be 
207b0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 49  followed by an I
207c0 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 74 68  dxLE opcode with
207d0 20 74 68 65 20 73 61 6d 65 20 61 72 67 75 6d 65   the same argume
207e0 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49 64 78 4c  nts..** The IdxL
207f0 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65  E opcode will be
20800 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 69 73   skipped if this
20810 20 6f 70 63 6f 64 65 20 73 75 63 63 65 65 64 73   opcode succeeds
20820 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20 49 64 78  , but the.** Idx
20830 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62  LE opcode will b
20840 65 20 75 73 65 64 20 6f 6e 20 73 75 62 73 65 71  e used on subseq
20850 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65 72 61 74  uent loop iterat
20860 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
20870 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74   opcode leaves t
20880 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67  he cursor config
20890 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20  ured to move in 
208a0 66 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a  forward order,.*
208b0 2a 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  * from the begin
208c0 6e 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20  ning toward the 
208d0 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  end.  In other w
208e0 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72  ords, the cursor
208f0 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65   is.** configure
20900 64 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e  d to use Next, n
20910 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53  ot Prev..**.** S
20920 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
20930 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 4c 74  NotFound, SeekLt
20940 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 4c 65  , SeekGt, SeekLe
20950 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
20960 65 65 6b 47 54 20 50 31 20 50 32 20 50 33 20 50  eekGT P1 P2 P3 P
20970 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
20980 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
20990 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
209a0 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
209b0 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
209c0 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
209d0 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
209e0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
209f0 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b  gister P3 as a k
20a00 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31  ey. If cursor P1
20a10 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61   refers .** to a
20a20 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65  n SQL index, the
20a30 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  n P3 is the firs
20a40 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
20a50 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a   P4 registers .*
20a60 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  * that are used 
20a70 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  as an unpacked i
20a80 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a  ndex key. .**.**
20a90 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73   Reposition curs
20aa0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20 69  or P1 so that  i
20ab0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
20ac0 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20 74  smallest entry t
20ad0 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61 74  hat .** is great
20ae0 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20  er than the key 
20af0 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20  value. If there 
20b00 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 67  are no records g
20b10 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
20b20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
20b30 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
20b40 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
20b50 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
20b60 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
20b70 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d   configured to m
20b80 6f 76 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f  ove in forward o
20b90 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68  rder,.** from th
20ba0 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61  e beginning towa
20bb0 72 64 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20  rd the end.  In 
20bc0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
20bd0 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f   cursor is.** co
20be0 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
20bf0 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a  Next, not Prev..
20c00 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
20c10 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
20c20 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 65 2c   SeekLt, SeekGe,
20c30 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70   SeekLe.*/./* Op
20c40 63 6f 64 65 3a 20 53 65 65 6b 4c 54 20 50 31 20  code: SeekLT P1 
20c50 50 32 20 50 33 20 50 34 20 2a 20 0a 2a 2a 20 53  P2 P3 P4 * .** S
20c60 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
20c70 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63  3@P4].**.** If c
20c80 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
20c90 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20  to an SQL table 
20ca0 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73 65  (B-Tree that use
20cb0 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c  s integer keys),
20cc0 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c   .** use the val
20cd0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
20ce0 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63  3 as a key. If c
20cf0 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
20d00 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  .** to an SQL in
20d10 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20  dex, then P3 is 
20d20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
20d30 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69  array of P4 regi
20d40 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61  sters .** that a
20d50 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e  re used as an un
20d60 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
20d70 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74  . .**.** Reposit
20d80 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f  ion cursor P1 so
20d90 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73   that  it points
20da0 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20   to the largest 
20db0 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69  entry that .** i
20dc0 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
20dd0 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68  key value. If th
20de0 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72  ere are no recor
20df0 64 73 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a  ds less than .**
20e00 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
20e10 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
20e20 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
20e30 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
20e40 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
20e50 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  r configured to 
20e60 6d 6f 76 65 20 69 6e 20 72 65 76 65 72 73 65 20  move in reverse 
20e70 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74  order,.** from t
20e80 68 65 20 65 6e 64 20 74 6f 77 61 72 64 20 74 68  he end toward th
20e90 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e  e beginning.  In
20ea0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
20eb0 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63  e cursor is.** c
20ec0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
20ed0 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e   Prev, not Next.
20ee0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
20ef0 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
20f00 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 47 65  , SeekGt, SeekGe
20f10 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f  , SeekLe.*/./* O
20f20 70 63 6f 64 65 3a 20 53 65 65 6b 4c 45 20 50 31  pcode: SeekLE P1
20f30 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53   P2 P3 P4 *.** S
20f40 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
20f50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63  3@P4].**.** If c
20f60 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
20f70 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20  to an SQL table 
20f80 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73 65  (B-Tree that use
20f90 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c  s integer keys),
20fa0 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c   .** use the val
20fb0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
20fc0 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63  3 as a key. If c
20fd0 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
20fe0 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  .** to an SQL in
20ff0 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20  dex, then P3 is 
21000 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
21010 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69  array of P4 regi
21020 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61  sters .** that a
21030 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e  re used as an un
21040 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
21050 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74  . .**.** Reposit
21060 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f  ion cursor P1 so
21070 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
21080 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  to the largest e
21090 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73  ntry that .** is
210a0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
210b0 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
210c0 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
210d0 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a  re no records .*
210e0 2a 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  * less than or e
210f0 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
21100 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65  and P2 is not ze
21110 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ro, then jump to
21120 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   P2..**.** This 
21130 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68  opcode leaves th
21140 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75  e cursor configu
21150 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72  red to move in r
21160 65 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a  everse order,.**
21170 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f   from the end to
21180 77 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69  ward the beginni
21190 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ng.  In other wo
211a0 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20  rds, the cursor 
211b0 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  is.** configured
211c0 20 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f   to use Prev, no
211d0 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t Next..**.** If
211e0 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 77   the cursor P1 w
211f0 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  as opened using 
21200 74 68 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45  the OPFLAG_SEEKE
21210 51 20 66 6c 61 67 2c 20 74 68 65 6e 20 74 68 69  Q flag, then thi
21220 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c  s.** opcode will
21230 20 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20   always land on 
21240 61 20 72 65 63 6f 72 64 20 74 68 61 74 20 65 71  a record that eq
21250 75 61 6c 6c 79 20 65 71 75 61 6c 73 20 74 68 65  ually equals the
21260 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65   key, or.** else
21270 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
21280 79 20 74 6f 20 50 32 2e 20 20 57 68 65 6e 20 74  y to P2.  When t
21290 68 65 20 63 75 72 73 6f 72 20 69 73 20 4f 50 46  he cursor is OPF
212a0 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74 68 69 73  LAG_SEEKEQ, this
212b0 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74 20  .** opcode must 
212c0 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  be followed by a
212d0 6e 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77  n IdxGE opcode w
212e0 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 72 67  ith the same arg
212f0 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49  uments..** The I
21300 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c  dxGE opcode will
21310 20 62 65 20 73 6b 69 70 70 65 64 20 69 66 20 74   be skipped if t
21320 68 69 73 20 6f 70 63 6f 64 65 20 73 75 63 63 65  his opcode succe
21330 65 64 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20  eds, but the.** 
21340 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69 6c  IdxGE opcode wil
21350 6c 20 62 65 20 75 73 65 64 20 6f 6e 20 73 75 62  l be used on sub
21360 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65  sequent loop ite
21370 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53  rations..**.** S
21380 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
21390 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 47 74  NotFound, SeekGt
213a0 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74  , SeekGe, SeekLt
213b0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b  .*/.case OP_Seek
213c0 4c 54 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  LT:         /* j
213d0 75 6d 70 2c 20 69 6e 33 2c 20 67 72 6f 75 70 20  ump, in3, group 
213e0 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c  */.case OP_SeekL
213f0 45 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  E:         /* ju
21400 6d 70 2c 20 69 6e 33 2c 20 67 72 6f 75 70 20 2a  mp, in3, group *
21410 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 45  /.case OP_SeekGE
21420 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
21430 70 2c 20 69 6e 33 2c 20 67 72 6f 75 70 20 2a 2f  p, in3, group */
21440 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 54 3a  .case OP_SeekGT:
21450 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70   {       /* jump
21460 2c 20 69 6e 33 2c 20 67 72 6f 75 70 20 2a 2f 0a  , in3, group */.
21470 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
21480 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
21490 6f 6e 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  on result */.  i
214a0 6e 74 20 6f 63 3b 20 20 20 20 20 20 20 20 20 20  nt oc;          
214b0 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
214c0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
214d0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
214e0 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 55  r to seek */.  U
214f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b  npackedRecord r;
21500 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20    /* The key to 
21510 73 65 65 6b 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  seek for */.  in
21520 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t nField;       
21530 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
21540 6c 75 6d 6e 73 20 6f 72 20 66 69 65 6c 64 73 20  lumns or fields 
21550 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
21560 69 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  i64 iKey;       
21570 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
21580 77 65 20 61 72 65 20 74 6f 20 73 65 65 6b 20 74  we are to seek t
21590 6f 20 2a 2f 0a 20 20 69 6e 74 20 65 71 4f 6e 6c  o */.  int eqOnl
215a0 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c  y;        /* Onl
215b0 79 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e 20  y interested in 
215c0 3d 3d 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  == results */.. 
215d0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
215e0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
215f0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
21600 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d  ssert( pOp->p2!=
21610 30 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  0 );.  pC = p->a
21620 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
21630 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
21640 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
21650 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
21660 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
21670 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 20 3d  ert( OP_SeekLE =
21680 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 31 20 29 3b  = OP_SeekLT+1 );
21690 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65  .  assert( OP_Se
216a0 65 6b 47 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c  ekGE == OP_SeekL
216b0 54 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  T+2 );.  assert(
216c0 20 4f 50 5f 53 65 65 6b 47 54 20 3d 3d 20 4f 50   OP_SeekGT == OP
216d0 5f 53 65 65 6b 4c 54 2b 33 20 29 3b 0a 20 20 61  _SeekLT+3 );.  a
216e0 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72 64  ssert( pC->isOrd
216f0 65 72 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ered );.  assert
21700 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
21710 21 3d 30 20 29 3b 0a 20 20 6f 63 20 3d 20 70 4f  !=0 );.  oc = pO
21720 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 65 71 4f  p->opcode;.  eqO
21730 6e 6c 79 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 6e  nly = 0;.  pC->n
21740 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 23 69 66 64  ullRow = 0;.#ifd
21750 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21760 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70    pC->seekOp = p
21770 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64  Op->opcode;.#end
21780 69 66 0a 0a 20 20 69 66 28 20 70 43 2d 3e 69 73  if..  if( pC->is
21790 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
217a0 54 68 65 20 42 54 52 45 45 5f 53 45 45 4b 5f 45  The BTREE_SEEK_E
217b0 51 20 66 6c 61 67 20 69 73 20 6f 6e 6c 79 20 73  Q flag is only s
217c0 65 74 20 6f 6e 20 69 6e 64 65 78 20 63 75 72 73  et on index curs
217d0 6f 72 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ors */.    asser
217e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
217f0 75 72 73 6f 72 48 61 73 48 69 6e 74 28 70 43 2d  ursorHasHint(pC-
21800 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 42 54 52  >uc.pCursor, BTR
21810 45 45 5f 53 45 45 4b 5f 45 51 29 3d 3d 30 0a 20  EE_SEEK_EQ)==0. 
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
21830 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
21840 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
21850 76 61 6c 75 65 20 69 6e 20 50 33 20 6d 69 67 68  value in P3 migh
21860 74 20 62 65 20 6f 66 20 61 6e 79 20 74 79 70 65  t be of any type
21870 3a 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c  : integer, real,
21880 20 73 74 72 69 6e 67 2c 0a 20 20 20 20 2a 2a 20   string,.    ** 
21890 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20  blob, or NULL.  
218a0 42 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f 20  But it needs to 
218b0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65  be an integer be
218c0 66 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a 20  fore we can do. 
218d0 20 20 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c 20     ** the seek, 
218e0 73 6f 20 63 6f 6e 76 65 72 74 20 69 74 2e 20 2a  so convert it. *
218f0 2f 0a 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d  /.    pIn3 = &aM
21900 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
21910 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
21920 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  s & (MEM_Int|MEM
21930 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d  _Real|MEM_Str))=
21940 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  =MEM_Str ){.    
21950 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
21960 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 30 29 3b  finity(pIn3, 0);
21970 0a 20 20 20 20 7d 0a 20 20 20 20 69 4b 65 79 20  .    }.    iKey 
21980 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
21990 56 61 6c 75 65 28 70 49 6e 33 29 3b 0a 0a 20 20  Value(pIn3);..  
219a0 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76    /* If the P3 v
219b0 61 6c 75 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  alue could not b
219c0 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
219d0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 69 74 68   an integer with
219e0 6f 75 74 0a 20 20 20 20 2a 2a 20 6c 6f 73 73 20  out.    ** loss 
219f0 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20  of information, 
21a00 74 68 65 6e 20 73 70 65 63 69 61 6c 20 70 72 6f  then special pro
21a10 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75 69  cessing is requi
21a20 72 65 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 66  red... */.    if
21a30 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
21a40 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a   MEM_Int)==0 ){.
21a50 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d        if( (pIn3-
21a60 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
21a70 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
21a80 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76 61   /* If the P3 va
21a90 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  lue cannot be co
21aa0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 79  nverted into any
21ab0 20 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d 62 65   kind of a numbe
21ac0 72 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  r,.        ** th
21ad0 65 6e 20 74 68 65 20 73 65 65 6b 20 69 73 20 6e  en the seek is n
21ae0 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f 20  ot possible, so 
21af0 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20  jump to P2 */.  
21b00 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63 68        VdbeBranch
21b10 54 61 6b 65 6e 28 31 2c 32 29 3b 20 67 6f 74 6f  Taken(1,2); goto
21b20 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
21b30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21b40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
21b50 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 69   the approximati
21b60 6f 6e 20 69 4b 65 79 20 69 73 20 6c 61 72 67 65  on iKey is large
21b70 72 20 74 68 61 6e 20 74 68 65 20 61 63 74 75 61  r than the actua
21b80 6c 20 72 65 61 6c 20 73 65 61 72 63 68 0a 20 20  l real search.  
21b90 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62      ** term, sub
21ba0 73 74 69 74 75 74 65 20 3e 3d 20 66 6f 72 20 3e  stitute >= for >
21bb0 20 61 6e 64 20 3c 20 66 6f 72 20 3c 3d 2e 20 65   and < for <=. e
21bc0 2e 67 2e 20 69 66 20 74 68 65 20 73 65 61 72 63  .g. if the searc
21bd0 68 20 74 65 72 6d 0a 20 20 20 20 20 20 2a 2a 20  h term.      ** 
21be0 69 73 20 34 2e 39 20 61 6e 64 20 74 68 65 20 69  is 4.9 and the i
21bf0 6e 74 65 67 65 72 20 61 70 70 72 6f 78 69 6d 61  nteger approxima
21c00 74 69 6f 6e 20 35 3a 0a 20 20 20 20 20 20 2a 2a  tion 5:.      **
21c10 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
21c20 20 28 78 20 3e 20 20 34 2e 39 29 20 20 20 20 2d   (x >  4.9)    -
21c30 3e 20 20 20 20 20 28 78 20 3e 3d 20 35 29 0a 20  >     (x >= 5). 
21c40 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 28       **        (
21c50 78 20 3c 3d 20 34 2e 39 29 20 20 20 20 2d 3e 20  x <= 4.9)    -> 
21c60 20 20 20 20 28 78 20 3c 20 20 35 29 0a 20 20 20      (x <  5).   
21c70 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21c80 70 49 6e 33 2d 3e 75 2e 72 3c 28 64 6f 75 62 6c  pIn3->u.r<(doubl
21c90 65 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  e)iKey ){.      
21ca0 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
21cb0 6b 47 45 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 2d  kGE==(OP_SeekGT-
21cc0 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  1) );.        as
21cd0 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 54 3d  sert( OP_SeekLT=
21ce0 3d 28 4f 50 5f 53 65 65 6b 4c 45 2d 31 29 20 29  =(OP_SeekLE-1) )
21cf0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
21d00 28 20 28 4f 50 5f 53 65 65 6b 4c 45 20 26 20 30  ( (OP_SeekLE & 0
21d10 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b  x0001)==(OP_Seek
21d20 47 54 20 26 20 30 78 30 30 30 31 29 20 29 3b 0a  GT & 0x0001) );.
21d30 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 63 20          if( (oc 
21d40 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53  & 0x0001)==(OP_S
21d50 65 65 6b 47 54 20 26 20 30 78 30 30 30 31 29 20  eekGT & 0x0001) 
21d60 29 20 6f 63 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  ) oc--;.      }.
21d70 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
21d80 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 69   approximation i
21d90 4b 65 79 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  Key is smaller t
21da0 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  han the actual r
21db0 65 61 6c 20 73 65 61 72 63 68 0a 20 20 20 20 20  eal search.     
21dc0 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62 73 74 69   ** term, substi
21dd0 74 75 74 65 20 3c 3d 20 66 6f 72 20 3c 20 61 6e  tute <= for < an
21de0 64 20 3e 20 66 6f 72 20 3e 3d 2e 20 20 2a 2f 0a  d > for >=.  */.
21df0 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70        else if( p
21e00 49 6e 33 2d 3e 75 2e 72 3e 28 64 6f 75 62 6c 65  In3->u.r>(double
21e10 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  )iKey ){.       
21e20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b   assert( OP_Seek
21e30 4c 45 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54 2b 31  LE==(OP_SeekLT+1
21e40 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
21e50 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 3d 3d  ert( OP_SeekGT==
21e60 28 4f 50 5f 53 65 65 6b 47 45 2b 31 29 20 29 3b  (OP_SeekGE+1) );
21e70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21e80 20 28 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30 78   (OP_SeekLT & 0x
21e90 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47  0001)==(OP_SeekG
21ea0 45 20 26 20 30 78 30 30 30 31 29 20 29 3b 0a 20  E & 0x0001) );. 
21eb0 20 20 20 20 20 20 20 69 66 28 20 28 6f 63 20 26         if( (oc &
21ec0 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65   0x0001)==(OP_Se
21ed0 65 6b 4c 54 20 26 20 30 78 30 30 30 31 29 20 29  ekLT & 0x0001) )
21ee0 20 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20   oc++;.      }. 
21ef0 20 20 20 7d 20 0a 20 20 20 20 72 63 20 3d 20 73     } .    rc = s
21f00 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
21f10 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63  oUnpacked(pC->uc
21f20 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  .pCursor, 0, (u6
21f30 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29  4)iKey, 0, &res)
21f40 3b 0a 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f  ;.    pC->moveto
21f50 54 61 72 67 65 74 20 3d 20 69 4b 65 79 3b 20 20  Target = iKey;  
21f60 2f 2a 20 55 73 65 64 20 62 79 20 4f 50 5f 44 65  /* Used by OP_De
21f70 6c 65 74 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  lete */.    if( 
21f80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21f90 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
21fa0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
21fb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
21fc0 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 75 72 73     /* For a curs
21fd0 6f 72 20 77 69 74 68 20 74 68 65 20 42 54 52 45  or with the BTRE
21fe0 45 5f 53 45 45 4b 5f 45 51 20 68 69 6e 74 2c 20  E_SEEK_EQ hint, 
21ff0 6f 6e 6c 79 20 74 68 65 20 4f 50 5f 53 65 65 6b  only the OP_Seek
22000 47 45 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4f 50  GE and.    ** OP
22010 5f 53 65 65 6b 4c 45 20 6f 70 63 6f 64 65 73 20  _SeekLE opcodes 
22020 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20 61 6e 64  are allowed, and
22030 20 74 68 65 73 65 20 6d 75 73 74 20 62 65 20 69   these must be i
22040 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
22050 77 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 61 6e  wed.    ** by an
22060 20 4f 50 5f 49 64 78 47 54 20 6f 72 20 4f 50 5f   OP_IdxGT or OP_
22070 49 64 78 4c 54 20 6f 70 63 6f 64 65 2c 20 72 65  IdxLT opcode, re
22080 73 70 65 63 74 69 76 65 6c 79 2c 20 77 69 74 68  spectively, with
22090 20 74 68 65 20 73 61 6d 65 20 6b 65 79 2e 0a 20   the same key.. 
220a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
220b0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
220c0 48 61 73 48 69 6e 74 28 70 43 2d 3e 75 63 2e 70  HasHint(pC->uc.p
220d0 43 75 72 73 6f 72 2c 20 42 54 52 45 45 5f 53 45  Cursor, BTREE_SE
220e0 45 4b 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  EK_EQ) ){.      
220f0 65 71 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  eqOnly = 1;.    
22100 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
22110 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 47 45  pcode==OP_SeekGE
22120 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
22130 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20  =OP_SeekLE );.  
22140 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
22150 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  1].opcode==OP_Id
22160 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70  xLT || pOp[1].op
22170 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29  code==OP_IdxGT )
22180 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22190 70 4f 70 5b 31 5d 2e 70 31 3d 3d 70 4f 70 5b 30  pOp[1].p1==pOp[0
221a0 5d 2e 70 31 20 29 3b 0a 20 20 20 20 20 20 61 73  ].p1 );.      as
221b0 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 32 3d  sert( pOp[1].p2=
221c0 3d 70 4f 70 5b 30 5d 2e 70 32 20 29 3b 0a 20 20  =pOp[0].p2 );.  
221d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
221e0 31 5d 2e 70 33 3d 3d 70 4f 70 5b 30 5d 2e 70 33  1].p3==pOp[0].p3
221f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22200 28 20 70 4f 70 5b 31 5d 2e 70 34 2e 69 3d 3d 70  ( pOp[1].p4.i==p
22210 4f 70 5b 30 5d 2e 70 34 2e 69 20 29 3b 0a 20 20  Op[0].p4.i );.  
22220 20 20 7d 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20    }..    nField 
22230 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20  = pOp->p4.i;.   
22240 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
22250 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
22260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 46  ;.    assert( nF
22270 69 65 6c 64 3e 30 20 29 3b 0a 20 20 20 20 72 2e  ield>0 );.    r.
22280 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70  pKeyInfo = pC->p
22290 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e  KeyInfo;.    r.n
222a0 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 46 69  Field = (u16)nFi
222b0 65 6c 64 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  eld;..    /* The
222c0 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20 63 6f   next line of co
222d0 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73 20 66  de computes as f
222e0 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66 61 73  ollows, only fas
222f0 74 65 72 3a 0a 20 20 20 20 2a 2a 20 20 20 69 66  ter:.    **   if
22300 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 20  ( oc==OP_SeekGT 
22310 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45  || oc==OP_SeekLE
22320 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72   ){.    **     r
22330 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d 31  .default_rc = -1
22340 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73 65  ;.    **   }else
22350 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 64  {.    **     r.d
22360 65 66 61 75 6c 74 5f 72 63 20 3d 20 2b 31 3b 0a  efault_rc = +1;.
22370 20 20 20 20 2a 2a 20 20 20 7d 0a 20 20 20 20 2a      **   }.    *
22380 2f 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f  /.    r.default_
22390 72 63 20 3d 20 28 28 31 20 26 20 28 6f 63 20 2d  rc = ((1 & (oc -
223a0 20 4f 50 5f 53 65 65 6b 4c 54 29 29 20 3f 20 2d   OP_SeekLT)) ? -
223b0 31 20 3a 20 2b 31 29 3b 0a 20 20 20 20 61 73 73  1 : +1);.    ass
223c0 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b  ert( oc!=OP_Seek
223d0 47 54 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f  GT || r.default_
223e0 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73  rc==-1 );.    as
223f0 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
22400 6b 4c 45 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74  kLE || r.default
22410 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61  _rc==-1 );.    a
22420 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65  ssert( oc!=OP_Se
22430 65 6b 47 45 20 7c 7c 20 72 2e 64 65 66 61 75 6c  ekGE || r.defaul
22440 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 20 20 20 20  t_rc==+1 );.    
22450 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53  assert( oc!=OP_S
22460 65 65 6b 4c 54 20 7c 7c 20 72 2e 64 65 66 61 75  eekLT || r.defau
22470 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 0a 20 20  lt_rc==+1 );..  
22480 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d    r.aMem = &aMem
22490 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65  [pOp->p3];.#ifde
224a0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
224b0 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28     { int i; for(
224c0 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b  i=0; i<r.nField;
224d0 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65   i++) assert( me
224e0 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d  mIsValid(&r.aMem
224f0 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66  [i]) ); }.#endif
22500 0a 20 20 20 20 72 2e 65 71 53 65 65 6e 20 3d 20  .    r.eqSeen = 
22510 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
22520 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
22530 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43  packed(pC->uc.pC
22540 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c 20 30 2c  ursor, &r, 0, 0,
22550 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
22560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22570 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
22580 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
22590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 71      }.    if( eq
225a0 4f 6e 6c 79 20 26 26 20 72 2e 65 71 53 65 65 6e  Only && r.eqSeen
225b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
225c0 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20  ert( res!=0 );. 
225d0 20 20 20 20 20 67 6f 74 6f 20 73 65 65 6b 5f 6e       goto seek_n
225e0 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a  ot_found;.    }.
225f0 20 20 7d 0a 20 20 70 43 2d 3e 64 65 66 65 72 72    }.  pC->deferr
22600 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
22610 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
22620 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 23  = CACHE_STALE;.#
22630 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22640 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72  T.  sqlite3_sear
22650 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
22660 69 66 0a 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f  if.  if( oc>=OP_
22670 53 65 65 6b 47 45 20 29 7b 20 20 61 73 73 65 72  SeekGE ){  asser
22680 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 45  t( oc==OP_SeekGE
22690 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
226a0 54 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  T );.    if( res
226b0 3c 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26  <0 || (res==0 &&
226c0 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 20   oc==OP_SeekGT) 
226d0 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30  ){.      res = 0
226e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
226f0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
22700 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 29  ->uc.pCursor, 0)
22710 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
22720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22730 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22740 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
22750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22760 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
22770 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  res = 1;.       
22780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22790 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
227a0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
227b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
227c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
227d0 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
227e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
227f0 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20  ( oc==OP_SeekLT 
22800 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45  || oc==OP_SeekLE
22810 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3e   );.    if( res>
22820 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20  0 || (res==0 && 
22830 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 20 29  oc==OP_SeekLT) )
22840 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b  {.      res = 0;
22850 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22860 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
22870 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
22880 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
22890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
228a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
228b0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
228c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
228d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
228e0 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20     res = 1;.    
228f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22900 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
22910 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
22920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22940 20 2f 2a 20 72 65 73 20 6d 69 67 68 74 20 62 65   /* res might be
22950 20 6e 65 67 61 74 69 76 65 20 62 65 63 61 75 73   negative becaus
22960 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  e the table is e
22970 6d 70 74 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a  mpty.  Check to.
22980 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
22990 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
229a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
229b0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74   res = sqlite3Bt
229c0 72 65 65 45 6f 66 28 70 43 2d 3e 75 63 2e 70 43  reeEof(pC->uc.pC
229d0 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
229e0 7d 0a 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64  }.seek_not_found
229f0 3a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  :.  assert( pOp-
22a00 3e 70 32 3e 30 20 29 3b 0a 20 20 56 64 62 65 42  >p2>0 );.  VdbeB
22a10 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
22a20 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20  0,2);.  if( res 
22a30 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
22a40 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 20  _to_p2;.  }else 
22a50 69 66 28 20 65 71 4f 6e 6c 79 20 29 7b 0a 20 20  if( eqOnly ){.  
22a60 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d    assert( pOp[1]
22a70 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c  .opcode==OP_IdxL
22a80 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f  T || pOp[1].opco
22a90 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a  de==OP_IdxGT );.
22aa0 20 20 20 20 70 4f 70 2b 2b 3b 20 2f 2a 20 53 6b      pOp++; /* Sk
22ab0 69 70 20 74 68 65 20 4f 50 5f 49 64 78 4c 74 20  ip the OP_IdxLt 
22ac0 6f 72 20 4f 50 5f 49 64 78 47 54 20 74 68 61 74  or OP_IdxGT that
22ad0 20 66 6f 6c 6c 6f 77 73 20 2a 2f 0a 20 20 7d 0a   follows */.  }.
22ae0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
22af0 70 63 6f 64 65 3a 20 53 65 65 6b 48 69 74 20 50  pcode: SeekHit P
22b00 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
22b10 6e 6f 70 73 69 73 3a 20 73 65 65 6b 48 69 74 3d  nopsis: seekHit=
22b20 50 32 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  P2.**.** Set the
22b30 20 73 65 65 6b 48 69 74 20 66 6c 61 67 20 6f 6e   seekHit flag on
22b40 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20 74 68   cursor P1 to th
22b50 65 20 76 61 6c 75 65 20 69 6e 20 50 32 2e 0a 2a  e value in P2..*
22b60 2a 20 54 68 65 20 73 65 65 6b 48 69 74 20 66 6c  * The seekHit fl
22b70 61 67 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ag is used by th
22b80 65 20 49 66 4e 6f 48 6f 70 65 20 6f 70 63 6f 64  e IfNoHope opcod
22b90 65 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74  e..**.** P1 must
22ba0 20 62 65 20 61 20 76 61 6c 69 64 20 62 2d 74 72   be a valid b-tr
22bb0 65 65 20 63 75 72 73 6f 72 2e 20 20 50 32 20 6d  ee cursor.  P2 m
22bc0 75 73 74 20 62 65 20 61 20 62 6f 6f 6c 65 61 6e  ust be a boolean
22bd0 20 76 61 6c 75 65 2c 0a 2a 2a 20 65 69 74 68 65   value,.** eithe
22be0 72 20 30 20 6f 72 20 31 2e 0a 2a 2f 0a 63 61 73  r 0 or 1..*/.cas
22bf0 65 20 4f 50 5f 53 65 65 6b 48 69 74 3a 20 7b 0a  e OP_SeekHit: {.
22c00 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
22c10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
22c20 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
22c30 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
22c40 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
22c50 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
22c60 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
22c70 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d  ssert( pOp->p2==
22c80 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  0 || pOp->p2==1 
22c90 29 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 48 69 74  );.  pC->seekHit
22ca0 20 3d 20 70 4f 70 2d 3e 70 32 20 26 20 31 3b 0a   = pOp->p2 & 1;.
22cb0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
22cc0 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31 20  pcode: Found P1 
22cd0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
22ce0 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
22cf0 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  @P4].**.** If P4
22d00 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65  ==0 then registe
22d10 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f  r P3 holds a blo
22d20 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  b constructed by
22d30 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66   MakeRecord.  If
22d40 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65  .** P4>0 then re
22d50 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
22d60 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67   first of P4 reg
22d70 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d  isters that form
22d80 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20   an unpacked.** 
22d90 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43 75  record..**.** Cu
22da0 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
22db0 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
22dc0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
22dd0 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
22de0 64 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72 65  d P4.** is a pre
22df0 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72 79  fix of any entry
22e00 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a 75   in P1 then a ju
22e10 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32  mp is made to P2
22e20 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c 65   and.** P1 is le
22e30 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  ft pointing at t
22e40 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72  he matching entr
22e50 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  y..**.** This op
22e60 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 74  eration leaves t
22e70 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73  he cursor in a s
22e80 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63 61  tate where it ca
22e90 6e 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64  n be.** advanced
22ea0 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
22eb0 64 69 72 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  direction.  The 
22ec0 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Next instruction
22ed0 20 77 69 6c 6c 20 77 6f 72 6b 2c 0a 2a 2a 20 62   will work,.** b
22ee0 75 74 20 6e 6f 74 20 74 68 65 20 50 72 65 76 20  ut not the Prev 
22ef0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
22f00 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74  ** See also: Not
22f10 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63  Found, NoConflic
22f20 74 2c 20 4e 6f 74 45 78 69 73 74 73 2e 20 53 65  t, NotExists. Se
22f30 65 6b 47 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ekGe.*/./* Opcod
22f40 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50  e: NotFound P1 P
22f50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
22f60 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
22f70 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d  P4].**.** If P4=
22f80 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  =0 then register
22f90 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
22fa0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
22fb0 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a  MakeRecord.  If.
22fc0 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67  ** P4>0 then reg
22fd0 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20  ister P3 is the 
22fe0 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69  first of P4 regi
22ff0 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20  sters that form 
23000 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72  an unpacked.** r
23010 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75  ecord..** .** Cu
23020 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
23030 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
23040 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
23050 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
23060 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  d P4.** is not t
23070 68 65 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79  he prefix of any
23080 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65   entry in P1 the
23090 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  n a jump is made
230a0 20 74 6f 20 50 32 2e 20 20 49 66 20 50 31 20 0a   to P2.  If P1 .
230b0 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  ** does contain 
230c0 61 6e 20 65 6e 74 72 79 20 77 68 6f 73 65 20 70  an entry whose p
230d0 72 65 66 69 78 20 6d 61 74 63 68 65 73 20 74 68  refix matches th
230e0 65 20 50 33 2f 50 34 20 72 65 63 6f 72 64 20 74  e P3/P4 record t
230f0 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66  hen control.** f
23100 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20  alls through to 
23110 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
23120 74 69 6f 6e 20 61 6e 64 20 50 31 20 69 73 20 6c  tion and P1 is l
23130 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
23140 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20  the.** matching 
23150 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
23160 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76  s operation leav
23170 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  es the cursor in
23180 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69   a state where i
23190 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61  t cannot be.** a
231a0 64 76 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65  dvanced in eithe
231b0 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e  r direction.  In
231c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
231d0 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a  e Next and Prev.
231e0 2a 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f  ** opcodes do no
231f0 74 20 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69  t work after thi
23200 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
23210 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
23220 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 4e  nd, NotExists, N
23230 6f 43 6f 6e 66 6c 69 63 74 2c 20 49 66 4e 6f 48  oConflict, IfNoH
23240 6f 70 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ope.*/./* Opcode
23250 3a 20 49 66 4e 6f 48 6f 70 65 20 50 31 20 50 32  : IfNoHope P1 P2
23260 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
23270 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
23280 34 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  4].**.** Registe
23290 72 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  r P3 is the firs
232a0 74 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  t of P4 register
232b0 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75  s that form an u
232c0 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72  npacked.** recor
232d0 64 2e 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20  d..**.** Cursor 
232e0 50 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65  P1 is on an inde
232f0 78 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65  x btree.  If the
23300 20 73 65 65 6b 48 69 74 20 66 6c 61 67 20 69 73   seekHit flag is
23310 20 73 65 74 20 6f 6e 20 50 31 2c 20 74 68 65 6e   set on P1, then
23320 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f 64 65 20  .** this opcode 
23330 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
23340 20 69 66 20 74 68 65 20 73 65 65 6b 48 69 74 20   if the seekHit 
23350 66 6c 61 67 20 6f 66 20 50 31 20 69 73 20 63 6c  flag of P1 is cl
23360 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 63 68 65  ear, then.** che
23370 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
23380 72 65 20 69 73 20 61 6e 79 20 65 6e 74 72 79 20  re is any entry 
23390 69 6e 20 50 31 20 74 68 61 74 20 6d 61 74 63 68  in P1 that match
233a0 65 73 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  es the.** prefix
233b0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50   identified by P
233c0 33 20 61 6e 64 20 50 34 2e 20 20 49 66 20 6e 6f  3 and P4.  If no
233d0 20 65 6e 74 72 79 20 6d 61 74 63 68 65 73 20 74   entry matches t
233e0 68 65 20 70 72 65 66 69 78 2c 0a 2a 2a 20 6a 75  he prefix,.** ju
233f0 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72  mp to P2.  Other
23400 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
23410 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  h..**.** This op
23420 63 6f 64 65 20 62 65 68 61 76 65 73 20 6c 69 6b  code behaves lik
23430 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 69 66  e OP_NotFound if
23440 20 74 68 65 20 73 65 65 6b 48 69 74 0a 2a 2a 20   the seekHit.** 
23450 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 61 6e  flag is clear an
23460 64 20 69 74 20 62 65 68 61 76 65 73 20 6c 69 6b  d it behaves lik
23470 65 20 4f 50 5f 4e 6f 6f 70 20 69 66 20 74 68 65  e OP_Noop if the
23480 20 73 65 65 6b 48 69 74 20 66 6c 61 67 20 69 73   seekHit flag is
23490 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   set..**.** This
234a0 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
234b0 69 6e 20 49 4e 20 63 6c 61 75 73 65 20 70 72 6f  in IN clause pro
234c0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 20 6d 75  cessing for a mu
234d0 6c 74 69 2d 63 6f 6c 75 6d 6e 20 6b 65 79 2e 0a  lti-column key..
234e0 2a 2a 20 49 66 20 61 6e 20 49 4e 20 63 6c 61 75  ** If an IN clau
234f0 73 65 20 69 73 20 61 74 74 61 63 68 65 64 20 74  se is attached t
23500 6f 20 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  o an element of 
23510 74 68 65 20 6b 65 79 20 6f 74 68 65 72 20 74 68  the key other th
23520 61 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  an the.** left-m
23530 6f 73 74 20 65 6c 65 6d 65 6e 74 2c 20 61 6e 64  ost element, and
23540 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
23550 20 6d 61 74 63 68 65 73 20 6f 6e 20 74 68 65 20   matches on the 
23560 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 73  most recent.** s
23570 65 65 6b 20 6f 76 65 72 20 74 68 65 20 77 68 6f  eek over the who
23580 6c 65 20 6b 65 79 2c 20 74 68 65 6e 20 69 74 20  le key, then it 
23590 6d 69 67 68 74 20 62 65 20 74 68 61 74 20 6f 6e  might be that on
235a0 65 20 6f 66 20 74 68 65 20 6b 65 79 20 65 6c 65  e of the key ele
235b0 6d 65 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  ment.** to the l
235c0 65 66 74 20 69 73 20 70 72 6f 68 69 62 69 74 69  eft is prohibiti
235d0 6e 67 20 61 20 6d 61 74 63 68 2c 20 61 6e 64 20  ng a match, and 
235e0 68 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 22  hence there is "
235f0 6e 6f 20 68 6f 70 65 22 20 6f 66 0a 2a 2a 20 61  no hope" of.** a
23600 6e 79 20 6d 61 74 63 68 20 72 65 67 61 72 64 6c  ny match regardl
23610 65 73 73 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20  ess of how many 
23620 49 4e 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  IN clause elemen
23630 74 73 20 61 72 65 20 63 68 65 63 6b 65 64 2e 0a  ts are checked..
23640 2a 2a 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  ** In such a cas
23650 65 2c 20 77 65 20 61 62 61 6e 64 6f 6e 20 74 68  e, we abandon th
23660 65 20 49 4e 20 63 6c 61 75 73 65 20 73 65 61 72  e IN clause sear
23670 63 68 20 65 61 72 6c 79 2c 20 75 73 69 6e 67 20  ch early, using 
23680 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 2e 20  this.** opcode. 
23690 20 54 68 65 20 6f 70 63 6f 64 65 20 6e 61 6d 65   The opcode name
236a0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   comes from the 
236b0 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 2a 2a  fact that the.**
236c0 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
236d0 66 20 74 68 65 72 65 20 69 73 20 22 6e 6f 20 68  f there is "no h
236e0 6f 70 65 22 20 6f 66 20 61 63 68 69 65 76 69 6e  ope" of achievin
236f0 67 20 61 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a  g a match..**.**
23700 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f   See also: NotFo
23710 75 6e 64 2c 20 53 65 65 6b 48 69 74 0a 2a 2f 0a  und, SeekHit.*/.
23720 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 43 6f 6e  /* Opcode: NoCon
23730 66 6c 69 63 74 20 50 31 20 50 32 20 50 33 20 50  flict P1 P2 P3 P
23740 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
23750 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
23760 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65  .** If P4==0 the
23770 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 68 6f  n register P3 ho
23780 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74  lds a blob const
23790 72 75 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65  ructed by MakeRe
237a0 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e  cord.  If.** P4>
237b0 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  0 then register 
237c0 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
237d0 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
237e0 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70  that form an unp
237f0 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e  acked.** record.
23800 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50  .** .** Cursor P
23810 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78  1 is on an index
23820 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
23830 72 65 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65  record identifie
23840 64 20 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a  d by P3 and P4.*
23850 2a 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  * contains any N
23860 55 4c 4c 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20  ULL value, jump 
23870 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
23880 32 2e 20 20 49 66 20 61 6c 6c 20 74 65 72 6d 73  2.  If all terms
23890 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72   of the.** recor
238a0 64 20 61 72 65 20 6e 6f 74 2d 4e 55 4c 4c 20 74  d are not-NULL t
238b0 68 65 6e 20 61 20 63 68 65 63 6b 20 69 73 20 64  hen a check is d
238c0 6f 6e 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  one to determine
238d0 20 69 66 20 61 6e 79 20 72 6f 77 20 69 6e 20 74   if any row in t
238e0 68 65 0a 2a 2a 20 50 31 20 69 6e 64 65 78 20 62  he.** P1 index b
238f0 74 72 65 65 20 68 61 73 20 61 20 6d 61 74 63 68  tree has a match
23900 69 6e 67 20 6b 65 79 20 70 72 65 66 69 78 2e 20  ing key prefix. 
23910 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
23920 20 6d 61 74 63 68 65 73 2c 20 6a 75 6d 70 0a 2a   matches, jump.*
23930 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  * immediately to
23940 20 50 32 2e 20 20 49 66 20 74 68 65 72 65 20 69   P2.  If there i
23950 73 20 61 20 6d 61 74 63 68 2c 20 66 61 6c 6c 20  s a match, fall 
23960 74 68 72 6f 75 67 68 20 61 6e 64 20 6c 65 61 76  through and leav
23970 65 20 74 68 65 20 50 31 0a 2a 2a 20 63 75 72 73  e the P1.** curs
23980 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
23990 68 65 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e  he matching row.
239a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
239b0 64 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  de is similar to
239c0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 77 69 74   OP_NotFound wit
239d0 68 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 73  h the exceptions
239e0 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 62 72 61   that the.** bra
239f0 6e 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 61  nch is always ta
23a00 6b 65 6e 20 69 66 20 61 6e 79 20 70 61 72 74 20  ken if any part 
23a10 6f 66 20 74 68 65 20 73 65 61 72 63 68 20 6b 65  of the search ke
23a20 79 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e  y input is NULL.
23a30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72  .**.** This oper
23a40 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 74 68 65  ation leaves the
23a50 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61   cursor in a sta
23a60 74 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e  te where it cann
23a70 6f 74 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65  ot be.** advance
23a80 64 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  d in either dire
23a90 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ction.  In other
23aa0 20 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74   words, the Next
23ab0 20 61 6e 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63   and Prev.** opc
23ac0 6f 64 65 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b  odes do not work
23ad0 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 65 72   after this oper
23ae0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ation..**.** See
23af0 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c   also: NotFound,
23b00 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74   Found, NotExist
23b10 73 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e  s.*/.case OP_IfN
23b20 6f 48 6f 70 65 3a 20 7b 20 20 20 20 20 2f 2a 20  oHope: {     /* 
23b30 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 56  jump, in3 */.  V
23b40 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
23b50 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
23b60 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
23b70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
23b80 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
23b90 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
23ba0 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   pC!=0 );.  if( 
23bb0 70 43 2d 3e 73 65 65 6b 48 69 74 20 29 20 62 72  pC->seekHit ) br
23bc0 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  eak;.  /* Fall t
23bd0 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 4e  hrough into OP_N
23be0 6f 74 46 6f 75 6e 64 20 2a 2f 0a 7d 0a 63 61 73  otFound */.}.cas
23bf0 65 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 3a  e OP_NoConflict:
23c00 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
23c10 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74  3 */.case OP_Not
23c20 46 6f 75 6e 64 3a 20 20 20 20 20 20 20 2f 2a 20  Found:       /* 
23c30 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
23c40 65 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b 20 20 20  e OP_Found: {   
23c50 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
23c60 33 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 72 65 61  3 */.  int alrea
23c70 64 79 45 78 69 73 74 73 3b 0a 20 20 69 6e 74 20  dyExists;.  int 
23c80 74 61 6b 65 4a 75 6d 70 3b 0a 20 20 69 6e 74 20  takeJump;.  int 
23c90 69 69 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  ii;.  VdbeCursor
23ca0 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b   *pC;.  int res;
23cb0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
23cc0 64 20 2a 70 46 72 65 65 3b 0a 20 20 55 6e 70 61  d *pFree;.  Unpa
23cd0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
23ce0 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  Key;.  UnpackedR
23cf0 65 63 6f 72 64 20 72 3b 0a 0a 23 69 66 64 65 66  ecord r;..#ifdef
23d00 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
23d10 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  f( pOp->opcode!=
23d20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 20  OP_NoConflict ) 
23d30 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f  sqlite3_found_co
23d40 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
23d50 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
23d60 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
23d70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
23d80 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
23d90 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
23da0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
23db0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
23dc0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 23 69 66  rt( pC!=0 );.#if
23dd0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
23de0 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20  .  pC->seekOp = 
23df0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e  pOp->opcode;.#en
23e00 64 69 66 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d  dif.  pIn3 = &aM
23e10 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
23e20 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
23e30 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
23e40 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EE );.  assert( 
23e50 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  pC->uc.pCursor!=
23e60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
23e70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b  C->isTable==0 );
23e80 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69  .  if( pOp->p4.i
23e90 3e 30 20 29 7b 0a 20 20 20 20 72 2e 70 4b 65 79  >0 ){.    r.pKey
23ea0 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
23eb0 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c  nfo;.    r.nFiel
23ec0 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34  d = (u16)pOp->p4
23ed0 2e 69 3b 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d  .i;.    r.aMem =
23ee0 20 70 49 6e 33 3b 0a 23 69 66 64 65 66 20 53 51   pIn3;.#ifdef SQ
23ef0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66  LITE_DEBUG.    f
23f00 6f 72 28 69 69 3d 30 3b 20 69 69 3c 72 2e 6e 46  or(ii=0; ii<r.nF
23f10 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  ield; ii++){.   
23f20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
23f30 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 69  Valid(&r.aMem[ii
23f40 5d 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ]) );.      asse
23f50 72 74 28 20 28 72 2e 61 4d 65 6d 5b 69 69 5d 2e  rt( (r.aMem[ii].
23f60 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
23f70 29 3d 3d 30 20 7c 7c 20 72 2e 61 4d 65 6d 5b 69  )==0 || r.aMem[i
23f80 69 5d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  i].n==0 );.     
23f90 20 69 66 28 20 69 69 20 29 20 52 45 47 49 53 54   if( ii ) REGIST
23fa0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
23fb0 2b 69 69 2c 20 26 72 2e 61 4d 65 6d 5b 69 69 5d  +ii, &r.aMem[ii]
23fc0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
23fd0 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 26 72      pIdxKey = &r
23fe0 3b 0a 20 20 20 20 70 46 72 65 65 20 3d 20 30 3b  ;.    pFree = 0;
23ff0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
24000 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67  sert( pIn3->flag
24010 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
24020 20 20 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42      rc = ExpandB
24030 6c 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 61  lob(pIn3);.    a
24040 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
24050 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
24060 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
24070 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6e 6f  if( rc ) goto no
24080 5f 6d 65 6d 3b 0a 20 20 20 20 70 46 72 65 65 20  _mem;.    pFree 
24090 3d 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69  = pIdxKey = sqli
240a0 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
240b0 63 6b 65 64 52 65 63 6f 72 64 28 70 43 2d 3e 70  ckedRecord(pC->p
240c0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  KeyInfo);.    if
240d0 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 67  ( pIdxKey==0 ) g
240e0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
240f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
24100 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79  dUnpack(pC->pKey
24110 49 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70  Info, pIn3->n, p
24120 49 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b 65 79 29  In3->z, pIdxKey)
24130 3b 0a 20 20 7d 0a 20 20 70 49 64 78 4b 65 79 2d  ;.  }.  pIdxKey-
24140 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
24150 0a 20 20 74 61 6b 65 4a 75 6d 70 20 3d 20 30 3b  .  takeJump = 0;
24160 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
24170 64 65 3d 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63  de==OP_NoConflic
24180 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20  t ){.    /* For 
24190 74 68 65 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63  the OP_NoConflic
241a0 74 20 6f 70 63 6f 64 65 2c 20 74 61 6b 65 20 74  t opcode, take t
241b0 68 65 20 6a 75 6d 70 20 69 66 20 61 6e 79 20 6f  he jump if any o
241c0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 70  f the.    ** inp
241d0 75 74 20 66 69 65 6c 64 73 20 61 72 65 20 4e 55  ut fields are NU
241e0 4c 4c 2c 20 73 69 6e 63 65 20 61 6e 79 20 6b 65  LL, since any ke
241f0 79 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 77 69  y with a NULL wi
24200 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 6f  ll not.    ** co
24210 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 66 6f  nflict */.    fo
24220 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78 4b  r(ii=0; ii<pIdxK
24230 65 79 2d 3e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b  ey->nField; ii++
24240 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ){.      if( pId
24250 78 4b 65 79 2d 3e 61 4d 65 6d 5b 69 69 5d 2e 66  xKey->aMem[ii].f
24260 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
24270 29 7b 0a 20 20 20 20 20 20 20 20 74 61 6b 65 4a  ){.        takeJ
24280 75 6d 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ump = 1;.       
24290 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
242a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
242b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
242c0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e  etoUnpacked(pC->
242d0 75 63 2e 70 43 75 72 73 6f 72 2c 20 70 49 64 78  uc.pCursor, pIdx
242e0 4b 65 79 2c 20 30 2c 20 30 2c 20 26 72 65 73 29  Key, 0, 0, &res)
242f0 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 20  ;.  if( pFree ) 
24300 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
24310 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 69 66  db, pFree);.  if
24320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24330 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  ){.    goto abor
24340 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
24350 20 20 7d 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65    }.  pC->seekRe
24360 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20 61 6c  sult = res;.  al
24370 72 65 61 64 79 45 78 69 73 74 73 20 3d 20 28 72  readyExists = (r
24380 65 73 3d 3d 30 29 3b 0a 20 20 70 43 2d 3e 6e 75  es==0);.  pC->nu
24390 6c 6c 52 6f 77 20 3d 20 31 2d 61 6c 72 65 61 64  llRow = 1-alread
243a0 79 45 78 69 73 74 73 3b 0a 20 20 70 43 2d 3e 64  yExists;.  pC->d
243b0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
243c0 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
243d0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
243e0 4c 45 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  LE;.  if( pOp->o
243f0 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20  pcode==OP_Found 
24400 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  ){.    VdbeBranc
24410 68 54 61 6b 65 6e 28 61 6c 72 65 61 64 79 45 78  hTaken(alreadyEx
24420 69 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20  ists!=0,2);.    
24430 69 66 28 20 61 6c 72 65 61 64 79 45 78 69 73 74  if( alreadyExist
24440 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  s ) goto jump_to
24450 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _p2;.  }else{.  
24460 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
24470 6e 28 74 61 6b 65 4a 75 6d 70 7c 7c 61 6c 72 65  n(takeJump||alre
24480 61 64 79 45 78 69 73 74 73 3d 3d 30 2c 32 29 3b  adyExists==0,2);
24490 0a 20 20 20 20 69 66 28 20 74 61 6b 65 4a 75 6d  .    if( takeJum
244a0 70 20 7c 7c 20 21 61 6c 72 65 61 64 79 45 78 69  p || !alreadyExi
244b0 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  sts ) goto jump_
244c0 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  to_p2;.  }.  bre
244d0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
244e0 3a 20 53 65 65 6b 52 6f 77 69 64 20 50 31 20 50  : SeekRowid P1 P
244f0 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
24500 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50  psis: intkey=r[P
24510 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74  3].**.** P1 is t
24520 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 75  he index of a cu
24530 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61 6e 20  rsor open on an 
24540 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65 65 20  SQL table btree 
24550 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a 2a 2a  (with integer.**
24560 20 6b 65 79 73 29 2e 20 20 49 66 20 72 65 67 69   keys).  If regi
24570 73 74 65 72 20 50 33 20 64 6f 65 73 20 6e 6f 74  ster P3 does not
24580 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
24590 67 65 72 20 6f 72 20 69 66 20 50 31 20 64 6f 65  ger or if P1 doe
245a0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  s not.** contain
245b0 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 72   a record with r
245c0 6f 77 69 64 20 50 33 20 74 68 65 6e 20 6a 75 6d  owid P3 then jum
245d0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
245e0 20 50 32 2e 20 20 0a 2a 2a 20 4f 72 2c 20 69 66   P2.  .** Or, if
245f0 20 50 32 20 69 73 20 30 2c 20 72 61 69 73 65 20   P2 is 0, raise 
24600 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
24610 54 20 65 72 72 6f 72 2e 20 49 66 20 50 31 20 64  T error. If P1 d
24620 6f 65 73 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61  oes contain.** a
24630 20 72 65 63 6f 72 64 20 77 69 74 68 20 72 6f 77   record with row
24640 69 64 20 50 33 20 74 68 65 6e 20 0a 2a 2a 20 6c  id P3 then .** l
24650 65 61 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  eave the cursor 
24660 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 61 74  pointing at that
24670 20 72 65 63 6f 72 64 20 61 6e 64 20 66 61 6c 6c   record and fall
24680 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
24690 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74  next.** instruct
246a0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ion..**.** The O
246b0 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70 63 6f  P_NotExists opco
246c0 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  de performs the 
246d0 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  same operation, 
246e0 62 75 74 20 77 69 74 68 20 4f 50 5f 4e 6f 74 45  but with OP_NotE
246f0 78 69 73 74 73 0a 2a 2a 20 74 68 65 20 50 33 20  xists.** the P3 
24700 72 65 67 69 73 74 65 72 20 6d 75 73 74 20 62 65  register must be
24710 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 63   guaranteed to c
24720 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
24730 72 20 76 61 6c 75 65 2e 20 20 57 69 74 68 20 74  r value.  With t
24740 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 2c 20 72  his.** opcode, r
24750 65 67 69 73 74 65 72 20 50 33 20 6d 69 67 68 74  egister P3 might
24760 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
24770 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  integer..**.** T
24780 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f  he OP_NotFound o
24790 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74  pcode performs t
247a0 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f  he same operatio
247b0 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65 65  n on index btree
247c0 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69 74  s.** (with arbit
247d0 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75 65  rary multi-value
247e0 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68   keys)..**.** Th
247f0 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
24800 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61   the cursor in a
24810 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
24820 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e 63  cannot be advanc
24830 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72 20  ed.** in either 
24840 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f  direction.  In o
24850 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
24860 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f 70  Next and Prev op
24870 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  codes will.** no
24880 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67  t work following
24890 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a   this opcode..**
248a0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
248b0 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e  und, NotFound, N
248c0 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b 52  oConflict, SeekR
248d0 6f 77 69 64 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  owid.*/./* Opcod
248e0 65 3a 20 4e 6f 74 45 78 69 73 74 73 20 50 31 20  e: NotExists P1 
248f0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
24900 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b  opsis: intkey=r[
24910 50 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  P3].**.** P1 is 
24920 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
24930 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61 6e  ursor open on an
24940 20 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65 65   SQL table btree
24950 20 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a 2a   (with integer.*
24960 2a 20 6b 65 79 73 29 2e 20 20 50 33 20 69 73 20  * keys).  P3 is 
24970 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64  an integer rowid
24980 2e 20 20 49 66 20 50 31 20 64 6f 65 73 20 6e 6f  .  If P1 does no
24990 74 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f  t contain a reco
249a0 72 64 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  rd with.** rowid
249b0 20 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d   P3 then jump im
249c0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
249d0 20 20 4f 72 2c 20 69 66 20 50 32 20 69 73 20 30    Or, if P2 is 0
249e0 2c 20 72 61 69 73 65 20 61 6e 0a 2a 2a 20 53 51  , raise an.** SQ
249f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
24a00 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20 63  or. If P1 does c
24a10 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20  ontain a record 
24a20 77 69 74 68 20 72 6f 77 69 64 20 50 33 20 74 68  with rowid P3 th
24a30 65 6e 20 0a 2a 2a 20 6c 65 61 76 65 20 74 68 65  en .** leave the
24a40 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
24a50 20 61 74 20 74 68 61 74 20 72 65 63 6f 72 64 20   at that record 
24a60 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  and fall through
24a70 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   to the next.** 
24a80 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
24a90 2a 2a 20 54 68 65 20 4f 50 5f 53 65 65 6b 52 6f  ** The OP_SeekRo
24aa0 77 69 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  wid opcode perfo
24ab0 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65  rms the same ope
24ac0 72 61 74 69 6f 6e 20 62 75 74 20 61 6c 73 6f 20  ration but also 
24ad0 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 50 33  allows the.** P3
24ae0 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e   register to con
24af0 74 61 69 6e 20 61 20 6e 6f 6e 2d 69 6e 74 65 67  tain a non-integ
24b00 65 72 20 76 61 6c 75 65 2c 20 69 6e 20 77 68 69  er value, in whi
24b10 63 68 20 63 61 73 65 20 74 68 65 20 6a 75 6d 70  ch case the jump
24b20 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74 61   is.** always ta
24b30 6b 65 6e 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ken.  This opcod
24b40 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
24b50 50 33 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69  P3 always contai
24b60 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  n an integer..**
24b70 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 46 6f  .** The OP_NotFo
24b80 75 6e 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  und opcode perfo
24b90 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65  rms the same ope
24ba0 72 61 74 69 6f 6e 20 6f 6e 20 69 6e 64 65 78 20  ration on index 
24bb0 62 74 72 65 65 73 0a 2a 2a 20 28 77 69 74 68 20  btrees.** (with 
24bc0 61 72 62 69 74 72 61 72 79 20 6d 75 6c 74 69 2d  arbitrary multi-
24bd0 76 61 6c 75 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a  value keys)..**.
24be0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
24bf0 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
24c00 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
24c10 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 61  e it cannot be a
24c20 64 76 61 6e 63 65 64 0a 2a 2a 20 69 6e 20 65 69  dvanced.** in ei
24c30 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20  ther direction. 
24c40 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
24c50 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72   the Next and Pr
24c60 65 76 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c 0a  ev opcodes will.
24c70 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c  ** not work foll
24c80 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64  owing this opcod
24c90 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
24ca0 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
24cb0 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20  nd, NoConflict, 
24cc0 53 65 65 6b 52 6f 77 69 64 0a 2a 2f 0a 63 61 73  SeekRowid.*/.cas
24cd0 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 3a 20  e OP_SeekRowid: 
24ce0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
24cf0 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64 62 65 43  , in3 */.  VdbeC
24d00 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
24d10 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
24d20 69 6e 74 20 72 65 73 3b 0a 20 20 75 36 34 20 69  int res;.  u64 i
24d30 4b 65 79 3b 0a 0a 20 20 70 49 6e 33 20 3d 20 26  Key;..  pIn3 = &
24d40 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
24d50 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
24d60 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20  s & MEM_Int)==0 
24d70 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ){.    /* Make s
24d80 75 72 65 20 70 49 6e 33 2d 3e 75 2e 69 20 63 6f  ure pIn3->u.i co
24d90 6e 74 61 69 6e 73 20 61 20 76 61 6c 69 64 20 69  ntains a valid i
24da0 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74  nteger represent
24db0 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 2a 2a 20  ation of.    ** 
24dc0 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2c 20 62  the key value, b
24dd0 75 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ut do not change
24de0 20 74 68 65 20 64 61 74 61 74 79 70 65 20 6f 66   the datatype of
24df0 20 74 68 65 20 72 65 67 69 73 74 65 72 2c 20 61   the register, a
24e00 73 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70  s.    ** other p
24e10 61 72 74 73 20 6f 66 20 74 68 65 20 70 65 72 70  arts of the perp
24e20 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ared statement m
24e30 69 67 68 74 20 62 65 20 64 65 70 65 6e 64 69 6e  ight be dependin
24e40 67 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  g on the.    ** 
24e50 63 75 72 72 65 6e 74 20 64 61 74 61 74 79 70 65  current datatype
24e60 2e 20 2a 2f 0a 20 20 20 20 75 31 36 20 6f 72 69  . */.    u16 ori
24e70 67 46 6c 61 67 73 20 3d 20 70 49 6e 33 2d 3e 66  gFlags = pIn3->f
24e80 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 69 73  lags;.    int is
24e90 4e 6f 74 49 6e 74 3b 0a 20 20 20 20 61 70 70 6c  NotInt;.    appl
24ea0 79 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 20  yAffinity(pIn3, 
24eb0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
24ec0 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  IC, encoding);. 
24ed0 20 20 20 69 73 4e 6f 74 49 6e 74 20 3d 20 28 70     isNotInt = (p
24ee0 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
24ef0 5f 49 6e 74 29 3d 3d 30 3b 0a 20 20 20 20 70 49  _Int)==0;.    pI
24f00 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 6f 72 69 67  n3->flags = orig
24f10 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 69  Flags;.    if( i
24f20 73 4e 6f 74 49 6e 74 20 29 20 67 6f 74 6f 20 6a  sNotInt ) goto j
24f30 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
24f40 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
24f50 20 69 6e 74 6f 20 4f 50 5f 4e 6f 74 45 78 69 73   into OP_NotExis
24f60 74 73 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f  ts */.case OP_No
24f70 74 45 78 69 73 74 73 3a 20 20 20 20 20 20 20 20  tExists:        
24f80 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
24f90 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  /.  pIn3 = &aMem
24fa0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73  [pOp->p3];.  ass
24fb0 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67  ert( (pIn3->flag
24fc0 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  s & MEM_Int)!=0 
24fd0 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  || pOp->opcode==
24fe0 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20 29 3b 0a  OP_SeekRowid );.
24ff0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
25000 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
25010 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
25020 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
25030 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
25040 28 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65  ( pC!=0 );.#ifde
25050 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
25060 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
25070 3d 3d 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20 29  ==OP_SeekRowid )
25080 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f 50   pC->seekOp = OP
25090 5f 53 65 65 6b 52 6f 77 69 64 3b 0a 23 65 6e 64  _SeekRowid;.#end
250a0 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  if.  assert( pC-
250b0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73  >isTable );.  as
250c0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
250d0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
250e0 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  E );.  pCrsr = p
250f0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20  C->uc.pCursor;. 
25100 20 61 73 73 65 72 74 28 20 70 43 72 73 72 21 3d   assert( pCrsr!=
25110 30 20 29 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a  0 );.  res = 0;.
25120 20 20 69 4b 65 79 20 3d 20 70 49 6e 33 2d 3e 75    iKey = pIn3->u
25130 2e 69 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .i;.  rc = sqlit
25140 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
25150 61 63 6b 65 64 28 70 43 72 73 72 2c 20 30 2c 20  acked(pCrsr, 0, 
25160 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a  iKey, 0, &res);.
25170 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
25180 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d  LITE_OK || res==
25190 30 20 29 3b 0a 20 20 70 43 2d 3e 6d 6f 76 65 74  0 );.  pC->movet
251a0 6f 54 61 72 67 65 74 20 3d 20 69 4b 65 79 3b 20  oTarget = iKey; 
251b0 20 2f 2a 20 55 73 65 64 20 62 79 20 4f 50 5f 44   /* Used by OP_D
251c0 65 6c 65 74 65 20 2a 2f 0a 20 20 70 43 2d 3e 6e  elete */.  pC->n
251d0 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43  ullRow = 0;.  pC
251e0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
251f0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70  CACHE_STALE;.  p
25200 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
25210 6f 20 3d 20 30 3b 0a 20 20 56 64 62 65 42 72 61  o = 0;.  VdbeBra
25220 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c  nchTaken(res!=0,
25230 32 29 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65  2);.  pC->seekRe
25240 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20 69 66  sult = res;.  if
25250 28 20 72 65 73 21 3d 30 20 29 7b 0a 20 20 20 20  ( res!=0 ){.    
25260 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
25270 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28  TE_OK );.    if(
25280 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20   pOp->p2==0 ){. 
25290 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
252a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
252b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
252c0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
252d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
252e0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
252f0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
25300 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
25310 63 6f 64 65 3a 20 53 65 71 75 65 6e 63 65 20 50  code: Sequence P
25320 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
25330 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 63 75  nopsis: r[P2]=cu
25340 72 73 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b 0a 2a  rsor[P1].ctr++.*
25350 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 65  *.** Find the ne
25360 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 65 71  xt available seq
25370 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 66 6f 72  uence number for
25380 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 57   cursor P1..** W
25390 72 69 74 65 20 74 68 65 20 73 65 71 75 65 6e 63  rite the sequenc
253a0 65 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 72 65  e number into re
253b0 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 54 68  gister P2..** Th
253c0 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65  e sequence numbe
253d0 72 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  r on the cursor 
253e0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 61  is incremented a
253f0 66 74 65 72 20 74 68 69 73 0a 2a 2a 20 69 6e 73  fter this.** ins
25400 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 63  truction.  .*/.c
25410 61 73 65 20 4f 50 5f 53 65 71 75 65 6e 63 65 3a  ase OP_Sequence:
25420 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
25430 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74  out2 */.  assert
25440 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
25450 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
25460 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
25470 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
25480 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ]!=0 );.  assert
25490 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  ( p->apCsr[pOp->
254a0 70 31 5d 2d 3e 65 43 75 72 54 79 70 65 21 3d 43  p1]->eCurType!=C
254b0 55 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20  URTYPE_VTAB );. 
254c0 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
254d0 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
254e0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 2d    pOut->u.i = p-
254f0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d  >apCsr[pOp->p1]-
25500 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b 0a 20 20 62  >seqCount++;.  b
25510 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63  reak;.}.../* Opc
25520 6f 64 65 3a 20 4e 65 77 52 6f 77 69 64 20 50 31  ode: NewRowid P1
25530 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
25540 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f  nopsis: r[P2]=ro
25550 77 69 64 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20  wid.**.** Get a 
25560 6e 65 77 20 69 6e 74 65 67 65 72 20 72 65 63 6f  new integer reco
25570 72 64 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61  rd number (a.k.a
25580 20 22 72 6f 77 69 64 22 29 20 75 73 65 64 20 61   "rowid") used a
25590 73 20 74 68 65 20 6b 65 79 20 74 6f 20 61 20 74  s the key to a t
255a0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63  able..** The rec
255b0 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f  ord number is no
255c0 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65  t previously use
255d0 64 20 61 73 20 61 20 6b 65 79 20 69 6e 20 74 68  d as a key in th
255e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  e database.** ta
255f0 62 6c 65 20 74 68 61 74 20 63 75 72 73 6f 72 20  ble that cursor 
25600 50 31 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54  P1 points to.  T
25610 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75  he new record nu
25620 6d 62 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  mber is written.
25630 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 72 65  ** written to re
25640 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a  gister P2..**.**
25650 20 49 66 20 50 33 3e 30 20 74 68 65 6e 20 50 33   If P3>0 then P3
25660 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 69   is a register i
25670 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65  n the root frame
25680 20 6f 66 20 74 68 69 73 20 56 44 42 45 20 74 68   of this VDBE th
25690 61 74 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65  at holds .** the
256a0 20 6c 61 72 67 65 73 74 20 70 72 65 76 69 6f 75   largest previou
256b0 73 6c 79 20 67 65 6e 65 72 61 74 65 64 20 72 65  sly generated re
256c0 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20  cord number. No 
256d0 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  new record numbe
256e0 72 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65  rs are.** allowe
256f0 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
25700 6e 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68  n this value. Wh
25710 65 6e 20 74 68 69 73 20 76 61 6c 75 65 20 72 65  en this value re
25720 61 63 68 65 73 20 69 74 73 20 6d 61 78 69 6d 75  aches its maximu
25730 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 49 54 45  m, .** an SQLITE
25740 5f 46 55 4c 4c 20 65 72 72 6f 72 20 69 73 20 67  _FULL error is g
25750 65 6e 65 72 61 74 65 64 2e 20 54 68 65 20 50 33  enerated. The P3
25760 20 72 65 67 69 73 74 65 72 20 69 73 20 75 70 64   register is upd
25770 61 74 65 64 20 77 69 74 68 20 74 68 65 20 27 0a  ated with the '.
25780 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 72 65 63  ** generated rec
25790 6f 72 64 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  ord number. This
257a0 20 50 33 20 6d 65 63 68 61 6e 69 73 6d 20 69 73   P3 mechanism is
257b0 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 69 6d   used to help im
257c0 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41  plement the.** A
257d0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65 61  UTOINCREMENT fea
257e0 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ture..*/.case OP
257f0 5f 4e 65 77 52 6f 77 69 64 3a 20 7b 20 20 20 20  _NewRowid: {    
25800 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
25810 2f 0a 20 20 69 36 34 20 76 3b 20 20 20 20 20 20  /.  i64 v;      
25820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25830 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20  e new rowid */. 
25840 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
25850 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
25860 72 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 67 65  r of table to ge
25870 74 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20  t the new rowid 
25880 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
25890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
258a0 65 73 75 6c 74 20 6f 66 20 61 6e 20 73 71 6c 69  esult of an sqli
258b0 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 2a  te3BtreeLast() *
258c0 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
258d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
258e0 75 6e 74 65 72 20 74 6f 20 6c 69 6d 69 74 20 74  unter to limit t
258f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61  he number of sea
25900 72 63 68 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  rches */.  Mem *
25910 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pMem;           
25920 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
25930 6c 64 69 6e 67 20 6c 61 72 67 65 73 74 20 72 6f  lding largest ro
25940 77 69 64 20 66 6f 72 20 41 55 54 4f 49 4e 43 52  wid for AUTOINCR
25950 45 4d 45 4e 54 20 2a 2f 0a 20 20 56 64 62 65 46  EMENT */.  VdbeF
25960 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20  rame *pFrame;   
25970 20 20 2f 2a 20 52 6f 6f 74 20 66 72 61 6d 65 20    /* Root frame 
25980 6f 66 20 56 44 42 45 20 2a 2f 0a 0a 20 20 76 20  of VDBE */..  v 
25990 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a  = 0;.  res = 0;.
259a0 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
259b0 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
259c0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
259d0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
259e0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
259f0 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
25a00 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
25a10 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
25a20 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
25a30 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
25a40 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
25a50 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
25a60 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
25a70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 7b  Cursor!=0 );.  {
25a80 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  .    /* The next
25a90 20 72 6f 77 69 64 20 6f 72 20 72 65 63 6f 72 64   rowid or record
25aa0 20 6e 75 6d 62 65 72 20 28 64 69 66 66 65 72 65   number (differe
25ab0 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
25ac0 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 74 68 69   same.    ** thi
25ad0 6e 67 29 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ng) is obtained 
25ae0 69 6e 20 61 20 74 77 6f 2d 73 74 65 70 20 61 6c  in a two-step al
25af0 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a  gorithm..    **.
25b00 20 20 20 20 2a 2a 20 46 69 72 73 74 20 77 65 20      ** First we 
25b10 61 74 74 65 6d 70 74 20 74 6f 20 66 69 6e 64 20  attempt to find 
25b20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73  the largest exis
25b30 74 69 6e 67 20 72 6f 77 69 64 20 61 6e 64 20 61  ting rowid and a
25b40 64 64 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 74 6f  dd one.    ** to
25b50 20 74 68 61 74 2e 20 20 42 75 74 20 69 66 20 74   that.  But if t
25b60 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
25b70 69 6e 67 20 72 6f 77 69 64 20 69 73 20 61 6c 72  ing rowid is alr
25b80 65 61 64 79 20 74 68 65 20 6d 61 78 69 6d 75 6d  eady the maximum
25b90 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 76 65  .    ** positive
25ba0 20 69 6e 74 65 67 65 72 2c 20 77 65 20 68 61 76   integer, we hav
25bb0 65 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67  e to fall throug
25bc0 68 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a  h to the second.
25bd0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 69 6c 69      ** probabili
25be0 73 74 69 63 20 61 6c 67 6f 72 69 74 68 6d 0a 20  stic algorithm. 
25bf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
25c00 20 73 65 63 6f 6e 64 20 61 6c 67 6f 72 69 74 68   second algorith
25c10 6d 20 69 73 20 74 6f 20 73 65 6c 65 63 74 20 61  m is to select a
25c20 20 72 6f 77 69 64 20 61 74 20 72 61 6e 64 6f 6d   rowid at random
25c30 20 61 6e 64 20 73 65 65 20 69 66 0a 20 20 20 20   and see if.    
25c40 2a 2a 20 69 74 20 61 6c 72 65 61 64 79 20 65 78  ** it already ex
25c50 69 73 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ists in the tabl
25c60 65 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  e.  If it does n
25c70 6f 74 20 65 78 69 73 74 2c 20 77 65 20 68 61 76  ot exist, we hav
25c80 65 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64  e.    ** succeed
25c90 65 64 2e 20 20 49 66 20 74 68 65 20 72 61 6e 64  ed.  If the rand
25ca0 6f 6d 20 72 6f 77 69 64 20 64 6f 65 73 20 65 78  om rowid does ex
25cb0 69 73 74 2c 20 77 65 20 73 65 6c 65 63 74 20 61  ist, we select a
25cc0 20 6e 65 77 20 6f 6e 65 0a 20 20 20 20 2a 2a 20   new one.    ** 
25cd0 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2c 20 75  and try again, u
25ce0 70 20 74 6f 20 31 30 30 20 74 69 6d 65 73 2e 0a  p to 100 times..
25cf0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
25d00 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29  t( pC->isTable )
25d10 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
25d20 5f 33 32 42 49 54 5f 52 4f 57 49 44 0a 23 20 20  _32BIT_ROWID.#  
25d30 20 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49   define MAX_ROWI
25d40 44 20 30 78 37 66 66 66 66 66 66 66 0a 23 65 6c  D 0x7fffffff.#el
25d50 73 65 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63  se.    /* Some c
25d60 6f 6d 70 69 6c 65 72 73 20 63 6f 6d 70 6c 61 69  ompilers complai
25d70 6e 20 61 62 6f 75 74 20 63 6f 6e 73 74 61 6e 74  n about constant
25d80 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 30 78  s of the form 0x
25d90 37 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66  7fffffffffffffff
25da0 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 73 20  ..    ** Others 
25db0 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20 30  complain about 0
25dc0 78 37 66 66 66 66 66 66 66 66 66 66 66 66 66 66  x7ffffffffffffff
25dd0 66 66 4c 4c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ffLL.  The follo
25de0 77 69 6e 67 20 6d 61 63 72 6f 20 73 65 65 6d 73  wing macro seems
25df0 0a 20 20 20 20 2a 2a 20 74 6f 20 70 72 6f 76 69  .    ** to provi
25e00 64 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  de the constant 
25e10 77 68 69 6c 65 20 6d 61 6b 69 6e 67 20 61 6c 6c  while making all
25e20 20 63 6f 6d 70 69 6c 65 72 73 20 68 61 70 70 79   compilers happy
25e30 2e 0a 20 20 20 20 2a 2f 0a 23 20 20 20 64 65 66  ..    */.#   def
25e40 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 20 28  ine MAX_ROWID  (
25e50 69 36 34 29 28 20 28 28 28 75 36 34 29 30 78 37  i64)( (((u64)0x7
25e60 66 66 66 66 66 66 66 29 3c 3c 33 32 29 20 7c 20  fffffff)<<32) | 
25e70 28 75 36 34 29 30 78 66 66 66 66 66 66 66 66 20  (u64)0xffffffff 
25e80 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ).#endif..    if
25e90 28 20 21 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d  ( !pC->useRandom
25ea0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 72  Rowid ){.      r
25eb0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
25ec0 4c 61 73 74 28 70 43 2d 3e 75 63 2e 70 43 75 72  Last(pC->uc.pCur
25ed0 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
25ee0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25ef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
25f00 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
25f10 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
25f20 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b        if( res ){
25f30 0a 20 20 20 20 20 20 20 20 76 20 3d 20 31 3b 20  .        v = 1; 
25f40 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 31    /* IMP: R-6191
25f50 34 2d 34 38 30 37 34 20 2a 2f 0a 20 20 20 20 20  4-48074 */.     
25f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25f70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
25f80 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
25f90 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  d(pC->uc.pCursor
25fa0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 76 20 3d  ) );.        v =
25fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
25fc0 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70  egerKey(pC->uc.p
25fd0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
25fe0 20 69 66 28 20 76 3e 3d 4d 41 58 5f 52 4f 57 49   if( v>=MAX_ROWI
25ff0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  D ){.          p
26000 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69  C->useRandomRowi
26010 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  d = 1;.        }
26020 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26030 76 2b 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  v++;   /* IMP: R
26040 2d 32 39 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a  -29538-34987 */.
26050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26060 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  }.    }..#ifndef
26070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26080 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 69  OINCREMENT.    i
26090 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20  f( pOp->p3 ){.  
260a0 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68      /* Assert th
260b0 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64  at P3 is a valid
260c0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f   memory cell. */
260d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
260e0 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20  Op->p3>0 );.    
260f0 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
26100 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  ){.        for(p
26110 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
26120 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
26130 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
26140 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20  >pParent);.     
26150 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61     /* Assert tha
26160 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20  t P3 is a valid 
26170 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a  memory cell. */.
26180 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26190 70 4f 70 2d 3e 70 33 3c 3d 70 46 72 61 6d 65 2d  pOp->p3<=pFrame-
261a0 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 20  >nMem );.       
261b0 20 70 4d 65 6d 20 3d 20 26 70 46 72 61 6d 65 2d   pMem = &pFrame-
261c0 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  >aMem[pOp->p3];.
261d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
261e0 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74       /* Assert t
261f0 68 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69  hat P3 is a vali
26200 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a  d memory cell. *
26210 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26220 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  ( pOp->p3<=(p->n
26230 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
26240 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  or) );.        p
26250 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
26260 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  >p3];.        me
26270 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
26280 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , pMem);.      }
26290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
262a0 65 6d 49 73 56 61 6c 69 64 28 70 4d 65 6d 29 20  emIsValid(pMem) 
262b0 29 3b 0a 0a 20 20 20 20 20 20 52 45 47 49 53 54  );..      REGIST
262c0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
262d0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , pMem);.      s
262e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
262f0 65 67 65 72 69 66 79 28 70 4d 65 6d 29 3b 0a 20  egerify(pMem);. 
26300 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d       assert( (pM
26310 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
26320 49 6e 74 29 21 3d 30 20 29 3b 20 20 2f 2a 20 6d  Int)!=0 );  /* m
26330 65 6d 28 50 33 29 20 68 6f 6c 64 73 20 61 6e 20  em(P3) holds an 
26340 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
26350 20 69 66 28 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d   if( pMem->u.i==
26360 4d 41 58 5f 52 4f 57 49 44 20 7c 7c 20 70 43 2d  MAX_ROWID || pC-
26370 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20  >useRandomRowid 
26380 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26390 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f  SQLITE_FULL;   /
263a0 2a 20 49 4d 50 3a 20 52 2d 31 37 38 31 37 2d 30  * IMP: R-17817-0
263b0 30 36 33 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0630 */.        
263c0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
263d0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
263e0 0a 20 20 20 20 20 20 69 66 28 20 76 3c 70 4d 65  .      if( v<pMe
263f0 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20 20 20  m->u.i+1 ){.    
26400 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
26410 69 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  i + 1;.      }. 
26420 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
26430 20 76 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   v;.    }.#endif
26440 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 75 73 65  .    if( pC->use
26450 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20  RandomRowid ){. 
26460 20 20 20 20 20 2f 2a 20 49 4d 50 4c 45 4d 45 4e       /* IMPLEMEN
26470 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 37 36  TATION-OF: R-076
26480 37 37 2d 34 31 38 38 31 20 49 66 20 74 68 65 20  77-41881 If the 
26490 6c 61 72 67 65 73 74 20 52 4f 57 49 44 20 69 73  largest ROWID is
264a0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 20 20   equal to the.  
264b0 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 70      ** largest p
264c0 6f 73 73 69 62 6c 65 20 69 6e 74 65 67 65 72 20  ossible integer 
264d0 28 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  (922337203685477
264e0 35 38 30 37 29 20 74 68 65 6e 20 74 68 65 20 64  5807) then the d
264f0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
26500 20 65 6e 67 69 6e 65 20 73 74 61 72 74 73 20 70   engine starts p
26510 69 63 6b 69 6e 67 20 70 6f 73 69 74 69 76 65 20  icking positive 
26520 63 61 6e 64 69 64 61 74 65 20 52 4f 57 49 44 73  candidate ROWIDs
26530 20 61 74 20 72 61 6e 64 6f 6d 20 75 6e 74 69 6c   at random until
26540 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 66 69 6e  .      ** it fin
26550 64 73 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e  ds one that is n
26560 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73  ot previously us
26570 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ed. */.      ass
26580 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20  ert( pOp->p3==0 
26590 29 3b 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74  );  /* We cannot
265a0 20 62 65 20 69 6e 20 72 61 6e 64 6f 6d 20 72 6f   be in random ro
265b0 77 69 64 20 6d 6f 64 65 20 69 66 20 74 68 69 73  wid mode if this
265c0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20   is.            
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 20 2a 2a 20 61 6e 20 41 55 54 4f 49 4e 43 52 45   ** an AUTOINCRE
265f0 4d 45 4e 54 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  MENT table. */. 
26600 20 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20       cnt = 0;.  
26610 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
26620 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
26630 73 73 28 73 69 7a 65 6f 66 28 76 29 2c 20 26 76  ss(sizeof(v), &v
26640 29 3b 0a 20 20 20 20 20 20 20 20 76 20 26 3d 20  );.        v &= 
26650 28 4d 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20  (MAX_ROWID>>1); 
26660 76 2b 2b 3b 20 20 2f 2a 20 45 6e 73 75 72 65 20  v++;  /* Ensure 
26670 74 68 61 74 20 76 20 69 73 20 67 72 65 61 74 65  that v is greate
26680 72 20 74 68 61 6e 20 7a 65 72 6f 20 2a 2f 0a 20  r than zero */. 
26690 20 20 20 20 20 7d 77 68 69 6c 65 28 20 20 28 28       }while(  ((
266a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
266b0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
266c0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
266d0 30 2c 20 28 75 36 34 29 76 2c 0a 20 20 20 20 20  0, (u64)v,.     
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26700 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26              0, &
26710 72 65 73 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  res))==SQLITE_OK
26720 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
26730 20 28 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20   (res==0).      
26740 20 20 20 20 20 20 26 26 20 28 2b 2b 63 6e 74 3c        && (++cnt<
26750 31 30 30 29 29 3b 0a 20 20 20 20 20 20 69 66 28  100));.      if(
26760 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
26770 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
26780 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
26790 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
267a0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f  SQLITE_FULL;   /
267b0 2a 20 49 4d 50 3a 20 52 2d 33 38 32 31 39 2d 35  * IMP: R-38219-5
267c0 33 30 30 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  3002 */.        
267d0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
267e0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
267f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76  .      assert( v
26800 3e 30 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d  >0 );  /* EV: R-
26810 34 30 38 31 32 2d 30 33 35 37 30 20 2a 2f 0a 20  40812-03570 */. 
26820 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 64 65 66     }.    pC->def
26830 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
26840 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
26850 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
26860 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  LE;.  }.  pOut->
26870 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b  u.i = v;.  break
26880 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
26890 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20  Insert P1 P2 P3 
268a0 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
268b0 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 20  s: intkey=r[P3] 
268c0 64 61 74 61 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a  data=r[P2].**.**
268d0 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
268e0 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
268f0 66 20 63 75 72 73 6f 72 20 50 31 2e 20 20 41 20  f cursor P1.  A 
26900 6e 65 77 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20  new entry is.** 
26910 63 72 65 61 74 65 64 20 69 66 20 69 74 20 64 6f  created if it do
26920 65 73 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78  esn't already ex
26930 69 73 74 20 6f 72 20 74 68 65 20 64 61 74 61 20  ist or the data 
26940 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  for an existing.
26950 2a 2a 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72  ** entry is over
26960 77 72 69 74 74 65 6e 2e 20 20 54 68 65 20 64 61  written.  The da
26970 74 61 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  ta is the value 
26980 4d 45 4d 5f 42 6c 6f 62 20 73 74 6f 72 65 64 20  MEM_Blob stored 
26990 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6e  in register.** n
269a0 75 6d 62 65 72 20 50 32 2e 20 54 68 65 20 6b 65  umber P2. The ke
269b0 79 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  y is stored in r
269c0 65 67 69 73 74 65 72 20 50 33 2e 20 54 68 65 20  egister P3. The 
269d0 6b 65 79 20 6d 75 73 74 0a 2a 2a 20 62 65 20 61  key must.** be a
269e0 20 4d 45 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20   MEM_Int..**.** 
269f0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43  If the OPFLAG_NC
26a00 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 35  HANGE flag of P5
26a10 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
26a20 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75  e row change cou
26a30 6e 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65  nt is.** increme
26a40 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73 65 20  nted (otherwise 
26a50 6e 6f 74 29 2e 20 20 49 66 20 74 68 65 20 4f 50  not).  If the OP
26a60 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 66  FLAG_LASTROWID f
26a70 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74  lag of P5 is set
26a80 2c 0a 2a 2a 20 74 68 65 6e 20 72 6f 77 69 64 20  ,.** then rowid 
26a90 69 73 20 73 74 6f 72 65 64 20 66 6f 72 20 73 75  is stored for su
26aa0 62 73 65 71 75 65 6e 74 20 72 65 74 75 72 6e 20  bsequent return 
26ab0 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  by the.** sqlite
26ac0 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
26ad0 77 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 28  wid() function (
26ae0 6f 74 68 65 72 77 69 73 65 20 69 74 20 69 73 20  otherwise it is 
26af0 75 6e 6d 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a  unmodified)..**.
26b00 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
26b10 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66  _USESEEKRESULT f
26b20 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74  lag of P5 is set
26b30 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
26b40 74 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a 20 72 75  tion might.** ru
26b50 6e 20 66 61 73 74 65 72 20 62 79 20 61 76 6f 69  n faster by avoi
26b60 64 69 6e 67 20 61 6e 20 75 6e 6e 65 63 65 73 73  ding an unnecess
26b70 61 72 79 20 73 65 65 6b 20 6f 6e 20 63 75 72 73  ary seek on curs
26b80 6f 72 20 50 31 2e 20 20 48 6f 77 65 76 65 72 2c  or P1.  However,
26b90 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f 55  .** the OPFLAG_U
26ba0 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61  SESEEKRESULT fla
26bb0 67 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 73  g must only be s
26bc0 65 74 20 69 66 20 74 68 65 72 65 20 68 61 76 65  et if there have
26bd0 20 62 65 65 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a   been no prior.*
26be0 2a 20 73 65 65 6b 73 20 6f 6e 20 74 68 65 20 63  * seeks on the c
26bf0 75 72 73 6f 72 20 6f 72 20 69 66 20 74 68 65 20  ursor or if the 
26c00 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 65 65 6b  most recent seek
26c10 20 75 73 65 64 20 61 20 6b 65 79 20 65 71 75 61   used a key equa
26c20 6c 20 74 6f 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49  l to P3..**.** I
26c30 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55  f the OPFLAG_ISU
26c40 50 44 41 54 45 20 66 6c 61 67 20 69 73 20 73 65  PDATE flag is se
26c50 74 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63  t, then this opc
26c60 6f 64 65 20 69 73 20 70 61 72 74 20 6f 66 20 61  ode is part of a
26c70 6e 0a 2a 2a 20 55 50 44 41 54 45 20 6f 70 65 72  n.** UPDATE oper
26c80 61 74 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73  ation.  Otherwis
26c90 65 20 28 69 66 20 74 68 65 20 66 6c 61 67 20 69  e (if the flag i
26ca0 73 20 63 6c 65 61 72 29 20 74 68 65 6e 20 74 68  s clear) then th
26cb0 69 73 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20  is opcode.** is 
26cc0 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45 52  part of an INSER
26cd0 54 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68  T operation.  Th
26ce0 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  e difference is 
26cf0 6f 6e 6c 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  only important t
26d00 6f 0a 2a 2a 20 74 68 65 20 75 70 64 61 74 65 20  o.** the update 
26d10 68 6f 6f 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  hook..**.** Para
26d20 6d 65 74 65 72 20 50 34 20 6d 61 79 20 70 6f 69  meter P4 may poi
26d30 6e 74 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74  nt to a Table st
26d40 72 75 63 74 75 72 65 2c 20 6f 72 20 6d 61 79 20  ructure, or may 
26d50 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69  be NULL. If it i
26d60 73 20 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20  s .** not NULL, 
26d70 74 68 65 6e 20 74 68 65 20 75 70 64 61 74 65 2d  then the update-
26d80 68 6f 6f 6b 20 28 73 71 6c 69 74 65 33 2e 78 55  hook (sqlite3.xU
26d90 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 29 20 69  pdateCallback) i
26da0 73 20 69 6e 76 6f 6b 65 64 20 0a 2a 2a 20 66 6f  s invoked .** fo
26db0 6c 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73  llowing a succes
26dc0 73 66 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a  sful insert..**.
26dd0 2a 2a 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f  ** (WARNING/TODO
26de0 3a 20 49 66 20 50 31 20 69 73 20 61 20 70 73 65  : If P1 is a pse
26df0 75 64 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20 50  udo-cursor and P
26e00 32 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  2 is dynamically
26e10 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74  .** allocated, t
26e20 68 65 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  hen ownership of
26e30 20 50 32 20 69 73 20 74 72 61 6e 73 66 65 72 72   P2 is transferr
26e40 65 64 20 74 6f 20 74 68 65 20 70 73 65 75 64 6f  ed to the pseudo
26e50 2d 63 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72  -cursor.** and r
26e60 65 67 69 73 74 65 72 20 50 32 20 62 65 63 6f 6d  egister P2 becom
26e70 65 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 49  es ephemeral.  I
26e80 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
26e90 63 68 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20  changed, the.** 
26ea0 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
26eb0 72 20 50 32 20 77 69 6c 6c 20 74 68 65 6e 20 63  r P2 will then c
26ec0 68 61 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75 72  hange.  Make sur
26ed0 65 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a  e this does not.
26ee0 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ** cause any pro
26ef0 62 6c 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  blems.).**.** Th
26f00 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  is instruction o
26f10 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62  nly works on tab
26f20 6c 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61  les.  The equiva
26f30 6c 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  lent instruction
26f40 0a 2a 2a 20 66 6f 72 20 69 6e 64 69 63 65 73 20  .** for indices 
26f50 69 73 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e  is OP_IdxInsert.
26f60 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65  .*/.case OP_Inse
26f70 72 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44 61  rt: {.  Mem *pDa
26f80 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d  ta;       /* MEM
26f90 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 64 61   cell holding da
26fa0 74 61 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ta for the recor
26fb0 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  d to be inserted
26fc0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65 79 3b   */.  Mem *pKey;
26fd0 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63          /* MEM c
26fe0 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20  ell holding key 
26ff0 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
27000 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
27010 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72  *pC;   /* Cursor
27020 20 74 6f 20 74 61 62 6c 65 20 69 6e 74 6f 20 77   to table into w
27030 68 69 63 68 20 69 6e 73 65 72 74 20 69 73 20 77  hich insert is w
27040 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
27050 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a  seekResult;   /*
27060 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72   Result of prior
27070 20 73 65 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f   seek or 0 if no
27080 20 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66   USESEEKRESULT f
27090 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  lag */.  const c
270a0 68 61 72 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61  har *zDb;  /* da
270b0 74 61 62 61 73 65 20 6e 61 6d 65 20 2d 20 75 73  tabase name - us
270c0 65 64 20 62 79 20 74 68 65 20 75 70 64 61 74 65  ed by the update
270d0 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54 61 62 6c 65   hook */.  Table
270e0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 2f 2a 20   *pTab;      /* 
270f0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
27100 2d 20 75 73 65 64 20 62 79 20 75 70 64 61 74 65  - used by update
27110 20 61 6e 64 20 70 72 65 2d 75 70 64 61 74 65 20   and pre-update 
27120 68 6f 6f 6b 73 20 2a 2f 0a 20 20 42 74 72 65 65  hooks */.  Btree
27130 50 61 79 6c 6f 61 64 20 78 3b 20 20 20 2f 2a 20  Payload x;   /* 
27140 50 61 79 6c 6f 61 64 20 74 6f 20 62 65 20 69 6e  Payload to be in
27150 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 70 44 61  serted */..  pDa
27160 74 61 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ta = &aMem[pOp->
27170 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
27180 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
27190 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
271a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  );.  assert( mem
271b0 49 73 56 61 6c 69 64 28 70 44 61 74 61 29 20 29  IsValid(pData) )
271c0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
271d0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
271e0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
271f0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
27200 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
27210 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
27220 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
27230 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
27240 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
27250 41 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c 20 70 43  AG_ISNOOP) || pC
27260 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
27270 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
27280 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 7c 7c 20  pe==P4_TABLE || 
27290 70 4f 70 2d 3e 70 34 74 79 70 65 3e 3d 50 34 5f  pOp->p4type>=P4_
272a0 53 54 41 54 49 43 20 29 3b 0a 20 20 52 45 47 49  STATIC );.  REGI
272b0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
272c0 70 32 2c 20 70 44 61 74 61 29 3b 0a 20 20 73 71  p2, pData);.  sq
272d0 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69  lite3VdbeIncrWri
272e0 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 70 43 29  teCounter(p, pC)
272f0 3b 0a 0a 20 20 70 4b 65 79 20 3d 20 26 61 4d 65  ;..  pKey = &aMe
27300 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73  m[pOp->p3];.  as
27310 73 65 72 74 28 20 70 4b 65 79 2d 3e 66 6c 61 67  sert( pKey->flag
27320 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
27330 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
27340 6c 69 64 28 70 4b 65 79 29 20 29 3b 0a 20 20 52  lid(pKey) );.  R
27350 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
27360 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b 0a 20 20  p->p3, pKey);.  
27370 78 2e 6e 4b 65 79 20 3d 20 70 4b 65 79 2d 3e 75  x.nKey = pKey->u
27380 2e 69 3b 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .i;..  if( pOp->
27390 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45  p4type==P4_TABLE
273a0 20 26 26 20 48 41 53 5f 55 50 44 41 54 45 5f 48   && HAS_UPDATE_H
273b0 4f 4f 4b 28 64 62 29 20 29 7b 0a 20 20 20 20 61  OOK(db) ){.    a
273c0 73 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d  ssert( pC->iDb>=
273d0 30 20 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 64  0 );.    zDb = d
273e0 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e  b->aDb[pC->iDb].
273f0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 70 54  zDbSName;.    pT
27400 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 54 61  ab = pOp->p4.pTa
27410 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  b;.    assert( (
27420 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
27430 5f 49 53 4e 4f 4f 50 29 20 7c 7c 20 48 61 73 52  _ISNOOP) || HasR
27440 6f 77 69 64 28 70 54 61 62 29 20 29 3b 0a 20 20  owid(pTab) );.  
27450 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 20  }else{.    pTab 
27460 3d 20 30 3b 0a 20 20 20 20 7a 44 62 20 3d 20 30  = 0;.    zDb = 0
27470 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
27480 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d  .  Silence a com
27490 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a  piler warning. *
274a0 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  /.  }..#ifdef SQ
274b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
274c0 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20  PDATE_HOOK.  /* 
274d0 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
274e0 70 64 61 74 65 20 68 6f 6f 6b 2c 20 69 66 20 61  pdate hook, if a
274f0 6e 79 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  ny */.  if( pTab
27500 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
27510 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
27520 63 6b 20 26 26 20 21 28 70 4f 70 2d 3e 70 35 20  ck && !(pOp->p5 
27530 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  & OPFLAG_ISUPDAT
27540 45 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  E) ){.      sqli
27550 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
27560 48 6f 6f 6b 28 70 2c 20 70 43 2c 20 53 51 4c 49  Hook(p, pC, SQLI
27570 54 45 5f 49 4e 53 45 52 54 2c 20 7a 44 62 2c 20  TE_INSERT, zDb, 
27580 70 54 61 62 2c 20 78 2e 6e 4b 65 79 2c 70 4f 70  pTab, x.nKey,pOp
27590 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p2);.    }.   
275a0 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74 65   if( db->xUpdate
275b0 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20 70  Callback==0 || p
275c0 54 61 62 2d 3e 61 43 6f 6c 3d 3d 30 20 29 7b 0a  Tab->aCol==0 ){.
275d0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74        /* Prevent
275e0 20 70 6f 73 74 2d 75 70 64 61 74 65 20 68 6f 6f   post-update hoo
275f0 6b 20 66 72 6f 6d 20 72 75 6e 6e 69 6e 67 20 69  k from running i
27600 6e 20 63 61 73 65 73 20 77 68 65 6e 20 69 74 20  n cases when it 
27610 73 68 6f 75 6c 64 20 6e 6f 74 20 2a 2f 0a 20 20  should not */.  
27620 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
27630 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f    }.  }.  if( pO
27640 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49  p->p5 & OPFLAG_I
27650 53 4e 4f 4f 50 20 29 20 62 72 65 61 6b 3b 0a 23  SNOOP ) break;.#
27660 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 70  endif..  if( pOp
27670 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43  ->p5 & OPFLAG_NC
27680 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e  HANGE ) p->nChan
27690 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f 70 2d  ge++;.  if( pOp-
276a0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c 41 53  >p5 & OPFLAG_LAS
276b0 54 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c 61 73  TROWID ) db->las
276c0 74 52 6f 77 69 64 20 3d 20 78 2e 6e 4b 65 79 3b  tRowid = x.nKey;
276d0 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
276e0 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42  ->flags & (MEM_B
276f0 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29 3b 0a  lob|MEM_Str) );.
27700 20 20 78 2e 70 44 61 74 61 20 3d 20 70 44 61 74    x.pData = pDat
27710 61 2d 3e 7a 3b 0a 20 20 78 2e 6e 44 61 74 61 20  a->z;.  x.nData 
27720 3d 20 70 44 61 74 61 2d 3e 6e 3b 0a 20 20 73 65  = pData->n;.  se
27730 65 6b 52 65 73 75 6c 74 20 3d 20 28 28 70 4f 70  ekResult = ((pOp
27740 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53  ->p5 & OPFLAG_US
27750 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70  ESEEKRESULT) ? p
27760 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20  C->seekResult : 
27770 30 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 2d  0);.  if( pData-
27780 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
27790 6f 20 29 7b 0a 20 20 20 20 78 2e 6e 5a 65 72 6f  o ){.    x.nZero
277a0 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65 72   = pData->u.nZer
277b0 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  o;.  }else{.    
277c0 78 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  x.nZero = 0;.  }
277d0 0a 20 20 78 2e 70 4b 65 79 20 3d 20 30 3b 0a 20  .  x.pKey = 0;. 
277e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
277f0 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e  eeInsert(pC->uc.
27800 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20  pCursor, &x,.   
27810 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f     (pOp->p5 & (O
27820 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50 46  PFLAG_APPEND|OPF
27830 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
27840 29 29 2c 20 73 65 65 6b 52 65 73 75 6c 74 0a 20  )), seekResult. 
27850 20 29 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72   );.  pC->deferr
27860 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
27870 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
27880 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a  = CACHE_STALE;..
27890 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
278a0 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72  update-hook if r
278b0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
278c0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
278d0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
278e0 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
278f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 78 55    assert( db->xU
27900 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 21 3d 30  pdateCallback!=0
27910 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27920 70 54 61 62 2d 3e 61 43 6f 6c 21 3d 30 20 29 3b  pTab->aCol!=0 );
27930 0a 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65  .    db->xUpdate
27940 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70  Callback(db->pUp
27950 64 61 74 65 41 72 67 2c 0a 20 20 20 20 20 20 20  dateArg,.       
27960 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f      (pOp->p5 & O
27970 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20  PFLAG_ISUPDATE) 
27980 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ? SQLITE_UPDATE 
27990 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  : SQLITE_INSERT,
279a0 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44 62 2c  .           zDb,
279b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 78 2e   pTab->zName, x.
279c0 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 62 72 65  nKey);.  }.  bre
279d0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
279e0 3a 20 44 65 6c 65 74 65 20 50 31 20 50 32 20 50  : Delete P1 P2 P
279f0 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44 65  3 P4 P5.**.** De
27a00 6c 65 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  lete the record 
27a10 61 74 20 77 68 69 63 68 20 74 68 65 20 50 31 20  at which the P1 
27a20 63 75 72 73 6f 72 20 69 73 20 63 75 72 72 65 6e  cursor is curren
27a30 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
27a40 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
27a50 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 20 62  G_SAVEPOSITION b
27a60 69 74 20 6f 66 20 74 68 65 20 50 35 20 70 61 72  it of the P5 par
27a70 61 6d 65 74 65 72 20 69 73 20 73 65 74 2c 20 74  ameter is set, t
27a80 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  hen.** the curso
27a90 72 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  r will be left p
27aa0 6f 69 6e 74 69 6e 67 20 61 74 20 20 65 69 74 68  ointing at  eith
27ab0 65 72 20 74 68 65 20 6e 65 78 74 20 6f 72 20 74  er the next or t
27ac0 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 72  he previous.** r
27ad0 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 61 62  ecord in the tab
27ae0 6c 65 2e 20 49 66 20 69 74 20 69 73 20 6c 65 66  le. If it is lef
27af0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
27b00 65 20 6e 65 78 74 20 72 65 63 6f 72 64 2c 20 74  e next record, t
27b10 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20  hen.** the next 
27b20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Next instruction
27b30 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
27b40 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 69  . As a result, i
27b50 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 69  n this case.** i
27b60 74 20 69 73 20 6f 6b 20 74 6f 20 64 65 6c 65 74  t is ok to delet
27b70 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  e a record from 
27b80 77 69 74 68 69 6e 20 61 20 4e 65 78 74 20 6c 6f  within a Next lo
27b90 6f 70 2e 20 49 66 20 0a 2a 2a 20 4f 50 46 4c 41  op. If .** OPFLA
27ba0 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 20 62  G_SAVEPOSITION b
27bb0 69 74 20 6f 66 20 50 35 20 69 73 20 63 6c 65 61  it of P5 is clea
27bc0 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  r, then the curs
27bd0 6f 72 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 6c 65  or will be.** le
27be0 66 74 20 69 6e 20 61 6e 20 75 6e 64 65 66 69 6e  ft in an undefin
27bf0 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ed state..**.** 
27c00 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 41 55  If the OPFLAG_AU
27c10 58 44 45 4c 45 54 45 20 62 69 74 20 69 73 20 73  XDELETE bit is s
27c20 65 74 20 6f 6e 20 50 35 2c 20 74 68 61 74 20 69  et on P5, that i
27c30 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
27c40 69 73 0a 2a 2a 20 64 65 6c 65 74 65 20 6f 6e 65  is.** delete one
27c50 20 6f 66 20 73 65 76 65 72 61 6c 20 61 73 73 6f   of several asso
27c60 63 69 61 74 65 64 20 77 69 74 68 20 64 65 6c 65  ciated with dele
27c70 74 69 6e 67 20 61 20 74 61 62 6c 65 20 72 6f 77  ting a table row
27c80 20 61 6e 64 20 61 6c 6c 20 69 74 73 0a 2a 2a 20   and all its.** 
27c90 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 65 78  associated index
27ca0 20 65 6e 74 72 69 65 73 2e 20 20 45 78 61 63 74   entries.  Exact
27cb0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ly one of those 
27cc0 64 65 6c 65 74 65 73 20 69 73 20 74 68 65 20 22  deletes is the "
27cd0 70 72 69 6d 61 72 79 22 0a 2a 2a 20 64 65 6c 65  primary".** dele
27ce0 74 65 2e 20 20 54 68 65 20 6f 74 68 65 72 73 20  te.  The others 
27cf0 61 72 65 20 61 6c 6c 20 6f 6e 20 4f 50 46 4c 41  are all on OPFLA
27d00 47 5f 46 4f 52 44 45 4c 45 54 45 20 63 75 72 73  G_FORDELETE curs
27d10 6f 72 73 20 6f 72 20 65 6c 73 65 20 61 72 65 0a  ors or else are.
27d20 2a 2a 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74  ** marked with t
27d30 68 65 20 41 55 58 44 45 4c 45 54 45 20 66 6c 61  he AUXDELETE fla
27d40 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
27d50 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66  OPFLAG_NCHANGE f
27d60 6c 61 67 20 6f 66 20 50 32 20 28 4e 42 3a 20 50  lag of P2 (NB: P
27d70 32 20 6e 6f 74 20 50 35 29 20 69 73 20 73 65 74  2 not P5) is set
27d80 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 0a 2a  , then the row.*
27d90 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69  * change count i
27da0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f  s incremented (o
27db0 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 0a 2a  therwise not)..*
27dc0 2a 0a 2a 2a 20 50 31 20 6d 75 73 74 20 6e 6f 74  *.** P1 must not
27dd0 20 62 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65   be pseudo-table
27de0 2e 20 20 49 74 20 68 61 73 20 74 6f 20 62 65 20  .  It has to be 
27df0 61 20 72 65 61 6c 20 74 61 62 6c 65 20 77 69 74  a real table wit
27e00 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 6f  h.** multiple ro
27e10 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20  ws..**.** If P4 
27e20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
27e30 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20   it points to a 
27e40 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 20 49 6e  Table object. In
27e50 20 74 68 69 73 20 63 61 73 65 20 65 69 74 68 65   this case eithe
27e60 72 20 0a 2a 2a 20 74 68 65 20 75 70 64 61 74 65  r .** the update
27e70 20 6f 72 20 70 72 65 2d 75 70 64 61 74 65 20 68   or pre-update h
27e80 6f 6f 6b 2c 20 6f 72 20 62 6f 74 68 2c 20 6d 61  ook, or both, ma
27e90 79 20 62 65 20 69 6e 76 6f 6b 65 64 2e 20 54 68  y be invoked. Th
27ea0 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74  e P1 cursor must
27eb0 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 70 6f  .** have been po
27ec0 73 69 74 69 6f 6e 65 64 20 75 73 69 6e 67 20 4f  sitioned using O
27ed0 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72 69 6f 72  P_NotFound prior
27ee0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
27ef0 73 20 6f 70 63 6f 64 65 20 69 6e 20 0a 2a 2a 20  s opcode in .** 
27f00 74 68 69 73 20 63 61 73 65 2e 20 53 70 65 63 69  this case. Speci
27f10 66 69 63 61 6c 6c 79 2c 20 69 66 20 6f 6e 65 20  fically, if one 
27f20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  is configured, t
27f30 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  he pre-update ho
27f40 6f 6b 20 69 73 20 0a 2a 2a 20 69 6e 76 6f 6b 65  ok is .** invoke
27f50 64 20 69 66 20 50 34 20 69 73 20 6e 6f 74 20 4e  d if P4 is not N
27f60 55 4c 4c 2e 20 54 68 65 20 75 70 64 61 74 65 2d  ULL. The update-
27f70 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  hook is invoked 
27f80 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e 66 69 67  if one is config
27f90 75 72 65 64 2c 20 0a 2a 2a 20 50 34 20 69 73 20  ured, .** P4 is 
27fa0 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 74 68  not NULL, and th
27fb0 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  e OPFLAG_NCHANGE
27fc0 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
27fd0 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P2..**.** If the
27fe0 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45   OPFLAG_ISUPDATE
27ff0 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
28000 50 32 2c 20 74 68 65 6e 20 50 33 20 63 6f 6e 74  P2, then P3 cont
28010 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73  ains the address
28020 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72  .** of the memor
28030 79 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74  y cell that cont
28040 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74  ains the value t
28050 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
28060 20 74 68 65 20 72 6f 77 20 77 69 6c 6c 0a 2a 2a   the row will.**
28070 20 62 65 20 73 65 74 20 74 6f 20 62 79 20 74 68   be set to by th
28080 65 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 63 61 73  e update..*/.cas
28090 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20 7b 0a 20  e OP_Delete: {. 
280a0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
280b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
280c0 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  Db;.  Table *pTa
280d0 62 3b 0a 20 20 69 6e 74 20 6f 70 66 6c 61 67 73  b;.  int opflags
280e0 3b 0a 0a 20 20 6f 70 66 6c 61 67 73 20 3d 20 70  ;..  opflags = p
280f0 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74  Op->p2;.  assert
28100 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
28110 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
28120 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
28130 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
28140 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
28150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
28160 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
28170 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
28180 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75  sert( pC->uc.pCu
28190 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
281a0 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
281b0 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
281c0 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57  sqlite3VdbeIncrW
281d0 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 70  riteCounter(p, p
281e0 43 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  C);..#ifdef SQLI
281f0 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
28200 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54  Op->p4type==P4_T
28210 41 42 4c 45 20 26 26 20 48 61 73 52 6f 77 69 64  ABLE && HasRowid
28220 28 70 4f 70 2d 3e 70 34 2e 70 54 61 62 29 20 26  (pOp->p4.pTab) &
28230 26 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 7b 0a  & pOp->p5==0 ){.
28240 20 20 20 20 2f 2a 20 49 66 20 70 35 20 69 73 20      /* If p5 is 
28250 7a 65 72 6f 2c 20 74 68 65 20 73 65 65 6b 20 6f  zero, the seek o
28260 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 70 6f  peration that po
28270 73 69 74 69 6f 6e 65 64 20 74 68 65 20 63 75 72  sitioned the cur
28280 73 6f 72 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  sor prior to.   
28290 20 2a 2a 20 4f 50 5f 44 65 6c 65 74 65 20 77 69   ** OP_Delete wi
282a0 6c 6c 20 68 61 76 65 20 61 6c 73 6f 20 73 65 74  ll have also set
282b0 20 74 68 65 20 70 43 2d 3e 6d 6f 76 65 74 6f 54   the pC->movetoT
282c0 61 72 67 65 74 20 66 69 65 6c 64 20 74 6f 20 74  arget field to t
282d0 68 65 20 72 6f 77 69 64 20 6f 66 0a 20 20 20 20  he rowid of.    
282e0 2a 2a 20 74 68 65 20 72 6f 77 20 74 68 61 74 20  ** the row that 
282f0 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
28300 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 4b 65 79   */.    i64 iKey
28310 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
28320 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63  ntegerKey(pC->uc
28330 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 61  .pCursor);.    a
28340 73 73 65 72 74 28 20 70 43 2d 3e 6d 6f 76 65 74  ssert( pC->movet
28350 6f 54 61 72 67 65 74 3d 3d 69 4b 65 79 20 29 3b  oTarget==iKey );
28360 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
28370 2a 20 49 66 20 74 68 65 20 75 70 64 61 74 65 2d  * If the update-
28380 68 6f 6f 6b 20 6f 72 20 70 72 65 2d 75 70 64 61  hook or pre-upda
28390 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20  te-hook will be 
283a0 69 6e 76 6f 6b 65 64 2c 20 73 65 74 20 7a 44 62  invoked, set zDb
283b0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d   to.  ** the nam
283c0 65 20 6f 66 20 74 68 65 20 64 62 20 74 6f 20 70  e of the db to p
283d0 61 73 73 20 61 73 20 74 6f 20 69 74 2e 20 41 6c  ass as to it. Al
283e0 73 6f 20 73 65 74 20 6c 6f 63 61 6c 20 70 54 61  so set local pTa
283f0 62 20 74 6f 20 61 20 63 6f 70 79 0a 20 20 2a 2a  b to a copy.  **
28400 20 6f 66 20 70 34 2e 70 54 61 62 2e 20 46 69 6e   of p4.pTab. Fin
28410 61 6c 6c 79 2c 20 69 66 20 70 35 20 69 73 20 74  ally, if p5 is t
28420 72 75 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  rue, indicating 
28430 74 68 61 74 20 74 68 69 73 20 63 75 72 73 6f 72  that this cursor
28440 20 77 61 73 0a 20 20 2a 2a 20 6c 61 73 74 20 6d   was.  ** last m
28450 6f 76 65 64 20 77 69 74 68 20 4f 50 5f 4e 65 78  oved with OP_Nex
28460 74 20 6f 72 20 4f 50 5f 50 72 65 76 2c 20 6e 6f  t or OP_Prev, no
28470 74 20 53 65 65 6b 20 6f 72 20 4e 6f 74 46 6f 75  t Seek or NotFou
28480 6e 64 2c 20 73 65 74 20 0a 20 20 2a 2a 20 56 64  nd, set .  ** Vd
28490 62 65 43 75 72 73 6f 72 2e 6d 6f 76 65 74 6f 54  beCursor.movetoT
284a0 61 72 67 65 74 20 74 6f 20 74 68 65 20 63 75 72  arget to the cur
284b0 72 65 6e 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a  rent rowid.  */.
284c0 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
284d0 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26 26 20 48  e==P4_TABLE && H
284e0 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 28 64  AS_UPDATE_HOOK(d
284f0 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b) ){.    assert
28500 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a  ( pC->iDb>=0 );.
28510 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
28520 3e 70 34 2e 70 54 61 62 21 3d 30 20 29 3b 0a 20  >p4.pTab!=0 );. 
28530 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62     zDb = db->aDb
28540 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e 61  [pC->iDb].zDbSNa
28550 6d 65 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  me;.    pTab = p
28560 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20 20 20  Op->p4.pTab;.   
28570 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20   if( (pOp->p5 & 
28580 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
28590 49 4f 4e 29 21 3d 30 20 26 26 20 70 43 2d 3e 69  ION)!=0 && pC->i
285a0 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  sTable ){.      
285b0 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
285c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
285d0 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63  ntegerKey(pC->uc
285e0 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  .pCursor);.    }
285f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
28600 62 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 6f 74 20  b = 0;   /* Not 
28610 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65  needed.  Silence
28620 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e   a compiler warn
28630 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62  ing. */.    pTab
28640 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65   = 0;  /* Not ne
28650 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61  eded.  Silence a
28660 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
28670 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65  g. */.  }..#ifde
28680 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
28690 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
286a0 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70   /* Invoke the p
286b0 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69  re-update-hook i
286c0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
286d0 20 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70 64   if( db->xPreUpd
286e0 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70  ateCallback && p
286f0 4f 70 2d 3e 70 34 2e 70 54 61 62 20 29 7b 0a 20  Op->p4.pTab ){. 
28700 20 20 20 61 73 73 65 72 74 28 20 21 28 6f 70 66     assert( !(opf
28710 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 49 53  lags & OPFLAG_IS
28720 55 50 44 41 54 45 29 20 0a 20 20 20 20 20 20 20  UPDATE) .       
28730 20 20 7c 7c 20 48 61 73 52 6f 77 69 64 28 70 54    || HasRowid(pT
28740 61 62 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ab)==0 .        
28750 20 7c 7c 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70   || (aMem[pOp->p
28760 33 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3].flags & MEM_I
28770 6e 74 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  nt) .    );.    
28780 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70  sqlite3VdbePreUp
28790 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 0a  dateHook(p, pC,.
287a0 20 20 20 20 20 20 20 20 28 6f 70 66 6c 61 67 73          (opflags
287b0 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41   & OPFLAG_ISUPDA
287c0 54 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50 44  TE) ? SQLITE_UPD
287d0 41 54 45 20 3a 20 53 51 4c 49 54 45 5f 44 45 4c  ATE : SQLITE_DEL
287e0 45 54 45 2c 20 0a 20 20 20 20 20 20 20 20 7a 44  ETE, .        zD
287f0 62 2c 20 70 54 61 62 2c 20 70 43 2d 3e 6d 6f 76  b, pTab, pC->mov
28800 65 74 6f 54 61 72 67 65 74 2c 0a 20 20 20 20 20  etoTarget,.     
28810 20 20 20 70 4f 70 2d 3e 70 33 0a 20 20 20 20 29     pOp->p3.    )
28820 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 66 6c  ;.  }.  if( opfl
28830 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e  ags & OPFLAG_ISN
28840 4f 4f 50 20 29 20 62 72 65 61 6b 3b 0a 23 65 6e  OOP ) break;.#en
28850 64 69 66 0a 20 0a 20 20 2f 2a 20 4f 6e 6c 79 20  dif. .  /* Only 
28860 66 6c 61 67 73 20 74 68 61 74 20 63 61 6e 20 62  flags that can b
28870 65 20 73 65 74 20 61 72 65 20 53 41 56 45 50 4f  e set are SAVEPO
28880 49 53 54 49 4f 4e 20 61 6e 64 20 41 55 58 44 45  ISTION and AUXDE
28890 4c 45 54 45 20 2a 2f 20 0a 20 20 61 73 73 65 72  LETE */ .  asser
288a0 74 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 7e 28  t( (pOp->p5 & ~(
288b0 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
288c0 49 4f 4e 7c 4f 50 46 4c 41 47 5f 41 55 58 44 45  ION|OPFLAG_AUXDE
288d0 4c 45 54 45 29 29 3d 3d 30 20 29 3b 0a 20 20 61  LETE))==0 );.  a
288e0 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 53 41  ssert( OPFLAG_SA
288f0 56 45 50 4f 53 49 54 49 4f 4e 3d 3d 42 54 52 45  VEPOSITION==BTRE
28900 45 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 20 29  E_SAVEPOSITION )
28910 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c  ;.  assert( OPFL
28920 41 47 5f 41 55 58 44 45 4c 45 54 45 3d 3d 42 54  AG_AUXDELETE==BT
28930 52 45 45 5f 41 55 58 44 45 4c 45 54 45 20 29 3b  REE_AUXDELETE );
28940 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
28950 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 70  DEBUG.  if( p->p
28960 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Frame==0 ){.    
28970 69 66 28 20 70 43 2d 3e 69 73 45 70 68 65 6d 65  if( pC->isEpheme
28980 72 61 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  ral==0.        &
28990 26 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  & (pOp->p5 & OPF
289a0 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 29 3d 3d  LAG_AUXDELETE)==
289b0 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 70 43  0.        && (pC
289c0 2d 3e 77 72 46 6c 61 67 20 26 20 4f 50 46 4c 41  ->wrFlag & OPFLA
289d0 47 5f 46 4f 52 44 45 4c 45 54 45 29 3d 3d 30 0a  G_FORDELETE)==0.
289e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e        ){.      n
289f0 45 78 74 72 61 44 65 6c 65 74 65 2b 2b 3b 0a 20  ExtraDelete++;. 
28a00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
28a10 2d 3e 70 32 20 26 20 4f 50 46 4c 41 47 5f 4e 43  ->p2 & OPFLAG_NC
28a20 48 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 6e  HANGE ){.      n
28a30 45 78 74 72 61 44 65 6c 65 74 65 2d 2d 3b 0a 20  ExtraDelete--;. 
28a40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
28a50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
28a60 74 72 65 65 44 65 6c 65 74 65 28 70 43 2d 3e 75  treeDelete(pC->u
28a70 63 2e 70 43 75 72 73 6f 72 2c 20 70 4f 70 2d 3e  c.pCursor, pOp->
28a80 70 35 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65  p5);.  pC->cache
28a90 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
28aa0 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 73 65 65 6b  TALE;.  pC->seek
28ab0 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 66  Result = 0;.  if
28ac0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
28ad0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
28ae0 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
28af0 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20   update-hook if 
28b00 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
28b10 66 28 20 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  f( opflags & OPF
28b20 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20  LAG_NCHANGE ){. 
28b30 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b     p->nChange++;
28b40 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 78 55 70  .    if( db->xUp
28b50 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20  dateCallback && 
28b60 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
28b70 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78 55 70 64  {.      db->xUpd
28b80 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ateCallback(db->
28b90 70 55 70 64 61 74 65 41 72 67 2c 20 53 51 4c 49  pUpdateArg, SQLI
28ba0 54 45 5f 44 45 4c 45 54 45 2c 20 7a 44 62 2c 20  TE_DELETE, zDb, 
28bb0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
28bc0 20 20 20 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74         pC->movet
28bd0 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  oTarget);.      
28be0 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e  assert( pC->iDb>
28bf0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
28c00 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f  .  break;.}./* O
28c10 70 63 6f 64 65 3a 20 52 65 73 65 74 43 6f 75 6e  pcode: ResetCoun
28c20 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  t * * * * *.**.*
28c30 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * The value of t
28c40 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
28c50 72 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74  r is copied to t
28c60 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
28c70 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75  le.** change cou
28c80 6e 74 65 72 20 28 72 65 74 75 72 6e 65 64 20 62  nter (returned b
28c90 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
28ca0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 68  ls to sqlite3_ch
28cb0 61 6e 67 65 73 28 29 29 2e 0a 2a 2a 20 54 68 65  anges())..** The
28cc0 6e 20 74 68 65 20 56 4d 73 20 69 6e 74 65 72 6e  n the VMs intern
28cd0 61 6c 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  al change counte
28ce0 72 20 72 65 73 65 74 73 20 74 6f 20 30 2e 0a 2a  r resets to 0..*
28cf0 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
28d00 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
28d10 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ms..*/.case OP_R
28d20 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 73  esetCount: {.  s
28d30 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
28d40 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
28d50 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  nge);.  p->nChan
28d60 67 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b  ge = 0;.  break;
28d70 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
28d80 6f 72 74 65 72 43 6f 6d 70 61 72 65 20 50 31 20  orterCompare P1 
28d90 50 32 20 50 33 20 50 34 0a 2a 2a 20 53 79 6e 6f  P2 P3 P4.** Syno
28da0 70 73 69 73 3a 20 69 66 20 6b 65 79 28 50 31 29  psis: if key(P1)
28db0 21 3d 74 72 69 6d 28 72 5b 50 33 5d 2c 50 34 29  !=trim(r[P3],P4)
28dc0 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 50   goto P2.**.** P
28dd0 31 20 69 73 20 61 20 73 6f 72 74 65 72 20 63 75  1 is a sorter cu
28de0 72 73 6f 72 2e 20 54 68 69 73 20 69 6e 73 74 72  rsor. This instr
28df0 75 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  uction compares 
28e00 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a  a prefix of the.
28e10 2a 2a 20 72 65 63 6f 72 64 20 62 6c 6f 62 20 69  ** record blob i
28e20 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61 67  n register P3 ag
28e30 61 69 6e 73 74 20 61 20 70 72 65 66 69 78 20 6f  ainst a prefix o
28e40 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  f the entry that
28e50 20 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65 72 20   .** the sorter 
28e60 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
28e70 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4f 6e 6c   points to.  Onl
28e80 79 20 74 68 65 20 66 69 72 73 74 20 50 34 20 66  y the first P4 f
28e90 69 65 6c 64 73 0a 2a 2a 20 6f 66 20 72 5b 50 33  ields.** of r[P3
28ea0 5d 20 61 6e 64 20 74 68 65 20 73 6f 72 74 65 72  ] and the sorter
28eb0 20 72 65 63 6f 72 64 20 61 72 65 20 63 6f 6d 70   record are comp
28ec0 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  ared..**.** If e
28ed0 69 74 68 65 72 20 50 33 20 6f 72 20 74 68 65 20  ither P3 or the 
28ee0 73 6f 72 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  sorter contains 
28ef0 61 20 4e 55 4c 4c 20 69 6e 20 6f 6e 65 20 6f 66  a NULL in one of
28f00 20 74 68 65 69 72 20 73 69 67 6e 69 66 69 63 61   their significa
28f10 6e 74 0a 2a 2a 20 66 69 65 6c 64 73 20 28 6e 6f  nt.** fields (no
28f20 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 20 50  t counting the P
28f30 34 20 66 69 65 6c 64 73 20 61 74 20 74 68 65 20  4 fields at the 
28f40 65 6e 64 20 77 68 69 63 68 20 61 72 65 20 69 67  end which are ig
28f50 6e 6f 72 65 64 29 20 74 68 65 6e 0a 2a 2a 20 74  nored) then.** t
28f60 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
28f70 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 65   assumed to be e
28f80 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c  qual..**.** Fall
28f90 20 74 68 72 6f 75 67 68 20 74 6f 20 6e 65 78 74   through to next
28fa0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 66 20   instruction if 
28fb0 74 68 65 20 74 77 6f 20 72 65 63 6f 72 64 73 20  the two records 
28fc0 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
28fd0 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 2e 20  .** each other. 
28fe0 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
28ff0 68 65 79 20 61 72 65 20 64 69 66 66 65 72 65 6e  hey are differen
29000 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  t..*/.case OP_So
29010 72 74 65 72 43 6f 6d 70 61 72 65 3a 20 7b 0a 20  rterCompare: {. 
29020 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
29030 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e  .  int res;.  in
29040 74 20 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 70 43  t nKeyCol;..  pC
29050 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
29060 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
29070 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a  isSorter(pC) );.
29080 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
29090 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
290a0 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  );.  pIn3 = &aMe
290b0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6e 4b  m[pOp->p3];.  nK
290c0 65 79 43 6f 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  eyCol = pOp->p4.
290d0 69 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20  i;.  res = 0;.  
290e0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
290f0 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 28 70 43  SorterCompare(pC
29100 2c 20 70 49 6e 33 2c 20 6e 4b 65 79 43 6f 6c 2c  , pIn3, nKeyCol,
29110 20 26 72 65 73 29 3b 0a 20 20 56 64 62 65 42 72   &res);.  VdbeBr
29120 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30  anchTaken(res!=0
29130 2c 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ,2);.  if( rc ) 
29140 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
29150 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72  o_error;.  if( r
29160 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  es ) goto jump_t
29170 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
29180 3b 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f  ;../* Opcode: So
29190 72 74 65 72 44 61 74 61 20 50 31 20 50 32 20 50  rterData P1 P2 P
291a0 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
291b0 73 3a 20 72 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a  s: r[P2]=data.**
291c0 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
291d0 65 67 69 73 74 65 72 20 50 32 20 74 68 65 20 63  egister P2 the c
291e0 75 72 72 65 6e 74 20 73 6f 72 74 65 72 20 64 61  urrent sorter da
291f0 74 61 20 66 6f 72 20 73 6f 72 74 65 72 20 63 75  ta for sorter cu
29200 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 6e  rsor P1..** Then
29210 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   clear the colum
29220 6e 20 68 65 61 64 65 72 20 63 61 63 68 65 20 6f  n header cache o
29230 6e 20 63 75 72 73 6f 72 20 50 33 2e 0a 2a 2a 0a  n cursor P3..**.
29240 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
29250 73 20 6e 6f 72 6d 61 6c 6c 79 20 75 73 65 20 74  s normally use t
29260 6f 20 6d 6f 76 65 20 61 20 72 65 63 6f 72 64 20  o move a record 
29270 6f 75 74 20 6f 66 20 74 68 65 20 73 6f 72 74 65  out of the sorte
29280 72 20 61 6e 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  r and into.** a 
29290 72 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73  register that is
292a0 20 74 68 65 20 73 6f 75 72 63 65 20 66 6f 72 20   the source for 
292b0 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63  a pseudo-table c
292c0 75 72 73 6f 72 20 63 72 65 61 74 65 64 20 75 73  ursor created us
292d0 69 6e 67 0a 2a 2a 20 4f 70 65 6e 50 73 65 75 64  ing.** OpenPseud
292e0 6f 2e 20 20 54 68 61 74 20 70 73 65 75 64 6f 2d  o.  That pseudo-
292f0 74 61 62 6c 65 20 63 75 72 73 6f 72 20 69 73 20  table cursor is 
29300 74 68 65 20 6f 6e 65 20 74 68 61 74 20 69 73 20  the one that is 
29310 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
29320 20 70 61 72 61 6d 65 74 65 72 20 50 33 2e 20 20   parameter P3.  
29330 43 6c 65 61 72 69 6e 67 20 74 68 65 20 50 33 20  Clearing the P3 
29340 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 73 20  column cache as 
29350 70 61 72 74 20 6f 66 20 74 68 69 73 20 6f 70 63  part of this opc
29360 6f 64 65 20 73 61 76 65 73 0a 2a 2a 20 75 73 20  ode saves.** us 
29370 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 69  from having to i
29380 73 73 75 65 20 61 20 73 65 70 61 72 61 74 65 20  ssue a separate 
29390 4e 75 6c 6c 52 6f 77 20 69 6e 73 74 72 75 63 74  NullRow instruct
293a0 69 6f 6e 20 74 6f 20 63 6c 65 61 72 20 74 68 61  ion to clear tha
293b0 74 20 63 61 63 68 65 2e 0a 2a 2f 0a 63 61 73 65  t cache..*/.case
293c0 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 3a 20   OP_SorterData: 
293d0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
293e0 70 43 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61  pC;..  pOut = &a
293f0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
29400 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
29410 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
29420 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29  ( isSorter(pC) )
29430 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
29440 56 64 62 65 53 6f 72 74 65 72 52 6f 77 6b 65 79  VdbeSorterRowkey
29450 28 70 43 2c 20 70 4f 75 74 29 3b 0a 20 20 61 73  (pC, pOut);.  as
29460 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
29470 5f 4f 4b 20 7c 7c 20 28 70 4f 75 74 2d 3e 66 6c  _OK || (pOut->fl
29480 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 20  ags & MEM_Blob) 
29490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
294a0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
294b0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
294c0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
294d0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
294e0 72 6f 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72 5b  ror;.  p->apCsr[
294f0 70 4f 70 2d 3e 70 33 5d 2d 3e 63 61 63 68 65 53  pOp->p3]->cacheS
29500 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
29510 41 4c 45 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ALE;.  break;.}.
29520 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 44  ./* Opcode: RowD
29530 61 74 61 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ata P1 P2 P3 * *
29540 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
29550 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57  P2]=data.**.** W
29560 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73 74  rite into regist
29570 65 72 20 50 32 20 74 68 65 20 63 6f 6d 70 6c 65  er P2 the comple
29580 74 65 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 66  te row content f
29590 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 0a 2a  or the row at .*
295a0 2a 20 77 68 69 63 68 20 63 75 72 73 6f 72 20 50  * which cursor P
295b0 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
295c0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 20 54 68 65 72  ointing..** Ther
295d0 65 20 69 73 20 6e 6f 20 69 6e 74 65 72 70 72 65  e is no interpre
295e0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
295f0 74 61 2e 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a  ta.  .** It is j
29600 75 73 74 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20  ust copied onto 
29610 74 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20  the P2 register 
29620 65 78 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69  exactly as .** i
29630 74 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  t is found in th
29640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29650 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
29660 20 50 31 20 69 73 20 61 6e 20 69 6e 64 65 78 2c   P1 is an index,
29670 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
29680 74 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66 20  t is the key of 
29690 74 68 65 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 63  the row..** If c
296a0 75 72 73 6f 72 20 50 32 20 69 73 20 61 20 74 61  ursor P2 is a ta
296b0 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ble, then the co
296c0 6e 74 65 6e 74 20 65 78 74 72 61 63 74 65 64 20  ntent extracted 
296d0 69 73 20 74 68 65 20 64 61 74 61 2e 0a 2a 2a 0a  is the data..**.
296e0 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63 75 72  ** If the P1 cur
296f0 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e  sor must be poin
29700 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20  ting to a valid 
29710 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20  row (not a NULL 
29720 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61  row).** of a rea
29730 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70  l table, not a p
29740 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a  seudo-table..**.
29750 2a 2a 20 49 66 20 50 33 21 3d 30 20 74 68 65 6e  ** If P3!=0 then
29760 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   this opcode is 
29770 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 6b 65 20  allowed to make 
29780 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 70 6f 69  an ephemeral poi
29790 6e 74 65 72 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  nter.** into the
297a0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
297b0 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   That means that
297c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
297d0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 72 65  the output.** re
297e0 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 69  gister will be i
297f0 6e 76 61 6c 69 64 61 74 65 64 20 61 73 20 73 6f  nvalidated as so
29800 6f 6e 20 61 73 20 74 68 65 20 63 75 72 73 6f 72  on as the cursor
29810 20 6d 6f 76 65 73 20 2d 20 69 6e 63 6c 75 64 69   moves - includi
29820 6e 67 0a 2a 2a 20 6d 6f 76 65 73 20 63 61 75 73  ng.** moves caus
29830 65 64 20 62 79 20 6f 74 68 65 72 20 63 75 72 73  ed by other curs
29840 6f 72 73 20 74 68 61 74 20 22 73 61 76 65 22 20  ors that "save" 
29850 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
29860 6f 72 73 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20  ors.** position 
29870 69 6e 20 6f 72 64 65 72 20 74 68 61 74 20 74 68  in order that th
29880 65 79 20 63 61 6e 20 77 72 69 74 65 20 74 6f 20  ey can write to 
29890 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
298a0 20 49 66 20 50 33 3d 3d 30 0a 2a 2a 20 74 68 65   If P3==0.** the
298b0 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
298c0 64 61 74 61 20 69 73 20 6d 61 64 65 20 69 6e 74  data is made int
298d0 6f 20 6d 65 6d 6f 72 79 2e 20 20 50 33 21 3d 30  o memory.  P3!=0
298e0 20 69 73 20 66 61 73 74 65 72 2c 20 62 75 74 0a   is faster, but.
298f0 2a 2a 20 50 33 3d 3d 30 20 69 73 20 73 61 66 65  ** P3==0 is safe
29900 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 21 3d  r..**.** If P3!=
29910 30 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  0 then the conte
29920 6e 74 20 6f 66 20 74 68 65 20 50 32 20 72 65 67  nt of the P2 reg
29930 69 73 74 65 72 20 69 73 20 75 6e 73 75 69 74 61  ister is unsuita
29940 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69  ble for use.** i
29950 6e 20 4f 50 5f 52 65 73 75 6c 74 20 61 6e 64 20  n OP_Result and 
29960 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74 20 77 69  any OP_Result wi
29970 6c 6c 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  ll invalidate th
29980 65 20 50 32 20 72 65 67 69 73 74 65 72 20 63 6f  e P2 register co
29990 6e 74 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 50 32  ntent..** The P2
299a0 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e   register conten
299b0 74 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64  t is invalidated
299c0 20 62 79 20 6f 70 63 6f 64 65 73 20 6c 69 6b 65   by opcodes like
299d0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 72 0a   OP_Function or.
299e0 2a 2a 20 62 79 20 61 6e 79 20 75 73 65 20 6f 66  ** by any use of
299f0 20 61 6e 6f 74 68 65 72 20 63 75 72 73 6f 72 20   another cursor 
29a00 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
29a10 73 61 6d 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63  same table..*/.c
29a20 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61 3a 20  ase OP_RowData: 
29a30 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
29a40 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
29a50 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e 3b 0a  pCrsr;.  u32 n;.
29a60 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
29a70 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
29a80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
29a90 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
29aa0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
29ab0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
29ac0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
29ad0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
29ae0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
29af0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
29b00 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
29b10 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d 30   isSorter(pC)==0
29b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29b30 2d 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a  ->nullRow==0 );.
29b40 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63    assert( pC->uc
29b50 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
29b60 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e   pCrsr = pC->uc.
29b70 70 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 54  pCursor;..  /* T
29b80 68 65 20 4f 50 5f 52 6f 77 44 61 74 61 20 6f 70  he OP_RowData op
29b90 63 6f 64 65 73 20 61 6c 77 61 79 73 20 66 6f 6c  codes always fol
29ba0 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  low OP_NotExists
29bb0 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 53 65 65 6b   or.  ** OP_Seek
29bc0 52 6f 77 69 64 20 6f 72 20 4f 50 5f 52 65 77 69  Rowid or OP_Rewi
29bd0 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74 68 20  nd/Op_Next with 
29be0 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 69  no intervening i
29bf0 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
29c00 20 74 68 61 74 20 6d 69 67 68 74 20 69 6e 76 61   that might inva
29c10 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f  lidate the curso
29c20 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  r..  ** If this 
29c30 77 68 65 72 65 20 6e 6f 74 20 74 68 65 20 63 61  where not the ca
29c40 73 65 2c 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f  se, on of the fo
29c50 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
29c60 73 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 66 61 69  s.  ** would fai
29c70 6c 2e 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20  l.  Should this 
29c80 65 76 65 72 20 63 68 61 6e 67 65 20 28 62 65 63  ever change (bec
29c90 61 75 73 65 20 6f 66 20 63 68 61 6e 67 65 73 20  ause of changes 
29ca0 69 6e 20 74 68 65 20 63 6f 64 65 0a 20 20 2a 2a  in the code.  **
29cb0 20 67 65 6e 65 72 61 74 6f 72 29 20 74 68 65 6e   generator) then
29cc0 20 74 68 65 20 66 69 78 20 77 6f 75 6c 64 20 62   the fix would b
29cd0 65 20 74 6f 20 69 6e 73 65 72 74 20 61 20 63 61  e to insert a ca
29ce0 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74  ll to.  ** sqlit
29cf0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
29d00 74 6f 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  to()..  */.  ass
29d10 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
29d20 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
29d30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
29d40 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
29d50 64 28 70 43 72 73 72 29 20 29 3b 0a 23 69 66 20  d(pCrsr) );.#if 
29d60 30 20 20 2f 2a 20 4e 6f 74 20 72 65 71 75 69 72  0  /* Not requir
29d70 65 64 20 64 75 65 20 74 6f 20 74 68 65 20 70 72  ed due to the pr
29d80 65 76 69 6f 75 73 20 74 6f 20 61 73 73 65 72 74  evious to assert
29d90 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
29da0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
29db0 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
29dc0 70 43 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  pC);.  if( rc!=S
29dd0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
29de0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
29df0 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 20  or;.#endif..  n 
29e00 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
29e10 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73 72 29  yloadSize(pCrsr)
29e20 3b 0a 20 20 69 66 28 20 6e 3e 28 75 33 32 29 64  ;.  if( n>(u32)d
29e30 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
29e40 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
29e50 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
29e60 69 67 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  ig;.  }.  testca
29e70 73 65 28 20 6e 3d 3d 30 20 29 3b 0a 20 20 72 63  se( n==0 );.  rc
29e80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
29e90 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72 73 72  mFromBtree(pCrsr
29ea0 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 29 3b 0a 20  , 0, n, pOut);. 
29eb0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
29ec0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
29ed0 72 3b 0a 20 20 69 66 28 20 21 70 4f 70 2d 3e 70  r;.  if( !pOp->p
29ee0 33 20 29 20 44 65 65 70 68 65 6d 65 72 61 6c 69  3 ) Deephemerali
29ef0 7a 65 28 70 4f 75 74 29 3b 0a 20 20 55 50 44 41  ze(pOut);.  UPDA
29f00 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
29f10 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53 54 45  pOut);.  REGISTE
29f20 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
29f30 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b   pOut);.  break;
29f40 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
29f50 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  owid P1 P2 * * *
29f60 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
29f70 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  P2]=rowid.**.** 
29f80 53 74 6f 72 65 20 69 6e 20 72 65 67 69 73 74 65  Store in registe
29f90 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20  r P2 an integer 
29fa0 77 68 69 63 68 20 69 73 20 74 68 65 20 6b 65 79  which is the key
29fb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e   of the table en
29fc0 74 72 79 20 74 68 61 74 0a 2a 2a 20 50 31 20 69  try that.** P1 i
29fd0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
29fe0 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63  t to..**.** P1 c
29ff0 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  an be either an 
2a000 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
2a010 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
2a020 65 2e 20 20 54 68 65 72 65 20 75 73 65 64 20 74  e.  There used t
2a030 6f 0a 2a 2a 20 62 65 20 61 20 73 65 70 61 72 61  o.** be a separa
2a040 74 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f 70 63  te OP_VRowid opc
2a050 6f 64 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ode for use with
2a060 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c   virtual tables,
2a070 20 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f 6e 65   but this.** one
2a080 20 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f 72 6b   opcode now work
2a090 73 20 66 6f 72 20 62 6f 74 68 20 74 61 62 6c 65  s for both table
2a0a0 20 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73 65 20   types..*/.case 
2a0b0 4f 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20 20 20  OP_Rowid: {     
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2a0d0 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ut2 */.  VdbeCur
2a0e0 73 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34 20 76  sor *pC;.  i64 v
2a0f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
2a100 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74   *pVtab;.  const
2a110 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
2a120 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70 4f 75  *pModule;..  pOu
2a130 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
2a140 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73  se(p, pOp);.  as
2a150 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2a160 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2a170 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2a180 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2a190 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2a1a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2a1b0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43   pC->eCurType!=C
2a1c0 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c  URTYPE_PSEUDO ||
2a1d0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a   pC->nullRow );.
2a1e0 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f    if( pC->nullRo
2a1f0 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  w ){.    pOut->f
2a200 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
2a210 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65  .    break;.  }e
2a220 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65 66 65  lse if( pC->defe
2a230 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
2a240 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f    v = pC->moveto
2a250 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20  Target;.#ifndef 
2a260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2a270 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65  UALTABLE.  }else
2a280 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54 79 70   if( pC->eCurTyp
2a290 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20  e==CURTYPE_VTAB 
2a2a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2a2b0 43 2d 3e 75 63 2e 70 56 43 75 72 21 3d 30 20 29  C->uc.pVCur!=0 )
2a2c0 3b 0a 20 20 20 20 70 56 74 61 62 20 3d 20 70 43  ;.    pVtab = pC
2a2d0 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61  ->uc.pVCur->pVta
2a2e0 62 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 20 3d  b;.    pModule =
2a2f0 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b   pVtab->pModule;
2a300 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 6f  .    assert( pMo
2a310 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29 3b 0a  dule->xRowid );.
2a320 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65      rc = pModule
2a330 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 75 63 2e  ->xRowid(pC->uc.
2a340 70 56 43 75 72 2c 20 26 76 29 3b 0a 20 20 20 20  pVCur, &v);.    
2a350 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
2a360 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
2a370 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2a380 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2a390 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66 20  o_error;.#endif 
2a3a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
2a3b0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20  IRTUALTABLE */. 
2a3c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2a3d0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2a3e0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2a3f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2a400 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
2a410 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2a420 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
2a430 73 74 6f 72 65 28 70 43 29 3b 0a 20 20 20 20 69  store(pC);.    i
2a440 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
2a450 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2a460 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c  .    if( pC->nul
2a470 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 4f  lRow ){.      pO
2a480 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
2a490 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
2a4a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 20 3d  k;.    }.    v =
2a4b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
2a4c0 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70  egerKey(pC->uc.p
2a4d0 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  Cursor);.  }.  p
2a4e0 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20  Out->u.i = v;.  
2a4f0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2a500 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31 20  ode: NullRow P1 
2a510 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f  * * * *.**.** Mo
2a520 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 50 31  ve the cursor P1
2a530 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20   to a null row. 
2a540 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   Any OP_Column o
2a550 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61  perations.** tha
2a560 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20 74 68  t occur while th
2a570 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 20 74  e cursor is on t
2a580 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c 6c  he null row will
2a590 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74 65   always.** write
2a5a0 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65   a NULL..*/.case
2a5b0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20   OP_NullRow: {. 
2a5c0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
2a5d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
2a5e0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2a5f0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2a600 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2a610 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2a620 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
2a630 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  C->nullRow = 1;.
2a640 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
2a650 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
2a660 0a 20 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54  .  if( pC->eCurT
2a670 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2a680 45 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  EE ){.    assert
2a690 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
2a6a0 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
2a6b0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
2a6c0 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  or(pC->uc.pCurso
2a6d0 72 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  r);.  }.#ifdef S
2a6e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
2a6f0 28 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 30 20  ( pC->seekOp==0 
2a700 29 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f  ) pC->seekOp = O
2a710 50 5f 4e 75 6c 6c 52 6f 77 3b 0a 23 65 6e 64 69  P_NullRow;.#endi
2a720 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  f.  break;.}../*
2a730 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 45 6e 64   Opcode: SeekEnd
2a740 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
2a750 2a 20 50 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f  * Position curso
2a760 72 20 50 31 20 61 74 20 74 68 65 20 65 6e 64 20  r P1 at the end 
2a770 6f 66 20 74 68 65 20 62 74 72 65 65 20 66 6f 72  of the btree for
2a780 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a   the purpose of.
2a790 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 61 20 6e  ** appending a n
2a7a0 65 77 20 65 6e 74 72 79 20 6f 6e 74 6f 20 74 68  ew entry onto th
2a7b0 65 20 62 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  e btree..**.** I
2a7c0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2a7d0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
2a7e0 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 61 70  used only for ap
2a7f0 70 65 6e 64 69 6e 67 20 61 6e 64 20 73 6f 0a 2a  pending and so.*
2a800 2a 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  * if the cursor 
2a810 69 73 20 76 61 6c 69 64 2c 20 74 68 65 6e 20 74  is valid, then t
2a820 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 61  he cursor must a
2a830 6c 72 65 61 64 79 20 62 65 20 70 6f 69 6e 74 69  lready be pointi
2a840 6e 67 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ng.** at the end
2a850 20 6f 66 20 74 68 65 20 62 74 72 65 65 20 61 6e   of the btree an
2a860 64 20 73 6f 20 6e 6f 20 63 68 61 6e 67 65 73 20  d so no changes 
2a870 61 72 65 20 6d 61 64 65 20 74 6f 0a 2a 2a 20 74  are made to.** t
2a880 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 2f 2a  he cursor..*/./*
2a890 20 4f 70 63 6f 64 65 3a 20 4c 61 73 74 20 50 31   Opcode: Last P1
2a8a0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
2a8b0 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20  The next use of 
2a8c0 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c  the Rowid or Col
2a8d0 75 6d 6e 20 6f 72 20 50 72 65 76 20 69 6e 73 74  umn or Prev inst
2a8e0 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a  ruction for P1 .
2a8f0 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f  ** will refer to
2a900 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2a910 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2a920 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a  table or index..
2a930 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
2a940 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74  or index is empt
2a950 79 20 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e  y and P2>0, then
2a960 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
2a970 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50  y to P2..** If P
2a980 32 20 69 73 20 30 20 6f 72 20 69 66 20 74 68 65  2 is 0 or if the
2a990 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2a9a0 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61  is not empty, fa
2a9b0 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f  ll through.** to
2a9c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2a9d0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
2a9e0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65  * This opcode le
2a9f0 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  aves the cursor 
2aa00 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f  configured to mo
2aa10 76 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  ve in reverse or
2aa20 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  der,.** from the
2aa30 20 65 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20   end toward the 
2aa40 62 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f  beginning.  In o
2aa50 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
2aa60 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e  cursor is.** con
2aa70 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 50  figured to use P
2aa80 72 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a  rev, not Next..*
2aa90 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 45 6e  /.case OP_SeekEn
2aaa0 64 3a 0a 63 61 73 65 20 4f 50 5f 4c 61 73 74 3a  d:.case OP_Last:
2aab0 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
2aac0 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
2aad0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
2aae0 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
2aaf0 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
2ab00 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2ab10 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2ab20 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
2ab30 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2ab40 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
2ab50 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
2ab60 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2ab70 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73  _BTREE );.  pCrs
2ab80 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
2ab90 6f 72 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20  or;.  res = 0;. 
2aba0 20 61 73 73 65 72 74 28 20 70 43 72 73 72 21 3d   assert( pCrsr!=
2abb0 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 );.#ifdef SQLI
2abc0 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73  TE_DEBUG.  pC->s
2abd0 65 65 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63  eekOp = pOp->opc
2abe0 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ode;.#endif.  if
2abf0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2ac00 50 5f 53 65 65 6b 45 6e 64 20 29 7b 0a 20 20 20  P_SeekEnd ){.   
2ac10 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
2ac20 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e 73  ==0 );.    pC->s
2ac30 65 65 6b 52 65 73 75 6c 74 20 3d 20 2d 31 3b 0a  eekResult = -1;.
2ac40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
2ac50 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
2ac60 64 4e 4e 28 70 43 72 73 72 29 20 29 7b 0a 20 20  dNN(pCrsr) ){.  
2ac70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2ac80 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
2ac90 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 72  te3BtreeLast(pCr
2aca0 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 70 43 2d  sr, &res);.  pC-
2acb0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72  >nullRow = (u8)r
2acc0 65 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72  es;.  pC->deferr
2acd0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
2ace0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
2acf0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
2ad00 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2ad10 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2ad20 72 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  r;.  if( pOp->p2
2ad30 3e 30 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72  >0 ){.    VdbeBr
2ad40 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30  anchTaken(res!=0
2ad50 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ,2);.    if( res
2ad60 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
2ad70 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
2ad80 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
2ad90 66 53 6d 61 6c 6c 65 72 20 50 31 20 50 32 20 50  fSmaller P1 P2 P
2ada0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 45 73 74 69  3 * *.**.** Esti
2adb0 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
2adc0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2add0 61 62 6c 65 20 50 31 2e 20 20 4a 75 6d 70 20 74  able P1.  Jump t
2ade0 6f 20 50 32 20 69 66 20 74 68 61 74 0a 2a 2a 20  o P2 if that.** 
2adf0 65 73 74 69 6d 61 74 65 20 69 73 20 6c 65 73 73  estimate is less
2ae00 20 74 68 61 6e 20 61 70 70 72 6f 78 69 6d 61 74   than approximat
2ae10 65 6c 79 20 32 2a 2a 28 30 2e 31 2a 50 33 29 2e  ely 2**(0.1*P3).
2ae20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 53 6d  .*/.case OP_IfSm
2ae30 61 6c 6c 65 72 3a 20 7b 20 20 20 20 20 20 20 20  aller: {        
2ae40 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
2ae50 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
2ae60 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
2ae70 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 36 34    int res;.  i64
2ae80 20 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   sz;..  assert( 
2ae90 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2aea0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2aeb0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
2aec0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2aed0 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
2aee0 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75  .  pCrsr = pC->u
2aef0 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73  c.pCursor;.  ass
2af00 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20  ert( pCrsr );.  
2af10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2af20 65 46 69 72 73 74 28 70 43 72 73 72 2c 20 26 72  eFirst(pCrsr, &r
2af30 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
2af40 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2af50 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72  o_error;.  if( r
2af60 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20  es==0 ){.    sz 
2af70 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
2af80 77 43 6f 75 6e 74 45 73 74 28 70 43 72 73 72 29  wCountEst(pCrsr)
2af90 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
2afa0 28 73 7a 3e 3d 30 29 20 26 26 20 73 71 6c 69 74  (sz>=0) && sqlit
2afb0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 73 7a  e3LogEst((u64)sz
2afc0 29 3c 70 4f 70 2d 3e 70 33 20 29 20 72 65 73 20  )<pOp->p3 ) res 
2afd0 3d 20 31 3b 0a 20 20 7d 0a 20 20 56 64 62 65 42  = 1;.  }.  VdbeB
2afe0 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
2aff0 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20  0,2);.  if( res 
2b000 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
2b010 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a  2;.  break;.}...
2b020 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
2b030 72 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a 20  rSort P1 P2 * * 
2b040 2a 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 61 6c  *.**.** After al
2b050 6c 20 72 65 63 6f 72 64 73 20 68 61 76 65 20 62  l records have b
2b060 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
2b070 6f 20 74 68 65 20 53 6f 72 74 65 72 20 6f 62 6a  o the Sorter obj
2b080 65 63 74 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ect.** identifie
2b090 64 20 62 79 20 50 31 2c 20 69 6e 76 6f 6b 65 20  d by P1, invoke 
2b0a0 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 61  this opcode to a
2b0b0 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 73  ctually do the s
2b0c0 6f 72 74 69 6e 67 2e 0a 2a 2a 20 4a 75 6d 70 20  orting..** Jump 
2b0d0 74 6f 20 50 32 20 69 66 20 74 68 65 72 65 20 61  to P2 if there a
2b0e0 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 74 6f  re no records to
2b0f0 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2a 0a 2a   be sorted..**.*
2b100 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73  * This opcode is
2b110 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 4f 50   an alias for OP
2b120 5f 53 6f 72 74 20 61 6e 64 20 4f 50 5f 52 65 77  _Sort and OP_Rew
2b130 69 6e 64 20 74 68 61 74 20 69 73 20 75 73 65 64  ind that is used
2b140 0a 2a 2a 20 66 6f 72 20 53 6f 72 74 65 72 20 6f  .** for Sorter o
2b150 62 6a 65 63 74 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70  bjects..*/./* Op
2b160 63 6f 64 65 3a 20 53 6f 72 74 20 50 31 20 50 32  code: Sort P1 P2
2b170 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69   * * *.**.** Thi
2b180 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 65 78  s opcode does ex
2b190 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 74  actly the same t
2b1a0 68 69 6e 67 20 61 73 20 4f 50 5f 52 65 77 69 6e  hing as OP_Rewin
2b1b0 64 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a  d except that.**
2b1c0 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 73 20 61   it increments a
2b1d0 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 67  n undocumented g
2b1e0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 75  lobal variable u
2b1f0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e  sed for testing.
2b200 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67 20 69  .**.** Sorting i
2b210 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62  s accomplished b
2b220 79 20 77 72 69 74 69 6e 67 20 72 65 63 6f 72 64  y writing record
2b230 73 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  s into a sorting
2b240 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
2b250 72 65 77 69 6e 64 69 6e 67 20 74 68 61 74 20 69  rewinding that i
2b260 6e 64 65 78 20 61 6e 64 20 70 6c 61 79 69 6e 67  ndex and playing
2b270 20 69 74 20 62 61 63 6b 20 66 72 6f 6d 20 62 65   it back from be
2b280 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e  ginning to.** en
2b290 64 2e 20 20 57 65 20 75 73 65 20 74 68 65 20 4f  d.  We use the O
2b2a0 50 5f 53 6f 72 74 20 6f 70 63 6f 64 65 20 69 6e  P_Sort opcode in
2b2b0 73 74 65 61 64 20 6f 66 20 4f 50 5f 52 65 77 69  stead of OP_Rewi
2b2c0 6e 64 20 74 6f 20 64 6f 20 74 68 65 0a 2a 2a 20  nd to do the.** 
2b2d0 72 65 77 69 6e 64 69 6e 67 20 73 6f 20 74 68 61  rewinding so tha
2b2e0 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72  t the global var
2b2f0 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 69 6e  iable will be in
2b300 63 72 65 6d 65 6e 74 65 64 20 61 6e 64 0a 2a 2a  cremented and.**
2b310 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
2b320 73 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20  s can determine 
2b330 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
2b340 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 0a  he optimizer is.
2b350 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6f 70 74  ** correctly opt
2b360 69 6d 69 7a 69 6e 67 20 6f 75 74 20 73 6f 72 74  imizing out sort
2b370 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  s..*/.case OP_So
2b380 72 74 65 72 53 6f 72 74 3a 20 20 20 20 2f 2a 20  rterSort:    /* 
2b390 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  jump */.case OP_
2b3a0 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f  Sort: {        /
2b3b0 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64 65 66  * jump */.#ifdef
2b3c0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
2b3d0 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
2b3e0 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
2b3f0 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23  earch_count--;.#
2b400 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f 75 6e  endif.  p->aCoun
2b410 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53  ter[SQLITE_STMTS
2b420 54 41 54 55 53 5f 53 4f 52 54 5d 2b 2b 3b 0a 20  TATUS_SORT]++;. 
2b430 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
2b440 20 69 6e 74 6f 20 4f 50 5f 52 65 77 69 6e 64 20   into OP_Rewind 
2b450 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  */.}./* Opcode: 
2b460 52 65 77 69 6e 64 20 50 31 20 50 32 20 2a 20 2a  Rewind P1 P2 * *
2b470 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78   *.**.** The nex
2b480 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77  t use of the Row
2b490 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20  id or Column or 
2b4a0 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Next instruction
2b4b0 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c   for P1 .** will
2b4c0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 66 69   refer to the fi
2b4d0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2b4e0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
2b4f0 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20  or index..** If 
2b500 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
2b510 65 78 20 69 73 20 65 6d 70 74 79 2c 20 6a 75 6d  ex is empty, jum
2b520 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
2b530 20 50 32 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74   P2..** If the t
2b540 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
2b550 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c   not empty, fall
2b560 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2b570 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 69 6e  following .** in
2b580 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
2b590 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61   This opcode lea
2b5a0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63  ves the cursor c
2b5b0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76  onfigured to mov
2b5c0 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64  e in forward ord
2b5d0 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  er,.** from the 
2b5e0 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64  beginning toward
2b5f0 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74   the end.  In ot
2b600 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
2b610 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66  ursor is.** conf
2b620 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65  igured to use Ne
2b630 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2f  xt, not Prev..*/
2b640 0a 63 61 73 65 20 4f 50 5f 52 65 77 69 6e 64 3a  .case OP_Rewind:
2b650 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
2b660 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
2b670 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
2b680 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
2b690 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
2b6a0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2b6b0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2b6c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2b6d0 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 70 43  p->p5==0 );.  pC
2b6e0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2b6f0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2b700 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
2b710 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d  t( isSorter(pC)=
2b720 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  =(pOp->opcode==O
2b730 50 5f 53 6f 72 74 65 72 53 6f 72 74 29 20 29 3b  P_SorterSort) );
2b740 0a 20 20 72 65 73 20 3d 20 31 3b 0a 23 69 66 64  .  res = 1;.#ifd
2b750 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2b760 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f    pC->seekOp = O
2b770 50 5f 52 65 77 69 6e 64 3b 0a 23 65 6e 64 69 66  P_Rewind;.#endif
2b780 0a 20 20 69 66 28 20 69 73 53 6f 72 74 65 72 28  .  if( isSorter(
2b790 70 43 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pC) ){.    rc = 
2b7a0 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
2b7b0 72 52 65 77 69 6e 64 28 70 43 2c 20 26 72 65 73  rRewind(pC, &res
2b7c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b7d0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
2b7e0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
2b7f0 52 45 45 20 29 3b 0a 20 20 20 20 70 43 72 73 72  REE );.    pCrsr
2b800 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
2b810 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
2b820 43 72 73 72 20 29 3b 0a 20 20 20 20 72 63 20 3d  Crsr );.    rc =
2b830 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
2b840 73 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  st(pCrsr, &res);
2b850 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
2b860 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
2b870 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
2b880 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
2b890 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67    }.  if( rc ) g
2b8a0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2b8b0 5f 65 72 72 6f 72 3b 0a 20 20 70 43 2d 3e 6e 75  _error;.  pC->nu
2b8c0 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b  llRow = (u8)res;
2b8d0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2b8e0 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  p2>0 && pOp->p2<
2b8f0 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 56 64 62 65  p->nOp );.  Vdbe
2b900 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
2b910 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73  =0,2);.  if( res
2b920 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
2b930 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
2b940 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20  /* Opcode: Next 
2b950 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
2b960 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72  *.** Advance cur
2b970 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69  sor P1 so that i
2b980 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
2b990 6e 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61  next key/data pa
2b9a0 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62  ir in its.** tab
2b9b0 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66  le or index.  If
2b9c0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
2b9d0 72 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69  re key/value pai
2b9e0 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  rs then fall thr
2b9f0 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
2ba00 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
2ba10 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68  tion.  But if th
2ba20 65 20 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65  e cursor advance
2ba30 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
2ba40 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  .** jump immedia
2ba50 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  tely to P2..**.*
2ba60 2a 20 54 68 65 20 4e 65 78 74 20 6f 70 63 6f 64  * The Next opcod
2ba70 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
2ba80 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65  following an See
2ba90 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 0a  kGT, SeekGE, or.
2baa0 2a 2a 20 4f 50 5f 52 65 77 69 6e 64 20 6f 70 63  ** OP_Rewind opc
2bab0 6f 64 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69  ode used to posi
2bac0 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e  tion the cursor.
2bad0 20 20 4e 65 78 74 20 69 73 20 6e 6f 74 20 61 6c    Next is not al
2bae0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c  lowed.** to foll
2baf0 6f 77 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c  ow SeekLT, SeekL
2bb00 45 2c 20 6f 72 20 4f 50 5f 4c 61 73 74 2e 0a 2a  E, or OP_Last..*
2bb10 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73  *.** The P1 curs
2bb20 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61  or must be for a
2bb30 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74   real table, not
2bb40 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
2bb50 20 20 50 31 20 6d 75 73 74 20 68 61 76 65 0a 2a    P1 must have.*
2bb60 2a 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 70 72  * been opened pr
2bb70 69 6f 72 20 74 6f 20 74 68 69 73 20 6f 70 63 6f  ior to this opco
2bb80 64 65 20 6f 72 20 74 68 65 20 70 72 6f 67 72 61  de or the progra
2bb90 6d 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  m will segfault.
2bba0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76 61  .**.** The P3 va
2bbb0 6c 75 65 20 69 73 20 61 20 68 69 6e 74 20 74 6f  lue is a hint to
2bbc0 20 74 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   the btree imple
2bbd0 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20 50 33  mentation. If P3
2bbe0 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  ==1, that.** mea
2bbf0 6e 73 20 50 31 20 69 73 20 61 6e 20 53 51 4c 20  ns P1 is an SQL 
2bc00 69 6e 64 65 78 20 61 6e 64 20 74 68 61 74 20 74  index and that t
2bc10 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
2bc20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a  could have been.
2bc30 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  ** omitted if th
2bc40 61 74 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  at index had bee
2bc50 6e 20 75 6e 69 71 75 65 2e 20 20 50 33 20 69 73  n unique.  P3 is
2bc60 20 75 73 75 61 6c 6c 79 20 30 2e 20 20 50 33 20   usually 0.  P3 
2bc70 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65 69 74  is.** always eit
2bc80 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a 0a 2a  her 0 or 1..**.*
2bc90 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f  * P4 is always o
2bca0 66 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43  f type P4_ADVANC
2bcb0 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  E. The function 
2bcc0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74  pointer points t
2bcd0 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
2bce0 65 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eNext()..**.** I
2bcf0 66 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65  f P5 is positive
2bd00 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73   and the jump is
2bd10 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65   taken, then eve
2bd20 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75  nt counter.** nu
2bd30 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65  mber P5-1 in the
2bd40 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
2bd50 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ent is increment
2bd60 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ed..**.** See al
2bd70 73 6f 3a 20 50 72 65 76 0a 2a 2f 0a 2f 2a 20 4f  so: Prev.*/./* O
2bd80 70 63 6f 64 65 3a 20 50 72 65 76 20 50 31 20 50  pcode: Prev P1 P
2bd90 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
2bda0 20 42 61 63 6b 20 75 70 20 63 75 72 73 6f 72 20   Back up cursor 
2bdb0 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  P1 so that it po
2bdc0 69 6e 74 73 20 74 6f 20 74 68 65 20 70 72 65 76  ints to the prev
2bdd0 69 6f 75 73 20 6b 65 79 2f 64 61 74 61 20 70 61  ious key/data pa
2bde0 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62  ir in its.** tab
2bdf0 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66  le or index.  If
2be00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65   there is no pre
2be10 76 69 6f 75 73 20 6b 65 79 2f 76 61 6c 75 65 20  vious key/value 
2be20 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20  pairs then fall 
2be30 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68  through.** to th
2be40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74  e following inst
2be50 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  ruction.  But if
2be60 20 74 68 65 20 63 75 72 73 6f 72 20 62 61 63 6b   the cursor back
2be70 75 70 20 77 61 73 20 73 75 63 63 65 73 73 66 75  up was successfu
2be80 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64  l,.** jump immed
2be90 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
2bea0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 72 65 76 20  .**.** The Prev 
2beb0 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 76  opcode is only v
2bec0 61 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  alid following a
2bed0 6e 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45  n SeekLT, SeekLE
2bee0 2c 20 6f 72 0a 2a 2a 20 4f 50 5f 4c 61 73 74 20  , or.** OP_Last 
2bef0 6f 70 63 6f 64 65 20 75 73 65 64 20 74 6f 20 70  opcode used to p
2bf00 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
2bf10 6f 72 2e 20 20 50 72 65 76 20 69 73 20 6e 6f 74  or.  Prev is not
2bf20 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 66   allowed.** to f
2bf30 6f 6c 6c 6f 77 20 53 65 65 6b 47 54 2c 20 53 65  ollow SeekGT, Se
2bf40 65 6b 47 45 2c 20 6f 72 20 4f 50 5f 52 65 77 69  ekGE, or OP_Rewi
2bf50 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31  nd..**.** The P1
2bf60 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20   cursor must be 
2bf70 66 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c 65  for a real table
2bf80 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74  , not a pseudo-t
2bf90 61 62 6c 65 2e 20 20 49 66 20 50 31 20 69 73 0a  able.  If P1 is.
2bfa0 2a 2a 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 6e  ** not open then
2bfb0 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 69 73   the behavior is
2bfc0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a   undefined..**.*
2bfd0 2a 20 54 68 65 20 50 33 20 76 61 6c 75 65 20 69  * The P3 value i
2bfe0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
2bff0 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2c000 74 69 6f 6e 2e 20 49 66 20 50 33 3d 3d 31 2c 20  tion. If P3==1, 
2c010 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 50 31  that.** means P1
2c020 20 69 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   is an SQL index
2c030 20 61 6e 64 20 74 68 61 74 20 74 68 69 73 20 69   and that this i
2c040 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 75 6c 64  nstruction could
2c050 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6f 6d   have been.** om
2c060 69 74 74 65 64 20 69 66 20 74 68 61 74 20 69 6e  itted if that in
2c070 64 65 78 20 68 61 64 20 62 65 65 6e 20 75 6e 69  dex had been uni
2c080 71 75 65 2e 20 20 50 33 20 69 73 20 75 73 75 61  que.  P3 is usua
2c090 6c 6c 79 20 30 2e 20 20 50 33 20 69 73 0a 2a 2a  lly 0.  P3 is.**
2c0a0 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 30   always either 0
2c0b0 20 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20   or 1..**.** P4 
2c0c0 69 73 20 61 6c 77 61 79 73 20 6f 66 20 74 79 70  is always of typ
2c0d0 65 20 50 34 5f 41 44 56 41 4e 43 45 2e 20 54 68  e P4_ADVANCE. Th
2c0e0 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  e function point
2c0f0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
2c100 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2c110 69 6f 75 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ious()..**.** If
2c120 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65 20   P5 is positive 
2c130 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73 20  and the jump is 
2c140 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e  taken, then even
2c150 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d  t counter.** num
2c160 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65 20  ber P5-1 in the 
2c170 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
2c180 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  nt is incremente
2c190 64 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  d..*/./* Opcode:
2c1a0 20 53 6f 72 74 65 72 4e 65 78 74 20 50 31 20 50   SorterNext P1 P
2c1b0 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 54  2 * * P5.**.** T
2c1c0 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73  his opcode works
2c1d0 20 6a 75 73 74 20 6c 69 6b 65 20 4f 50 5f 4e 65   just like OP_Ne
2c1e0 78 74 20 65 78 63 65 70 74 20 74 68 61 74 20 50  xt except that P
2c1f0 31 20 6d 75 73 74 20 62 65 20 61 0a 2a 2a 20 73  1 must be a.** s
2c200 6f 72 74 65 72 20 6f 62 6a 65 63 74 20 66 6f 72  orter object for
2c210 20 77 68 69 63 68 20 74 68 65 20 4f 50 5f 53 6f   which the OP_So
2c220 72 74 65 72 53 6f 72 74 20 6f 70 63 6f 64 65 20  rterSort opcode 
2c230 68 61 73 20 62 65 65 6e 0a 2a 2a 20 69 6e 76 6f  has been.** invo
2c240 6b 65 64 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ked.  This opcod
2c250 65 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 63  e advances the c
2c260 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
2c270 74 20 73 6f 72 74 65 64 0a 2a 2a 20 72 65 63 6f  t sorted.** reco
2c280 72 64 2c 20 6f 72 20 6a 75 6d 70 73 20 74 6f 20  rd, or jumps to 
2c290 50 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20  P2 if there are 
2c2a0 6e 6f 20 6d 6f 72 65 20 73 6f 72 74 65 64 20 72  no more sorted r
2c2b0 65 63 6f 72 64 73 2e 0a 2a 2f 0a 63 61 73 65 20  ecords..*/.case 
2c2c0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b  OP_SorterNext: {
2c2d0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56    /* jump */.  V
2c2e0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a  dbeCursor *pC;..
2c2f0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2c300 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2c310 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29  rt( isSorter(pC)
2c320 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2c330 65 33 56 64 62 65 53 6f 72 74 65 72 4e 65 78 74  e3VdbeSorterNext
2c340 28 64 62 2c 20 70 43 29 3b 0a 20 20 67 6f 74 6f  (db, pC);.  goto
2c350 20 6e 65 78 74 5f 74 61 69 6c 3b 0a 63 61 73 65   next_tail;.case
2c360 20 4f 50 5f 50 72 65 76 3a 20 20 20 20 20 20 20   OP_Prev:       
2c370 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61     /* jump */.ca
2c380 73 65 20 4f 50 5f 4e 65 78 74 3a 20 20 20 20 20  se OP_Next:     
2c390 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
2c3a0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2c3b0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2c3c0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
2c3d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c  assert( pOp->p5<
2c3e0 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 43 6f  ArraySize(p->aCo
2c3f0 75 6e 74 65 72 29 20 29 3b 0a 20 20 70 43 20 3d  unter) );.  pC =
2c400 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2c410 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2c420 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2c430 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2c440 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eto==0 );.  asse
2c450 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2c460 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2c470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
2c480 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78  ->opcode!=OP_Nex
2c490 74 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64  t || pOp->p4.xAd
2c4a0 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74  vance==sqlite3Bt
2c4b0 72 65 65 4e 65 78 74 20 29 3b 0a 20 20 61 73 73  reeNext );.  ass
2c4c0 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
2c4d0 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70  !=OP_Prev || pOp
2c4e0 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73  ->p4.xAdvance==s
2c4f0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2c500 6f 75 73 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ous );..  /* The
2c510 20 4e 65 78 74 20 6f 70 63 6f 64 65 20 69 73 20   Next opcode is 
2c520 6f 6e 6c 79 20 75 73 65 64 20 61 66 74 65 72 20  only used after 
2c530 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20  SeekGT, SeekGE, 
2c540 52 65 77 69 6e 64 2c 20 61 6e 64 20 46 6f 75 6e  Rewind, and Foun
2c550 64 2e 0a 20 20 2a 2a 20 54 68 65 20 50 72 65 76  d..  ** The Prev
2c560 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20   opcode is only 
2c570 75 73 65 64 20 61 66 74 65 72 20 53 65 65 6b 4c  used after SeekL
2c580 54 2c 20 53 65 65 6b 4c 45 2c 20 61 6e 64 20 4c  T, SeekLE, and L
2c590 61 73 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ast. */.  assert
2c5a0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
2c5b0 50 5f 4e 65 78 74 0a 20 20 20 20 20 20 20 7c 7c  P_Next.       ||
2c5c0 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f   pC->seekOp==OP_
2c5d0 53 65 65 6b 47 54 20 7c 7c 20 70 43 2d 3e 73 65  SeekGT || pC->se
2c5e0 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 0a  ekOp==OP_SeekGE.
2c5f0 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65         || pC->se
2c600 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ekOp==OP_Rewind 
2c610 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2c620 50 5f 46 6f 75 6e 64 20 0a 20 20 20 20 20 20 20  P_Found .       
2c630 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2c640 50 5f 4e 75 6c 6c 52 6f 77 7c 7c 20 70 43 2d 3e  P_NullRow|| pC->
2c650 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 52  seekOp==OP_SeekR
2c660 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72 74 28  owid);.  assert(
2c670 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
2c680 5f 50 72 65 76 0a 20 20 20 20 20 20 20 7c 7c 20  _Prev.       || 
2c690 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53  pC->seekOp==OP_S
2c6a0 65 65 6b 4c 54 20 7c 7c 20 70 43 2d 3e 73 65 65  eekLT || pC->see
2c6b0 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 0a 20  kOp==OP_SeekLE. 
2c6c0 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65        || pC->see
2c6d0 6b 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20 0a 20 20  kOp==OP_Last .  
2c6e0 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b       || pC->seek
2c6f0 4f 70 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 29 3b  Op==OP_NullRow);
2c700 0a 0a 20 20 72 63 20 3d 20 70 4f 70 2d 3e 70 34  ..  rc = pOp->p4
2c710 2e 78 41 64 76 61 6e 63 65 28 70 43 2d 3e 75 63  .xAdvance(pC->uc
2c720 2e 70 43 75 72 73 6f 72 2c 20 70 4f 70 2d 3e 70  .pCursor, pOp->p
2c730 33 29 3b 0a 6e 65 78 74 5f 74 61 69 6c 3a 0a 20  3);.next_tail:. 
2c740 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
2c750 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
2c760 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
2c770 6e 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2c  n(rc==SQLITE_OK,
2c780 32 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  2);.  if( rc==SQ
2c790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2c7a0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  C->nullRow = 0;.
2c7b0 20 20 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b      p->aCounter[
2c7c0 70 4f 70 2d 3e 70 35 5d 2b 2b 3b 0a 23 69 66 64  pOp->p5]++;.#ifd
2c7d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2c7e0 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
2c7f0 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
2c800 66 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f  f.    goto jump_
2c810 74 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f  to_p2_and_check_
2c820 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20  for_interrupt;. 
2c830 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
2c840 49 54 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f 20  ITE_DONE ) goto 
2c850 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2c860 6f 72 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  or;.  rc = SQLIT
2c870 45 5f 4f 4b 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c  E_OK;.  pC->null
2c880 52 6f 77 20 3d 20 31 3b 0a 20 20 67 6f 74 6f 20  Row = 1;.  goto 
2c890 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72  check_for_interr
2c8a0 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  upt;.}../* Opcod
2c8b0 65 3a 20 49 64 78 49 6e 73 65 72 74 20 50 31 20  e: IdxInsert P1 
2c8c0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
2c8d0 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
2c8e0 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  2].**.** Registe
2c8f0 72 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53 51  r P2 holds an SQ
2c900 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65  L index key made
2c910 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61   using the.** Ma
2c920 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
2c930 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63  tions.  This opc
2c940 6f 64 65 20 77 72 69 74 65 73 20 74 68 61 74 20  ode writes that 
2c950 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  key.** into the 
2c960 69 6e 64 65 78 20 50 31 2e 20 20 44 61 74 61 20  index P1.  Data 
2c970 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 69 73  for the entry is
2c980 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50   nil..**.** If P
2c990 34 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  4 is not zero, t
2c9a0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 6e 75  hen it is the nu
2c9b0 6d 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20 69  mber of values i
2c9c0 6e 20 74 68 65 20 75 6e 70 61 63 6b 65 64 0a 2a  n the unpacked.*
2c9d0 2a 20 6b 65 79 20 6f 66 20 72 65 67 28 50 32 29  * key of reg(P2)
2c9e0 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
2c9f0 20 50 33 20 69 73 20 74 68 65 20 69 6e 64 65 78   P3 is the index
2ca00 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
2ca10 67 69 73 74 65 72 0a 2a 2a 20 66 6f 72 20 74 68  gister.** for th
2ca20 65 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 2e 20  e unpacked key. 
2ca30 20 54 68 65 20 61 76 61 69 6c 61 62 69 6c 69 74   The availabilit
2ca40 79 20 6f 66 20 74 68 65 20 75 6e 70 61 63 6b 65  y of the unpacke
2ca50 64 20 6b 65 79 20 63 61 6e 20 73 6f 6d 65 74 69  d key can someti
2ca60 6d 65 73 0a 2a 2a 20 62 65 20 61 6e 20 6f 70 74  mes.** be an opt
2ca70 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  imization..**.**
2ca80 20 49 66 20 50 35 20 68 61 73 20 74 68 65 20 4f   If P5 has the O
2ca90 50 46 4c 41 47 5f 41 50 50 45 4e 44 20 62 69 74  PFLAG_APPEND bit
2caa0 20 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20   set, that is a 
2cab0 68 69 6e 74 20 74 6f 20 74 68 65 20 62 2d 74 72  hint to the b-tr
2cac0 65 65 20 6c 61 79 65 72 0a 2a 2a 20 74 68 61 74  ee layer.** that
2cad0 20 74 68 69 73 20 69 6e 73 65 72 74 20 69 73 20   this insert is 
2cae0 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e 20  likely to be an 
2caf0 61 70 70 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  append..**.** If
2cb00 20 50 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c   P5 has the OPFL
2cb10 41 47 5f 4e 43 48 41 4e 47 45 20 62 69 74 20 73  AG_NCHANGE bit s
2cb20 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  et, then the cha
2cb30 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 0a 2a  nge counter is.*
2cb40 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79  * incremented by
2cb50 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
2cb60 6e 2e 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41  n.  If the OPFLA
2cb70 47 5f 4e 43 48 41 4e 47 45 20 62 69 74 20 69 73  G_NCHANGE bit is
2cb80 20 63 6c 65 61 72 2c 0a 2a 2a 20 74 68 65 6e 20   clear,.** then 
2cb90 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
2cba0 65 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  er is unchanged.
2cbb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
2cbc0 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
2cbd0 4c 54 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73  LT flag of P5 is
2cbe0 20 73 65 74 2c 20 74 68 65 20 69 6d 70 6c 65 6d   set, the implem
2cbf0 65 6e 74 61 74 69 6f 6e 20 6d 69 67 68 74 0a 2a  entation might.*
2cc00 2a 20 72 75 6e 20 66 61 73 74 65 72 20 62 79 20  * run faster by 
2cc10 61 76 6f 69 64 69 6e 67 20 61 6e 20 75 6e 6e 65  avoiding an unne
2cc20 63 65 73 73 61 72 79 20 73 65 65 6b 20 6f 6e 20  cessary seek on 
2cc30 63 75 72 73 6f 72 20 50 31 2e 20 20 48 6f 77 65  cursor P1.  Howe
2cc40 76 65 72 2c 0a 2a 2a 20 74 68 65 20 4f 50 46 4c  ver,.** the OPFL
2cc50 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
2cc60 20 66 6c 61 67 20 6d 75 73 74 20 6f 6e 6c 79 20   flag must only 
2cc70 62 65 20 73 65 74 20 69 66 20 74 68 65 72 65 20  be set if there 
2cc80 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 70 72 69  have been no pri
2cc90 6f 72 0a 2a 2a 20 73 65 65 6b 73 20 6f 6e 20 74  or.** seeks on t
2cca0 68 65 20 63 75 72 73 6f 72 20 6f 72 20 69 66 20  he cursor or if 
2ccb0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
2ccc0 73 65 65 6b 20 75 73 65 64 20 61 20 6b 65 79 20  seek used a key 
2ccd0 65 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20 74 6f  equivalent.** to
2cce0 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73   P2. .**.** This
2ccf0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c   instruction onl
2cd00 79 20 77 6f 72 6b 73 20 66 6f 72 20 69 6e 64 69  y works for indi
2cd10 63 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61  ces.  The equiva
2cd20 6c 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  lent instruction
2cd30 0a 2a 2a 20 66 6f 72 20 74 61 62 6c 65 73 20 69  .** for tables i
2cd40 73 20 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a  s OP_Insert..*/.
2cd50 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
2cd60 72 49 6e 73 65 72 74 20 50 31 20 50 32 20 2a 20  rInsert P1 P2 * 
2cd70 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
2cd80 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a   key=r[P2].**.**
2cd90 20 52 65 67 69 73 74 65 72 20 50 32 20 68 6f 6c   Register P2 hol
2cda0 64 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  ds an SQL index 
2cdb0 6b 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20 74  key made using t
2cdc0 68 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64  he.** MakeRecord
2cdd0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
2cde0 54 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69 74  This opcode writ
2cdf0 65 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69  es that key.** i
2ce00 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 50  nto the sorter P
2ce10 31 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68 65  1.  Data for the
2ce20 20 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a   entry is nil..*
2ce30 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
2ce40 49 6e 73 65 72 74 3a 20 20 20 20 20 20 20 2f 2a  Insert:       /*
2ce50 20 69 6e 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in2 */.case OP_
2ce60 49 64 78 49 6e 73 65 72 74 3a 20 7b 20 20 20 20  IdxInsert: {    
2ce70 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20      /* in2 */.  
2ce80 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
2ce90 20 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 78    BtreePayload x
2cea0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
2ceb0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2cec0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
2ced0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
2cee0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 73 71 6c  [pOp->p1];.  sql
2cef0 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74  ite3VdbeIncrWrit
2cf00 65 43 6f 75 6e 74 65 72 28 70 2c 20 70 43 29 3b  eCounter(p, pC);
2cf10 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
2cf20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2cf30 53 6f 72 74 65 72 28 70 43 29 3d 3d 28 70 4f 70  Sorter(pC)==(pOp
2cf40 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  ->opcode==OP_Sor
2cf50 74 65 72 49 6e 73 65 72 74 29 20 29 3b 0a 20 20  terInsert) );.  
2cf60 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
2cf70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
2cf80 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn2->flags & M
2cf90 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 69 66 28  EM_Blob );.  if(
2cfa0 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
2cfb0 47 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e  G_NCHANGE ) p->n
2cfc0 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 61 73 73 65  Change++;.  asse
2cfd0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2cfe0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2cff0 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  || pOp->opcode==
2d000 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20  OP_SorterInsert 
2d010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2d020 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  >isTable==0 );. 
2d030 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62   rc = ExpandBlob
2d040 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 72 63  (pIn2);.  if( rc
2d050 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2d060 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
2d070 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2d080 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29  P_SorterInsert )
2d090 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2d0a0 65 33 56 64 62 65 53 6f 72 74 65 72 57 72 69 74  e3VdbeSorterWrit
2d0b0 65 28 70 43 2c 20 70 49 6e 32 29 3b 0a 20 20 7d  e(pC, pIn2);.  }
2d0c0 65 6c 73 65 7b 0a 20 20 20 20 78 2e 6e 4b 65 79  else{.    x.nKey
2d0d0 20 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20   = pIn2->n;.    
2d0e0 78 2e 70 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a  x.pKey = pIn2->z
2d0f0 3b 0a 20 20 20 20 78 2e 61 4d 65 6d 20 3d 20 61  ;.    x.aMem = a
2d100 4d 65 6d 20 2b 20 70 4f 70 2d 3e 70 33 3b 0a 20  Mem + pOp->p3;. 
2d110 20 20 20 78 2e 6e 4d 65 6d 20 3d 20 28 75 31 36     x.nMem = (u16
2d120 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20  )pOp->p4.i;.    
2d130 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2d140 65 49 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e 70  eInsert(pC->uc.p
2d150 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20 20  Cursor, &x,.    
2d160 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20       (pOp->p5 & 
2d170 28 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f  (OPFLAG_APPEND|O
2d180 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49  PFLAG_SAVEPOSITI
2d190 4f 4e 29 29 2c 20 0a 20 20 20 20 20 20 20 20 28  ON)), .        (
2d1a0 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
2d1b0 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
2d1c0 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c   ? pC->seekResul
2d1d0 74 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29  t : 0).        )
2d1e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2d1f0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
2d200 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e 63  ==0 );.    pC->c
2d210 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
2d220 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20  HE_STALE;.  }.  
2d230 69 66 28 20 72 63 29 20 67 6f 74 6f 20 61 62 6f  if( rc) goto abo
2d240 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2d250 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2d260 4f 70 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74  Opcode: IdxDelet
2d270 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
2d280 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
2d290 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 54  r[P2@P3].**.** T
2d2a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33  he content of P3
2d2b0 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
2d2c0 69 6e 67 20 61 74 20 72 65 67 69 73 74 65 72 20  ing at register 
2d2d0 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e  P2 form.** an un
2d2e0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
2d2f0 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65  . This opcode re
2d300 6d 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72 79  moves that entry
2d310 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e   from the .** in
2d320 64 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75  dex opened by cu
2d330 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  rsor P1..*/.case
2d340 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b   OP_IdxDelete: {
2d350 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2d360 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
2d370 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
2d380 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
2d390 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  d r;..  assert( 
2d3a0 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61  pOp->p3>0 );.  a
2d3b0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
2d3c0 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d   && pOp->p2+pOp-
2d3d0 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
2d3e0 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20  - p->nCursor)+1 
2d3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
2d400 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2d410 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
2d420 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
2d430 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2d440 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
2d450 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
2d460 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
2d470 52 45 45 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  REE );.  sqlite3
2d480 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75  VdbeIncrWriteCou
2d490 6e 74 65 72 28 70 2c 20 70 43 29 3b 0a 20 20 70  nter(p, pC);.  p
2d4a0 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  Crsr = pC->uc.pC
2d4b0 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
2d4c0 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 20 61   pCrsr!=0 );.  a
2d4d0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d  ssert( pOp->p5==
2d4e0 30 20 29 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66  0 );.  r.pKeyInf
2d4f0 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  o = pC->pKeyInfo
2d500 3b 0a 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28  ;.  r.nField = (
2d510 75 31 36 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 72  u16)pOp->p3;.  r
2d520 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  .default_rc = 0;
2d530 0a 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65  .  r.aMem = &aMe
2d540 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 72 63  m[pOp->p2];.  rc
2d550 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2d560 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
2d570 72 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26  rsr, &r, 0, 0, &
2d580 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
2d590 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2d5a0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  to_error;.  if( 
2d5b0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  res==0 ){.    rc
2d5c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
2d5d0 65 6c 65 74 65 28 70 43 72 73 72 2c 20 42 54 52  elete(pCrsr, BTR
2d5e0 45 45 5f 41 55 58 44 45 4c 45 54 45 29 3b 0a 20  EE_AUXDELETE);. 
2d5f0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2d600 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2d610 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ror;.  }.  asser
2d620 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  t( pC->deferredM
2d630 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 70 43  oveto==0 );.  pC
2d640 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
2d650 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70  CACHE_STALE;.  p
2d660 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20  C->seekResult = 
2d670 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  0;.  break;.}../
2d680 2a 20 4f 70 63 6f 64 65 3a 20 44 65 66 65 72 72  * Opcode: Deferr
2d690 65 64 53 65 65 6b 20 50 31 20 2a 20 50 33 20 50  edSeek P1 * P3 P
2d6a0 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
2d6b0 20 4d 6f 76 65 20 50 33 20 74 6f 20 50 31 2e 72   Move P3 to P1.r
2d6c0 6f 77 69 64 20 69 66 20 6e 65 65 64 65 64 0a 2a  owid if needed.*
2d6d0 2a 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20 6f 70  *.** P1 is an op
2d6e0 65 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  en index cursor 
2d6f0 61 6e 64 20 50 33 20 69 73 20 61 20 63 75 72 73  and P3 is a curs
2d700 6f 72 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  or on the corres
2d710 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65  ponding.** table
2d720 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64  .  This opcode d
2d730 6f 65 73 20 61 20 64 65 66 65 72 72 65 64 20 73  oes a deferred s
2d740 65 65 6b 20 6f 66 20 74 68 65 20 50 33 20 74 61  eek of the P3 ta
2d750 62 6c 65 20 63 75 72 73 6f 72 0a 2a 2a 20 74 6f  ble cursor.** to
2d760 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 63 6f   the row that co
2d770 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
2d780 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
2d790 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P1..**.** This i
2d7a0 73 20 61 20 64 65 66 65 72 72 65 64 20 73 65 65  s a deferred see
2d7b0 6b 2e 20 20 4e 6f 74 68 69 6e 67 20 61 63 74 75  k.  Nothing actu
2d7c0 61 6c 6c 79 20 68 61 70 70 65 6e 73 20 75 6e 74  ally happens unt
2d7d0 69 6c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  il.** the cursor
2d7e0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
2d7f0 20 61 20 72 65 63 6f 72 64 2e 20 20 54 68 61 74   a record.  That
2d800 20 77 61 79 2c 20 69 66 20 6e 6f 20 72 65 61 64   way, if no read
2d810 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75  s.** occur, no u
2d820 6e 6e 65 63 65 73 73 61 72 79 20 49 2f 4f 20 68  nnecessary I/O h
2d830 61 70 70 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 50 34  appens..**.** P4
2d840 20 6d 61 79 20 62 65 20 61 6e 20 61 72 72 61 79   may be an array
2d850 20 6f 66 20 69 6e 74 65 67 65 72 73 20 28 74 79   of integers (ty
2d860 70 65 20 50 34 5f 49 4e 54 41 52 52 41 59 29 20  pe P4_INTARRAY) 
2d870 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e  containing.** on
2d880 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
2d890 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 50   column in the P
2d8a0 33 20 74 61 62 6c 65 2e 20 20 49 66 20 61 72 72  3 table.  If arr
2d8b0 61 79 20 65 6e 74 72 79 20 61 28 69 29 0a 2a 2a  ay entry a(i).**
2d8c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2d8d0 65 6e 20 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d  en reading colum
2d8e0 6e 20 61 28 69 29 2d 31 20 66 72 6f 6d 20 63 75  n a(i)-1 from cu
2d8f0 72 73 6f 72 20 50 33 20 69 73 20 0a 2a 2a 20 65  rsor P3 is .** e
2d900 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 70 65 72  quivalent to per
2d910 66 6f 72 6d 69 6e 67 20 74 68 65 20 64 65 66 65  forming the defe
2d920 72 72 65 64 20 73 65 65 6b 20 61 6e 64 20 74 68  rred seek and th
2d930 65 6e 20 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d  en reading colum
2d940 6e 20 69 20 0a 2a 2a 20 66 72 6f 6d 20 50 31 2e  n i .** from P1.
2d950 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
2d960 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  on is stored in 
2d970 50 33 20 61 6e 64 20 75 73 65 64 20 74 6f 20 72  P3 and used to r
2d980 65 64 69 72 65 63 74 0a 2a 2a 20 72 65 61 64 73  edirect.** reads
2d990 20 61 67 61 69 6e 73 74 20 50 33 20 6f 76 65 72   against P3 over
2d9a0 20 74 6f 20 50 31 2c 20 74 68 75 73 20 70 6f 73   to P1, thus pos
2d9b0 73 69 62 6c 79 20 61 76 6f 69 64 69 6e 67 20 74  sibly avoiding t
2d9c0 68 65 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 73 65  he need to.** se
2d9d0 65 6b 20 61 6e 64 20 72 65 61 64 20 63 75 72 73  ek and read curs
2d9e0 6f 72 20 50 33 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  or P3..*/./* Opc
2d9f0 6f 64 65 3a 20 49 64 78 52 6f 77 69 64 20 50 31  ode: IdxRowid P1
2da00 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
2da10 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77  opsis: r[P2]=row
2da20 69 64 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69  id.**.** Write i
2da30 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20  nto register P2 
2da40 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
2da50 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
2da60 72 79 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ry in the record
2da70 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f   at.** the end o
2da80 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20  f the index key 
2da90 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75  pointed to by cu
2daa0 72 73 6f 72 20 50 31 2e 20 20 54 68 69 73 20 69  rsor P1.  This i
2dab0 6e 74 65 67 65 72 20 73 68 6f 75 6c 64 20 62 65  nteger should be
2dac0 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66  .** the rowid of
2dad0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
2dae0 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 69   to which this i
2daf0 6e 64 65 78 20 65 6e 74 72 79 20 70 6f 69 6e 74  ndex entry point
2db00 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  s..**.** See als
2db10 6f 3a 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65  o: Rowid, MakeRe
2db20 63 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  cord..*/.case OP
2db30 5f 44 65 66 65 72 72 65 64 53 65 65 6b 3a 0a 63  _DeferredSeek:.c
2db40 61 73 65 20 4f 50 5f 49 64 78 52 6f 77 69 64 3a  ase OP_IdxRowid:
2db50 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
2db60 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43 75  out2 */.  VdbeCu
2db70 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20 20  rsor *pC;       
2db80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
2db90 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a  index cursor */.
2dba0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 54    VdbeCursor *pT
2dbb0 61 62 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a  abCur;        /*
2dbc0 20 54 68 65 20 50 32 20 74 61 62 6c 65 20 63 75   The P2 table cu
2dbd0 72 73 6f 72 20 28 4f 50 5f 44 65 66 65 72 72 65  rsor (OP_Deferre
2dbe0 64 53 65 65 6b 20 6f 6e 6c 79 29 20 2a 2f 0a 20  dSeek only) */. 
2dbf0 20 69 36 34 20 72 6f 77 69 64 3b 20 20 20 20 20   i64 rowid;     
2dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dc10 52 6f 77 69 64 20 74 68 61 74 20 50 31 20 63 75  Rowid that P1 cu
2dc20 72 72 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20  rrent points to 
2dc30 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
2dc40 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2dc50 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
2dc60 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
2dc70 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2dc80 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
2dc90 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
2dca0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
2dcb0 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
2dcc0 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
2dcd0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2dce0 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20   pC->isTable==0 
2dcf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2dd00 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
2dd10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2dd20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 7c 7c 20  !pC->nullRow || 
2dd30 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2dd40 49 64 78 52 6f 77 69 64 20 29 3b 0a 0a 20 20 2f  IdxRowid );..  /
2dd50 2a 20 54 68 65 20 49 64 78 52 6f 77 69 64 20 61  * The IdxRowid a
2dd60 6e 64 20 53 65 65 6b 20 6f 70 63 6f 64 65 73 20  nd Seek opcodes 
2dd70 61 72 65 20 63 6f 6d 62 69 6e 65 64 20 62 65 63  are combined bec
2dd80 61 75 73 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d  ause of the comm
2dd90 6f 6e 61 6c 69 74 79 0a 20 20 2a 2a 20 6f 66 20  onality.  ** of 
2dda0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
2ddb0 72 52 65 73 74 6f 72 65 28 29 20 61 6e 64 20 73  rRestore() and s
2ddc0 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
2ddd0 69 64 28 29 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  id(). */.  rc = 
2dde0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
2ddf0 72 52 65 73 74 6f 72 65 28 70 43 29 3b 0a 0a 20  rRestore(pC);.. 
2de00 20 2f 2a 20 73 71 6c 69 74 65 33 56 62 65 43 75   /* sqlite3VbeCu
2de10 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 63 61  rsorRestore() ca
2de20 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20 74  n only fail if t
2de30 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 62 65  he record has be
2de40 65 6e 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  en deleted.  ** 
2de50 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
2de60 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 61 74  he cursor.  That
2de70 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 61 70 70   will never happ
2de80 65 6e 73 20 66 6f 72 20 61 6e 20 49 64 78 52 6f  ens for an IdxRo
2de90 77 69 64 0a 20 20 2a 2a 20 6f 72 20 53 65 65 6b  wid.  ** or Seek
2dea0 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28   opcode */.  if(
2deb0 20 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54   NEVER(rc!=SQLIT
2dec0 45 5f 4f 4b 29 20 29 20 67 6f 74 6f 20 61 62 6f  E_OK) ) goto abo
2ded0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2dee0 0a 0a 20 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c  ..  if( !pC->nul
2def0 6c 52 6f 77 20 29 7b 0a 20 20 20 20 72 6f 77 69  lRow ){.    rowi
2df00 64 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e  d = 0;  /* Not n
2df10 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65  eeded.  Only use
2df20 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20 77  d to silence a w
2df30 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  arning. */.    r
2df40 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  c = sqlite3VdbeI
2df50 64 78 52 6f 77 69 64 28 64 62 2c 20 70 43 2d 3e  dxRowid(db, pC->
2df60 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 6f 77  uc.pCursor, &row
2df70 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  id);.    if( rc!
2df80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2df90 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
2dfa0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
2dfb0 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e   }.    if( pOp->
2dfc0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 66 65 72  opcode==OP_Defer
2dfd0 72 65 64 53 65 65 6b 20 29 7b 0a 20 20 20 20 20  redSeek ){.     
2dfe0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
2dff0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70  >=0 && pOp->p3<p
2e000 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->nCursor );.   
2e010 20 20 20 70 54 61 62 43 75 72 20 3d 20 70 2d 3e     pTabCur = p->
2e020 61 70 43 73 72 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  apCsr[pOp->p3];.
2e030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2e040 61 62 43 75 72 21 3d 30 20 29 3b 0a 20 20 20 20  abCur!=0 );.    
2e050 20 20 61 73 73 65 72 74 28 20 70 54 61 62 43 75    assert( pTabCu
2e060 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  r->eCurType==CUR
2e070 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
2e080 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2e090 43 75 72 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21  Cur->uc.pCursor!
2e0a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2e0b0 72 74 28 20 70 54 61 62 43 75 72 2d 3e 69 73 54  rt( pTabCur->isT
2e0c0 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 70 54  able );.      pT
2e0d0 61 62 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  abCur->nullRow =
2e0e0 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75   0;.      pTabCu
2e0f0 72 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20  r->movetoTarget 
2e100 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 70  = rowid;.      p
2e110 54 61 62 43 75 72 2d 3e 64 65 66 65 72 72 65 64  TabCur->deferred
2e120 4d 6f 76 65 74 6f 20 3d 20 31 3b 0a 20 20 20 20  Moveto = 1;.    
2e130 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2e140 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52  4type==P4_INTARR
2e150 41 59 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 61 69  AY || pOp->p4.ai
2e160 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
2e170 62 43 75 72 2d 3e 61 41 6c 74 4d 61 70 20 3d 20  bCur->aAltMap = 
2e180 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20  pOp->p4.ai;.    
2e190 20 20 70 54 61 62 43 75 72 2d 3e 70 41 6c 74 43    pTabCur->pAltC
2e1a0 75 72 73 6f 72 20 3d 20 70 43 3b 0a 20 20 20 20  ursor = pC;.    
2e1b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 75  }else{.      pOu
2e1c0 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
2e1d0 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 20 20  se(p, pOp);.    
2e1e0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f    pOut->u.i = ro
2e1f0 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  wid;.    }.  }el
2e200 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2e210 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2e220 49 64 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  IdxRowid );.    
2e230 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
2e240 74 4e 75 6c 6c 28 26 61 4d 65 6d 5b 70 4f 70 2d  tNull(&aMem[pOp-
2e250 3e 70 32 5d 29 3b 0a 20 20 7d 0a 20 20 62 72 65  >p2]);.  }.  bre
2e260 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2e270 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 50 33  : IdxGE P1 P2 P3
2e280 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
2e290 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d  is: key=r[P3@P4]
2e2a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65  .**.** The P4 re
2e2b0 67 69 73 74 65 72 20 76 61 6c 75 65 73 20 62 65  gister values be
2e2c0 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20  ginning with P3 
2e2d0 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64  form an unpacked
2e2e0 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74   index .** key t
2e2f0 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20 50 52  hat omits the PR
2e300 49 4d 41 52 59 20 4b 45 59 2e 20 20 43 6f 6d 70  IMARY KEY.  Comp
2e310 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c  are this key val
2e320 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 69  ue against the i
2e330 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31  ndex .** that P1
2e340 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2e350 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72  inting to, ignor
2e360 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20  ing the PRIMARY 
2e370 4b 45 59 20 6f 72 20 52 4f 57 49 44 20 0a 2a 2a  KEY or ROWID .**
2e380 20 66 69 65 6c 64 73 20 61 74 20 74 68 65 20 65   fields at the e
2e390 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nd..**.** If the
2e3a0 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20   P1 index entry 
2e3b0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2e3c0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2e3d0 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65  key value.** the
2e3e0 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f  n jump to P2.  O
2e3f0 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68  therwise fall th
2e400 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
2e410 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  t instruction..*
2e420 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78  /./* Opcode: Idx
2e430 47 54 20 50 31 20 50 32 20 50 33 20 50 34 20 50  GT P1 P2 P3 P4 P
2e440 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  5.** Synopsis: k
2e450 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
2e460 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65  * The P4 registe
2e470 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69  r values beginni
2e480 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20  ng with P3 form 
2e490 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
2e4a0 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f  x .** key that o
2e4b0 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59  mits the PRIMARY
2e4c0 20 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 74   KEY.  Compare t
2e4d0 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67  his key value ag
2e4e0 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
2e4f0 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20 63  .** that P1 is c
2e500 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2e510 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74  g to, ignoring t
2e520 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2e530 72 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c  r ROWID .** fiel
2e540 64 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a  ds at the end..*
2e550 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69  *.** If the P1 i
2e560 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67 72  ndex entry is gr
2e570 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b  eater than the k
2e580 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e  ey value.** then
2e590 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74   jump to P2.  Ot
2e5a0 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72  herwise fall thr
2e5b0 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
2e5c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2e5d0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c  ./* Opcode: IdxL
2e5e0 54 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  T P1 P2 P3 P4 P5
2e5f0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
2e600 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
2e610 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72   The P4 register
2e620 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e   values beginnin
2e630 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61  g with P3 form a
2e640 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
2e650 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d   .** key that om
2e660 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  its the PRIMARY 
2e670 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 43  KEY or ROWID.  C
2e680 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20  ompare this key 
2e690 76 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a  value against.**
2e6a0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
2e6b0 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  P1 is currently 
2e6c0 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e  pointing to, ign
2e6d0 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52  oring the PRIMAR
2e6e0 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49  Y KEY or.** ROWI
2e6f0 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65  D on the P1 inde
2e700 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  x..**.** If the 
2e710 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  P1 index entry i
2e720 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
2e730 6b 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a  key value then j
2e740 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74  ump to P2..** Ot
2e750 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72  herwise fall thr
2e760 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
2e770 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2e780 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c  ./* Opcode: IdxL
2e790 45 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  E P1 P2 P3 P4 P5
2e7a0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
2e7b0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
2e7c0 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72   The P4 register
2e7d0 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e   values beginnin
2e7e0 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61  g with P3 form a
2e7f0 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
2e800 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d   .** key that om
2e810 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  its the PRIMARY 
2e820 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20 43  KEY or ROWID.  C
2e830 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20  ompare this key 
2e840 76 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a 2a  value against.**
2e850 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
2e860 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  P1 is currently 
2e870 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e  pointing to, ign
2e880 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52  oring the PRIMAR
2e890 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57 49  Y KEY or.** ROWI
2e8a0 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65  D on the P1 inde
2e8b0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  x..**.** If the 
2e8c0 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  P1 index entry i
2e8d0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
2e8e0 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
2e8f0 76 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 0a  value then jump.
2e900 2a 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65 72 77  ** to P2. Otherw
2e910 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ise fall through
2e920 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
2e930 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
2e940 65 20 4f 50 5f 49 64 78 4c 45 3a 20 20 20 20 20  e OP_IdxLE:     
2e950 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
2e960 63 61 73 65 20 4f 50 5f 49 64 78 47 54 3a 20 20  case OP_IdxGT:  
2e970 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
2e980 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c 54  */.case OP_IdxLT
2e990 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  :          /* ju
2e9a0 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64  mp */.case OP_Id
2e9b0 78 47 45 3a 20 20 7b 20 20 20 20 20 20 20 2f 2a  xGE:  {       /*
2e9c0 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43   jump */.  VdbeC
2e9d0 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74  ursor *pC;.  int
2e9e0 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64   res;.  Unpacked
2e9f0 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73 73  Record r;..  ass
2ea00 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
2ea10 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
2ea20 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
2ea30 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
2ea40 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
2ea50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2ea60 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 3b  pC->isOrdered );
2ea70 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
2ea80 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2ea90 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65  _BTREE );.  asse
2eaa0 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  rt( pC->uc.pCurs
2eab0 6f 72 21 3d 30 29 3b 0a 20 20 61 73 73 65 72 74  or!=0);.  assert
2eac0 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
2ead0 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73  veto==0 );.  ass
2eae0 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ert( pOp->p5==0 
2eaf0 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b  || pOp->p5==1 );
2eb00 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2eb10 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
2eb20 20 29 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f   );.  r.pKeyInfo
2eb30 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
2eb40 0a 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75  .  r.nField = (u
2eb50 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20  16)pOp->p4.i;.  
2eb60 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c  if( pOp->opcode<
2eb70 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20 20  OP_IdxLT ){.    
2eb80 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
2eb90 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c  ode==OP_IdxLE ||
2eba0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2ebb0 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 72 2e  _IdxGT );.    r.
2ebc0 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d 31 3b  default_rc = -1;
2ebd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2ebe0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2ebf0 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20 70  e==OP_IdxGE || p
2ec00 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2ec10 64 78 4c 54 20 29 3b 0a 20 20 20 20 72 2e 64 65  dxLT );.    r.de
2ec20 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
2ec30 7d 0a 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d  }.  r.aMem = &aM
2ec40 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66  em[pOp->p3];.#if
2ec50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2ec60 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
2ec70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
2ec80 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  .nField; i++){. 
2ec90 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
2eca0 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b  IsValid(&r.aMem[
2ecb0 69 5d 29 20 29 3b 0a 20 20 20 20 20 20 52 45 47  i]) );.      REG
2ecc0 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
2ecd0 3e 70 33 2b 69 2c 20 26 61 4d 65 6d 5b 70 4f 70  >p3+i, &aMem[pOp
2ece0 2d 3e 70 33 2b 69 5d 29 3b 0a 20 20 20 20 7d 0a  ->p3+i]);.    }.
2ecf0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 73    }.#endif.  res
2ed00 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65   = 0;  /* Not ne
2ed10 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64  eded.  Only used
2ed20 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61   to silence a wa
2ed30 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  rning. */.  rc =
2ed40 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
2ed50 65 79 43 6f 6d 70 61 72 65 28 64 62 2c 20 70 43  eyCompare(db, pC
2ed60 2c 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20 61  , &r, &res);.  a
2ed70 73 73 65 72 74 28 20 28 4f 50 5f 49 64 78 4c 45  ssert( (OP_IdxLE
2ed80 26 31 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26 31  &1)==(OP_IdxLT&1
2ed90 29 20 26 26 20 28 4f 50 5f 49 64 78 47 45 26 31  ) && (OP_IdxGE&1
2eda0 29 3d 3d 28 4f 50 5f 49 64 78 47 54 26 31 29 20  )==(OP_IdxGT&1) 
2edb0 29 3b 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f  );.  if( (pOp->o
2edc0 70 63 6f 64 65 26 31 29 3d 3d 28 4f 50 5f 49 64  pcode&1)==(OP_Id
2edd0 78 4c 54 26 31 29 20 29 7b 0a 20 20 20 20 61 73  xLT&1) ){.    as
2ede0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2edf0 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20 70  e==OP_IdxLE || p
2ee00 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2ee10 64 78 4c 54 20 29 3b 0a 20 20 20 20 72 65 73 20  dxLT );.    res 
2ee20 3d 20 2d 72 65 73 3b 0a 20 20 7d 65 6c 73 65 7b  = -res;.  }else{
2ee30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
2ee40 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
2ee50 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  GE || pOp->opcod
2ee60 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20  e==OP_IdxGT );. 
2ee70 20 20 20 72 65 73 2b 2b 3b 0a 20 20 7d 0a 20 20     res++;.  }.  
2ee80 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
2ee90 72 65 73 3e 30 2c 32 29 3b 0a 20 20 69 66 28 20  res>0,2);.  if( 
2eea0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2eeb0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2eec0 69 66 28 20 72 65 73 3e 30 20 29 20 67 6f 74 6f  if( res>0 ) goto
2eed0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62   jump_to_p2;.  b
2eee0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2eef0 64 65 3a 20 44 65 73 74 72 6f 79 20 50 31 20 50  de: Destroy P1 P
2ef00 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44  2 P3 * *.**.** D
2ef10 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
2ef20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
2ef30 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f  r index whose ro
2ef40 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
2ef50 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
2ef60 69 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 0a  is given by P1..
2ef70 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
2ef80 62 65 69 6e 67 20 64 65 73 74 72 6f 79 65 64 20  being destroyed 
2ef90 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  is in the main d
2efa0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
2efb0 50 33 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 33  P3==0.  If.** P3
2efc0 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61 62  ==1 then the tab
2efd0 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69  le to be clear i
2efe0 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  s in the auxilia
2eff0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2f000 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65 64  .** that is used
2f010 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73   to store tables
2f020 20 63 72 65 61 74 65 20 75 73 69 6e 67 20 43 52   create using CR
2f030 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54  EATE TEMPORARY T
2f040 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41  ABLE..**.** If A
2f050 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61  UTOVACUUM is ena
2f060 62 6c 65 64 20 74 68 65 6e 20 69 74 20 69 73 20  bled then it is 
2f070 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 61 6e  possible that an
2f080 6f 74 68 65 72 20 72 6f 6f 74 20 70 61 67 65 0a  other root page.
2f090 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d 6f 76 65  ** might be move
2f0a0 64 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 6c 79  d into the newly
2f0b0 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 20 70 61   deleted root pa
2f0c0 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ge in order to k
2f0d0 65 65 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20  eep all.** root 
2f0e0 70 61 67 65 73 20 63 6f 6e 74 69 67 75 6f 75 73  pages contiguous
2f0f0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2f100 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
2f110 65 2e 20 20 54 68 65 20 66 6f 72 6d 65 72 0a 2a  e.  The former.*
2f120 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72  * value of the r
2f130 6f 6f 74 20 70 61 67 65 20 74 68 61 74 20 6d 6f  oot page that mo
2f140 76 65 64 20 2d 20 69 74 73 20 76 61 6c 75 65 20  ved - its value 
2f150 62 65 66 6f 72 65 20 74 68 65 20 6d 6f 76 65 20  before the move 
2f160 6f 63 63 75 72 72 65 64 20 2d 0a 2a 2a 20 69 73  occurred -.** is
2f170 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
2f180 74 65 72 20 50 32 2e 20 49 66 20 6e 6f 20 70 61  ter P2. If no pa
2f190 67 65 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20  ge movement was 
2f1a0 72 65 71 75 69 72 65 64 20 28 62 65 63 61 75 73  required (becaus
2f1b0 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 62  e the.** table b
2f1c0 65 69 6e 67 20 64 72 6f 70 70 65 64 20 77 61 73  eing dropped was
2f1d0 20 61 6c 72 65 61 64 79 20 74 68 65 20 6c 61 73   already the las
2f1e0 74 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61 74  t one in the dat
2f1f0 61 62 61 73 65 29 20 74 68 65 6e 20 61 20 0a 2a  abase) then a .*
2f200 2a 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64  * zero is stored
2f210 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
2f220 20 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20    If AUTOVACUUM 
2f230 69 73 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e  is disabled then
2f240 20 61 20 7a 65 72 6f 20 0a 2a 2a 20 69 73 20 73   a zero .** is s
2f250 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
2f260 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r P2..**.** This
2f270 20 6f 70 63 6f 64 65 20 74 68 72 6f 77 73 20 61   opcode throws a
2f280 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 72 65  n error if there
2f290 20 61 72 65 20 61 6e 79 20 61 63 74 69 76 65 20   are any active 
2f2a0 72 65 61 64 65 72 20 56 4d 73 20 77 68 65 6e 0a  reader VMs when.
2f2b0 2a 2a 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** it is invoked
2f2c0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
2f2d0 6f 20 61 76 6f 69 64 20 74 68 65 20 64 69 66 66  o avoid the diff
2f2e0 69 63 75 6c 74 79 20 61 73 73 6f 63 69 61 74 65  iculty associate
2f2f0 64 20 77 69 74 68 20 0a 2a 2a 20 75 70 64 61 74  d with .** updat
2f300 69 6e 67 20 65 78 69 73 74 69 6e 67 20 63 75 72  ing existing cur
2f310 73 6f 72 73 20 77 68 65 6e 20 61 20 72 6f 6f 74  sors when a root
2f320 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 69   page is moved i
2f330 6e 20 61 6e 20 41 55 54 4f 56 41 43 55 55 4d 20  n an AUTOVACUUM 
2f340 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
2f350 69 73 20 65 72 72 6f 72 20 69 73 20 74 68 72 6f  is error is thro
2f360 77 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 64  wn even if the d
2f370 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
2f380 6e 20 41 55 54 4f 56 41 43 55 55 4d 20 0a 2a 2a  n AUTOVACUUM .**
2f390 20 64 62 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   db in order to 
2f3a0 61 76 6f 69 64 20 69 6e 74 72 6f 64 75 63 69 6e  avoid introducin
2f3b0 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 69  g an incompatibi
2f3c0 6c 69 74 79 20 62 65 74 77 65 65 6e 20 61 75 74  lity between aut
2f3d0 6f 76 61 63 75 75 6d 20 0a 2a 2a 20 61 6e 64 20  ovacuum .** and 
2f3e0 6e 6f 6e 2d 61 75 74 6f 76 61 63 75 75 6d 20 6d  non-autovacuum m
2f3f0 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  odes..**.** See 
2f400 61 6c 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a 63  also: Clear.*/.c
2f410 61 73 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a 20  ase OP_Destroy: 
2f420 7b 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f  {     /* out2 */
2f430 0a 20 20 69 6e 74 20 69 4d 6f 76 65 64 3b 0a 20  .  int iMoved;. 
2f440 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 73 71 6c   int iDb;..  sql
2f450 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74  ite3VdbeIncrWrit
2f460 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a  eCounter(p, 0);.
2f470 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
2f480 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
2f490 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 31 20  sert( pOp->p1>1 
2f4a0 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
2f4b0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
2f4c0 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67  p);.  pOut->flag
2f4d0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
2f4e0 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  if( db->nVdbeRea
2f4f0 64 20 3e 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f  d > db->nVDestro
2f500 79 2b 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  y+1 ){.    rc = 
2f510 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
2f520 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
2f530 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
2f540 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
2f550 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 65 6c  _to_error;.  }el
2f560 73 65 7b 0a 20 20 20 20 69 44 62 20 3d 20 70 4f  se{.    iDb = pO
2f570 70 2d 3e 70 33 3b 0a 20 20 20 20 61 73 73 65 72  p->p3;.    asser
2f580 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
2f590 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29  >btreeMask, iDb)
2f5a0 20 29 3b 0a 20 20 20 20 69 4d 6f 76 65 64 20 3d   );.    iMoved =
2f5b0 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64   0;  /* Not need
2f5c0 65 64 2e 20 20 4f 6e 6c 79 20 74 6f 20 73 69 6c  ed.  Only to sil
2f5d0 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20  ence a warning. 
2f5e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2f5f0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
2f600 65 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  e(db->aDb[iDb].p
2f610 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 69 4d  Bt, pOp->p1, &iM
2f620 6f 76 65 64 29 3b 0a 20 20 20 20 70 4f 75 74 2d  oved);.    pOut-
2f630 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
2f640 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  ;.    pOut->u.i 
2f650 3d 20 69 4d 6f 76 65 64 3b 0a 20 20 20 20 69 66  = iMoved;.    if
2f660 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
2f670 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2f680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f690 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2f6a0 20 20 20 69 66 28 20 69 4d 6f 76 65 64 21 3d 30     if( iMoved!=0
2f6b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2f6c0 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 64  3RootPageMoved(d
2f6d0 62 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64 2c 20  b, iDb, iMoved, 
2f6e0 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20 20  pOp->p1);.      
2f6f0 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  /* All OP_Destro
2f700 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63  y operations occ
2f710 75 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62  ur on the same b
2f720 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  tree */.      as
2f730 73 65 72 74 28 20 72 65 73 65 74 53 63 68 65 6d  sert( resetSchem
2f740 61 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c 20 72  aOnFault==0 || r
2f750 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c  esetSchemaOnFaul
2f760 74 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20 20 20  t==iDb+1 );.    
2f770 20 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46    resetSchemaOnF
2f780 61 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a 20 20  ault = iDb+1;.  
2f790 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
2f7a0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2f7b0 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31 20 50  code: Clear P1 P
2f7c0 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  2 P3.**.** Delet
2f7d0 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  e all contents o
2f7e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2f7f0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68  able or index wh
2f800 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  ose root page.**
2f810 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f820 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
2f830 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c 69  y P1.  But, unli
2f840 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f 20 6e  ke Destroy, do n
2f850 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  ot.** remove the
2f860 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2f870 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2f880 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
2f890 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c  e table being cl
2f8a0 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ear is in the ma
2f8b0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2f8c0 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a 2a   if P2==0.  If.*
2f8d0 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68 65  * P2==1 then the
2f8e0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65   table to be cle
2f8f0 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75 78  ar is in the aux
2f900 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
2f910 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20  file.** that is 
2f920 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61  used to store ta
2f930 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69 6e  bles create usin
2f940 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41  g CREATE TEMPORA
2f950 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  RY TABLE..**.** 
2f960 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
2f970 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2f980 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  n the table refe
2f990 72 72 65 64 20 74 6f 20 6d 75 73 74 20 62 65 20  rred to must be 
2f9a0 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62  an.** intkey tab
2f9b0 6c 65 20 28 61 6e 20 53 51 4c 20 74 61 62 6c 65  le (an SQL table
2f9c0 2c 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 2e  , not an index).
2f9d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2f9e0 65 20 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a 2a  e row change .**
2f9f0 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d   count is increm
2fa00 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
2fa10 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2fa20 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
2fa30 6c 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20 50  leared. .** If P
2fa40 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
2fa50 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
2fa60 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
2fa70 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 0a   register P3 is.
2fa80 2a 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65 6e  ** also incremen
2fa90 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2faa0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2fab0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65   table being cle
2fac0 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ared..**.** See 
2fad0 61 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a 2f  also: Destroy.*/
2fae0 0a 63 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a 20  .case OP_Clear: 
2faf0 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 3b  {.  int nChange;
2fb00 0a 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  . .  sqlite3Vdbe
2fb10 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72  IncrWriteCounter
2fb20 28 70 2c 20 30 29 3b 0a 20 20 6e 43 68 61 6e 67  (p, 0);.  nChang
2fb30 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
2fb40 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
2fb50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  );.  assert( DbM
2fb60 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
2fb70 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 32 29 20 29  Mask, pOp->p2) )
2fb80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2fb90 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
2fba0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70  .      db->aDb[p
2fbb0 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70  Op->p2].pBt, pOp
2fbc0 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33 20 3f  ->p1, (pOp->p3 ?
2fbd0 20 26 6e 43 68 61 6e 67 65 20 3a 20 30 29 0a 20   &nChange : 0). 
2fbe0 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
2fbf0 33 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61  3 ){.    p->nCha
2fc00 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
2fc10 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e      if( pOp->p3>
2fc20 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
2fc30 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61  t( memIsValid(&a
2fc40 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b  Mem[pOp->p3]) );
2fc50 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54  .      memAboutT
2fc60 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d  oChange(p, &aMem
2fc70 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20  [pOp->p3]);.    
2fc80 20 20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e    aMem[pOp->p3].
2fc90 75 2e 69 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  u.i += nChange;.
2fca0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2fcb0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2fcc0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2fcd0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2fce0 6f 64 65 3a 20 52 65 73 65 74 53 6f 72 74 65 72  ode: ResetSorter
2fcf0 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
2fd00 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e  * Delete all con
2fd10 74 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 65  tents from the e
2fd20 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
2fd30 72 20 73 6f 72 74 65 72 0a 2a 2a 20 74 68 61 74  r sorter.** that
2fd40 20 69 73 20 6f 70 65 6e 20 6f 6e 20 63 75 72 73   is open on curs
2fd50 6f 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  or P1..**.** Thi
2fd60 73 20 6f 70 63 6f 64 65 20 6f 6e 6c 79 20 77 6f  s opcode only wo
2fd70 72 6b 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20  rks for cursors 
2fd80 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
2fd90 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 65 64 20 77   and.** opened w
2fda0 69 74 68 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ith OP_OpenEphem
2fdb0 65 72 61 6c 20 6f 72 20 4f 50 5f 53 6f 72 74 65  eral or OP_Sorte
2fdc0 72 4f 70 65 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  rOpen..*/.case O
2fdd0 50 5f 52 65 73 65 74 53 6f 72 74 65 72 3a 20 7b  P_ResetSorter: {
2fde0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2fdf0 43 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 70  C;. .  assert( p
2fe00 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
2fe10 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
2fe20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
2fe30 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
2fe40 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
2fe50 20 20 69 66 28 20 69 73 53 6f 72 74 65 72 28 70    if( isSorter(p
2fe60 43 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C) ){.    sqlite
2fe70 33 56 64 62 65 53 6f 72 74 65 72 52 65 73 65 74  3VdbeSorterReset
2fe80 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70 53 6f 72  (db, pC->uc.pSor
2fe90 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ter);.  }else{. 
2fea0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65     assert( pC->e
2feb0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2fec0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 61 73  _BTREE );.    as
2fed0 73 65 72 74 28 20 70 43 2d 3e 69 73 45 70 68 65  sert( pC->isEphe
2fee0 6d 65 72 61 6c 20 29 3b 0a 20 20 20 20 72 63 20  meral );.    rc 
2fef0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
2ff00 65 61 72 54 61 62 6c 65 4f 66 43 75 72 73 6f 72  earTableOfCursor
2ff10 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  (pC->uc.pCursor)
2ff20 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2ff30 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2ff40 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72  _error;.  }.  br
2ff50 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2ff60 65 3a 20 43 72 65 61 74 65 42 74 72 65 65 20 50  e: CreateBtree P
2ff70 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
2ff80 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72  ynopsis: r[P2]=r
2ff90 6f 6f 74 20 69 44 62 3d 50 31 20 66 6c 61 67 73  oot iDb=P1 flags
2ffa0 3d 50 33 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  =P3.**.** Alloca
2ffb0 74 65 20 61 20 6e 65 77 20 62 2d 74 72 65 65 20  te a new b-tree 
2ffc0 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
2ffd0 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d  base file if P1=
2ffe0 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20  =0 or in the.** 
2fff0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 66 69  TEMP database fi
30000 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20 69  le if P1==1 or i
30010 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  n an attached da
30020 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e  tabase if.** P1>
30030 31 2e 20 20 54 68 65 20 50 33 20 61 72 67 75 6d  1.  The P3 argum
30040 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 28 42  ent must be 1 (B
30050 54 52 45 45 5f 49 4e 54 4b 45 59 29 20 66 6f 72  TREE_INTKEY) for
30060 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 0a 2a   a rowid table.*
30070 2a 20 69 74 20 6d 75 73 74 20 62 65 20 32 20 28  * it must be 2 (
30080 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 20 66  BTREE_BLOBKEY) f
30090 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 57  or an index or W
300a0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
300b0 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20  le..** The root 
300c0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
300d0 68 65 20 6e 65 77 20 62 2d 74 72 65 65 20 69 73  he new b-tree is
300e0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
300f0 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ter P2..*/.case 
30100 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 3a 20  OP_CreateBtree: 
30110 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75  {          /* ou
30120 74 32 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f  t2 */.  int pgno
30130 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
30140 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57  sqlite3VdbeIncrW
30150 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30  riteCounter(p, 0
30160 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
30170 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
30180 70 29 3b 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a  p);.  pgno = 0;.
30190 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
301a0 33 3d 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  3==BTREE_INTKEY 
301b0 7c 7c 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45  || pOp->p3==BTRE
301c0 45 5f 42 4c 4f 42 4b 45 59 20 29 3b 0a 20 20 61  E_BLOBKEY );.  a
301d0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
301e0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
301f0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
30200 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
30210 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
30220 70 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p1) );.  assert(
30230 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
30240 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
30250 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  aDb[pOp->p1];.  
30260 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74  assert( pDb->pBt
30270 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  !=0 );.  rc = sq
30280 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
30290 54 61 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c 20  Table(pDb->pBt, 
302a0 26 70 67 6e 6f 2c 20 70 4f 70 2d 3e 70 33 29 3b  &pgno, pOp->p3);
302b0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
302c0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
302d0 72 6f 72 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  ror;.  pOut->u.i
302e0 20 3d 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b   = pgno;.  break
302f0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
30300 53 71 6c 45 78 65 63 20 2a 20 2a 20 2a 20 50 34  SqlExec * * * P4
30310 20 2a 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 74 68 65   *.**.** Run the
30320 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 6f   SQL statement o
30330 72 20 73 74 61 74 65 6d 65 6e 74 73 20 73 70 65  r statements spe
30340 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 50 34  cified in the P4
30350 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65   string..*/.case
30360 20 4f 50 5f 53 71 6c 45 78 65 63 3a 20 7b 0a 20   OP_SqlExec: {. 
30370 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72   sqlite3VdbeIncr
30380 57 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20  WriteCounter(p, 
30390 30 29 3b 0a 20 20 64 62 2d 3e 6e 53 71 6c 45 78  0);.  db->nSqlEx
303a0 65 63 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ec++;.  rc = sql
303b0 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 70 4f  ite3_exec(db, pO
303c0 70 2d 3e 70 34 2e 7a 2c 20 30 2c 20 30 2c 20 30  p->p4.z, 0, 0, 0
303d0 29 3b 0a 20 20 64 62 2d 3e 6e 53 71 6c 45 78 65  );.  db->nSqlExe
303e0 63 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c--;.  if( rc ) 
303f0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
30400 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
30410 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
30420 50 61 72 73 65 53 63 68 65 6d 61 20 50 31 20 2a  ParseSchema P1 *
30430 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   * P4 *.**.** Re
30440 61 64 20 61 6e 64 20 70 61 72 73 65 20 61 6c 6c  ad and parse all
30450 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
30460 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
30470 74 61 62 6c 65 20 6f 66 20 64 61 74 61 62 61 73  table of databas
30480 65 20 50 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74  e P1.** that mat
30490 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ch the WHERE cla
304a0 75 73 65 20 50 34 2e 20 20 49 66 20 50 34 20 69  use P4.  If P4 i
304b0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
304c0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 6e  , then the.** en
304d0 74 69 72 65 20 73 63 68 65 6d 61 20 66 6f 72 20  tire schema for 
304e0 50 31 20 69 73 20 72 65 70 61 72 73 65 64 2e 0a  P1 is reparsed..
304f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
30500 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 70 61  e invokes the pa
30510 72 73 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rser to create a
30520 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63   new virtual mac
30530 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 75  hine,.** then ru
30540 6e 73 20 74 68 65 20 6e 65 77 20 76 69 72 74 75  ns the new virtu
30550 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49 74 20  al machine.  It 
30560 69 73 20 74 68 75 73 20 61 20 72 65 2d 65 6e 74  is thus a re-ent
30570 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  rant opcode..*/.
30580 63 61 73 65 20 4f 50 5f 50 61 72 73 65 53 63 68  case OP_ParseSch
30590 65 6d 61 3a 20 7b 0a 20 20 69 6e 74 20 69 44 62  ema: {.  int iDb
305a0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
305b0 7a 4d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20  zMaster;.  char 
305c0 2a 7a 53 71 6c 3b 0a 20 20 49 6e 69 74 44 61 74  *zSql;.  InitDat
305d0 61 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20 20 2f  a initData;..  /
305e0 2a 20 41 6e 79 20 70 72 65 70 61 72 65 64 20 73  * Any prepared s
305f0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 6e  tatement that in
30600 76 6f 6b 65 73 20 74 68 69 73 20 6f 70 63 6f 64  vokes this opcod
30610 65 20 77 69 6c 6c 20 68 6f 6c 64 20 6d 75 74 65  e will hold mute
30620 78 65 73 0a 20 20 2a 2a 20 6f 6e 20 65 76 65 72  xes.  ** on ever
30630 79 20 62 74 72 65 65 2e 20 20 54 68 69 73 20 69  y btree.  This i
30640 73 20 61 20 70 72 65 72 65 71 75 69 73 69 74 65  s a prerequisite
30650 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 0a 20   for invoking . 
30660 20 2a 2a 20 73 71 6c 69 74 65 33 49 6e 69 74 43   ** sqlite3InitC
30670 61 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a  allback()..  */.
30680 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
30690 42 55 47 0a 20 20 66 6f 72 28 69 44 62 3d 30 3b  BUG.  for(iDb=0;
306a0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
306b0 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
306c0 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73 71 6c 69  ( iDb==1 || sqli
306d0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
306e0 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ex(db->aDb[iDb].
306f0 70 42 74 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  pBt) );.  }.#end
30700 69 66 0a 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d  if..  iDb = pOp-
30710 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69  >p1;.  assert( i
30720 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
30730 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
30740 28 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  ( DbHasProperty(
30750 64 62 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65  db, iDb, DB_Sche
30760 6d 61 4c 6f 61 64 65 64 29 20 29 3b 0a 0a 23 69  maLoaded) );..#i
30770 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30780 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 69  T_ALTERTABLE.  i
30790 66 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20  f( pOp->p4.z==0 
307a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63  ){.    sqlite3Sc
307b0 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
307c0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 29 3b  b[iDb].pSchema);
307d0 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67  .    db->mDbFlag
307e0 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68  s &= ~DBFLAG_Sch
307f0 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 20 20  emaKnownOk;.    
30800 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
30810 4f 6e 65 28 64 62 2c 20 69 44 62 2c 20 26 70 2d  One(db, iDb, &p-
30820 3e 7a 45 72 72 4d 73 67 2c 20 49 4e 49 54 46 4c  >zErrMsg, INITFL
30830 41 47 5f 41 6c 74 65 72 54 61 62 6c 65 29 3b 0a  AG_AlterTable);.
30840 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
30850 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
30860 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 70 2d 3e  aChange;.    p->
30870 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d  expired = 0;.  }
30880 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
30890 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 4d 41      zMaster = MA
308a0 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 20 20 69  STER_NAME;.    i
308b0 6e 69 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b  nitData.db = db;
308c0 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e 69 44  .    initData.iD
308d0 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 69 6e 69  b = iDb;.    ini
308e0 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d  tData.pzErrMsg =
308f0 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20   &p->zErrMsg;.  
30900 20 20 69 6e 69 74 44 61 74 61 2e 6d 49 6e 69 74    initData.mInit
30910 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7a  Flags = 0;.    z
30920 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
30930 69 6e 74 66 28 64 62 2c 0a 20 20 20 20 20 20 20  intf(db,.       
30940 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f  "SELECT name, ro
30950 6f 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d  otpage, sql FROM
30960 20 27 25 71 27 2e 25 73 20 57 48 45 52 45 20 25   '%q'.%s WHERE %
30970 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
30980 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
30990 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
309a0 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d 3e 70   zMaster, pOp->p
309b0 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  4.z);.    if( zS
309c0 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
309d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
309e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
309f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30a00 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
30a10 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e   );.      db->in
30a20 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20 20  it.busy = 1;.   
30a30 20 20 20 69 6e 69 74 44 61 74 61 2e 72 63 20 3d     initData.rc =
30a40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30a50 20 20 69 6e 69 74 44 61 74 61 2e 6e 49 6e 69 74    initData.nInit
30a60 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  Row = 0;.      a
30a70 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
30a80 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
30a90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
30aa0 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71  xec(db, zSql, sq
30ab0 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63  lite3InitCallbac
30ac0 6b 2c 20 26 69 6e 69 74 44 61 74 61 2c 20 30 29  k, &initData, 0)
30ad0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
30ae0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
30af0 20 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20 20   initData.rc;.  
30b00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30b10 54 45 5f 4f 4b 20 26 26 20 69 6e 69 74 44 61 74  TE_OK && initDat
30b20 61 2e 6e 49 6e 69 74 52 6f 77 3d 3d 30 20 29 7b  a.nInitRow==0 ){
30b30 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
30b40 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f  OP_ParseSchema o
30b50 70 63 6f 64 65 20 77 69 74 68 20 61 20 6e 6f 6e  pcode with a non
30b60 2d 4e 55 4c 4c 20 50 34 20 61 72 67 75 6d 65 6e  -NULL P4 argumen
30b70 74 20 73 68 6f 75 6c 64 20 70 61 72 73 65 0a 20  t should parse. 
30b80 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
30b90 73 74 20 6f 6e 65 20 53 51 4c 20 73 74 61 74 65  st one SQL state
30ba0 6d 65 6e 74 2e 20 41 6e 79 20 6c 65 73 73 20 74  ment. Any less t
30bb0 68 61 6e 20 74 68 61 74 20 69 6e 64 69 63 61 74  han that indicat
30bc0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
30bd0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
30be0 73 74 65 72 20 74 61 62 6c 65 20 69 73 20 63 6f  ster table is co
30bf0 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
30c00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30c10 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30c20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
30c30 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 7a 53  3DbFreeNN(db, zS
30c40 71 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  ql);.      db->i
30c50 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20  nit.busy = 0;.  
30c60 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
30c70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
30c80 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
30c90 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
30ca0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30cb0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
30cc0 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
30cd0 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 61 62     }.    goto ab
30ce0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
30cf0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20  ;.  }.  break;  
30d00 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
30d10 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41  (SQLITE_OMIT_ANA
30d20 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a  LYZE)./* Opcode:
30d30 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20 50 31   LoadAnalysis P1
30d40 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52   * * * *.**.** R
30d50 65 61 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ead the sqlite_s
30d60 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72 20 64  tat1 table for d
30d70 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20 6c  atabase P1 and l
30d80 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  oad the content.
30d90 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  ** of that table
30da0 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 6e   into the intern
30db0 61 6c 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  al index hash ta
30dc0 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ble.  This will 
30dd0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61  cause.** the ana
30de0 6c 79 73 69 73 20 74 6f 20 62 65 20 75 73 65 64  lysis to be used
30df0 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20   when preparing 
30e00 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 71  all subsequent q
30e10 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20  ueries..*/.case 
30e20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a  OP_LoadAnalysis:
30e30 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
30e40 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
30e50 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
30e60 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c  rc = sqlite3Anal
30e70 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70  ysisLoad(db, pOp
30e80 2d 3e 70 31 29 3b 0a 20 20 69 66 28 20 72 63 20  ->p1);.  if( rc 
30e90 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
30ea0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
30eb0 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  ak;  .}.#endif /
30ec0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
30ed0 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20  E_OMIT_ANALYZE) 
30ee0 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  */../* Opcode: D
30ef0 72 6f 70 54 61 62 6c 65 20 50 31 20 2a 20 2a 20  ropTable P1 * * 
30f00 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
30f10 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
30f20 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
30f30 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
30f40 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
30f50 74 61 62 6c 65 20 6e 61 6d 65 64 20 50 34 20 69  table named P4 i
30f60 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20  n database P1.  
30f70 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
30f80 66 74 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20  fter a table.** 
30f90 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  is dropped from 
30fa0 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20  disk (using the 
30fb0 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 20  Destroy opcode) 
30fc0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
30fd0 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61   .** the interna
30fe0 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
30ff0 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d   of the.** schem
31000 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  a consistent wit
31010 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
31020 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72  k..*/.case OP_Dr
31030 6f 70 54 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c  opTable: {.  sql
31040 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74  ite3VdbeIncrWrit
31050 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a  eCounter(p, 0);.
31060 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41    sqlite3UnlinkA
31070 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
31080 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
31090 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  p4.z);.  break;.
310a0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72  }../* Opcode: Dr
310b0 6f 70 49 6e 64 65 78 20 50 31 20 2a 20 2a 20 50  opIndex P1 * * P
310c0 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65  4 *.**.** Remove
310d0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69   the internal (i
310e0 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73  n-memory) data s
310f0 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64  tructures that d
31100 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 69  escribe.** the i
31110 6e 64 65 78 20 6e 61 6d 65 64 20 50 34 20 69 6e  ndex named P4 in
31120 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54   database P1.  T
31130 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
31140 74 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ter an index.** 
31150 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  is dropped from 
31160 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20  disk (using the 
31170 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 0a  Destroy opcode).
31180 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ** in order to k
31190 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  eep the internal
311a0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
311b0 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  of the.** schema
311c0 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
311d0 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
311e0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f  ..*/.case OP_Dro
311f0 70 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69  pIndex: {.  sqli
31200 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74 65  te3VdbeIncrWrite
31210 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20  Counter(p, 0);. 
31220 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
31230 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
31240 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
31250 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  4.z);.  break;.}
31260 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f  ../* Opcode: Dro
31270 70 54 72 69 67 67 65 72 20 50 31 20 2a 20 2a 20  pTrigger P1 * * 
31280 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
31290 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
312a0 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
312b0 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
312c0 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
312d0 74 72 69 67 67 65 72 20 6e 61 6d 65 64 20 50 34  trigger named P4
312e0 20 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e   in database P1.
312f0 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64    This is called
31300 20 61 66 74 65 72 20 61 20 74 72 69 67 67 65 72   after a trigger
31310 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20 66  .** is dropped f
31320 72 6f 6d 20 64 69 73 6b 20 28 75 73 69 6e 67 20  rom disk (using 
31330 74 68 65 20 44 65 73 74 72 6f 79 20 6f 70 63 6f  the Destroy opco
31340 64 65 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  de) in order to 
31350 6b 65 65 70 20 0a 2a 2a 20 74 68 65 20 69 6e 74  keep .** the int
31360 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
31370 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
31380 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74  chema consistent
31390 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
313a0 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f   disk..*/.case O
313b0 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a 20 7b  P_DropTrigger: {
313c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e  .  sqlite3VdbeIn
313d0 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28 70  crWriteCounter(p
313e0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 55  , 0);.  sqlite3U
313f0 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72  nlinkAndDeleteTr
31400 69 67 67 65 72 28 64 62 2c 20 70 4f 70 2d 3e 70  igger(db, pOp->p
31410 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
31420 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e   break;.}...#ifn
31430 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31440 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
31450 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67  /* Opcode: Integ
31460 72 69 74 79 43 6b 20 50 31 20 50 32 20 50 33 20  rityCk P1 P2 P3 
31470 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61  P4 P5.**.** Do a
31480 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68  n analysis of th
31490 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
314a0 20 64 61 74 61 62 61 73 65 2e 20 20 53 74 6f 72   database.  Stor
314b0 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72  e in.** register
314c0 20 50 31 20 74 68 65 20 74 65 78 74 20 6f 66 20   P1 the text of 
314d0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
314e0 20 64 65 73 63 72 69 62 69 6e 67 20 61 6e 79 20   describing any 
314f0 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20  problems..** If 
31500 6e 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  no problems are 
31510 66 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61 20 4e  found, store a N
31520 55 4c 4c 20 69 6e 20 72 65 67 69 73 74 65 72 20  ULL in register 
31530 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  P1..**.** The re
31540 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69  gister P3 contai
31550 6e 73 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e  ns one less than
31560 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
31570 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65  ber of allowed e
31580 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73  rrors..** At mos
31590 74 20 72 65 67 28 50 33 29 20 65 72 72 6f 72 73  t reg(P3) errors
315a0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
315b0 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  d..** In other w
315c0 6f 72 64 73 2c 20 74 68 65 20 61 6e 61 6c 79 73  ords, the analys
315d0 69 73 20 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e  is stops as soon
315e0 20 61 73 20 72 65 67 28 50 31 29 20 65 72 72 6f   as reg(P1) erro
315f0 72 73 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e  rs are .** seen.
31600 20 20 52 65 67 28 50 31 29 20 69 73 20 75 70 64    Reg(P1) is upd
31610 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 75  ated with the nu
31620 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72  mber of errors r
31630 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  emaining..**.** 
31640 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  The root page nu
31650 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 74 61 62  mbers of all tab
31660 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  les in the datab
31670 61 73 65 20 61 72 65 20 69 6e 74 65 67 65 72 73  ase are integers
31680 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 50 34  .** stored in P4
31690 5f 49 4e 54 41 52 52 41 59 20 61 72 67 75 6d 65  _INTARRAY argume
316a0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  nt..**.** If P5 
316b0 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
316c0 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65 20 6f   check is done o
316d0 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
316e0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
316f0 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e 20 64  , not the main d
31700 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
31710 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
31720 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
31730 6d 65 6e 74 20 74 68 65 20 69 6e 74 65 67 72 69  ment the integri
31740 74 79 5f 63 68 65 63 6b 20 70 72 61 67 6d 61 2e  ty_check pragma.
31750 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65  .*/.case OP_Inte
31760 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69 6e 74  grityCk: {.  int
31770 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20   nRoot;      /* 
31780 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  Number of tables
31790 20 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e 75 6d   to check.  (Num
317a0 62 65 72 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  ber of root page
317b0 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  s.) */.  int *aR
317c0 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72 72 61  oot;     /* Arra
317d0 79 20 6f 66 20 72 6f 6f 74 70 61 67 65 20 6e 75  y of rootpage nu
317e0 6d 62 65 72 73 20 66 6f 72 20 74 61 62 6c 65 73  mbers for tables
317f0 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a   to be checked *
31800 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20  /.  int nErr;   
31810 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31820 20 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65 64   errors reported
31830 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
31840 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
31850 20 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f 72   the error repor
31860 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72  t */.  Mem *pnEr
31870 72 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  r;     /* Regist
31880 65 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  er keeping track
31890 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69   of errors remai
318a0 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ning */..  asser
318b0 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
318c0 29 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70  );.  nRoot = pOp
318d0 2d 3e 70 32 3b 0a 20 20 61 52 6f 6f 74 20 3d 20  ->p2;.  aRoot = 
318e0 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 61 73  pOp->p4.ai;.  as
318f0 73 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29 3b  sert( nRoot>0 );
31900 0a 20 20 61 73 73 65 72 74 28 20 61 52 6f 6f 74  .  assert( aRoot
31910 5b 30 5d 3d 3d 6e 52 6f 6f 74 20 29 3b 0a 20 20  [0]==nRoot );.  
31920 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
31930 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  0 && pOp->p3<=(p
31940 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
31950 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 6e 45 72  ursor) );.  pnEr
31960 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  r = &aMem[pOp->p
31970 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  3];.  assert( (p
31980 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 4d 45  nErr->flags & ME
31990 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 61  M_Int)!=0 );.  a
319a0 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66  ssert( (pnErr->f
319b0 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c  lags & (MEM_Str|
319c0 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29 3b  MEM_Blob))==0 );
319d0 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
319e0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
319f0 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e  rt( pOp->p5<db->
31a00 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
31a10 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
31a20 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70  treeMask, pOp->p
31a30 35 29 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  5) );.  z = sqli
31a40 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74  te3BtreeIntegrit
31a50 79 43 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70  yCheck(db->aDb[p
31a60 4f 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 26 61 52  Op->p5].pBt, &aR
31a70 6f 6f 74 5b 31 5d 2c 20 6e 52 6f 6f 74 2c 0a 20  oot[1], nRoot,. 
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31aa0 28 69 6e 74 29 70 6e 45 72 72 2d 3e 75 2e 69 2b  (int)pnErr->u.i+
31ab0 31 2c 20 26 6e 45 72 72 29 3b 0a 20 20 73 71 6c  1, &nErr);.  sql
31ac0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
31ad0 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69 66 28 20  ll(pIn1);.  if( 
31ae0 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nErr==0 ){.    a
31af0 73 73 65 72 74 28 20 7a 3d 3d 30 20 29 3b 0a 20  ssert( z==0 );. 
31b00 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d 3d 30 20   }else if( z==0 
31b10 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  ){.    goto no_m
31b20 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
31b30 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e   pnErr->u.i -= n
31b40 45 72 72 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74  Err-1;.    sqlit
31b50 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
31b60 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pIn1, z, -1, SQL
31b70 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65  ITE_UTF8, sqlite
31b80 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55  3_free);.  }.  U
31b90 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
31ba0 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  ZE(pIn1);.  sqli
31bb0 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
31bc0 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f  oding(pIn1, enco
31bd0 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  ding);.  break;.
31be0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
31bf0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
31c00 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f  Y_CHECK */../* O
31c10 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41 64 64  pcode: RowSetAdd
31c20 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
31c30 53 79 6e 6f 70 73 69 73 3a 20 72 6f 77 73 65 74  Synopsis: rowset
31c40 28 50 31 29 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a  (P1)=r[P2].**.**
31c50 20 49 6e 73 65 72 74 20 74 68 65 20 69 6e 74 65   Insert the inte
31c60 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20 62  ger value held b
31c70 79 20 72 65 67 69 73 74 65 72 20 50 32 20 69 6e  y register P2 in
31c80 74 6f 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  to a RowSet obje
31c90 63 74 0a 2a 2a 20 68 65 6c 64 20 69 6e 20 72 65  ct.** held in re
31ca0 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a  gister P1..**.**
31cb0 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
31cc0 69 6c 73 20 69 66 20 50 32 20 69 73 20 6e 6f 74  ils if P2 is not
31cd0 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
31ce0 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 41 64  case OP_RowSetAd
31cf0 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e  d: {       /* in
31d00 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49 6e 31  1, in2 */.  pIn1
31d10 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
31d20 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65  ];.  pIn2 = &aMe
31d30 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73  m[pOp->p2];.  as
31d40 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61  sert( (pIn2->fla
31d50 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  gs & MEM_Int)!=0
31d60 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d   );.  if( (pIn1-
31d70 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
31d80 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  b)==0 ){.    if(
31d90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
31da0 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 20 29  etRowSet(pIn1) )
31db0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
31dc0 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
31dd0 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53  te3VdbeMemIsRowS
31de0 65 74 28 70 49 6e 31 29 20 29 3b 0a 20 20 73 71  et(pIn1) );.  sq
31df0 6c 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72  lite3RowSetInser
31e00 74 28 28 52 6f 77 53 65 74 2a 29 70 49 6e 31 2d  t((RowSet*)pIn1-
31e10 3e 7a 2c 20 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a  >z, pIn2->u.i);.
31e20 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
31e30 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 52 65 61  pcode: RowSetRea
31e40 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
31e50 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
31e60 5d 3d 72 6f 77 73 65 74 28 50 31 29 0a 2a 2a 0a  ]=rowset(P1).**.
31e70 2a 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73  ** Extract the s
31e80 6d 61 6c 6c 65 73 74 20 76 61 6c 75 65 20 66 72  mallest value fr
31e90 6f 6d 20 74 68 65 20 52 6f 77 53 65 74 20 6f 62  om the RowSet ob
31ea0 6a 65 63 74 20 69 6e 20 50 31 0a 2a 2a 20 61 6e  ject in P1.** an
31eb0 64 20 70 75 74 20 74 68 61 74 20 76 61 6c 75 65  d put that value
31ec0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
31ed0 33 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 52 6f 77  3..** Or, if Row
31ee0 53 65 74 20 6f 62 6a 65 63 74 20 50 31 20 69 73  Set object P1 is
31ef0 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
31f00 2c 20 6c 65 61 76 65 20 50 33 0a 2a 2a 20 75 6e  , leave P3.** un
31f10 63 68 61 6e 67 65 64 20 61 6e 64 20 6a 75 6d 70  changed and jump
31f20 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
31f30 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  P2..*/.case OP_R
31f40 6f 77 53 65 74 52 65 61 64 3a 20 7b 20 20 20 20  owSetRead: {    
31f50 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c     /* jump, in1,
31f60 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 76   out3 */.  i64 v
31f70 61 6c 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61  al;..  pIn1 = &a
31f80 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
31f90 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e 66  assert( (pIn1->f
31fa0 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29  lags & MEM_Blob)
31fb0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64  ==0 || sqlite3Vd
31fc0 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 49  beMemIsRowSet(pI
31fd0 6e 31 29 20 29 3b 0a 20 20 69 66 28 20 28 70 49  n1) );.  if( (pI
31fe0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
31ff0 42 6c 6f 62 29 3d 3d 30 20 0a 20 20 20 7c 7c 20  Blob)==0 .   || 
32000 73 71 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78  sqlite3RowSetNex
32010 74 28 28 52 6f 77 53 65 74 2a 29 70 49 6e 31 2d  t((RowSet*)pIn1-
32020 3e 7a 2c 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29  >z, &val)==0.  )
32030 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f  {.    /* The boo
32040 6c 65 61 6e 20 69 6e 64 65 78 20 69 73 20 65 6d  lean index is em
32050 70 74 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  pty */.    sqlit
32060 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
32070 28 70 49 6e 31 29 3b 0a 20 20 20 20 56 64 62 65  (pIn1);.    Vdbe
32080 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29  BranchTaken(1,2)
32090 3b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f  ;.    goto jump_
320a0 74 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f  to_p2_and_check_
320b0 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20  for_interrupt;. 
320c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
320d0 20 76 61 6c 75 65 20 77 61 73 20 70 75 6c 6c 65   value was pulle
320e0 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  d from the index
320f0 20 2a 2f 0a 20 20 20 20 56 64 62 65 42 72 61 6e   */.    VdbeBran
32100 63 68 54 61 6b 65 6e 28 30 2c 32 29 3b 0a 20 20  chTaken(0,2);.  
32110 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
32120 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70  SetInt64(&aMem[p
32130 4f 70 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b 0a 20  Op->p3], val);. 
32140 20 7d 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f   }.  goto check_
32150 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d  for_interrupt;.}
32160 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  ../* Opcode: Row
32170 53 65 74 54 65 73 74 20 50 31 20 50 32 20 50 33  SetTest P1 P2 P3
32180 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P4.** Synopsis:
32190 20 69 66 20 72 5b 50 33 5d 20 69 6e 20 72 6f 77   if r[P3] in row
321a0 73 65 74 28 50 31 29 20 67 6f 74 6f 20 50 32 0a  set(P1) goto P2.
321b0 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50  **.** Register P
321c0 33 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  3 is assumed to 
321d0 68 6f 6c 64 20 61 20 36 34 2d 62 69 74 20 69 6e  hold a 64-bit in
321e0 74 65 67 65 72 20 76 61 6c 75 65 2e 20 49 66 20  teger value. If 
321f0 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 63  register P1.** c
32200 6f 6e 74 61 69 6e 73 20 61 20 52 6f 77 53 65 74  ontains a RowSet
32210 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74   object and that
32220 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 63   RowSet object c
32230 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76  ontains.** the v
32240 61 6c 75 65 20 68 65 6c 64 20 69 6e 20 50 33 2c  alue held in P3,
32250 20 6a 75 6d 70 20 74 6f 20 72 65 67 69 73 74 65   jump to registe
32260 72 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c  r P2. Otherwise,
32270 20 69 6e 73 65 72 74 20 74 68 65 0a 2a 2a 20 69   insert the.** i
32280 6e 74 65 67 65 72 20 69 6e 20 50 33 20 69 6e 74  nteger in P3 int
32290 6f 20 74 68 65 20 52 6f 77 53 65 74 20 61 6e 64  o the RowSet and
322a0 20 63 6f 6e 74 69 6e 75 65 20 6f 6e 20 74 6f 20   continue on to 
322b0 74 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 70 63 6f  the.** next opco
322c0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f  de..**.** The Ro
322d0 77 53 65 74 20 6f 62 6a 65 63 74 20 69 73 20 6f  wSet object is o
322e0 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 74 68 65  ptimized for the
322f0 20 63 61 73 65 20 77 68 65 72 65 20 73 65 74 73   case where sets
32300 20 6f 66 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20   of integers.** 
32310 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
32320 64 69 73 74 69 6e 63 74 20 70 68 61 73 65 73 2c  distinct phases,
32330 20 77 68 69 63 68 20 65 61 63 68 20 73 65 74 20   which each set 
32340 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75 70 6c  contains no dupl
32350 69 63 61 74 65 73 2e 0a 2a 2a 20 45 61 63 68 20  icates..** Each 
32360 73 65 74 20 69 73 20 69 64 65 6e 74 69 66 69 65  set is identifie
32370 64 20 62 79 20 61 20 75 6e 69 71 75 65 20 50 34  d by a unique P4
32380 20 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73   value. The firs
32390 74 20 73 65 74 0a 2a 2a 20 6d 75 73 74 20 68 61  t set.** must ha
323a0 76 65 20 50 34 3d 3d 30 2c 20 74 68 65 20 66 69  ve P4==0, the fi
323b0 6e 61 6c 20 73 65 74 20 6d 75 73 74 20 68 61 76  nal set must hav
323c0 65 20 50 34 3d 3d 2d 31 2c 20 61 6e 64 20 66 6f  e P4==-1, and fo
323d0 72 20 61 6c 6c 20 6f 74 68 65 72 20 73 65 74 73  r all other sets
323e0 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34  .** must have P4
323f0 3e 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61  >0..**.** This a
32400 6c 6c 6f 77 73 20 6f 70 74 69 6d 69 7a 61 74 69  llows optimizati
32410 6f 6e 73 3a 20 28 61 29 20 77 68 65 6e 20 50 34  ons: (a) when P4
32420 3d 3d 30 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ==0 there is no 
32430 6e 65 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  need to test.** 
32440 74 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  the RowSet objec
32450 74 20 66 6f 72 20 50 33 2c 20 61 73 20 69 74 20  t for P3, as it 
32460 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f  is guaranteed no
32470 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 69 74 2c  t to contain it,
32480 0a 2a 2a 20 28 62 29 20 77 68 65 6e 20 50 34 3d  .** (b) when P4=
32490 3d 2d 31 20 74 68 65 72 65 20 69 73 20 6e 6f 20  =-1 there is no 
324a0 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74  need to insert t
324b0 68 65 20 76 61 6c 75 65 2c 20 61 73 20 69 74 20  he value, as it 
324c0 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65  will.** never be
324d0 20 74 65 73 74 65 64 20 66 6f 72 2c 20 61 6e 64   tested for, and
324e0 20 28 63 29 20 77 68 65 6e 20 61 20 76 61 6c 75   (c) when a valu
324f0 65 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  e that is part o
32500 66 20 73 65 74 20 58 20 69 73 0a 2a 2a 20 69 6e  f set X is.** in
32510 73 65 72 74 65 64 2c 20 74 68 65 72 65 20 69 73  serted, there is
32520 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 61 72   no need to sear
32530 63 68 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ch to see if the
32540 20 73 61 6d 65 20 76 61 6c 75 65 20 77 61 73 0a   same value was.
32550 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ** previously in
32560 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20 6f  serted as part o
32570 66 20 73 65 74 20 58 20 28 6f 6e 6c 79 20 69 66  f set X (only if
32580 20 69 74 20 77 61 73 20 70 72 65 76 69 6f 75 73   it was previous
32590 6c 79 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 61  ly.** inserted a
325a0 73 20 70 61 72 74 20 6f 66 20 73 6f 6d 65 20 6f  s part of some o
325b0 74 68 65 72 20 73 65 74 29 2e 0a 2a 2f 0a 63 61  ther set)..*/.ca
325c0 73 65 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  se OP_RowSetTest
325d0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
325e0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
325f0 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69   in1, in3 */.  i
32600 6e 74 20 69 53 65 74 3b 0a 20 20 69 6e 74 20 65  nt iSet;.  int e
32610 78 69 73 74 73 3b 0a 0a 20 20 70 49 6e 31 20 3d  xists;..  pIn1 =
32620 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
32630 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
32640 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 53 65 74  pOp->p3];.  iSet
32650 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20   = pOp->p4.i;.  
32660 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c  assert( pIn3->fl
32670 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a  ags&MEM_Int );..
32680 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
32690 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
326a0 74 68 61 6e 20 61 20 72 6f 77 73 65 74 20 6f 62  than a rowset ob
326b0 6a 65 63 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ject in memory c
326c0 65 6c 6c 20 50 31 2c 0a 20 20 2a 2a 20 64 65 6c  ell P1,.  ** del
326d0 65 74 65 20 69 74 20 6e 6f 77 20 61 6e 64 20 69  ete it now and i
326e0 6e 69 74 69 61 6c 69 7a 65 20 50 31 20 77 69 74  nitialize P1 wit
326f0 68 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65  h an empty rowse
32700 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 49  t.  */.  if( (pI
32710 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
32720 42 6c 6f 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Blob)==0 ){.    
32730 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
32740 65 6d 53 65 74 52 6f 77 53 65 74 28 70 49 6e 31  emSetRowSet(pIn1
32750 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
32760 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
32770 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52  qlite3VdbeMemIsR
32780 6f 77 53 65 74 28 70 49 6e 31 29 20 29 3b 0a 20  owSet(pIn1) );. 
32790 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
327a0 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
327b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 65 74  ;.  assert( iSet
327c0 3d 3d 2d 31 20 7c 7c 20 69 53 65 74 3e 3d 30 20  ==-1 || iSet>=0 
327d0 29 3b 0a 20 20 69 66 28 20 69 53 65 74 20 29 7b  );.  if( iSet ){
327e0 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 73 71  .    exists = sq
327f0 6c 69 74 65 33 52 6f 77 53 65 74 54 65 73 74 28  lite3RowSetTest(
32800 28 52 6f 77 53 65 74 2a 29 70 49 6e 31 2d 3e 7a  (RowSet*)pIn1->z
32810 2c 20 69 53 65 74 2c 20 70 49 6e 33 2d 3e 75 2e  , iSet, pIn3->u.
32820 69 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  i);.    VdbeBran
32830 63 68 54 61 6b 65 6e 28 65 78 69 73 74 73 21 3d  chTaken(exists!=
32840 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 65 78  0,2);.    if( ex
32850 69 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70  ists ) goto jump
32860 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 69 66  _to_p2;.  }.  if
32870 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20  ( iSet>=0 ){.   
32880 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e   sqlite3RowSetIn
32890 73 65 72 74 28 28 52 6f 77 53 65 74 2a 29 70 49  sert((RowSet*)pI
328a0 6e 31 2d 3e 7a 2c 20 70 49 6e 33 2d 3e 75 2e 69  n1->z, pIn3->u.i
328b0 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
328c0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
328d0 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
328e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 6f 67  ./* Opcode: Prog
328f0 72 61 6d 20 50 31 20 50 32 20 50 33 20 50 34 20  ram P1 P2 P3 P4 
32900 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65  P5.**.** Execute
32910 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f   the trigger pro
32920 67 72 61 6d 20 70 61 73 73 65 64 20 61 73 20 50  gram passed as P
32930 34 20 28 74 79 70 65 20 50 34 5f 53 55 42 50 52  4 (type P4_SUBPR
32940 4f 47 52 41 4d 29 2e 20 0a 2a 2a 0a 2a 2a 20 50  OGRAM). .**.** P
32950 31 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61  1 contains the a
32960 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6d 65  ddress of the me
32970 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63  mory cell that c
32980 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73  ontains the firs
32990 74 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  t memory .** cel
329a0 6c 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  l in an array of
329b0 20 76 61 6c 75 65 73 20 75 73 65 64 20 61 73 20   values used as 
329c0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
329d0 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 50 32   sub-program. P2
329e0 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68   .** contains th
329f0 65 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  e address to jum
32a00 70 20 74 6f 20 69 66 20 74 68 65 20 73 75 62 2d  p to if the sub-
32a10 70 72 6f 67 72 61 6d 20 74 68 72 6f 77 73 20 61  program throws a
32a20 6e 20 49 47 4e 4f 52 45 20 0a 2a 2a 20 65 78 63  n IGNORE .** exc
32a30 65 70 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  eption using the
32a40 20 52 41 49 53 45 28 29 20 66 75 6e 63 74 69 6f   RAISE() functio
32a50 6e 2e 20 52 65 67 69 73 74 65 72 20 50 33 20 63  n. Register P3 c
32a60 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72  ontains the addr
32a70 65 73 73 20 0a 2a 2a 20 6f 66 20 61 20 6d 65 6d  ess .** of a mem
32a80 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 69 73  ory cell in this
32a90 20 28 74 68 65 20 70 61 72 65 6e 74 29 20 56 4d   (the parent) VM
32aa0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
32ab0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 0a 2a   allocate the .*
32ac0 2a 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  * memory require
32ad0 64 20 62 79 20 74 68 65 20 73 75 62 2d 76 64 62  d by the sub-vdb
32ae0 65 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a  e at runtime..**
32af0 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
32b00 74 65 72 20 74 6f 20 74 68 65 20 56 4d 20 63 6f  ter to the VM co
32b10 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69  ntaining the tri
32b20 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a  gger program..**
32b30 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 6e  .** If P5 is non
32b40 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72 65 63 75  -zero, then recu
32b50 72 73 69 76 65 20 70 72 6f 67 72 61 6d 20 69 6e  rsive program in
32b60 76 6f 63 61 74 69 6f 6e 20 69 73 20 65 6e 61 62  vocation is enab
32b70 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  led..*/.case OP_
32b80 50 72 6f 67 72 61 6d 3a 20 7b 20 20 20 20 20 20  Program: {      
32b90 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
32ba0 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  nt nMem;        
32bb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32bc0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   of memory regis
32bd0 74 65 72 73 20 66 6f 72 20 73 75 62 2d 70 72 6f  ters for sub-pro
32be0 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  gram */.  int nB
32bf0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
32c00 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 72 75    /* Bytes of ru
32c10 6e 74 69 6d 65 20 73 70 61 63 65 20 72 65 71 75  ntime space requ
32c20 69 72 65 64 20 66 6f 72 20 73 75 62 2d 70 72 6f  ired for sub-pro
32c30 67 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  gram */.  Mem *p
32c40 52 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Rt;             
32c50 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
32c60 20 61 6c 6c 6f 63 61 74 65 20 72 75 6e 74 69 6d   allocate runtim
32c70 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 4d 65 6d  e space */.  Mem
32c80 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   *pMem;         
32c90 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
32ca0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
32cb0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f 0a  memory cells */.
32cc0 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 20 20 20 20    Mem *pEnd;    
32cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
32ce0 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
32cf0 20 6e 65 77 20 61 72 72 61 79 20 2a 2f 0a 20 20   new array */.  
32d00 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
32d10 65 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76  e;      /* New v
32d20 64 62 65 20 66 72 61 6d 65 20 74 6f 20 65 78 65  dbe frame to exe
32d30 63 75 74 65 20 69 6e 20 2a 2f 0a 20 20 53 75 62  cute in */.  Sub
32d40 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72 61  Program *pProgra
32d50 6d 3b 20 20 20 2f 2a 20 53 75 62 2d 70 72 6f 67  m;   /* Sub-prog
32d60 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20 2a  ram to execute *
32d70 2f 0a 20 20 76 6f 69 64 20 2a 74 3b 20 20 20 20  /.  void *t;    
32d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32d90 6f 6b 65 6e 20 69 64 65 6e 74 69 66 79 69 6e 67  oken identifying
32da0 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a 20 20 70   trigger */..  p
32db0 50 72 6f 67 72 61 6d 20 3d 20 70 4f 70 2d 3e 70  Program = pOp->p
32dc0 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 52  4.pProgram;.  pR
32dd0 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
32de0 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  3];.  assert( pP
32df0 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b  rogram->nOp>0 );
32e00 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .  .  /* If the 
32e10 70 35 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  p5 flag is clear
32e20 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69 76 65  , then recursive
32e30 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
32e40 72 69 67 67 65 72 73 20 69 73 20 0a 20 20 2a 2a  riggers is .  **
32e50 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 62 61   disabled for ba
32e60 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
32e70 69 6c 69 74 79 20 28 70 35 20 69 73 20 73 65 74  ility (p5 is set
32e80 20 69 66 20 74 68 69 73 20 73 75 62 2d 70 72 6f   if this sub-pro
32e90 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65 61  gram.  ** is rea
32ea0 6c 6c 79 20 61 20 74 72 69 67 67 65 72 2c 20 6e  lly a trigger, n
32eb0 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  ot a foreign key
32ec0 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65   action, and the
32ed0 20 66 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20 61   flag set.  ** a
32ee0 6e 64 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  nd cleared by th
32ef0 65 20 22 50 52 41 47 4d 41 20 72 65 63 75 72 73  e "PRAGMA recurs
32f00 69 76 65 5f 74 72 69 67 67 65 72 73 22 20 63 6f  ive_triggers" co
32f10 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61 72 29 2e  mmand is clear).
32f20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20 69  .  ** .  ** It i
32f30 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f  s recursive invo
32f40 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65  cation of trigge
32f50 72 73 2c 20 61 74 20 74 68 65 20 53 51 4c 20 6c  rs, at the SQL l
32f60 65 76 65 6c 2c 20 74 68 61 74 20 69 73 20 0a 20  evel, that is . 
32f70 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 49 6e   ** disabled. In
32f80 20 73 6f 6d 65 20 63 61 73 65 73 20 61 20 73 69   some cases a si
32f90 6e 67 6c 65 20 74 72 69 67 67 65 72 20 6d 61 79  ngle trigger may
32fa0 20 67 65 6e 65 72 61 74 65 20 6d 6f 72 65 20 74   generate more t
32fb0 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53 75  han one .  ** Su
32fc0 62 50 72 6f 67 72 61 6d 20 28 69 66 20 74 68 65  bProgram (if the
32fd0 20 74 72 69 67 67 65 72 20 6d 61 79 20 62 65 20   trigger may be 
32fe0 65 78 65 63 75 74 65 64 20 77 69 74 68 20 6d 6f  executed with mo
32ff0 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 69 66 66  re than one diff
33000 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20 43  erent .  ** ON C
33010 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68  ONFLICT algorith
33020 6d 29 2e 20 53 75 62 50 72 6f 67 72 61 6d 20 73  m). SubProgram s
33030 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
33040 61 74 65 64 20 77 69 74 68 20 61 0a 20 20 2a 2a  ated with a.  **
33050 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20   single trigger 
33060 61 6c 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d  all have the sam
33070 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
33080 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e  SubProgram.token
33090 20 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e   .  ** variable.
330a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e    */.  if( pOp->
330b0 70 35 20 29 7b 0a 20 20 20 20 74 20 3d 20 70 50  p5 ){.    t = pP
330c0 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20  rogram->token;. 
330d0 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
330e0 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 20  >pFrame; pFrame 
330f0 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e  && pFrame->token
33100 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  !=t; pFrame=pFra
33110 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
33120 20 20 69 66 28 20 70 46 72 61 6d 65 20 29 20 62    if( pFrame ) b
33130 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
33140 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e   p->nFrame>=db->
33150 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
33160 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
33170 48 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  H] ){.    rc = S
33180 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
33190 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
331a0 72 28 70 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c  r(p, "too many l
331b0 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72  evels of trigger
331c0 20 72 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20   recursion");.  
331d0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
331e0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a  _to_error;.  }..
331f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 70 52    /* Register pR
33200 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
33210 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  re the memory re
33220 71 75 69 72 65 64 20 74 6f 20 73 61 76 65 20 74  quired to save t
33230 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
33240 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
33250 67 72 61 6d 2c 20 61 6e 64 20 74 68 65 20 6d 65  gram, and the me
33260 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 61 74  mory required at
33270 20 72 75 6e 74 69 6d 65 20 74 6f 20 65 78 65 63   runtime to exec
33280 75 74 65 0a 20 20 2a 2a 20 74 68 65 20 74 72 69  ute.  ** the tri
33290 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66  gger program. If
332a0 20 74 68 69 73 20 74 72 69 67 67 65 72 20 68 61   this trigger ha
332b0 73 20 62 65 65 6e 20 66 69 72 65 64 20 62 65 66  s been fired bef
332c0 6f 72 65 2c 20 74 68 65 6e 20 70 52 74 20 0a 20  ore, then pRt . 
332d0 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 61   ** is already a
332e0 6c 6c 6f 63 61 74 65 64 2e 20 4f 74 68 65 72 77  llocated. Otherw
332f0 69 73 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ise, it must be 
33300 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
33310 0a 20 20 69 66 28 20 28 70 52 74 2d 3e 66 6c 61  .  if( (pRt->fla
33320 67 73 26 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20  gs&MEM_Blob)==0 
33330 29 7b 0a 20 20 20 20 2f 2a 20 53 75 62 50 72 6f  ){.    /* SubPro
33340 67 72 61 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74  gram.nMem is set
33350 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
33360 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75  f memory cells u
33370 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 20 20  sed by the .    
33380 2a 2a 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  ** program store
33390 64 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e  d in SubProgram.
333a0 61 4f 70 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  aOp. As well as 
333b0 74 68 65 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72  these, one memor
333c0 79 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73  y.    ** cell is
333d0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
333e0 63 68 20 63 75 72 73 6f 72 20 75 73 65 64 20 62  ch cursor used b
333f0 79 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 53  y the program. S
33400 65 74 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  et local.    ** 
33410 76 61 72 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61  variable nMem (a
33420 6e 64 20 6c 61 74 65 72 2c 20 56 64 62 65 46 72  nd later, VdbeFr
33430 61 6d 65 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74  ame.nChildMem) t
33440 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 0a 20 20  o this value..  
33450 20 20 2a 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20    */.    nMem = 
33460 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b  pProgram->nMem +
33470 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b   pProgram->nCsr;
33480 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4d 65  .    assert( nMe
33490 6d 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  m>0 );.    if( p
334a0 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30  Program->nCsr==0
334b0 20 29 20 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 6e   ) nMem++;.    n
334c0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
334d0 7a 65 6f 66 28 56 64 62 65 46 72 61 6d 65 29 29  zeof(VdbeFrame))
334e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b  .              +
334f0 20 6e 4d 65 6d 20 2a 20 73 69 7a 65 6f 66 28 4d   nMem * sizeof(M
33500 65 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  em).            
33510 20 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43    + pProgram->nC
33520 73 72 20 2a 20 73 69 7a 65 6f 66 28 56 64 62 65  sr * sizeof(Vdbe
33530 43 75 72 73 6f 72 2a 29 0a 20 20 20 20 20 20 20  Cursor*).       
33540 20 20 20 20 20 20 20 2b 20 28 70 50 72 6f 67 72         + (pProgr
33550 61 6d 2d 3e 6e 4f 70 20 2b 20 37 29 2f 38 3b 0a  am->nOp + 7)/8;.
33560 20 20 20 20 70 46 72 61 6d 65 20 3d 20 73 71 6c      pFrame = sql
33570 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
33580 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
33590 20 69 66 28 20 21 70 46 72 61 6d 65 20 29 7b 0a   if( !pFrame ){.
335a0 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
335b0 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
335c0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
335d0 73 65 28 70 52 74 29 3b 0a 20 20 20 20 70 52 74  se(pRt);.    pRt
335e0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
335f0 6f 62 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20  ob|MEM_Dyn;.    
33600 70 52 74 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  pRt->z = (char*)
33610 70 46 72 61 6d 65 3b 0a 20 20 20 20 70 52 74 2d  pFrame;.    pRt-
33620 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  >n = nByte;.    
33630 70 52 74 2d 3e 78 44 65 6c 20 3d 20 73 71 6c 69  pRt->xDel = sqli
33640 74 65 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44  te3VdbeFrameMemD
33650 65 6c 3b 0a 0a 20 20 20 20 70 46 72 61 6d 65 2d  el;..    pFrame-
33660 3e 76 20 3d 20 70 3b 0a 20 20 20 20 70 46 72 61  >v = p;.    pFra
33670 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 3d 20  me->nChildMem = 
33680 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65  nMem;.    pFrame
33690 2d 3e 6e 43 68 69 6c 64 43 73 72 20 3d 20 70 50  ->nChildCsr = pP
336a0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20  rogram->nCsr;.  
336b0 20 20 70 46 72 61 6d 65 2d 3e 70 63 20 3d 20 28    pFrame->pc = (
336c0 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b  int)(pOp - aOp);
336d0 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 4d 65  .    pFrame->aMe
336e0 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20  m = p->aMem;.   
336f0 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20   pFrame->nMem = 
33700 70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72  p->nMem;.    pFr
33710 61 6d 65 2d 3e 61 70 43 73 72 20 3d 20 70 2d 3e  ame->apCsr = p->
33720 61 70 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d  apCsr;.    pFram
33730 65 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 2d 3e  e->nCursor = p->
33740 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 46 72  nCursor;.    pFr
33750 61 6d 65 2d 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f  ame->aOp = p->aO
33760 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  p;.    pFrame->n
33770 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = p->nOp;.   
33780 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d   pFrame->token =
33790 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e   pProgram->token
337a0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
337b0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
337c0 53 54 41 54 55 53 0a 20 20 20 20 70 46 72 61 6d  STATUS.    pFram
337d0 65 2d 3e 61 6e 45 78 65 63 20 3d 20 70 2d 3e 61  e->anExec = p->a
337e0 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 23 69  nExec;.#endif.#i
337f0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
33800 47 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 69 46  G.    pFrame->iF
33810 72 61 6d 65 4d 61 67 69 63 20 3d 20 53 51 4c 49  rameMagic = SQLI
33820 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43 3b 0a  TE_FRAME_MAGIC;.
33830 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 45 6e 64  #endif..    pEnd
33840 20 3d 20 26 56 64 62 65 46 72 61 6d 65 4d 65 6d   = &VdbeFrameMem
33850 28 70 46 72 61 6d 65 29 5b 70 46 72 61 6d 65 2d  (pFrame)[pFrame-
33860 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20  >nChildMem];.   
33870 20 66 6f 72 28 70 4d 65 6d 3d 56 64 62 65 46 72   for(pMem=VdbeFr
33880 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 20  ameMem(pFrame); 
33890 70 4d 65 6d 21 3d 70 45 6e 64 3b 20 70 4d 65 6d  pMem!=pEnd; pMem
338a0 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ++){.      pMem-
338b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
338c0 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 4d  efined;.      pM
338d0 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  em->db = db;.   
338e0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
338f0 70 46 72 61 6d 65 20 3d 20 28 56 64 62 65 46 72  pFrame = (VdbeFr
33900 61 6d 65 2a 29 70 52 74 2d 3e 7a 3b 0a 20 20 20  ame*)pRt->z;.   
33910 20 61 73 73 65 72 74 28 20 70 52 74 2d 3e 78 44   assert( pRt->xD
33920 65 6c 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 46  el==sqlite3VdbeF
33930 72 61 6d 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20  rameMemDel );.  
33940 20 20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72    assert( pProgr
33950 61 6d 2d 3e 6e 4d 65 6d 2b 70 50 72 6f 67 72 61  am->nMem+pProgra
33960 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d  m->nCsr==pFrame-
33970 3e 6e 43 68 69 6c 64 4d 65 6d 20 0a 20 20 20 20  >nChildMem .    
33980 20 20 20 20 7c 7c 20 28 70 50 72 6f 67 72 61 6d      || (pProgram
33990 2d 3e 6e 43 73 72 3d 3d 30 20 26 26 20 70 50 72  ->nCsr==0 && pPr
339a0 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 31 3d 3d 70  ogram->nMem+1==p
339b0 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Frame->nChildMem
339c0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
339d0 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d   pProgram->nCsr=
339e0 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43  =pFrame->nChildC
339f0 73 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  sr );.    assert
33a00 28 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  ( (int)(pOp - aO
33a10 70 29 3d 3d 70 46 72 61 6d 65 2d 3e 70 63 20 29  p)==pFrame->pc )
33a20 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 6e 46 72 61  ;.  }..  p->nFra
33a30 6d 65 2b 2b 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  me++;.  pFrame->
33a40 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 46 72  pParent = p->pFr
33a50 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6c  ame;.  pFrame->l
33a60 61 73 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c  astRowid = db->l
33a70 61 73 74 52 6f 77 69 64 3b 0a 20 20 70 46 72 61  astRowid;.  pFra
33a80 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d  me->nChange = p-
33a90 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70 46 72 61  >nChange;.  pFra
33aa0 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 20 3d 20  me->nDbChange = 
33ab0 70 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a  p->db->nChange;.
33ac0 20 20 61 73 73 65 72 74 28 20 70 46 72 61 6d 65    assert( pFrame
33ad0 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
33ae0 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44  .  pFrame->pAuxD
33af0 61 74 61 20 3d 20 70 2d 3e 70 41 75 78 44 61 74  ata = p->pAuxDat
33b00 61 3b 0a 20 20 70 2d 3e 70 41 75 78 44 61 74 61  a;.  p->pAuxData
33b10 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e   = 0;.  p->nChan
33b20 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 46 72  ge = 0;.  p->pFr
33b30 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 20 20  ame = pFrame;.  
33b40 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 3d  p->aMem = aMem =
33b50 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46   VdbeFrameMem(pF
33b60 72 61 6d 65 29 3b 0a 20 20 70 2d 3e 6e 4d 65 6d  rame);.  p->nMem
33b70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c   = pFrame->nChil
33b80 64 4d 65 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72 73  dMem;.  p->nCurs
33b90 6f 72 20 3d 20 28 75 31 36 29 70 46 72 61 6d 65  or = (u16)pFrame
33ba0 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 0a 20 20 70  ->nChildCsr;.  p
33bb0 2d 3e 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  ->apCsr = (VdbeC
33bc0 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
33bd0 2d 3e 6e 4d 65 6d 5d 3b 0a 20 20 70 46 72 61 6d  ->nMem];.  pFram
33be0 65 2d 3e 61 4f 6e 63 65 20 3d 20 28 75 38 2a 29  e->aOnce = (u8*)
33bf0 26 70 2d 3e 61 70 43 73 72 5b 70 50 72 6f 67 72  &p->apCsr[pProgr
33c00 61 6d 2d 3e 6e 43 73 72 5d 3b 0a 20 20 6d 65 6d  am->nCsr];.  mem
33c10 73 65 74 28 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  set(pFrame->aOnc
33c20 65 2c 20 30 2c 20 28 70 50 72 6f 67 72 61 6d 2d  e, 0, (pProgram-
33c30 3e 6e 4f 70 20 2b 20 37 29 2f 38 29 3b 0a 20 20  >nOp + 7)/8);.  
33c40 70 2d 3e 61 4f 70 20 3d 20 61 4f 70 20 3d 20 70  p->aOp = aOp = p
33c50 50 72 6f 67 72 61 6d 2d 3e 61 4f 70 3b 0a 20 20  Program->aOp;.  
33c60 70 2d 3e 6e 4f 70 20 3d 20 70 50 72 6f 67 72 61  p->nOp = pProgra
33c70 6d 2d 3e 6e 4f 70 3b 0a 23 69 66 64 65 66 20 53  m->nOp;.#ifdef S
33c80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
33c90 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 70  T_SCANSTATUS.  p
33ca0 2d 3e 61 6e 45 78 65 63 20 3d 20 30 3b 0a 23 65  ->anExec = 0;.#e
33cb0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
33cc0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
33cd0 72 69 66 79 20 74 68 61 74 20 73 65 63 6f 6e 64  rify that second
33ce0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
33cf0 65 78 65 63 75 74 69 6f 6e 73 20 6f 66 20 74 68  executions of th
33d00 65 20 73 61 6d 65 20 74 72 69 67 67 65 72 20 64  e same trigger d
33d10 6f 20 6e 6f 74 0a 20 20 2a 2a 20 74 72 79 20 74  o not.  ** try t
33d20 6f 20 72 65 75 73 65 20 72 65 67 69 73 74 65 72  o reuse register
33d30 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65   values from the
33d40 20 66 69 72 73 74 20 75 73 65 2e 20 2a 2f 0a 20   first use. */. 
33d50 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
33d60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
33d70 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
33d80 20 20 61 4d 65 6d 5b 69 5d 2e 70 53 63 6f 70 79    aMem[i].pScopy
33d90 46 72 6f 6d 20 3d 20 30 3b 20 20 2f 2a 20 50 72  From = 0;  /* Pr
33da0 65 76 65 6e 74 20 66 61 6c 73 65 2d 70 6f 73 69  event false-posi
33db0 74 69 76 65 20 41 62 6f 75 74 54 6f 43 68 61 6e  tive AboutToChan
33dc0 67 65 28 29 20 65 72 72 73 20 2a 2f 0a 20 20 20  ge() errs */.   
33dd0 20 20 20 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73     aMem[i].flags
33de0 20 7c 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65   |= MEM_Undefine
33df0 64 3b 20 2f 2a 20 43 61 75 73 65 20 61 20 66 61  d; /* Cause a fa
33e00 75 6c 74 20 69 66 20 74 68 69 73 20 72 65 67 20  ult if this reg 
33e10 69 73 20 72 65 75 73 65 64 20 2a 2f 0a 20 20 20  is reused */.   
33e20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
33e30 70 4f 70 20 3d 20 26 61 4f 70 5b 2d 31 5d 3b 0a  pOp = &aOp[-1];.
33e40 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72    goto check_for
33e50 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f  _interrupt;.}../
33e60 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61 6d 20  * Opcode: Param 
33e70 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
33e80 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73  * This opcode is
33e90 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65 73 65   only ever prese
33ea0 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67 72 61  nt in sub-progra
33eb0 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  ms called via th
33ec0 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 6d  e .** OP_Program
33ed0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 43 6f   instruction. Co
33ee0 70 79 20 61 20 76 61 6c 75 65 20 63 75 72 72 65  py a value curre
33ef0 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
33f00 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
33f10 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   of the calling 
33f20 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65 20 74  (parent) frame t
33f30 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74 68 65  o cell P2 in the
33f40 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 73 20   current frames 
33f50 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
33f60 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
33f70 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
33f80 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ams to access th
33f90 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20  e new.* .** and 
33fa0 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a  old.* values..**
33fb0 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73 73 20  .** The address 
33fc0 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  of the cell in t
33fd0 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65 20  he parent frame 
33fe0 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
33ff0 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 76   adding.** the v
34000 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 61  alue of the P1 a
34010 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 76  rgument to the v
34020 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 61  alue of the P1 a
34030 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a  rgument to the.*
34040 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f  * calling OP_Pro
34050 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e  gram instruction
34060 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72  ..*/.case OP_Par
34070 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  am: {           
34080 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62  /* out2 */.  Vdb
34090 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a  eFrame *pFrame;.
340a0 20 20 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20 70 4f    Mem *pIn;.  pO
340b0 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
340c0 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
340d0 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d  Frame = p->pFram
340e0 65 3b 0a 20 20 70 49 6e 20 3d 20 26 70 46 72 61  e;.  pIn = &pFra
340f0 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31  me->aMem[pOp->p1
34100 20 2b 20 70 46 72 61 6d 65 2d 3e 61 4f 70 5b 70   + pFrame->aOp[p
34110 46 72 61 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b 20  Frame->pc].p1]; 
34120 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65    .  sqlite3Vdbe
34130 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70  MemShallowCopy(p
34140 4f 75 74 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45 70  Out, pIn, MEM_Ep
34150 68 65 6d 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  hem);.  break;.}
34160 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  ..#endif /* #ifn
34170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34180 54 52 49 47 47 45 52 20 2a 2f 0a 0a 23 69 66 6e  TRIGGER */..#ifn
34190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
341a0 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20 4f  FOREIGN_KEY./* O
341b0 70 63 6f 64 65 3a 20 46 6b 43 6f 75 6e 74 65 72  pcode: FkCounter
341c0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
341d0 53 79 6e 6f 70 73 69 73 3a 20 66 6b 63 74 72 5b  Synopsis: fkctr[
341e0 50 31 5d 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 6e  P1]+=P2.**.** In
341f0 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74  crement a "const
34200 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 20 62  raint counter" b
34210 79 20 50 32 20 28 50 32 20 6d 61 79 20 62 65 20  y P2 (P2 may be 
34220 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69  negative or posi
34230 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20  tive)..** If P1 
34240 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
34250 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72   database constr
34260 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73 20  aint counter is 
34270 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20  incremented .** 
34280 28 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67  (deferred foreig
34290 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
342a0 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  s). Otherwise, i
342b0 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68  f P1 is zero, th
342c0 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
342d0 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65  counter is incre
342e0 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69 61 74  mented (immediat
342f0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
34300 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63  nstraints)..*/.c
34310 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  ase OP_FkCounter
34320 3a 20 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  : {.  if( db->fl
34330 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 65 66  ags & SQLITE_Def
34340 65 72 46 4b 73 20 29 7b 0a 20 20 20 20 64 62 2d  erFKs ){.    db-
34350 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
34360 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  s += pOp->p2;.  
34370 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70  }else if( pOp->p
34380 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  1 ){.    db->nDe
34390 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f  ferredCons += pO
343a0 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p->p2;.  }else{.
343b0 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72      p->nFkConstr
343c0 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b  aint += pOp->p2;
343d0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
343e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66  ./* Opcode: FkIf
343f0 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a  Zero P1 P2 * * *
34400 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
34410 20 66 6b 63 74 72 5b 50 31 5d 3d 3d 30 20 67 6f   fkctr[P1]==0 go
34420 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73  to P2.**.** This
34430 20 6f 70 63 6f 64 65 20 74 65 73 74 73 20 69 66   opcode tests if
34440 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63   a foreign key c
34450 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65  onstraint-counte
34460 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 7a  r is currently z
34470 65 72 6f 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 6a  ero..** If so, j
34480 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
34490 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65  on P2. Otherwise
344a0 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  , fall through t
344b0 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 69  o the next .** i
344c0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
344d0 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a  * If P1 is non-z
344e0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 75  ero, then the ju
344f0 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74  mp is taken if t
34500 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73  he database cons
34510 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 0a 2a  traint-counter.*
34520 2a 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 6f  * is zero (the o
34530 6e 65 20 74 68 61 74 20 63 6f 75 6e 74 73 20 64  ne that counts d
34540 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
34550 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 20  nt violations). 
34560 49 66 20 50 31 20 69 73 0a 2a 2a 20 7a 65 72 6f  If P1 is.** zero
34570 2c 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  , the jump is ta
34580 6b 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ken if the state
34590 6d 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 2d  ment constraint-
345a0 63 6f 75 6e 74 65 72 20 69 73 20 7a 65 72 6f 0a  counter is zero.
345b0 2a 2a 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f  ** (immediate fo
345c0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
345d0 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29  aint violations)
345e0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6b 49  ..*/.case OP_FkI
345f0 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 20  fZero: {        
34600 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66   /* jump */.  if
34610 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20  ( pOp->p1 ){.   
34620 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
34630 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  (db->nDeferredCo
34640 6e 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65  ns==0 && db->nDe
34650 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30  ferredImmCons==0
34660 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 2);.    if( db
34670 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3d  ->nDeferredCons=
34680 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72  =0 && db->nDefer
34690 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20  redImmCons==0 ) 
346a0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
346b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
346c0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 2d  beBranchTaken(p-
346d0 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d  >nFkConstraint==
346e0 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72  0 && db->nDeferr
346f0 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29  edImmCons==0, 2)
34700 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b  ;.    if( p->nFk
34710 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26 26  Constraint==0 &&
34720 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
34730 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20  mCons==0 ) goto 
34740 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
34750 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
34760 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
34770 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
34780 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  _KEY */..#ifndef
34790 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
347a0 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70  OINCREMENT./* Op
347b0 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50 31 20  code: MemMax P1 
347c0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
347d0 70 73 69 73 3a 20 72 5b 50 31 5d 3d 6d 61 78 28  psis: r[P1]=max(
347e0 72 5b 50 31 5d 2c 72 5b 50 32 5d 29 0a 2a 2a 0a  r[P1],r[P2]).**.
347f0 2a 2a 20 50 31 20 69 73 20 61 20 72 65 67 69 73  ** P1 is a regis
34800 74 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20  ter in the root 
34810 66 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 4d  frame of this VM
34820 20 28 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65   (the root frame
34830 20 69 73 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74   is.** different
34840 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
34850 74 20 66 72 61 6d 65 20 69 66 20 74 68 69 73 20  t frame if this 
34860 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 62  instruction is b
34870 65 69 6e 67 20 65 78 65 63 75 74 65 64 0a 2a 2a  eing executed.**
34880 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d 70 72   within a sub-pr
34890 6f 67 72 61 6d 29 2e 20 53 65 74 20 74 68 65 20  ogram). Set the 
348a0 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
348b0 72 20 50 31 20 74 6f 20 74 68 65 20 6d 61 78 69  r P1 to the maxi
348c0 6d 75 6d 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63  mum of .** its c
348d0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
348e0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
348f0 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a  gister P2..**.**
34900 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
34910 6e 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f  n throws an erro
34920 72 20 69 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  r if the memory 
34930 63 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74  cell is not init
34940 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65  ially.** an inte
34950 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ger..*/.case OP_
34960 4d 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20 20 20  MemMax: {       
34970 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62   /* in2 */.  Vdb
34980 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a  eFrame *pFrame;.
34990 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
349a0 29 7b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  ){.    for(pFram
349b0 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
349c0 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
349d0 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
349e0 72 65 6e 74 29 3b 0a 20 20 20 20 70 49 6e 31 20  rent);.    pIn1 
349f0 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b  = &pFrame->aMem[
34a00 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c 73  pOp->p1];.  }els
34a10 65 7b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 61  e{.    pIn1 = &a
34a20 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
34a30 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49  }.  assert( memI
34a40 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a  sValid(pIn1) );.
34a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
34a60 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29  Integerify(pIn1)
34a70 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
34a80 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c  [pOp->p2];.  sql
34a90 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67  ite3VdbeMemInteg
34aa0 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 69  erify(pIn2);.  i
34ab0 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 49 6e  f( pIn1->u.i<pIn
34ac0 32 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70 49 6e  2->u.i){.    pIn
34ad0 31 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d 3e 75  1->u.i = pIn2->u
34ae0 2e 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  .i;.  }.  break;
34af0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
34b00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
34b10 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f 70  REMENT */../* Op
34b20 63 6f 64 65 3a 20 49 66 50 6f 73 20 50 31 20 50  code: IfPos P1 P
34b30 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
34b40 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30  psis: if r[P1]>0
34b50 20 74 68 65 6e 20 72 5b 50 31 5d 2d 3d 50 33 2c   then r[P1]-=P3,
34b60 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52   goto P2.**.** R
34b70 65 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 20  egister P1 must 
34b80 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67  contain an integ
34b90 65 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61  er..** If the va
34ba0 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
34bb0 50 31 20 69 73 20 31 20 6f 72 20 67 72 65 61 74  P1 is 1 or great
34bc0 65 72 2c 20 73 75 62 74 72 61 63 74 20 50 33 20  er, subtract P3 
34bd0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 76 61 6c 75  from the.** valu
34be0 65 20 69 6e 20 50 31 20 61 6e 64 20 6a 75 6d 70  e in P1 and jump
34bf0 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66   to P2..**.** If
34c00 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
34c10 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
34c20 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  1 is less than 1
34c30 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 76 61  , then the.** va
34c40 6c 75 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64  lue is unchanged
34c50 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 70 61 73   and control pas
34c60 73 65 73 20 74 68 72 6f 75 67 68 20 74 6f 20 74  ses through to t
34c70 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
34c80 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
34c90 49 66 50 6f 73 3a 20 7b 20 20 20 20 20 20 20 20  IfPos: {        
34ca0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
34cb0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
34cc0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
34cd0 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d  t( pIn1->flags&M
34ce0 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64 62 65  EM_Int );.  Vdbe
34cf0 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 70 49 6e  BranchTaken( pIn
34d00 31 2d 3e 75 2e 69 3e 30 2c 20 32 29 3b 0a 20 20  1->u.i>0, 2);.  
34d10 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20  if( pIn1->u.i>0 
34d20 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69  ){.    pIn1->u.i
34d30 20 2d 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20   -= pOp->p3;.   
34d40 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
34d50 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
34d60 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 66 66  ../* Opcode: Off
34d70 73 65 74 4c 69 6d 69 74 20 50 31 20 50 32 20 50  setLimit P1 P2 P
34d80 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
34d90 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20 74 68  s: if r[P1]>0 th
34da0 65 6e 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 2b 6d  en r[P2]=r[P1]+m
34db0 61 78 28 30 2c 72 5b 50 33 5d 29 20 65 6c 73 65  ax(0,r[P3]) else
34dc0 20 72 5b 50 32 5d 3d 28 2d 31 29 0a 2a 2a 0a 2a   r[P2]=(-1).**.*
34dd0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 70 65  * This opcode pe
34de0 72 66 6f 72 6d 73 20 61 20 63 6f 6d 6d 6f 6e 6c  rforms a commonl
34df0 79 20 75 73 65 64 20 63 6f 6d 70 75 74 61 74 69  y used computati
34e00 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
34e10 74 68 0a 2a 2a 20 4c 49 4d 49 54 20 61 6e 64 20  th.** LIMIT and 
34e20 4f 46 46 53 45 54 20 70 72 6f 63 65 73 73 2e 20  OFFSET process. 
34e30 20 72 5b 50 31 5d 20 68 6f 6c 64 73 20 74 68 65   r[P1] holds the
34e40 20 6c 69 6d 69 74 20 63 6f 75 6e 74 65 72 2e 20   limit counter. 
34e50 20 72 5b 50 33 5d 0a 2a 2a 20 68 6f 6c 64 73 20   r[P3].** holds 
34e60 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
34e70 65 72 2e 20 20 54 68 65 20 6f 70 63 6f 64 65 20  er.  The opcode 
34e80 63 6f 6d 70 75 74 65 73 20 74 68 65 20 63 6f 6d  computes the com
34e90 62 69 6e 65 64 20 76 61 6c 75 65 0a 2a 2a 20 6f  bined value.** o
34ea0 66 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  f the LIMIT and 
34eb0 4f 46 46 53 45 54 20 61 6e 64 20 73 74 6f 72 65  OFFSET and store
34ec0 73 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 20  s that value in 
34ed0 72 5b 50 32 5d 2e 20 20 54 68 65 20 72 5b 50 32  r[P2].  The r[P2
34ee0 5d 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 6d 70 75  ].** value compu
34ef0 74 65 64 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ted is the total
34f00 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
34f10 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74  that will need t
34f20 6f 20 62 65 0a 2a 2a 20 76 69 73 69 74 65 64 20  o be.** visited 
34f30 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
34f40 6c 65 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  lete the query..
34f50 2a 2a 0a 2a 2a 20 49 66 20 72 5b 50 33 5d 20 69  **.** If r[P3] i
34f60 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
34f70 76 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ve, that means t
34f80 68 65 72 65 20 69 73 20 6e 6f 20 4f 46 46 53 45  here is no OFFSE
34f90 54 0a 2a 2a 20 61 6e 64 20 72 5b 50 32 5d 20 69  T.** and r[P2] i
34fa0 73 20 73 65 74 20 74 6f 20 62 65 20 74 68 65 20  s set to be the 
34fb0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4c 49 4d  value of the LIM
34fc0 49 54 2c 20 72 5b 50 31 5d 2e 0a 2a 2a 0a 2a 2a  IT, r[P1]..**.**
34fd0 20 69 66 20 72 5b 50 31 5d 20 69 73 20 7a 65 72   if r[P1] is zer
34fe0 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 74  o or negative, t
34ff0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72 65 20  hat means there 
35000 69 73 20 6e 6f 20 4c 49 4d 49 54 0a 2a 2a 20 61  is no LIMIT.** a
35010 6e 64 20 72 5b 50 32 5d 20 69 73 20 73 65 74 20  nd r[P2] is set 
35020 74 6f 20 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74  to -1. .**.** Ot
35030 68 65 72 77 69 73 65 2c 20 72 5b 50 32 5d 20 69  herwise, r[P2] i
35040 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d  s set to the sum
35050 20 6f 66 20 72 5b 50 31 5d 20 61 6e 64 20 72 5b   of r[P1] and r[
35060 50 33 5d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  P3]..*/.case OP_
35070 4f 66 66 73 65 74 4c 69 6d 69 74 3a 20 7b 20 20  OffsetLimit: {  
35080 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32 2c 20    /* in1, out2, 
35090 69 6e 33 20 2a 2f 0a 20 20 69 36 34 20 78 3b 0a  in3 */.  i64 x;.
350a0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
350b0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20  Op->p1];.  pIn3 
350c0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
350d0 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ;.  pOut = out2P
350e0 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
350f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
35100 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  1->flags & MEM_I
35110 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
35120 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
35130 4d 5f 49 6e 74 20 29 3b 0a 20 20 78 20 3d 20 70  M_Int );.  x = p
35140 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 69 66 28 20  In1->u.i;.  if( 
35150 78 3c 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 41  x<=0 || sqlite3A
35160 64 64 49 6e 74 36 34 28 26 78 2c 20 70 49 6e 33  ddInt64(&x, pIn3
35170 2d 3e 75 2e 69 3e 30 3f 70 49 6e 33 2d 3e 75 2e  ->u.i>0?pIn3->u.
35180 69 3a 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49  i:0) ){.    /* I
35190 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 6c  f the LIMIT is l
351a0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
351b0 6c 20 74 6f 20 7a 65 72 6f 2c 20 6c 6f 6f 70 20  l to zero, loop 
351c0 66 6f 72 65 76 65 72 2e 20 20 54 68 69 73 0a 20  forever.  This. 
351d0 20 20 20 2a 2a 20 69 73 20 64 6f 63 75 6d 65 6e     ** is documen
351e0 74 65 64 2e 20 20 42 75 74 20 61 6c 73 6f 2c 20  ted.  But also, 
351f0 69 66 20 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46  if the LIMIT+OFF
35200 53 45 54 20 65 78 63 65 65 64 73 20 32 5e 36 33  SET exceeds 2^63
35210 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 73   then.    ** als
35220 6f 20 6c 6f 6f 70 20 66 6f 72 65 76 65 72 2e 20  o loop forever. 
35230 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75 6d   This is undocum
35240 65 6e 74 65 64 2e 20 20 49 6e 20 66 61 63 74 2c  ented.  In fact,
35250 20 6f 6e 65 20 63 6f 75 6c 64 20 61 72 67 75 65   one could argue
35260 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
35270 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 20 74 65 72   loop should ter
35280 6d 69 6e 61 74 65 2e 20 20 42 75 74 20 61 73 73  minate.  But ass
35290 75 6d 69 6e 67 20 31 20 62 69 6c 6c 69 6f 6e 20  uming 1 billion 
352a0 69 74 65 72 61 74 69 6f 6e 73 0a 20 20 20 20 2a  iterations.    *
352b0 2a 20 70 65 72 20 73 65 63 6f 6e 64 20 28 66 61  * per second (fa
352c0 72 20 65 78 63 65 65 64 69 6e 67 20 74 68 65 20  r exceeding the 
352d0 63 61 70 61 62 69 6c 69 74 69 65 73 20 6f 66 20  capabilities of 
352e0 61 6e 79 20 63 75 72 72 65 6e 74 20 68 61 72 64  any current hard
352f0 77 61 72 65 29 0a 20 20 20 20 2a 2a 20 69 74 20  ware).    ** it 
35300 77 6f 75 6c 64 20 74 61 6b 65 20 6e 65 61 72 6c  would take nearl
35310 79 20 33 30 30 20 79 65 61 72 73 20 74 6f 20 61  y 300 years to a
35320 63 74 75 61 6c 6c 79 20 72 65 61 63 68 20 74 68  ctually reach th
35330 65 20 6c 69 6d 69 74 2e 20 20 53 6f 0a 20 20 20  e limit.  So.   
35340 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 66 6f 72 65   ** looping fore
35350 76 65 72 20 69 73 20 61 20 72 65 61 73 6f 6e 61  ver is a reasona
35360 62 6c 65 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  ble approximatio
35370 6e 2e 20 2a 2f 0a 20 20 20 20 70 4f 75 74 2d 3e  n. */.    pOut->
35380 75 2e 69 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  u.i = -1;.  }els
35390 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  e{.    pOut->u.i
353a0 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = x;.  }.  brea
353b0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
353c0 20 49 66 4e 6f 74 5a 65 72 6f 20 50 31 20 50 32   IfNotZero P1 P2
353d0 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
353e0 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d 30 20  is: if r[P1]!=0 
353f0 74 68 65 6e 20 72 5b 50 31 5d 2d 2d 2c 20 67 6f  then r[P1]--, go
35400 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69  to P2.**.** Regi
35410 73 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e  ster P1 must con
35420 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
35430 20 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74    If the content
35440 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20   of register P1 
35450 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
35460 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
35470 6f 2c 20 74 68 65 6e 20 64 65 63 72 65 6d 65 6e  o, then decremen
35480 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  t the value in r
35490 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 49  egister P1..** I
354a0 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f it is non-zero
354b0 20 28 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f   (negative or po
354c0 73 69 74 69 76 65 29 20 61 6e 64 20 74 68 65 6e  sitive) and then
354d0 20 61 6c 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32   also jump to P2
354e0 2e 20 20 0a 2a 2a 20 49 66 20 72 65 67 69 73 74  .  .** If regist
354f0 65 72 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c  er P1 is initial
35500 6c 79 20 7a 65 72 6f 2c 20 6c 65 61 76 65 20 69  ly zero, leave i
35510 74 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  t unchanged and 
35520 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  fall through..*/
35530 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 5a 65  .case OP_IfNotZe
35540 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ro: {        /* 
35550 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70  jump, in1 */.  p
35560 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
35570 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
35580 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn1->flags&MEM_
35590 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61  Int );.  VdbeBra
355a0 6e 63 68 54 61 6b 65 6e 28 70 49 6e 31 2d 3e 75  nchTaken(pIn1->u
355b0 2e 69 3c 30 2c 20 32 29 3b 0a 20 20 69 66 28 20  .i<0, 2);.  if( 
355c0 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 0a 20 20 20  pIn1->u.i ){.   
355d0 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e    if( pIn1->u.i>
355e0 30 20 29 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b  0 ) pIn1->u.i--;
355f0 0a 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f  .     goto jump_
35600 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  to_p2;.  }.  bre
35610 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
35620 3a 20 44 65 63 72 4a 75 6d 70 5a 65 72 6f 20 50  : DecrJumpZero P
35630 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
35640 6e 6f 70 73 69 73 3a 20 69 66 20 28 2d 2d 72 5b  nopsis: if (--r[
35650 50 31 5d 29 3d 3d 30 20 67 6f 74 6f 20 50 32 0a  P1])==0 goto P2.
35660 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50  **.** Register P
35670 31 20 6d 75 73 74 20 68 6f 6c 64 20 61 6e 20 69  1 must hold an i
35680 6e 74 65 67 65 72 2e 20 20 44 65 63 72 65 6d 65  nteger.  Decreme
35690 6e 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  nt the value in 
356a0 50 31 0a 2a 2a 20 61 6e 64 20 6a 75 6d 70 20 74  P1.** and jump t
356b0 6f 20 50 32 20 69 66 20 74 68 65 20 6e 65 77 20  o P2 if the new 
356c0 76 61 6c 75 65 20 69 73 20 65 78 61 63 74 6c 79  value is exactly
356d0 20 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f   zero..*/.case O
356e0 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3a 20  P_DecrJumpZero: 
356f0 7b 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20  {      /* jump, 
35700 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
35710 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
35720 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
35730 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
35740 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69  .  if( pIn1->u.i
35750 3e 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  >SMALLEST_INT64 
35760 29 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20  ) pIn1->u.i--;. 
35770 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
35780 28 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 2c 20 32  (pIn1->u.i==0, 2
35790 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
357a0 2e 69 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d  .i==0 ) goto jum
357b0 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b  p_to_p2;.  break
357c0 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.}.../* Opcode:
357d0 20 41 67 67 53 74 65 70 20 2a 20 50 32 20 50 33   AggStep * P2 P3
357e0 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
357f0 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50 33 5d 20  is: accum=r[P3] 
35800 73 74 65 70 28 72 5b 50 32 40 50 35 5d 29 0a 2a  step(r[P2@P5]).*
35810 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65  *.** Execute the
35820 20 78 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 20   xStep function 
35830 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
35840 2e 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f  ..** The functio
35850 6e 20 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e  n has P5 argumen
35860 74 73 2e 20 20 50 34 20 69 73 20 61 20 70 6f 69  ts.  P4 is a poi
35870 6e 74 65 72 20 74 6f 20 74 68 65 20 0a 2a 2a 20  nter to the .** 
35880 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
35890 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
358a0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
358b0 52 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74  Register P3 is t
358c0 68 65 0a 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f  he.** accumulato
358d0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20  r..**.** The P5 
358e0 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61  arguments are ta
358f0 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ken from registe
35900 72 20 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20  r P2 and its.** 
35910 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f  successors..*/./
35920 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 49 6e 76  * Opcode: AggInv
35930 65 72 73 65 20 2a 20 50 32 20 50 33 20 50 34 20  erse * P2 P3 P4 
35940 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
35950 61 63 63 75 6d 3d 72 5b 50 33 5d 20 69 6e 76 65  accum=r[P3] inve
35960 72 73 65 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a  rse(r[P2@P5]).**
35970 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
35980 78 49 6e 76 65 72 73 65 20 66 75 6e 63 74 69 6f  xInverse functio
35990 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  n for an aggrega
359a0 74 65 2e 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74  te..** The funct
359b0 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75 6d  ion has P5 argum
359c0 65 6e 74 73 2e 20 20 50 34 20 69 73 20 61 20 70  ents.  P4 is a p
359d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 0a 2a  ointer to the .*
359e0 2a 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  * FuncDef struct
359f0 75 72 65 20 74 68 61 74 20 73 70 65 63 69 66 69  ure that specifi
35a00 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  es the function.
35a10 20 20 52 65 67 69 73 74 65 72 20 50 33 20 69 73    Register P3 is
35a20 20 74 68 65 0a 2a 2a 20 61 63 63 75 6d 75 6c 61   the.** accumula
35a30 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  tor..**.** The P
35a40 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  5 arguments are 
35a50 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73  taken from regis
35a60 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a 2a  ter P2 and its.*
35a70 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2f  * successors..*/
35a80 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53  ./* Opcode: AggS
35a90 74 65 70 31 20 50 31 20 50 32 20 50 33 20 50 34  tep1 P1 P2 P3 P4
35aa0 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
35ab0 20 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74 65   accum=r[P3] ste
35ac0 70 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a  p(r[P2@P5]).**.*
35ad0 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 78 53  * Execute the xS
35ae0 74 65 70 20 28 69 66 20 50 31 3d 3d 30 29 20 6f  tep (if P1==0) o
35af0 72 20 78 49 6e 76 65 72 73 65 20 28 69 66 20 50  r xInverse (if P
35b00 31 21 3d 30 29 20 66 75 6e 63 74 69 6f 6e 20 66  1!=0) function f
35b10 6f 72 20 61 6e 0a 2a 2a 20 61 67 67 72 65 67 61  or an.** aggrega
35b20 74 65 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f  te.  The functio
35b30 6e 20 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e  n has P5 argumen
35b40 74 73 2e 20 20 50 34 20 69 73 20 61 20 70 6f 69  ts.  P4 is a poi
35b50 6e 74 65 72 20 74 6f 20 74 68 65 20 0a 2a 2a 20  nter to the .** 
35b60 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
35b70 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
35b80 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
35b90 52 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74  Register P3 is t
35ba0 68 65 0a 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f  he.** accumulato
35bb0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20  r..**.** The P5 
35bc0 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61  arguments are ta
35bd0 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ken from registe
35be0 72 20 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20  r P2 and its.** 
35bf0 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2a 0a 2a  successors..**.*
35c00 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73  * This opcode is
35c10 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 64 65 64   initially coded
35c20 20 61 73 20 4f 50 5f 41 67 67 53 74 65 70 30 2e   as OP_AggStep0.
35c30 20 20 4f 6e 20 66 69 72 73 74 20 65 76 61 6c 75    On first evalu
35c40 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 46 75  ation,.** the Fu
35c50 6e 63 44 65 66 20 73 74 6f 72 65 64 20 69 6e 20  ncDef stored in 
35c60 50 34 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  P4 is converted 
35c70 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  into an sqlite3_
35c80 63 6f 6e 74 65 78 74 20 61 6e 64 0a 2a 2a 20 74  context and.** t
35c90 68 65 20 6f 70 63 6f 64 65 20 69 73 20 63 68 61  he opcode is cha
35ca0 6e 67 65 64 2e 20 20 49 6e 20 74 68 69 73 20 77  nged.  In this w
35cb0 61 79 2c 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ay, the initiali
35cc0 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  zation of the.**
35cd0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
35ce0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e   only happens on
35cf0 63 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ce, instead of o
35d00 6e 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  n each call to t
35d10 68 65 0a 2a 2a 20 73 74 65 70 20 66 75 6e 63 74  he.** step funct
35d20 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
35d30 41 67 67 49 6e 76 65 72 73 65 3a 0a 63 61 73 65  AggInverse:.case
35d40 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20   OP_AggStep: {. 
35d50 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
35d60 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  3_context *pCtx;
35d70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
35d80 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43  >p4type==P4_FUNC
35d90 44 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f 70  DEF );.  n = pOp
35da0 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p5;.  assert( 
35db0 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
35dc0 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
35dd0 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
35de0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30  ;.  assert( n==0
35df0 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26   || (pOp->p2>0 &
35e00 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d  & pOp->p2+n<=(p-
35e10 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
35e20 72 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61 73  rsor)+1) );.  as
35e30 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
35e40 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p2 || pOp->p3
35e50 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20  >=pOp->p2+n );. 
35e60 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44   pCtx = sqlite3D
35e70 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
35e80 20 6e 2a 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   n*sizeof(sqlite
35e90 33 5f 76 61 6c 75 65 2a 29 20 2b 0a 20 20 20 20  3_value*) +.    
35ea0 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
35eb0 6f 66 28 70 43 74 78 5b 30 5d 29 20 2b 20 73 69  of(pCtx[0]) + si
35ec0 7a 65 6f 66 28 4d 65 6d 29 20 2d 20 73 69 7a 65  zeof(Mem) - size
35ed0 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  of(sqlite3_value
35ee0 2a 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78  *)));.  if( pCtx
35ef0 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
35f00 6d 3b 0a 20 20 70 43 74 78 2d 3e 70 4d 65 6d 20  m;.  pCtx->pMem 
35f10 3d 20 30 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75  = 0;.  pCtx->pOu
35f20 74 20 3d 20 28 4d 65 6d 2a 29 26 28 70 43 74 78  t = (Mem*)&(pCtx
35f30 2d 3e 61 72 67 76 5b 6e 5d 29 3b 0a 20 20 73 71  ->argv[n]);.  sq
35f40 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
35f50 28 70 43 74 78 2d 3e 70 4f 75 74 2c 20 64 62 2c  (pCtx->pOut, db,
35f60 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 70 43   MEM_Null);.  pC
35f70 74 78 2d 3e 70 46 75 6e 63 20 3d 20 70 4f 70 2d  tx->pFunc = pOp-
35f80 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 70 43 74  >p4.pFunc;.  pCt
35f90 78 2d 3e 69 4f 70 20 3d 20 28 69 6e 74 29 28 70  x->iOp = (int)(p
35fa0 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 70 43 74  Op - aOp);.  pCt
35fb0 78 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  x->pVdbe = p;.  
35fc0 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20 3d  pCtx->skipFlag =
35fd0 20 30 3b 0a 20 20 70 43 74 78 2d 3e 69 73 45 72   0;.  pCtx->isEr
35fe0 72 6f 72 20 3d 20 30 3b 0a 20 20 70 43 74 78 2d  ror = 0;.  pCtx-
35ff0 3e 61 72 67 63 20 3d 20 6e 3b 0a 20 20 70 4f 70  >argc = n;.  pOp
36000 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 46 55  ->p4type = P4_FU
36010 4e 43 43 54 58 3b 0a 20 20 70 4f 70 2d 3e 70 34  NCCTX;.  pOp->p4
36020 2e 70 43 74 78 20 3d 20 70 43 74 78 3b 0a 0a 20  .pCtx = pCtx;.. 
36030 20 2f 2a 20 4f 50 5f 41 67 67 49 6e 76 65 72 73   /* OP_AggInvers
36040 65 20 6d 75 73 74 20 68 61 76 65 20 50 31 3d 3d  e must have P1==
36050 31 20 61 6e 64 20 4f 50 5f 41 67 67 53 74 65 70  1 and OP_AggStep
36060 20 6d 75 73 74 20 68 61 76 65 20 50 31 3d 3d 30   must have P1==0
36070 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
36080 70 2d 3e 70 31 3d 3d 28 70 4f 70 2d 3e 6f 70 63  p->p1==(pOp->opc
36090 6f 64 65 3d 3d 4f 50 5f 41 67 67 49 6e 76 65 72  ode==OP_AggInver
360a0 73 65 29 20 29 3b 0a 0a 20 20 70 4f 70 2d 3e 6f  se) );..  pOp->o
360b0 70 63 6f 64 65 20 3d 20 4f 50 5f 41 67 67 53 74  pcode = OP_AggSt
360c0 65 70 31 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  ep1;.  /* Fall t
360d0 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 41  hrough into OP_A
360e0 67 67 53 74 65 70 20 2a 2f 0a 7d 0a 63 61 73 65  ggStep */.}.case
360f0 20 4f 50 5f 41 67 67 53 74 65 70 31 3a 20 7b 0a   OP_AggStep1: {.
36100 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
36110 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
36120 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a  ;.  Mem *pMem;..
36130 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
36140 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 43 54  4type==P4_FUNCCT
36150 58 20 29 3b 0a 20 20 70 43 74 78 20 3d 20 70 4f  X );.  pCtx = pO
36160 70 2d 3e 70 34 2e 70 43 74 78 3b 0a 20 20 70 4d  p->p4.pCtx;.  pM
36170 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
36180 70 33 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  p3];..#ifdef SQL
36190 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
361a0 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 2f  pOp->p1 ){.    /
361b0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 4f 50 5f  * This is an OP_
361c0 41 67 67 49 6e 76 65 72 73 65 20 63 61 6c 6c 2e  AggInverse call.
361d0 20 20 56 65 72 69 66 79 20 74 68 61 74 20 78 53    Verify that xS
361e0 74 65 70 20 68 61 73 20 61 6c 77 61 79 73 0a 20  tep has always. 
361f0 20 20 20 2a 2a 20 62 65 65 6e 20 63 61 6c 6c 65     ** been calle
36200 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  d at least once 
36210 70 72 69 6f 72 20 74 6f 20 61 6e 79 20 78 49 6e  prior to any xIn
36220 76 65 72 73 65 20 63 61 6c 6c 2e 20 2a 2f 0a 20  verse call. */. 
36230 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
36240 3e 75 54 65 6d 70 3d 3d 30 78 31 31 32 32 65 30  >uTemp==0x1122e0
36250 65 33 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e3 );.  }else{. 
36260 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
36270 20 4f 50 5f 41 67 67 53 74 65 70 20 63 61 6c 6c   OP_AggStep call
36280 2e 20 20 4d 61 72 6b 20 69 74 20 61 73 20 73 75  .  Mark it as su
36290 63 68 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d  ch. */.    pMem-
362a0 3e 75 54 65 6d 70 20 3d 20 30 78 31 31 32 32 65  >uTemp = 0x1122e
362b0 30 65 33 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0e3;.  }.#endif.
362c0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 66 75  .  /* If this fu
362d0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 73 69 64 65  nction is inside
362e0 20 6f 66 20 61 20 74 72 69 67 67 65 72 2c 20 74   of a trigger, t
362f0 68 65 20 72 65 67 69 73 74 65 72 20 61 72 72 61  he register arra
36300 79 20 69 6e 20 61 4d 65 6d 5b 5d 0a 20 20 2a 2a  y in aMem[].  **
36310 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 66 72   might change fr
36320 6f 6d 20 6f 6e 65 20 65 76 61 6c 75 61 74 69 6f  om one evaluatio
36330 6e 20 74 6f 20 74 68 65 20 6e 65 78 74 2e 20 20  n to the next.  
36340 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
36350 66 20 63 6f 64 65 0a 20 20 2a 2a 20 63 68 65 63  f code.  ** chec
36360 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
36370 20 72 65 67 69 73 74 65 72 20 61 72 72 61 79 20   register array 
36380 68 61 73 20 63 68 61 6e 67 65 64 2c 20 61 6e 64  has changed, and
36390 20 69 66 20 73 6f 20 69 74 0a 20 20 2a 2a 20 72   if so it.  ** r
363a0 65 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65  einitializes the
363b0 20 72 65 6c 61 76 61 6e 74 20 70 61 72 74 73 20   relavant parts 
363c0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  of the sqlite3_c
363d0 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f  ontext object */
363e0 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 4d 65  .  if( pCtx->pMe
363f0 6d 20 21 3d 20 70 4d 65 6d 20 29 7b 0a 20 20 20  m != pMem ){.   
36400 20 70 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 70 4d   pCtx->pMem = pM
36410 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43  em;.    for(i=pC
36420 74 78 2d 3e 61 72 67 63 2d 31 3b 20 69 3e 3d 30  tx->argc-1; i>=0
36430 3b 20 69 2d 2d 29 20 70 43 74 78 2d 3e 61 72 67  ; i--) pCtx->arg
36440 76 5b 69 5d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  v[i] = &aMem[pOp
36450 2d 3e 70 32 2b 69 5d 3b 0a 20 20 7d 0a 0a 23 69  ->p2+i];.  }..#i
36460 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
36470 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  G.  for(i=0; i<p
36480 43 74 78 2d 3e 61 72 67 63 3b 20 69 2b 2b 29 7b  Ctx->argc; i++){
36490 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
364a0 49 73 56 61 6c 69 64 28 70 43 74 78 2d 3e 61 72  IsValid(pCtx->ar
364b0 67 76 5b 69 5d 29 20 29 3b 0a 20 20 20 20 52 45  gv[i]) );.    RE
364c0 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
364d0 2d 3e 70 32 2b 69 2c 20 70 43 74 78 2d 3e 61 72  ->p2+i, pCtx->ar
364e0 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64  gv[i]);.  }.#end
364f0 69 66 0a 0a 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b  if..  pMem->n++;
36500 0a 20 20 61 73 73 65 72 74 28 20 70 43 74 78 2d  .  assert( pCtx-
36510 3e 70 4f 75 74 2d 3e 66 6c 61 67 73 3d 3d 4d 45  >pOut->flags==ME
36520 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  M_Null );.  asse
36530 72 74 28 20 70 43 74 78 2d 3e 69 73 45 72 72 6f  rt( pCtx->isErro
36540 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
36550 28 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67  ( pCtx->skipFlag
36560 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
36570 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
36580 57 46 55 4e 43 0a 20 20 69 66 28 20 70 4f 70 2d  WFUNC.  if( pOp-
36590 3e 70 31 20 29 7b 0a 20 20 20 20 28 70 43 74 78  >p1 ){.    (pCtx
365a0 2d 3e 70 46 75 6e 63 2d 3e 78 49 6e 76 65 72 73  ->pFunc->xInvers
365b0 65 29 28 70 43 74 78 2c 70 43 74 78 2d 3e 61 72  e)(pCtx,pCtx->ar
365c0 67 63 2c 70 43 74 78 2d 3e 61 72 67 76 29 3b 0a  gc,pCtx->argv);.
365d0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
365e0 20 28 70 43 74 78 2d 3e 70 46 75 6e 63 2d 3e 78   (pCtx->pFunc->x
365f0 53 46 75 6e 63 29 28 70 43 74 78 2c 70 43 74 78  SFunc)(pCtx,pCtx
36600 2d 3e 61 72 67 63 2c 70 43 74 78 2d 3e 61 72 67  ->argc,pCtx->arg
36610 76 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 34  v); /* IMP: R-24
36620 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a 0a 20 20  505-23230 */..  
36630 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72 72 6f  if( pCtx->isErro
36640 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74  r ){.    if( pCt
36650 78 2d 3e 69 73 45 72 72 6f 72 3e 30 20 29 7b 0a  x->isError>0 ){.
36660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36670 65 45 72 72 6f 72 28 70 2c 20 22 25 73 22 2c 20  eError(p, "%s", 
36680 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
36690 78 74 28 70 43 74 78 2d 3e 70 4f 75 74 29 29 3b  xt(pCtx->pOut));
366a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78  .      rc = pCtx
366b0 2d 3e 69 73 45 72 72 6f 72 3b 0a 20 20 20 20 7d  ->isError;.    }
366c0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 73  .    if( pCtx->s
366d0 6b 69 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  kipFlag ){.     
366e0 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
366f0 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c  .opcode==OP_Coll
36700 53 65 71 20 29 3b 0a 20 20 20 20 20 20 69 20 3d  Seq );.      i =
36710 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20   pOp[-1].p1;.   
36720 20 20 20 69 66 28 20 69 20 29 20 73 71 6c 69 74     if( i ) sqlit
36730 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
36740 34 28 26 61 4d 65 6d 5b 69 5d 2c 20 31 29 3b 0a  4(&aMem[i], 1);.
36750 20 20 20 20 20 20 70 43 74 78 2d 3e 73 6b 69 70        pCtx->skip
36760 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Flag = 0;.    }.
36770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
36780 65 6d 52 65 6c 65 61 73 65 28 70 43 74 78 2d 3e  emRelease(pCtx->
36790 70 4f 75 74 29 3b 0a 20 20 20 20 70 43 74 78 2d  pOut);.    pCtx-
367a0 3e 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d  >pOut->flags = M
367b0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 74  EM_Null;.    pCt
367c0 78 2d 3e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a  x->isError = 0;.
367d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
367e0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
367f0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rror;.  }.  asse
36800 72 74 28 20 70 43 74 78 2d 3e 70 4f 75 74 2d 3e  rt( pCtx->pOut->
36810 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20  flags==MEM_Null 
36820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 74  );.  assert( pCt
36830 78 2d 3e 73 6b 69 70 46 6c 61 67 3d 3d 30 20 29  x->skipFlag==0 )
36840 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
36850 20 4f 70 63 6f 64 65 3a 20 41 67 67 46 69 6e 61   Opcode: AggFina
36860 6c 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  l P1 P2 * P4 *.*
36870 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75  * Synopsis: accu
36880 6d 3d 72 5b 50 31 5d 20 4e 3d 50 32 0a 2a 2a 0a  m=r[P1] N=P2.**.
36890 2a 2a 20 50 31 20 69 73 20 74 68 65 20 6d 65 6d  ** P1 is the mem
368a0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61  ory location tha
368b0 74 20 69 73 20 74 68 65 20 61 63 63 75 6d 75 6c  t is the accumul
368c0 61 74 6f 72 20 66 6f 72 20 61 6e 20 61 67 67 72  ator for an aggr
368d0 65 67 61 74 65 0a 2a 2a 20 6f 72 20 77 69 6e 64  egate.** or wind
368e0 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 20 20 45 78  ow function.  Ex
368f0 65 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c 69  ecute the finali
36900 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  zer function .**
36910 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
36920 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
36930 72 65 73 75 6c 74 20 69 6e 20 50 31 2e 0a 2a 2a  result in P1..**
36940 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75  .** P2 is the nu
36950 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
36960 73 20 74 68 61 74 20 74 68 65 20 73 74 65 70 20  s that the step 
36970 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61  function takes a
36980 6e 64 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  nd.** P4 is a po
36990 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e  inter to the Fun
369a0 63 44 65 66 20 66 6f 72 20 74 68 69 73 20 66 75  cDef for this fu
369b0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a  nction.  The P2.
369c0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ** argument is n
369d0 6f 74 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ot used by this 
369e0 6f 70 63 6f 64 65 2e 20 20 49 74 20 69 73 20 6f  opcode.  It is o
369f0 6e 6c 79 20 74 68 65 72 65 20 74 6f 20 64 69 73  nly there to dis
36a00 61 6d 62 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e  ambiguate.** fun
36a10 63 74 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20  ctions that can 
36a20 74 61 6b 65 20 76 61 72 79 69 6e 67 20 6e 75 6d  take varying num
36a30 62 65 72 73 20 6f 66 20 61 72 67 75 6d 65 6e 74  bers of argument
36a40 73 2e 20 20 54 68 65 0a 2a 2a 20 50 34 20 61 72  s.  The.** P4 ar
36a50 67 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e  gument is only n
36a60 65 65 64 65 64 20 66 6f 72 20 74 68 65 20 63 61  eeded for the ca
36a70 73 65 20 77 68 65 72 65 0a 2a 2a 20 74 68 65 20  se where.** the 
36a80 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 77 61  step function wa
36a90 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  s not previously
36aa0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 2f 2a 20 4f   called..*/./* O
36ab0 70 63 6f 64 65 3a 20 41 67 67 56 61 6c 75 65 20  pcode: AggValue 
36ac0 2a 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20  * P2 P3 P4 *.** 
36ad0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
36ae0 76 61 6c 75 65 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a  value N=P2.**.**
36af0 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 56 61 6c   Invoke the xVal
36b00 75 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  ue() function an
36b10 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
36b20 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
36b30 33 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74  3..**.** P2 is t
36b40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
36b50 75 6d 65 6e 74 73 20 74 68 61 74 20 74 68 65 20  uments that the 
36b60 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 74 61  step function ta
36b70 6b 65 73 20 61 6e 64 0a 2a 2a 20 50 34 20 69 73  kes and.** P4 is
36b80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
36b90 65 20 46 75 6e 63 44 65 66 20 66 6f 72 20 74 68  e FuncDef for th
36ba0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  is function.  Th
36bb0 65 20 50 32 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  e P2.** argument
36bc0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20   is not used by 
36bd0 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 49 74  this opcode.  It
36be0 20 69 73 20 6f 6e 6c 79 20 74 68 65 72 65 20 74   is only there t
36bf0 6f 20 64 69 73 61 6d 62 69 67 75 61 74 65 0a 2a  o disambiguate.*
36c00 2a 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  * functions that
36c10 20 63 61 6e 20 74 61 6b 65 20 76 61 72 79 69 6e   can take varyin
36c20 67 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 72 67  g numbers of arg
36c30 75 6d 65 6e 74 73 2e 20 20 54 68 65 0a 2a 2a 20  uments.  The.** 
36c40 50 34 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  P4 argument is o
36c50 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 74  nly needed for t
36c60 68 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  he case where.**
36c70 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
36c80 6f 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76 69  on was not previ
36c90 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ously called..*/
36ca0 0a 63 61 73 65 20 4f 50 5f 41 67 67 56 61 6c 75  .case OP_AggValu
36cb0 65 3a 0a 63 61 73 65 20 4f 50 5f 41 67 67 46 69  e:.case OP_AggFi
36cc0 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d  nal: {.  Mem *pM
36cd0 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  em;.  assert( pO
36ce0 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p1>0 && pOp->
36cf0 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p1<=(p->nMem+1 -
36d00 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
36d10 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
36d20 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  3==0 || pOp->opc
36d30 6f 64 65 3d 3d 4f 50 5f 41 67 67 56 61 6c 75 65  ode==OP_AggValue
36d40 20 29 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d   );.  pMem = &aM
36d50 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
36d60 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
36d70 61 67 73 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c  ags & ~(MEM_Null
36d80 7c 4d 45 4d 5f 41 67 67 29 29 3d 3d 30 20 29 3b  |MEM_Agg))==0 );
36d90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36da0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
36db0 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b    if( pOp->p3 ){
36dc0 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  .    memAboutToC
36dd0 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70  hange(p, &aMem[p
36de0 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 72 63  Op->p3]);.    rc
36df0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
36e00 6d 41 67 67 56 61 6c 75 65 28 70 4d 65 6d 2c 20  mAggValue(pMem, 
36e10 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20  &aMem[pOp->p3], 
36e20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a  pOp->p4.pFunc);.
36e30 20 20 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d      pMem = &aMem
36e40 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 7d 65 6c  [pOp->p3];.  }el
36e50 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
36e60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
36e70 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70 4d  beMemFinalize(pM
36e80 65 6d 2c 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  em, pOp->p4.pFun
36e90 63 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  c);.  }.  .  if(
36ea0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
36eb0 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
36ec0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  %s", sqlite3_val
36ed0 75 65 5f 74 65 78 74 28 70 4d 65 6d 29 29 3b 0a  ue_text(pMem));.
36ee0 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
36ef0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
36f00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
36f10 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65  angeEncoding(pMe
36f20 6d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  m, encoding);.  
36f30 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
36f40 49 5a 45 28 70 4d 65 6d 29 3b 0a 20 20 69 66 28  IZE(pMem);.  if(
36f50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
36f60 6f 6f 42 69 67 28 70 4d 65 6d 29 20 29 7b 0a 20  ooBig(pMem) ){. 
36f70 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
36f80 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
36f90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36fa0 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 4f 70 63 6f  OMIT_WAL./* Opco
36fb0 64 65 3a 20 43 68 65 63 6b 70 6f 69 6e 74 20 50  de: Checkpoint P
36fc0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
36fd0 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
36fe0 61 62 61 73 65 20 50 31 2e 20 54 68 69 73 20 69  abase P1. This i
36ff0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 50 31 20  s a no-op if P1 
37000 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
37010 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e   in.** WAL mode.
37020 20 50 61 72 61 6d 65 74 65 72 20 50 32 20 69 73   Parameter P2 is
37030 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
37040 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
37050 45 2c 20 46 55 4c 4c 2c 0a 2a 2a 20 52 45 53 54  E, FULL,.** REST
37060 41 52 54 2c 20 6f 72 20 54 52 55 4e 43 41 54 45  ART, or TRUNCATE
37070 2e 20 20 57 72 69 74 65 20 31 20 6f 72 20 30 20  .  Write 1 or 0 
37080 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d 20 69 66 20  into mem[P3] if 
37090 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 72  the checkpoint r
370a0 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
370b0 5f 42 55 53 59 20 6f 72 20 6e 6f 74 2c 20 72 65  _BUSY or not, re
370c0 73 70 65 63 74 69 76 65 6c 79 2e 20 20 57 72 69  spectively.  Wri
370d0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
370e0 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a   pages in the.**
370f0 20 57 41 4c 20 61 66 74 65 72 20 74 68 65 20 63   WAL after the c
37100 68 65 63 6b 70 6f 69 6e 74 20 69 6e 74 6f 20 6d  heckpoint into m
37110 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 20 74 68 65  em[P3+1] and the
37120 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
37130 0a 2a 2a 20 69 6e 20 74 68 65 20 57 41 4c 20 74  .** in the WAL t
37140 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 63 68  hat have been ch
37150 65 63 6b 70 6f 69 6e 74 65 64 20 61 66 74 65 72  eckpointed after
37160 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 0a   the checkpoint.
37170 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 20 69 6e 74  ** completes int
37180 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e 20 20 48 6f  o mem[P3+2].  Ho
37190 77 65 76 65 72 20 6f 6e 20 61 6e 20 65 72 72 6f  wever on an erro
371a0 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64  r, mem[P3+1] and
371b0 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32 5d 20 61 72  .** mem[P3+2] ar
371c0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
371d0 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   -1..*/.case OP_
371e0 43 68 65 63 6b 70 6f 69 6e 74 3a 20 7b 0a 20 20  Checkpoint: {.  
371f0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
37200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37210 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
37220 2a 2f 0a 20 20 69 6e 74 20 61 52 65 73 5b 33 5d  */.  int aRes[3]
37230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37240 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
37250 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20  */.  Mem *pMem; 
37260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37270 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
37280 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 0a 20  sults here */.. 
37290 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
372a0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 52 65  Only==0 );.  aRe
372b0 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 52 65 73  s[0] = 0;.  aRes
372c0 5b 31 5d 20 3d 20 61 52 65 73 5b 32 5d 20 3d 20  [1] = aRes[2] = 
372d0 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  -1;.  assert( pO
372e0 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48  p->p2==SQLITE_CH
372f0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
37300 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e  .       || pOp->
37310 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b  p2==SQLITE_CHECK
37320 50 4f 49 4e 54 5f 46 55 4c 4c 0a 20 20 20 20 20  POINT_FULL.     
37330 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51    || pOp->p2==SQ
37340 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
37350 52 45 53 54 41 52 54 0a 20 20 20 20 20 20 20 7c  RESTART.       |
37360 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  | pOp->p2==SQLIT
37370 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
37380 4e 43 41 54 45 0a 20 20 29 3b 0a 20 20 72 63 20  NCATE.  );.  rc 
37390 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f  = sqlite3Checkpo
373a0 69 6e 74 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  int(db, pOp->p1,
373b0 20 70 4f 70 2d 3e 70 32 2c 20 26 61 52 65 73 5b   pOp->p2, &aRes[
373c0 31 5d 2c 20 26 61 52 65 73 5b 32 5d 29 3b 0a 20  1], &aRes[2]);. 
373d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
373e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
373f0 53 59 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  SY ) goto abort_
37400 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
37410 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
37420 3b 0a 20 20 20 20 61 52 65 73 5b 30 5d 20 3d 20  ;.    aRes[0] = 
37430 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
37440 2c 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  , pMem = &aMem[p
37450 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33 3b 20 69 2b  Op->p3]; i<3; i+
37460 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20  +, pMem++){.    
37470 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
37480 74 49 6e 74 36 34 28 70 4d 65 6d 2c 20 28 69 36  tInt64(pMem, (i6
37490 34 29 61 52 65 73 5b 69 5d 29 3b 0a 20 20 7d 20  4)aRes[i]);.  } 
374a0 20 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 20     .  break;.}; 
374b0 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65   .#endif..#ifnde
374c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
374d0 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  AGMA./* Opcode: 
374e0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20 50 31 20 50  JournalMode P1 P
374f0 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43  2 P3 * *.**.** C
37500 68 61 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e 61  hange the journa
37510 6c 20 6d 6f 64 65 20 6f 66 20 64 61 74 61 62 61  l mode of databa
37520 73 65 20 50 31 20 74 6f 20 50 33 2e 20 50 33 20  se P1 to P3. P3 
37530 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
37540 68 65 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  he.** PAGER_JOUR
37550 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 76 61 6c 75  NALMODE_XXX valu
37560 65 73 2e 20 49 66 20 63 68 61 6e 67 69 6e 67 20  es. If changing 
37570 62 65 74 77 65 65 6e 20 74 68 65 20 76 61 72 69  between the vari
37580 6f 75 73 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  ous rollback.** 
37590 6d 6f 64 65 73 20 28 64 65 6c 65 74 65 2c 20 74  modes (delete, t
375a0 72 75 6e 63 61 74 65 2c 20 70 65 72 73 69 73 74  runcate, persist
375b0 2c 20 6f 66 66 20 61 6e 64 20 6d 65 6d 6f 72 79  , off and memory
375c0 29 2c 20 74 68 69 73 20 69 73 20 61 20 73 69 6d  ), this is a sim
375d0 70 6c 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ple.** operation
375e0 2e 20 4e 6f 20 49 4f 20 69 73 20 72 65 71 75 69  . No IO is requi
375f0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 68  red..**.** If ch
37600 61 6e 67 69 6e 67 20 69 6e 74 6f 20 6f 72 20 6f  anging into or o
37610 75 74 20 6f 66 20 57 41 4c 20 6d 6f 64 65 20 74  ut of WAL mode t
37620 68 65 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  he procedure is 
37630 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
37640 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ..**.** Write a 
37650 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
37660 67 20 74 68 65 20 66 69 6e 61 6c 20 6a 6f 75 72  g the final jour
37670 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20 72 65 67 69  nal-mode to regi
37680 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
37690 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a   OP_JournalMode:
376a0 20 7b 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f   {    /* out2 */
376b0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20  .  Btree *pBt;  
376c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376d0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 6f 20 63     /* Btree to c
376e0 68 61 6e 67 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  hange journal mo
376f0 64 65 20 6f 66 20 2a 2f 0a 20 20 50 61 67 65 72  de of */.  Pager
37700 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
37710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
37720 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
37730 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 69 6e 74  ith pBt */.  int
37740 20 65 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   eNew;          
37750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37760 4e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  New journal mode
37770 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 6c 64 3b 20   */.  int eOld; 
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64        /* The old
377a0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f   journal mode */
377b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
377c0 4f 4d 49 54 5f 57 41 4c 0a 20 20 63 6f 6e 73 74  OMIT_WAL.  const
377d0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
377e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
377f0 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  me of database f
37800 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 20 2a  ile for pPager *
37810 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f 75 74  /.#endif..  pOut
37820 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
37830 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 65 4e 65  e(p, pOp);.  eNe
37840 77 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61  w = pOp->p3;.  a
37850 73 73 65 72 74 28 20 65 4e 65 77 3d 3d 50 41 47  ssert( eNew==PAG
37860 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
37870 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 7c 7c  ELETE .       ||
37880 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
37890 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
378a0 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  E .       || eNe
378b0 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
378c0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 0a 20 20  MODE_PERSIST .  
378d0 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
378e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
378f0 4f 46 46 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  OFF.       || eN
37900 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
37910 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 20 20 20  LMODE_MEMORY.   
37920 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47      || eNew==PAG
37930 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
37940 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  AL.       || eNe
37950 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
37960 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 29 3b 0a  MODE_QUERY.  );.
37970 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
37980 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
37990 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
379a0 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  ert( p->readOnly
379b0 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20  ==0 );..  pBt = 
379c0 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
379d0 2e 70 42 74 3b 0a 20 20 70 50 61 67 65 72 20 3d  .pBt;.  pPager =
379e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
379f0 65 72 28 70 42 74 29 3b 0a 20 20 65 4f 6c 64 20  er(pBt);.  eOld 
37a00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
37a10 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61  tJournalMode(pPa
37a20 67 65 72 29 3b 0a 20 20 69 66 28 20 65 4e 65 77  ger);.  if( eNew
37a30 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
37a40 4f 44 45 5f 51 55 45 52 59 20 29 20 65 4e 65 77  ODE_QUERY ) eNew
37a50 20 3d 20 65 4f 6c 64 3b 0a 20 20 69 66 28 20 21   = eOld;.  if( !
37a60 73 71 6c 69 74 65 33 50 61 67 65 72 4f 6b 54 6f  sqlite3PagerOkTo
37a70 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64  ChangeJournalMod
37a80 65 28 70 50 61 67 65 72 29 20 29 20 65 4e 65 77  e(pPager) ) eNew
37a90 20 3d 20 65 4f 6c 64 3b 0a 0a 23 69 66 6e 64 65   = eOld;..#ifnde
37aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
37ab0 4c 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  L.  zFilename = 
37ac0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
37ad0 6e 61 6d 65 28 70 50 61 67 65 72 2c 20 31 29 3b  name(pPager, 1);
37ae0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ..  /* Do not al
37af0 6c 6f 77 20 61 20 74 72 61 6e 73 69 74 69 6f 6e  low a transition
37b00 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   to journal_mode
37b10 3d 57 41 4c 20 66 6f 72 20 61 20 64 61 74 61 62  =WAL for a datab
37b20 61 73 65 0a 20 20 2a 2a 20 69 6e 20 74 65 6d 70  ase.  ** in temp
37b30 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 6f 72  orary storage or
37b40 20 69 66 20 74 68 65 20 56 46 53 20 64 6f 65 73   if the VFS does
37b50 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61   not support sha
37b60 72 65 64 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2f  red memory .  */
37b70 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47  .  if( eNew==PAG
37b80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
37b90 41 4c 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  AL.   && (sqlite
37ba0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
37bb0 61 6d 65 29 3d 3d 30 20 20 20 20 20 20 20 20 20  ame)==0         
37bc0 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 20 2a    /* Temp file *
37bd0 2f 0a 20 20 20 20 20 20 20 7c 7c 20 21 73 71 6c  /.       || !sql
37be0 69 74 65 33 50 61 67 65 72 57 61 6c 53 75 70 70  ite3PagerWalSupp
37bf0 6f 72 74 65 64 28 70 50 61 67 65 72 29 29 20 20  orted(pPager))  
37c00 20 2f 2a 20 4e 6f 20 73 68 61 72 65 64 2d 6d 65   /* No shared-me
37c10 6d 6f 72 79 20 73 75 70 70 6f 72 74 20 2a 2f 0a  mory support */.
37c20 20 20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d 20    ){.    eNew = 
37c30 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  eOld;.  }..  if(
37c40 20 28 65 4e 65 77 21 3d 65 4f 6c 64 29 0a 20 20   (eNew!=eOld).  
37c50 20 26 26 20 28 65 4f 6c 64 3d 3d 50 41 47 45 52   && (eOld==PAGER
37c60 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
37c70 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
37c80 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
37c90 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 21 64  .  ){.    if( !d
37ca0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c  b->autoCommit ||
37cb0 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
37cc0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
37cd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
37ce0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
37cf0 72 6f 72 28 70 2c 0a 20 20 20 20 20 20 20 20 20  ror(p,.         
37d00 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20   "cannot change 
37d10 25 73 20 77 61 6c 20 6d 6f 64 65 20 66 72 6f 6d  %s wal mode from
37d20 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
37d30 63 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20  ction",.        
37d40 20 20 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a    (eNew==PAGER_J
37d50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f  OURNALMODE_WAL ?
37d60 20 22 69 6e 74 6f 22 20 3a 20 22 6f 75 74 20 6f   "into" : "out o
37d70 66 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  f").      );.   
37d80 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
37d90 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
37da0 7d 65 6c 73 65 7b 0a 20 0a 20 20 20 20 20 20 69  }else{. .      i
37db0 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a  f( eOld==PAGER_J
37dc0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
37dd0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
37de0 6c 65 61 76 69 6e 67 20 57 41 4c 20 6d 6f 64 65  leaving WAL mode
37df0 2c 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67 20  , close the log 
37e00 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
37e10 66 75 6c 2c 20 74 68 65 20 63 61 6c 6c 0a 20 20  ful, the call.  
37e20 20 20 20 20 20 20 2a 2a 20 74 6f 20 50 61 67 65        ** to Page
37e30 72 43 6c 6f 73 65 57 61 6c 28 29 20 63 68 65 63  rCloseWal() chec
37e40 6b 70 6f 69 6e 74 73 20 61 6e 64 20 64 65 6c 65  kpoints and dele
37e50 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 61 68  tes the write-ah
37e60 65 61 64 2d 6c 6f 67 20 0a 20 20 20 20 20 20 20  ead-log .       
37e70 20 2a 2a 20 66 69 6c 65 2e 20 41 6e 20 45 58 43   ** file. An EXC
37e80 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6d 61 79 20  LUSIVE lock may 
37e90 73 74 69 6c 6c 20 62 65 20 68 65 6c 64 20 6f 6e  still be held on
37ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37eb0 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  le .        ** a
37ec0 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
37ed0 6c 20 72 65 74 75 72 6e 2e 20 0a 20 20 20 20 20  l return. .     
37ee0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
37ef0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
37f00 6c 6f 73 65 57 61 6c 28 70 50 61 67 65 72 2c 20  loseWal(pPager, 
37f10 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  db);.        if(
37f20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37f30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
37f40 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e  te3PagerSetJourn
37f50 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65  alMode(pPager, e
37f60 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
37f70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
37f80 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eOld==PAGER_JOUR
37f90 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
37fa0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  {.        /* Can
37fb0 6e 6f 74 20 74 72 61 6e 73 69 74 69 6f 6e 20 64  not transition d
37fc0 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 4d 45 4d  irectly from MEM
37fd0 4f 52 59 20 74 6f 20 57 41 4c 2e 20 20 55 73 65  ORY to WAL.  Use
37fe0 20 6d 6f 64 65 20 4f 46 46 0a 20 20 20 20 20 20   mode OFF.      
37ff0 20 20 2a 2a 20 61 73 20 61 6e 20 69 6e 74 65 72    ** as an inter
38000 6d 65 64 69 61 74 65 20 2a 2f 0a 20 20 20 20 20  mediate */.     
38010 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
38020 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
38030 61 67 65 72 2c 20 50 41 47 45 52 5f 4a 4f 55 52  ager, PAGER_JOUR
38040 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 3b 0a 20 20  NALMODE_OFF);.  
38050 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
38060 2a 20 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  * Open a transac
38070 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
38080 62 61 73 65 20 66 69 6c 65 2e 20 52 65 67 61 72  base file. Regar
38090 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6a 6f 75  dless of the jou
380a0 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  rnal.      ** mo
380b0 64 65 2c 20 74 68 69 73 20 74 72 61 6e 73 61 63  de, this transac
380c0 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65 73  tion always uses
380d0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
380e0 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nal..      */.  
380f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
38100 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
38110 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
38120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38140 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
38150 65 53 65 74 56 65 72 73 69 6f 6e 28 70 42 74 2c  eSetVersion(pBt,
38160 20 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f   (eNew==PAGER_JO
38170 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20  URNALMODE_WAL ? 
38180 32 20 3a 20 31 29 29 3b 0a 20 20 20 20 20 20 7d  2 : 1));.      }
38190 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
381a0 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
381b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
381c0 20 20 69 66 28 20 72 63 20 29 20 65 4e 65 77 20    if( rc ) eNew 
381d0 3d 20 65 4f 6c 64 3b 0a 20 20 65 4e 65 77 20 3d  = eOld;.  eNew =
381e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
381f0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
38200 65 72 2c 20 65 4e 65 77 29 3b 0a 0a 20 20 70 4f  er, eNew);..  pO
38210 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
38220 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  Str|MEM_Static|M
38230 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d  EM_Term;.  pOut-
38240 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  >z = (char *)sql
38250 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
38260 61 6d 65 28 65 4e 65 77 29 3b 0a 20 20 70 4f 75  ame(eNew);.  pOu
38270 74 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  t->n = sqlite3St
38280 72 6c 65 6e 33 30 28 70 4f 75 74 2d 3e 7a 29 3b  rlen30(pOut->z);
38290 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53  .  pOut->enc = S
382a0 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 73 71  QLITE_UTF8;.  sq
382b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
382c0 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e  ncoding(pOut, en
382d0 63 6f 64 69 6e 67 29 3b 0a 20 20 69 66 28 20 72  coding);.  if( r
382e0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto a