/ Hex Artifact Content
Login

Artifact d4efd6e5ecff8eeef280ce5d622dc2c0cfe085014e5813401b346517574adb18:


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 41  .#endif../*.** A
1ef0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1f00: 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66  ng value (signif
1f10: 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45  ied by the MEM_E
1f20: 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61  phem flag) conta
1f30: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
1f40: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
1f50: 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
1f60: 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74  ng where some ot
1f70: 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73  her entity.** is
1f80: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1f90: 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68   deallocating th
1fa0: 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61  at string.  Beca
1fb0: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
1fc0: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  .** does not con
1fd0: 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c  trol the string,
1fe0: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c   it might be del
1ff0: 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  eted without the
2000: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f   register.** kno
2010: 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  wing it..**.** T
2020: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
2030: 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61  erts an ephemera
2040: 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  l string into a 
2050: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
2060: 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  cated.** string 
2070: 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74 65  that the registe
2080: 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c  r itself control
2090: 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
20a0: 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72  ds, it.** conver
20b0: 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20  ts an MEM_Ephem 
20c0: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 73 74  string into a st
20d0: 72 69 6e 67 20 77 69 74 68 20 50 2e 7a 3d 3d 50  ring with P.z==P
20e0: 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 23 64 65  .zMalloc..*/.#de
20f0: 66 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c  fine Deephemeral
2100: 69 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20  ize(P) \.   if( 
2110: 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  ((P)->flags&MEM_
2120: 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20  Ephem)!=0 \.    
2130: 20 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62     && sqlite3Vdb
2140: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
2150: 65 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f  e(P) ){ goto no_
2160: 6d 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  mem;}../* Return
2170: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
2180: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75  sor was opened u
2190: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e  sing the OP_Open
21a0: 53 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a  Sorter opcode. *
21b0: 2f 0a 23 64 65 66 69 6e 65 20 69 73 53 6f 72 74  /.#define isSort
21c0: 65 72 28 78 29 20 28 28 78 29 2d 3e 65 43 75 72  er(x) ((x)->eCur
21d0: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f  Type==CURTYPE_SO
21e0: 52 54 45 52 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  RTER)../*.** All
21f0: 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f 72  ocate VdbeCursor
2200: 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20 52   number iCur.  R
2210: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2220: 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20 4e  to it.  Return N
2230: 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75 6e  ULL.** if we run
2240: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a   out of memory..
2250: 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43 75  */.static VdbeCu
2260: 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43 75  rsor *allocateCu
2270: 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70 2c  rsor(.  Vdbe *p,
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2290: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
22a0: 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  hine */.  int iC
22b0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
22c0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
22d0: 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20 2a  new VdbeCursor *
22e0: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  /.  int nField, 
22f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2300: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
2310: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
2320: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  dex */.  int iDb
2330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2340: 2a 20 44 61 74 61 62 61 73 65 20 74 68 65 20 63  * Database the c
2350: 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
2360: 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 75 38 20  , or -1 */.  u8 
2370: 65 43 75 72 54 79 70 65 20 20 20 20 20 20 20 20  eCurType        
2380: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
2390: 65 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  e new cursor */.
23a0: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
23b0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
23c0: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
23d0: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
23e0: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
23f0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
2400: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
2410: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
2420: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
2430: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
2440: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
2450: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
2460: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
2470: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
2480: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
2490: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
24a0: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
24b0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
24c0: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
24d0: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
24e0: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
24f0: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
2500: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
2510: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
2520: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
2530: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
2540: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
2550: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
2560: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
2570: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
2580: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
2590: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
25a0: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
25b0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
25c0: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
25d0: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
25e0: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
25f0: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
2600: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
2610: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
2620: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
2630: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
2640: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
2650: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
2660: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
2670: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  * The memory cel
2680: 6c 20 66 6f 72 20 63 75 72 73 6f 72 20 30 20 69  l for cursor 0 i
2690: 73 20 61 4d 65 6d 5b 30 5d 2e 20 54 68 65 20 72  s aMem[0]. The r
26a0: 65 73 74 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  est are allocate
26b0: 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
26c0: 74 6f 70 20 6f 66 20 74 68 65 20 72 65 67 69 73  top of the regis
26d0: 74 65 72 20 73 70 61 63 65 2e 20 20 43 75 72 73  ter space.  Curs
26e0: 6f 72 20 31 20 69 73 20 61 74 20 4d 65 6d 5b 70  or 1 is at Mem[p
26f0: 2d 3e 6e 4d 65 6d 2d 31 5d 2e 0a 20 20 2a 2a 20  ->nMem-1]..  ** 
2700: 43 75 72 73 6f 72 20 32 20 69 73 20 61 74 20 4d  Cursor 2 is at M
2710: 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 32 5d 2e 20 41  em[p->nMem-2]. A
2720: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a  nd so forth..  *
2730: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
2740: 69 43 75 72 3e 30 20 3f 20 26 70 2d 3e 61 4d 65  iCur>0 ? &p->aMe
2750: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 20  m[p->nMem-iCur] 
2760: 3a 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 69 6e  : p->aMem;..  in
2770: 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43  t nByte;.  VdbeC
2780: 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a  ursor *pCx = 0;.
2790: 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 20    nByte = .     
27a0: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
27b0: 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20 32 2a  dbeCursor)) + 2*
27c0: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65  sizeof(u32)*nFie
27d0: 6c 64 20 2b 20 0a 20 20 20 20 20 20 28 65 43 75  ld + .      (eCu
27e0: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
27f0: 54 52 45 45 3f 73 71 6c 69 74 65 33 42 74 72 65  TREE?sqlite3Btre
2800: 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29  eCursorSize():0)
2810: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  ;..  assert( iCu
2820: 72 3e 3d 30 20 26 26 20 69 43 75 72 3c 70 2d 3e  r>=0 && iCur<p->
2830: 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  nCursor );.  if(
2840: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20   p->apCsr[iCur] 
2850: 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
2860: 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20  N-IF-FALSE*/.   
2870: 20 2f 2a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69   /* Before calli
2880: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  ng sqlite3VdbeFr
2890: 65 65 43 75 72 73 6f 72 28 29 2c 20 65 6e 73 75  eeCursor(), ensu
28a0: 72 65 20 74 68 65 20 69 73 45 70 68 65 6d 65 72  re the isEphemer
28b0: 61 6c 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 69  al flag.    ** i
28c0: 73 20 63 6c 65 61 72 2e 20 4f 74 68 65 72 77 69  s clear. Otherwi
28d0: 73 65 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  se, if this is a
28e0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  n ephemeral curs
28f0: 6f 72 20 63 72 65 61 74 65 64 20 62 79 20 0a 20  or created by . 
2900: 20 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 44 75 70     ** OP_OpenDup
2910: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c  , the cursor wil
2920: 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  l not be closed 
2930: 61 6e 64 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62  and will still b
2940: 65 20 70 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66  e part.    ** of
2950: 20 61 20 42 74 53 68 61 72 65 64 2e 70 43 75 72   a BtShared.pCur
2960: 73 6f 72 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  sor list.  */.  
2970: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b 69    if( p->apCsr[i
2980: 43 75 72 5d 2d 3e 70 42 74 78 3d 3d 30 20 29 20  Cur]->pBtx==0 ) 
2990: 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 2d 3e  p->apCsr[iCur]->
29a0: 69 73 45 70 68 65 6d 65 72 61 6c 20 3d 20 30 3b  isEphemeral = 0;
29b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29c0: 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d  FreeCursor(p, p-
29d0: 3e 61 70 43 73 72 5b 69 43 75 72 5d 29 3b 0a 20  >apCsr[iCur]);. 
29e0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72     p->apCsr[iCur
29f0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  ] = 0;.  }.  if(
2a00: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
2a10: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
2a20: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 6e  ndResize(pMem, n
2a30: 42 79 74 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e  Byte) ){.    p->
2a40: 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 70 43  apCsr[iCur] = pC
2a50: 78 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 2a  x = (VdbeCursor*
2a60: 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65  )pMem->z;.    me
2a70: 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 6f 66 66  mset(pCx, 0, off
2a80: 73 65 74 6f 66 28 56 64 62 65 43 75 72 73 6f 72  setof(VdbeCursor
2a90: 2c 70 41 6c 74 43 75 72 73 6f 72 29 29 3b 0a 20  ,pAltCursor));. 
2aa0: 20 20 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65     pCx->eCurType
2ab0: 20 3d 20 65 43 75 72 54 79 70 65 3b 0a 20 20 20   = eCurType;.   
2ac0: 20 70 43 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b   pCx->iDb = iDb;
2ad0: 0a 20 20 20 20 70 43 78 2d 3e 6e 46 69 65 6c 64  .    pCx->nField
2ae0: 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70   = nField;.    p
2af0: 43 78 2d 3e 61 4f 66 66 73 65 74 20 3d 20 26 70  Cx->aOffset = &p
2b00: 43 78 2d 3e 61 54 79 70 65 5b 6e 46 69 65 6c 64  Cx->aType[nField
2b10: 5d 3b 0a 20 20 20 20 69 66 28 20 65 43 75 72 54  ];.    if( eCurT
2b20: 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2b30: 45 45 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d  EE ){.      pCx-
2b40: 3e 75 63 2e 70 43 75 72 73 6f 72 20 3d 20 28 42  >uc.pCursor = (B
2b50: 74 43 75 72 73 6f 72 2a 29 0a 20 20 20 20 20 20  tCursor*).      
2b60: 20 20 20 20 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55      &pMem->z[ROU
2b70: 4e 44 38 28 73 69 7a 65 6f 66 28 56 64 62 65 43  ND8(sizeof(VdbeC
2b80: 75 72 73 6f 72 29 29 2b 32 2a 73 69 7a 65 6f 66  ursor))+2*sizeof
2b90: 28 75 33 32 29 2a 6e 46 69 65 6c 64 5d 3b 0a 20  (u32)*nField];. 
2ba0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2bb0: 65 43 75 72 73 6f 72 5a 65 72 6f 28 70 43 78 2d  eCursorZero(pCx-
2bc0: 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
2bd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2be0: 20 70 43 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   pCx;.}../*.** T
2bf0: 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20  ry to convert a 
2c00: 76 61 6c 75 65 20 69 6e 74 6f 20 61 20 6e 75 6d  value into a num
2c10: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
2c20: 69 6f 6e 20 69 66 20 77 65 20 63 61 6e 0a 2a 2a  ion if we can.**
2c30: 20 64 6f 20 73 6f 20 77 69 74 68 6f 75 74 20 6c   do so without l
2c40: 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69  oss of informati
2c50: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
2c60: 72 64 73 2c 20 69 66 20 74 68 65 20 73 74 72 69  rds, if the stri
2c70: 6e 67 0a 2a 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65  ng.** looks like
2c80: 20 61 20 6e 75 6d 62 65 72 2c 20 63 6f 6e 76 65   a number, conve
2c90: 72 74 20 69 74 20 69 6e 74 6f 20 61 20 6e 75 6d  rt it into a num
2ca0: 62 65 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73  ber.  If it does
2cb0: 20 6e 6f 74 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b   not.** look lik
2cc0: 65 20 61 20 6e 75 6d 62 65 72 2c 20 6c 65 61 76  e a number, leav
2cd0: 65 20 69 74 20 61 6c 6f 6e 65 2e 0a 2a 2a 0a 2a  e it alone..**.*
2ce0: 2a 20 49 66 20 74 68 65 20 62 54 72 79 46 6f 72  * If the bTryFor
2cf0: 49 6e 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  Int flag is true
2d00: 2c 20 74 68 65 6e 20 65 78 74 72 61 20 65 66 66  , then extra eff
2d10: 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 67  ort is made to g
2d20: 69 76 65 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65  ive.** an intege
2d30: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
2d40: 2e 20 20 53 74 72 69 6e 67 73 20 74 68 61 74 20  .  Strings that 
2d50: 6c 6f 6f 6b 20 6c 69 6b 65 20 66 6c 6f 61 74 69  look like floati
2d60: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
2d70: 65 73 20 62 75 74 20 77 68 69 63 68 20 68 61 76  es but which hav
2d80: 65 20 6e 6f 20 66 72 61 63 74 69 6f 6e 61 6c 20  e no fractional 
2d90: 63 6f 6d 70 6f 6e 65 6e 74 20 28 65 78 61 6d 70  component (examp
2da0: 6c 65 3a 20 27 34 38 2e 30 30 27 29 0a 2a 2a 20  le: '48.00').** 
2db0: 77 69 6c 6c 20 68 61 76 65 20 61 20 4d 45 4d 5f  will have a MEM_
2dc0: 49 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  Int representati
2dd0: 6f 6e 20 77 68 65 6e 20 62 54 72 79 46 6f 72 49  on when bTryForI
2de0: 6e 74 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  nt is true..**.*
2df0: 2a 20 49 66 20 62 54 72 79 46 6f 72 49 6e 74 20  * If bTryForInt 
2e00: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69  is false, then i
2e10: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
2e20: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 20 64 65  ng contains a de
2e30: 63 69 6d 61 6c 0a 2a 2a 20 70 6f 69 6e 74 20 6f  cimal.** point o
2e40: 72 20 65 78 70 6f 6e 65 6e 74 69 61 6c 20 6e 6f  r exponential no
2e50: 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 65 73 75  tation, the resu
2e60: 6c 74 20 69 73 20 6f 6e 6c 79 20 4d 45 4d 5f 52  lt is only MEM_R
2e70: 65 61 6c 2c 20 65 76 65 6e 0a 2a 2a 20 69 66 20  eal, even.** if 
2e80: 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 61 63  there is an exac
2e90: 74 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  t integer repres
2ea0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2eb0: 71 75 61 6e 74 69 74 79 2e 0a 2a 2f 0a 73 74 61  quantity..*/.sta
2ec0: 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79 4e 75  tic void applyNu
2ed0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 4d 65  mericAffinity(Me
2ee0: 6d 20 2a 70 52 65 63 2c 20 69 6e 74 20 62 54 72  m *pRec, int bTr
2ef0: 79 46 6f 72 49 6e 74 29 7b 0a 20 20 64 6f 75 62  yForInt){.  doub
2f00: 6c 65 20 72 56 61 6c 75 65 3b 0a 20 20 69 36 34  le rValue;.  i64
2f10: 20 69 56 61 6c 75 65 3b 0a 20 20 75 38 20 65 6e   iValue;.  u8 en
2f20: 63 20 3d 20 70 52 65 63 2d 3e 65 6e 63 3b 0a 20  c = pRec->enc;. 
2f30: 20 61 73 73 65 72 74 28 20 28 70 52 65 63 2d 3e   assert( (pRec->
2f40: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
2f50: 7c 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  |MEM_Int|MEM_Rea
2f60: 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 3d  l|MEM_IntReal))=
2f70: 3d 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 69 66  =MEM_Str );.  if
2f80: 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52  ( sqlite3AtoF(pR
2f90: 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20  ec->z, &rValue, 
2fa0: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30  pRec->n, enc)==0
2fb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2fc0: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
2fd0: 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c  4(pRec->z, &iVal
2fe0: 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63  ue, pRec->n, enc
2ff0: 29 20 29 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75  ) ){.    pRec->u
3000: 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  .i = iValue;.   
3010: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20   pRec->flags |= 
3020: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65  MEM_Int;.  }else
3030: 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 72 20  {.    pRec->u.r 
3040: 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 70 52  = rValue;.    pR
3050: 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ec->flags |= MEM
3060: 5f 52 65 61 6c 3b 0a 20 20 20 20 69 66 28 20 62  _Real;.    if( b
3070: 54 72 79 46 6f 72 49 6e 74 20 29 20 73 71 6c 69  TryForInt ) sqli
3080: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
3090: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
30a0: 7d 0a 20 20 2f 2a 20 54 45 58 54 2d 3e 4e 55 4d  }.  /* TEXT->NUM
30b0: 45 52 49 43 20 69 73 20 6d 61 6e 79 2d 3e 6f 6e  ERIC is many->on
30c0: 65 2e 20 20 48 65 6e 63 65 2c 20 69 74 20 69 73  e.  Hence, it is
30d0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 69 6e   important to in
30e0: 76 61 6c 69 64 61 74 65 20 74 68 65 0a 20 20 2a  validate the.  *
30f0: 2a 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  * string represe
3100: 6e 74 61 74 69 6f 6e 20 61 66 74 65 72 20 63 6f  ntation after co
3110: 6d 70 75 74 69 6e 67 20 61 20 6e 75 6d 65 72 69  mputing a numeri
3120: 63 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 62 65  c equivalent, be
3130: 63 61 75 73 65 20 74 68 65 0a 20 20 2a 2a 20 73  cause the.  ** s
3140: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
3150: 74 69 6f 6e 20 6d 69 67 68 74 20 6e 6f 74 20 62  tion might not b
3160: 65 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  e the canonical 
3170: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
3180: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 65  or the.  ** nume
3190: 72 69 63 20 76 61 6c 75 65 2e 20 20 54 69 63 6b  ric value.  Tick
31a0: 65 74 20 5b 33 34 33 36 33 34 39 34 32 64 64 35  et [343634942dd5
31b0: 34 61 62 35 37 62 37 30 32 34 5d 20 32 30 31 38  4ab57b7024] 2018
31c0: 2d 30 31 2d 33 31 2e 20 2a 2f 0a 20 20 70 52 65  -01-31. */.  pRe
31d0: 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d  c->flags &= ~MEM
31e0: 5f 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  _Str;.}../*.** P
31f0: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 64 65 74  rocessing is det
3200: 65 72 6d 69 6e 65 20 62 79 20 74 68 65 20 61 66  ermine by the af
3210: 66 69 6e 69 74 79 20 70 61 72 61 6d 65 74 65 72  finity parameter
3220: 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  :.**.** SQLITE_A
3230: 46 46 5f 49 4e 54 45 47 45 52 3a 0a 2a 2a 20 53  FF_INTEGER:.** S
3240: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 0a  QLITE_AFF_REAL:.
3250: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
3260: 4d 45 52 49 43 3a 0a 2a 2a 20 20 20 20 54 72 79  MERIC:.**    Try
3270: 20 74 6f 20 63 6f 6e 76 65 72 74 20 70 52 65 63   to convert pRec
3280: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 72   to an integer r
3290: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72  epresentation or
32a0: 20 61 20 0a 2a 2a 20 20 20 20 66 6c 6f 61 74 69   a .**    floati
32b0: 6e 67 2d 70 6f 69 6e 74 20 72 65 70 72 65 73 65  ng-point represe
32c0: 6e 74 61 74 69 6f 6e 20 69 66 20 61 6e 20 69 6e  ntation if an in
32d0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
32e0: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 6e 6f  tion.**    is no
32f0: 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 4e 6f 74  t possible.  Not
3300: 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 67  e that the integ
3310: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
3320: 6e 20 69 73 0a 2a 2a 20 20 20 20 61 6c 77 61 79  n is.**    alway
3330: 73 20 70 72 65 66 65 72 72 65 64 2c 20 65 76 65  s preferred, eve
3340: 6e 20 69 66 20 74 68 65 20 61 66 66 69 6e 69 74  n if the affinit
3350: 79 20 69 73 20 52 45 41 4c 2c 20 62 65 63 61 75  y is REAL, becau
3360: 73 65 0a 2a 2a 20 20 20 20 61 6e 20 69 6e 74 65  se.**    an inte
3370: 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ger representati
3380: 6f 6e 20 69 73 20 6d 6f 72 65 20 73 70 61 63 65  on is more space
3390: 20 65 66 66 69 63 69 65 6e 74 20 6f 6e 20 64 69   efficient on di
33a0: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  sk..**.** SQLITE
33b0: 5f 41 46 46 5f 54 45 58 54 3a 0a 2a 2a 20 20 20  _AFF_TEXT:.**   
33c0: 20 43 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f   Convert pRec to
33d0: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
33e0: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51  tation..**.** SQ
33f0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a  LITE_AFF_BLOB:.*
3400: 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20 20 70 52 65  *    No-op.  pRe
3410: 63 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  c is unchanged..
3420: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
3430: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20  pplyAffinity(.  
3440: 4d 65 6d 20 2a 70 52 65 63 2c 20 20 20 20 20 20  Mem *pRec,      
3450: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
3460: 20 74 6f 20 61 70 70 6c 79 20 61 66 66 69 6e 69   to apply affini
3470: 74 79 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20  ty to */.  char 
3480: 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 2f  affinity,      /
3490: 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74  * The affinity t
34a0: 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a  o be applied */.
34b0: 20 20 75 38 20 65 6e 63 20 20 20 20 20 20 20 20    u8 enc        
34c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
34d0: 73 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  s text encoding 
34e0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 66 66 69  */.){.  if( affi
34f0: 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46  nity>=SQLITE_AFF
3500: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
3510: 61 73 73 65 72 74 28 20 61 66 66 69 6e 69 74 79  assert( affinity
3520: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
3530: 45 47 45 52 20 7c 7c 20 61 66 66 69 6e 69 74 79  EGER || affinity
3540: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
3550: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  L.             |
3560: 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  | affinity==SQLI
3570: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
3580: 3b 0a 20 20 20 20 69 66 28 20 28 70 52 65 63 2d  ;.    if( (pRec-
3590: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
35a0: 29 3d 3d 30 20 29 7b 20 2f 2a 4f 50 54 49 4d 49  )==0 ){ /*OPTIMI
35b0: 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a  ZATION-IF-FALSE*
35c0: 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65  /.      if( (pRe
35d0: 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  c->flags & MEM_R
35e0: 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eal)==0 ){.     
35f0: 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61     if( pRec->fla
3600: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 20 61  gs & MEM_Str ) a
3610: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
3620: 69 74 79 28 70 52 65 63 2c 31 29 3b 0a 20 20 20  ity(pRec,1);.   
3630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74    sqlite3VdbeInt
3650: 65 67 65 72 41 66 66 69 6e 69 74 79 28 70 52 65  egerAffinity(pRe
3660: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
3670: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66  }.  }else if( af
3680: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
3690: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f  FF_TEXT ){.    /
36a0: 2a 20 4f 6e 6c 79 20 61 74 74 65 6d 70 74 20 74  * Only attempt t
36b0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
36c0: 20 54 45 58 54 20 69 66 20 74 68 65 72 65 20 69   TEXT if there i
36d0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  s an integer or 
36e0: 72 65 61 6c 0a 20 20 20 20 2a 2a 20 72 65 70 72  real.    ** repr
36f0: 65 73 65 6e 74 61 74 69 6f 6e 20 28 62 6c 6f 62  esentation (blob
3700: 20 61 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74   and NULL do not
3710: 20 67 65 74 20 63 6f 6e 76 65 72 74 65 64 29 20   get converted) 
3720: 62 75 74 20 6e 6f 20 73 74 72 69 6e 67 0a 20 20  but no string.  
3730: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74    ** representat
3740: 69 6f 6e 2e 20 20 49 74 20 77 6f 75 6c 64 20 62  ion.  It would b
3750: 65 20 68 61 72 6d 6c 65 73 73 20 74 6f 20 72 65  e harmless to re
3760: 70 65 61 74 20 74 68 65 20 63 6f 6e 76 65 72 73  peat the convers
3770: 69 6f 6e 20 69 66 20 0a 20 20 20 20 2a 2a 20 74  ion if .    ** t
3780: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
3790: 61 20 73 74 72 69 6e 67 20 72 65 70 2c 20 62 75  a string rep, bu
37a0: 74 20 69 74 20 69 73 20 70 6f 69 6e 74 6c 65 73  t it is pointles
37b0: 73 20 74 6f 20 77 61 73 74 65 20 74 68 6f 73 65  s to waste those
37c0: 0a 20 20 20 20 2a 2a 20 43 50 55 20 63 79 63 6c  .    ** CPU cycl
37d0: 65 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 30  es. */.    if( 0
37e0: 3d 3d 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d  ==(pRec->flags&M
37f0: 45 4d 5f 53 74 72 29 20 29 7b 20 2f 2a 4f 50 54  EM_Str) ){ /*OPT
3800: 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c  IMIZATION-IF-FAL
3810: 53 45 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  SE*/.      if( (
3820: 70 52 65 63 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  pRec->flags&(MEM
3830: 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 7c 4d 45  _Real|MEM_Int|ME
3840: 4d 5f 49 6e 74 52 65 61 6c 29 29 20 29 7b 0a 20  M_IntReal)) ){. 
3850: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
3860: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d   pRec->flags & M
3870: 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  EM_Int );.      
3880: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 65 63    testcase( pRec
3890: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
38a0: 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  al );.        te
38b0: 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 66 6c  stcase( pRec->fl
38c0: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61  ags & MEM_IntRea
38d0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
38e0: 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e  ite3VdbeMemStrin
38f0: 67 69 66 79 28 70 52 65 63 2c 20 65 6e 63 2c 20  gify(pRec, enc, 
3900: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
3910: 7d 0a 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67  }.    pRec->flag
3920: 73 20 26 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c  s &= ~(MEM_Real|
3930: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52  MEM_Int|MEM_IntR
3940: 65 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eal);.  }.}../*.
3950: 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72  ** Try to conver
3960: 74 20 74 68 65 20 74 79 70 65 20 6f 66 20 61 20  t the type of a 
3970: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
3980: 74 20 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f  t or a result co
3990: 6c 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  lumn.** into a n
39a0: 75 6d 65 72 69 63 20 72 65 70 72 65 73 65 6e 74  umeric represent
39b0: 61 74 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68  ation.  Use eith
39c0: 65 72 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45  er INTEGER or RE
39d0: 41 4c 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20  AL whichever.** 
39e0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  is appropriate. 
39f0: 20 42 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65   But only do the
3a00: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69   conversion if i
3a10: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69  t is possible wi
3a20: 74 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66  thout.** loss of
3a30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   information and
3a40: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 76 69   return the revi
3a50: 73 65 64 20 74 79 70 65 20 6f 66 20 74 68 65 20  sed type of the 
3a60: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
3a70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e   sqlite3_value_n
3a80: 75 6d 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69  umeric_type(sqli
3a90: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29  te3_value *pVal)
3aa0: 7b 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  {.  int eType = 
3ab0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
3ac0: 70 65 28 70 56 61 6c 29 3b 0a 20 20 69 66 28 20  pe(pVal);.  if( 
3ad0: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
3ae0: 58 54 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70  XT ){.    Mem *p
3af0: 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c  Mem = (Mem*)pVal
3b00: 3b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72  ;.    applyNumer
3b10: 69 63 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c  icAffinity(pMem,
3b20: 20 30 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d   0);.    eType =
3b30: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
3b40: 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20  ype(pVal);.  }. 
3b50: 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
3b60: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64  ../*.** Exported
3b70: 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c   version of appl
3b80: 79 41 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69  yAffinity(). Thi
3b90: 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73  s one works on s
3ba0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a  qlite3_value*, .
3bb0: 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72  ** not the inter
3bc0: 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a  nal Mem* type..*
3bd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61  /.void sqlite3Va
3be0: 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
3bf0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  (.  sqlite3_valu
3c00: 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61  e *pVal, .  u8 a
3c10: 66 66 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65  ffinity, .  u8 e
3c20: 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66  nc.){.  applyAff
3c30: 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61  inity((Mem *)pVa
3c40: 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63  l, affinity, enc
3c50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d 65 6d  );.}../*.** pMem
3c60: 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20   currently only 
3c70: 68 6f 6c 64 73 20 61 20 73 74 72 69 6e 67 20 74  holds a string t
3c80: 79 70 65 20 28 6f 72 20 6d 61 79 62 65 20 61 20  ype (or maybe a 
3c90: 42 4c 4f 42 20 74 68 61 74 20 77 65 20 63 61 6e  BLOB that we can
3ca0: 0a 2a 2a 20 69 6e 74 65 72 70 72 65 74 20 61 73  .** interpret as
3cb0: 20 61 20 73 74 72 69 6e 67 20 69 66 20 77 65 20   a string if we 
3cc0: 77 61 6e 74 20 74 6f 29 2e 20 20 43 6f 6d 70 75  want to).  Compu
3cd0: 74 65 20 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  te its correspon
3ce0: 64 69 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 63 20  ding.** numeric 
3cf0: 74 79 70 65 2c 20 69 66 20 68 61 73 20 6f 6e 65  type, if has one
3d00: 2e 20 20 53 65 74 20 74 68 65 20 70 4d 65 6d 2d  .  Set the pMem-
3d10: 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75  >u.r and pMem->u
3d20: 2e 69 20 66 69 65 6c 64 73 0a 2a 2a 20 61 63 63  .i fields.** acc
3d30: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61  ordingly..*/.sta
3d40: 74 69 63 20 75 31 36 20 53 51 4c 49 54 45 5f 4e  tic u16 SQLITE_N
3d50: 4f 49 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 65 4e  OINLINE computeN
3d60: 75 6d 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a  umericType(Mem *
3d70: 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28  pMem){.  assert(
3d80: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
3d90: 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
3da0: 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 3d  l|MEM_IntReal))=
3db0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3dc0: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28  (pMem->flags & (
3dd0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
3de0: 29 29 21 3d 30 20 29 3b 0a 20 20 45 78 70 61 6e  ))!=0 );.  Expan
3df0: 64 42 6c 6f 62 28 70 4d 65 6d 29 3b 0a 20 20 69  dBlob(pMem);.  i
3e00: 66 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70  f( sqlite3AtoF(p
3e10: 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75  Mem->z, &pMem->u
3e20: 2e 72 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65  .r, pMem->n, pMe
3e30: 6d 2d 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a 20 20  m->enc)==0 ){.  
3e40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3e50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f    if( sqlite3Ato
3e60: 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d  i64(pMem->z, &pM
3e70: 65 6d 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d 3e 6e  em->u.i, pMem->n
3e80: 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 30 20  , pMem->enc)==0 
3e90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4d 45  ){.    return ME
3ea0: 4d 5f 49 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  M_Int;.  }.  ret
3eb0: 75 72 6e 20 4d 45 4d 5f 52 65 61 6c 3b 0a 7d 0a  urn MEM_Real;.}.
3ec0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3ed0: 65 20 6e 75 6d 65 72 69 63 20 74 79 70 65 20 66  e numeric type f
3ee0: 6f 72 20 70 4d 65 6d 2c 20 65 69 74 68 65 72 20  or pMem, either 
3ef0: 4d 45 4d 5f 49 6e 74 20 6f 72 20 4d 45 4d 5f 52  MEM_Int or MEM_R
3f00: 65 61 6c 20 6f 72 20 62 6f 74 68 20 6f 72 0a 2a  eal or both or.*
3f10: 2a 20 6e 6f 6e 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  * none.  .**.** 
3f20: 55 6e 6c 69 6b 65 20 61 70 70 6c 79 4e 75 6d 65  Unlike applyNume
3f30: 72 69 63 41 66 66 69 6e 69 74 79 28 29 2c 20 74  ricAffinity(), t
3f40: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
3f50: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 70 4d 65 6d   not modify pMem
3f60: 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20 42 75 74 20  ->flags..** But 
3f70: 69 74 20 64 6f 65 73 20 73 65 74 20 70 4d 65 6d  it does set pMem
3f80: 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e  ->u.r and pMem->
3f90: 75 2e 69 20 61 70 70 72 6f 70 72 69 61 74 65 6c  u.i appropriatel
3fa0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y..*/.static u16
3fb0: 20 6e 75 6d 65 72 69 63 54 79 70 65 28 4d 65 6d   numericType(Mem
3fc0: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28 20 70   *pMem){.  if( p
3fd0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  Mem->flags & (ME
3fe0: 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d  M_Int|MEM_Real|M
3ff0: 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20  EM_IntReal) ){. 
4000: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
4010: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
4020: 6e 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  nt );.    testca
4030: 73 65 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  se( pMem->flags 
4040: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
4050: 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
4060: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
4070: 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 72 65 74  tReal );.    ret
4080: 75 72 6e 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  urn pMem->flags 
4090: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
40a0: 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29  eal|MEM_IntReal)
40b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d  ;.  }.  if( pMem
40c0: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
40d0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a  tr|MEM_Blob) ){.
40e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
40f0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
4100: 53 74 72 20 29 3b 0a 20 20 20 20 74 65 73 74 63  Str );.    testc
4110: 61 73 65 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  ase( pMem->flags
4120: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
4130: 20 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74     return comput
4140: 65 4e 75 6d 65 72 69 63 54 79 70 65 28 70 4d 65  eNumericType(pMe
4150: 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  m);.  }.  return
4160: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
4170: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
4180: 20 57 72 69 74 65 20 61 20 6e 69 63 65 20 73 74   Write a nice st
4190: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
41a0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ion of the conte
41b0: 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65 6d  nts of cell pMem
41c0: 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72 20  .** into buffer 
41d0: 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42 75  zBuf, length nBu
41e0: 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
41f0: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
4200: 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  rint(Mem *pMem, 
4210: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63  char *zBuf){.  c
4220: 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75 66  har *zCsr = zBuf
4230: 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65 6d  ;.  int f = pMem
4240: 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61 74  ->flags;..  stat
4250: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
4260: 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d 20  onst encnames[] 
4270: 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22 2c  = {"(X)", "(8)",
4280: 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36 42   "(16LE)", "(16B
4290: 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26 4d  E)"};..  if( f&M
42a0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 69  EM_Blob ){.    i
42b0: 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63  nt i;.    char c
42c0: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
42d0: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 63  M_Dyn ){.      c
42e0: 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73   = 'z';.      as
42f0: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
4300: 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d  Static|MEM_Ephem
4310: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
4320: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
4330: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 63  tatic ){.      c
4340: 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61 73   = 't';.      as
4350: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
4360: 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  Dyn|MEM_Ephem))=
4370: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
4380: 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68 65  if( f & MEM_Ephe
4390: 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  m ){.      c = '
43a0: 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e';.      assert
43b0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74  ( (f & (MEM_Stat
43c0: 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20  ic|MEM_Dyn))==0 
43d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
43e0: 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20 20      c = 's';.   
43f0: 20 7d 0a 20 20 20 20 2a 28 7a 43 73 72 2b 2b 29   }.    *(zCsr++)
4400: 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c 69 74 65   = c;.    sqlite
4410: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
4420: 7a 43 73 72 2c 20 22 25 64 5b 22 2c 20 70 4d 65  zCsr, "%d[", pMe
4430: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a 43 73 72 20  m->n);.    zCsr 
4440: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
4450: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 66 6f  30(zCsr);.    fo
4460: 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20 69  r(i=0; i<16 && i
4470: 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  <pMem->n; i++){.
4480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4490: 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72  printf(100, zCsr
44a0: 2c 20 22 25 30 32 58 22 2c 20 28 28 69 6e 74 29  , "%02X", ((int)
44b0: 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78 46  pMem->z[i] & 0xF
44c0: 46 29 29 3b 0a 20 20 20 20 20 20 7a 43 73 72 20  F));.      zCsr 
44d0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
44e0: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a  30(zCsr);.    }.
44f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
4500: 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20  6 && i<pMem->n; 
4510: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
4520: 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b   z = pMem->z[i];
4530: 0a 20 20 20 20 20 20 69 66 28 20 7a 3c 33 32 20  .      if( z<32 
4540: 7c 7c 20 7a 3e 31 32 36 20 29 20 2a 7a 43 73 72  || z>126 ) *zCsr
4550: 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20  ++ = '.';.      
4560: 65 6c 73 65 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a  else *zCsr++ = z
4570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a 43  ;.    }.    *(zC
4580: 73 72 2b 2b 29 20 3d 20 27 5d 27 3b 0a 20 20 20  sr++) = ']';.   
4590: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 5a 65 72   if( f & MEM_Zer
45a0: 6f 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  o ){.      sqlit
45b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
45c0: 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c 70 4d 65   zCsr,"+%dz",pMe
45d0: 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20 20  m->u.nZero);.   
45e0: 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74     zCsr += sqlit
45f0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29  e3Strlen30(zCsr)
4600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73  ;.    }.    *zCs
4610: 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73  r = '\0';.  }els
4620: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74  e if( f & MEM_St
4630: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20  r ){.    int j, 
4640: 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d  k;.    zBuf[0] =
4650: 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 66 20   ' ';.    if( f 
4660: 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20  & MEM_Dyn ){.   
4670: 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a 27     zBuf[1] = 'z'
4680: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4690: 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63  (f & (MEM_Static
46a0: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20  |MEM_Ephem))==0 
46b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
46c0: 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63 20   f & MEM_Static 
46d0: 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d  ){.      zBuf[1]
46e0: 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61 73   = 't';.      as
46f0: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
4700: 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  Dyn|MEM_Ephem))=
4710: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
4720: 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68 65  if( f & MEM_Ephe
4730: 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  m ){.      zBuf[
4740: 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20  1] = 'e';.      
4750: 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45  assert( (f & (ME
4760: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e  M_Static|MEM_Dyn
4770: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
4780: 73 65 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31  se{.      zBuf[1
4790: 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a 20  ] = 's';.    }. 
47a0: 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20 20 73 71     k = 2;.    sq
47b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
47c0: 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c 20 22 25  00, &zBuf[k], "%
47d0: 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20  d", pMem->n);.  
47e0: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
47f0: 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29  rlen30(&zBuf[k])
4800: 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20  ;.    zBuf[k++] 
4810: 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f 72 28 6a  = '[';.    for(j
4820: 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a 3c 70 4d  =0; j<15 && j<pM
4830: 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  em->n; j++){.   
4840: 20 20 20 75 38 20 63 20 3d 20 70 4d 65 6d 2d 3e     u8 c = pMem->
4850: 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[j];.      if( 
4860: 63 3e 3d 30 78 32 30 20 26 26 20 63 3c 30 78 37  c>=0x20 && c<0x7
4870: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75  f ){.        zBu
4880: 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  f[k++] = c;.    
4890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
48a0: 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e 27   zBuf[k++] = '.'
48b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
48c0: 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20      zBuf[k++] = 
48d0: 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ']';.    sqlite3
48e0: 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 26 7a  _snprintf(100,&z
48f0: 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65 73  Buf[k], encnames
4900: 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20  [pMem->enc]);.  
4910: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
4920: 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29  rlen30(&zBuf[k])
4930: 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20  ;.    zBuf[k++] 
4940: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
4950: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
4960: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
4970: 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
4980: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  a register for t
4990: 72 61 63 69 6e 67 20 70 75 72 70 6f 73 65 73 3a  racing purposes:
49a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
49b0: 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 4d 65  memTracePrint(Me
49c0: 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  m *p){.  if( p->
49d0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 55 6e 64 65  flags & MEM_Unde
49e0: 66 69 6e 65 64 20 29 7b 0a 20 20 20 20 70 72 69  fined ){.    pri
49f0: 6e 74 66 28 22 20 75 6e 64 65 66 69 6e 65 64 22  ntf(" undefined"
4a00: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
4a10: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
4a20: 6c 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ll ){.    printf
4a30: 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  (p->flags & MEM_
4a40: 5a 65 72 6f 20 3f 20 22 20 4e 55 4c 4c 2d 6e 6f  Zero ? " NULL-no
4a50: 63 68 6e 67 22 20 3a 20 22 20 4e 55 4c 4c 22 29  chng" : " NULL")
4a60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
4a70: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49  ->flags & (MEM_I
4a80: 6e 74 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28 4d  nt|MEM_Str))==(M
4a90: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 20  EM_Int|MEM_Str) 
4aa0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  ){.    printf(" 
4ab0: 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69  si:%lld", p->u.i
4ac0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
4ad0: 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  p->flags & (MEM_
4ae0: 49 6e 74 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a  IntReal))!=0 ){.
4af0: 20 20 20 20 70 72 69 6e 74 66 28 22 20 69 72 3a      printf(" ir:
4b00: 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a  %lld", p->u.i);.
4b10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66    }else if( p->f
4b20: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
4b30: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 69  {.    printf(" i
4b40: 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b  :%lld", p->u.i);
4b50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4b60: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
4b70: 49 4e 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  INT.  }else if( 
4b80: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  p->flags & MEM_R
4b90: 65 61 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  eal ){.    print
4ba0: 66 28 22 20 72 3a 25 67 22 2c 20 70 2d 3e 75 2e  f(" r:%g", p->u.
4bb0: 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  r);.#endif.  }el
4bc0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  se if( sqlite3Vd
4bd0: 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 29  beMemIsRowSet(p)
4be0: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
4bf0: 20 28 72 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d   (rowset)");.  }
4c00: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
4c10: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71  Buf[200];.    sq
4c20: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74  lite3VdbeMemPret
4c30: 74 79 50 72 69 6e 74 28 70 2c 20 7a 42 75 66 29  tyPrint(p, zBuf)
4c40: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 25  ;.    printf(" %
4c50: 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20  s", zBuf);.  }. 
4c60: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
4c70: 4d 45 4d 5f 53 75 62 74 79 70 65 20 29 20 70 72  MEM_Subtype ) pr
4c80: 69 6e 74 66 28 22 20 73 75 62 74 79 70 65 3d 30  intf(" subtype=0
4c90: 78 25 30 32 78 22 2c 20 70 2d 3e 65 53 75 62 74  x%02x", p->eSubt
4ca0: 79 70 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ype);.}.static v
4cb0: 6f 69 64 20 72 65 67 69 73 74 65 72 54 72 61 63  oid registerTrac
4cc0: 65 28 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20  e(int iReg, Mem 
4cd0: 2a 70 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 52  *p){.  printf("R
4ce0: 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 67  EG[%d] = ", iReg
4cf0: 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 69  );.  memTracePri
4d00: 6e 74 28 70 29 3b 0a 20 20 70 72 69 6e 74 66 28  nt(p);.  printf(
4d10: 22 5c 6e 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  "\n");.  sqlite3
4d20: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
4d30: 72 69 61 6e 74 73 28 70 29 3b 0a 7d 0a 23 65 6e  riants(p);.}.#en
4d40: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4d50: 54 45 5f 44 45 42 55 47 0a 23 20 20 64 65 66 69  TE_DEBUG.#  defi
4d60: 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  ne REGISTER_TRAC
4d70: 45 28 52 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c  E(R,M) if(db->fl
4d80: 61 67 73 26 53 51 4c 49 54 45 5f 56 64 62 65 54  ags&SQLITE_VdbeT
4d90: 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72 61  race)registerTra
4da0: 63 65 28 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20  ce(R,M).#else.# 
4db0: 20 64 65 66 69 6e 65 20 52 45 47 49 53 54 45 52   define REGISTER
4dc0: 5f 54 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64  _TRACE(R,M).#end
4dd0: 69 66 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45  if...#ifdef VDBE
4de0: 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a  _PROFILE../* .**
4df0: 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69   hwtime.h contai
4e00: 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62  ns inline assemb
4e10: 6c 65 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70  ler code for imp
4e20: 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69  lementing .** hi
4e30: 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74  gh-performance t
4e40: 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a  iming routines..
4e50: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74  */.#include "hwt
4e60: 69 6d 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a  ime.h"..#endif..
4e70: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
4e80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4e90: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
4ea0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
4eb0: 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
4ec0: 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63  sion. It.** chec
4ed0: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
4ee0: 74 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  te3.nTransaction
4ef0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72   variable is cor
4f00: 72 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a  rectly set to.**
4f10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
4f20: 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
4f30: 61 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e  avepoints curren
4f40: 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  tly in the .** l
4f50: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
4f60: 69 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70  ing at sqlite3.p
4f70: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a  Savepoint..** .*
4f80: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
4f90: 20 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b     assert( check
4fa0: 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
4fb0: 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  b) );.*/.static 
4fc0: 69 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69  int checkSavepoi
4fd0: 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20  ntCount(sqlite3 
4fe0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  *db){.  int n = 
4ff0: 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  0;.  Savepoint *
5000: 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70  p;.  for(p=db->p
5010: 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d  Savepoint; p; p=
5020: 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20  p->pNext) n++;. 
5030: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d   assert( n==(db-
5040: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62  >nSavepoint + db
5050: 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
5060: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72  avepoint) );.  r
5070: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
5080: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
5090: 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
50a0: 70 4f 70 2d 3e 70 32 20 61 66 74 65 72 20 66 69  pOp->p2 after fi
50b0: 72 73 74 20 70 72 65 70 61 72 69 6e 67 20 69 74  rst preparing it
50c0: 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
50d0: 69 74 74 65 6e 20 77 69 74 68 20 61 6e 20 69 6e  itten with an in
50e0: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a  teger value..*/.
50f0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
5100: 49 4e 4c 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32  INLINE Mem *out2
5110: 50 72 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c  PrereleaseWithCl
5120: 65 61 72 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a  ear(Mem *pOut){.
5130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
5140: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
5150: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
5160: 45 4d 5f 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e  EM_Int;.  return
5170: 20 70 4f 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20   pOut;.}.static 
5180: 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c 65  Mem *out2Prerele
5190: 61 73 65 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ase(Vdbe *p, Vdb
51a0: 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d  eOp *pOp){.  Mem
51b0: 20 2a 70 4f 75 74 3b 0a 20 20 61 73 73 65 72 74   *pOut;.  assert
51c0: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
51d0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
51e0: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
51f0: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
5200: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
5210: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41  pOp->p2];.  memA
5220: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
5230: 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 56 64 62  pOut);.  if( Vdb
5240: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
5250: 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  ) ){ /*OPTIMIZAT
5260: 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20  ION-IF-FALSE*/. 
5270: 20 20 20 72 65 74 75 72 6e 20 6f 75 74 32 50 72     return out2Pr
5280: 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61  ereleaseWithClea
5290: 72 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  r(pOut);.  }else
52a0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
52b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
52c0: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
52d0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  }.}.../*.** Exec
52e0: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
52f0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
5300: 20 77 65 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73   we can..** This
5310: 20 69 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20   is the core of 
5320: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
5330: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
5340: 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65  VdbeExec(.  Vdbe
5350: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
5360: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
5370: 42 45 20 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61  BE */.){.  Op *a
5380: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20  Op = p->aOp;    
5390: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
53a0: 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20   p->aOp */.  Op 
53b0: 2a 70 4f 70 20 3d 20 61 4f 70 3b 20 20 20 20 20  *pOp = aOp;     
53c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
53d0: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
53e0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
53f0: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
5400: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
5410: 45 29 0a 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70  E).  Op *pOrigOp
5420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5430: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 4f 70 20  /* Value of pOp 
5440: 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
5450: 65 20 6c 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66  e loop */.#endif
5460: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5470: 45 42 55 47 0a 20 20 69 6e 74 20 6e 45 78 74 72  EBUG.  int nExtr
5480: 61 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  aDelete = 0;    
5490: 20 20 2f 2a 20 56 65 72 69 66 69 65 73 20 46 4f    /* Verifies FO
54a0: 52 44 45 4c 45 54 45 20 61 6e 64 20 41 55 58 44  RDELETE and AUXD
54b0: 45 4c 45 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23  ELETE flags */.#
54c0: 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 20 3d  endif.  int rc =
54d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
54e0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
54f0: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
5500: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
5510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
5520: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 72 65  abase */.  u8 re
5530: 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
5540: 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74 20 73   = 0; /* Reset s
5550: 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e 20 65  chema after an e
5560: 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69 76 65  rror if positive
5570: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e   */.  u8 encodin
5580: 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  g = ENC(db);    
5590: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
55a0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
55b0: 6e 74 20 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b  nt iCompare = 0;
55c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
55d0: 75 6c 74 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70  ult of last comp
55e0: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  arison */.  unsi
55f0: 67 6e 65 64 20 6e 56 6d 53 74 65 70 20 3d 20 30  gned nVmStep = 0
5600: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
5610: 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 61 63 68   of virtual mach
5620: 69 6e 65 20 73 74 65 70 73 20 2a 2f 0a 23 69 66  ine steps */.#if
5630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5640: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
5650: 43 4b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 50  CK.  unsigned nP
5660: 72 6f 67 72 65 73 73 4c 69 6d 69 74 3b 20 20 20  rogressLimit;   
5670: 2f 2a 20 49 6e 76 6f 6b 65 20 78 50 72 6f 67 72  /* Invoke xProgr
5680: 65 73 73 28 29 20 77 68 65 6e 20 6e 56 6d 53 74  ess() when nVmSt
5690: 65 70 20 72 65 61 63 68 65 73 20 74 68 69 73 20  ep reaches this 
56a0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d 65 6d 20  */.#endif.  Mem 
56b0: 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *aMem = p->aMem;
56c0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
56d0: 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20 4d  f p->aMem */.  M
56e0: 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b 20 20 20  em *pIn1 = 0;   
56f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73 74            /* 1st
5700: 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a   input operand *
5710: 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32 20 3d 20  /.  Mem *pIn2 = 
5720: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
5730: 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f 70 65 72  * 2nd input oper
5740: 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  and */.  Mem *pI
5750: 6e 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  n3 = 0;         
5760: 20 20 20 20 2f 2a 20 33 72 64 20 69 6e 70 75 74      /* 3rd input
5770: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65   operand */.  Me
5780: 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20 20 20 20  m *pOut = 0;    
5790: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
57a0: 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 23 69  ut operand */.#i
57b0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
57c0: 45 0a 20 20 75 36 34 20 73 74 61 72 74 3b 20 20  E.  u64 start;  
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
57e0: 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e  * CPU clock coun
57f0: 74 20 61 74 20 73 74 61 72 74 20 6f 66 20 6f 70  t at start of op
5800: 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  code */.#endif. 
5810: 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20 53 54 41   /*** INSERT STA
5820: 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45 20 2a 2a  CK UNION HERE **
5830: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
5840: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5850: 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a 20 73 71  IC_RUN );  /* sq
5860: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 76 65 72  lite3_step() ver
5870: 69 66 69 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  ifies this */.  
5880: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
5890: 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
58a0: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
58b0: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 69 66 28  S_CALLBACK.  if(
58c0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 29   db->xProgress )
58d0: 7b 0a 20 20 20 20 75 33 32 20 69 50 72 69 6f 72  {.    u32 iPrior
58e0: 20 3d 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53   = p->aCounter[S
58f0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
5900: 5f 56 4d 5f 53 54 45 50 5d 3b 0a 20 20 20 20 61  _VM_STEP];.    a
5910: 73 73 65 72 74 28 20 30 20 3c 20 64 62 2d 3e 6e  ssert( 0 < db->n
5920: 50 72 6f 67 72 65 73 73 4f 70 73 20 29 3b 0a 20  ProgressOps );. 
5930: 20 20 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69     nProgressLimi
5940: 74 20 3d 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73  t = db->nProgres
5950: 73 4f 70 73 20 2d 20 28 69 50 72 69 6f 72 20 25  sOps - (iPrior %
5960: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
5970: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
5980: 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20   nProgressLimit 
5990: 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  = 0xffffffff;.  
59a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
59b0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
59c0: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
59d0: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
59e0: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
59f0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
5a00: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
5a10: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
5a20: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
5a30: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
5a40: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
5a50: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  }.  assert( p->r
5a60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
5a70: 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
5a80: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 61  LITE_BUSY );.  a
5a90: 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
5aa0: 64 65 72 20 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e  der || p->readOn
5ab0: 6c 79 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 69 43  ly!=0 );.  p->iC
5ac0: 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a  urrentTime = 0;.
5ad0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
5ae0: 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  lain==0 );.  p->
5af0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
5b00: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
5b10: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 69  r.nBusy = 0;.  i
5b20: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
5b30: 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f 20 61  rrupted ) goto a
5b40: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65  bort_due_to_inte
5b50: 72 72 75 70 74 3b 0a 20 20 73 71 6c 69 74 65 33  rrupt;.  sqlite3
5b60: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 70  VdbeIOTraceSql(p
5b70: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
5b80: 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33  _DEBUG.  sqlite3
5b90: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
5ba0: 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63  c();.  if( p->pc
5bb0: 3d 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e 64 62  ==0.   && (p->db
5bc0: 2d 3e 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ->flags & (SQLIT
5bd0: 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 7c 53 51  E_VdbeListing|SQ
5be0: 4c 49 54 45 5f 56 64 62 65 45 51 50 7c 53 51 4c  LITE_VdbeEQP|SQL
5bf0: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 29 21  ITE_VdbeTrace))!
5c00: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  =0.  ){.    int 
5c10: 69 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  i;.    int once 
5c20: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
5c30: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
5c40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
5c50: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
5c60: 64 62 65 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20  dbeListing ){.  
5c70: 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45      printf("VDBE
5c80: 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67   Program Listing
5c90: 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  :\n");.      for
5ca0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
5cb0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
5cc0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
5cd0: 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70  (stdout, i, &aOp
5ce0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
5cf0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64    }.    if( p->d
5d00: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5d10: 45 5f 56 64 62 65 45 51 50 20 29 7b 0a 20 20 20  E_VdbeEQP ){.   
5d20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5d30: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
5d40: 20 20 20 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f      if( aOp[i].o
5d50: 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69  pcode==OP_Explai
5d60: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
5d70: 66 28 20 6f 6e 63 65 20 29 20 70 72 69 6e 74 66  f( once ) printf
5d80: 28 22 56 44 42 45 20 51 75 65 72 79 20 50 6c 61  ("VDBE Query Pla
5d90: 6e 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  n:\n");.        
5da0: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
5db0: 20 61 4f 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20   aOp[i].p4.z);. 
5dc0: 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
5dd0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
5de0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5df0: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
5e00: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
5e10: 63 65 20 29 20 20 70 72 69 6e 74 66 28 22 56 44  ce )  printf("VD
5e20: 42 45 20 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20  BE Trace:\n");. 
5e30: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
5e40: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
5e50: 65 6e 64 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d  endif.  for(pOp=
5e60: 26 61 4f 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20  &aOp[p->pc]; 1; 
5e70: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45  pOp++){.    /* E
5e80: 72 72 6f 72 73 20 61 72 65 20 64 65 74 65 63 74  rrors are detect
5e90: 65 64 20 62 79 20 69 6e 64 69 76 69 64 75 61 6c  ed by individual
5ea0: 20 6f 70 63 6f 64 65 73 2c 20 77 69 74 68 20 61   opcodes, with a
5eb0: 6e 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20  n immediate.    
5ec0: 2a 2a 20 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72  ** jumps to abor
5ed0: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20  t_due_to_error. 
5ee0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
5ef0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
5f00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
5f10: 3e 3d 61 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f  >=aOp && pOp<&aO
5f20: 70 5b 70 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64  p[p->nOp]);.#ifd
5f30: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
5f40: 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
5f50: 74 65 33 4e 50 72 6f 66 69 6c 65 43 6e 74 20 3f  te3NProfileCnt ?
5f60: 20 73 71 6c 69 74 65 33 4e 50 72 6f 66 69 6c 65   sqlite3NProfile
5f70: 43 6e 74 20 3a 20 73 71 6c 69 74 65 33 48 77 74  Cnt : sqlite3Hwt
5f80: 69 6d 65 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ime();.#endif.  
5f90: 20 20 6e 56 6d 53 74 65 70 2b 2b 3b 0a 23 69 66    nVmStep++;.#if
5fa0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5fb0: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
5fc0: 53 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 6e 45  S.    if( p->anE
5fd0: 78 65 63 20 29 20 70 2d 3e 61 6e 45 78 65 63 5b  xec ) p->anExec[
5fe0: 28 69 6e 74 29 28 70 4f 70 2d 61 4f 70 29 5d 2b  (int)(pOp-aOp)]+
5ff0: 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  +;.#endif..    /
6000: 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 74 72 61  * Only allow tra
6010: 63 69 6e 67 20 69 66 20 53 51 4c 49 54 45 5f 44  cing if SQLITE_D
6020: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
6030: 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
6040: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
6050: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
6060: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
6070: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6080: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64  3VdbePrintOp(std
6090: 6f 75 74 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d  out, (int)(pOp -
60a0: 20 61 4f 70 29 2c 20 70 4f 70 29 3b 0a 20 20 20   aOp), pOp);.   
60b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
60c0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
60d0: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
60e0: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
60f0: 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68 69 73  interrupt.  This
6100: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a 20 20   only happens.  
6110: 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76 65 20    ** if we have 
6120: 61 20 73 70 65 63 69 61 6c 20 74 65 73 74 20 62  a special test b
6130: 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  uild..    */.#if
6140: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
6150: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
6160: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3e  interrupt_count>
6170: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6180: 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
6190: 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  nt--;.      if( 
61a0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
61b0: 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20 20  t_count==0 ){.  
61c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
61d0: 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 20  terrupt(db);.   
61e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
61f0: 66 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79  f..    /* Sanity
6200: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68   checking on oth
6210: 65 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23  er operands */.#
6220: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
6230: 55 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75  UG.    {.      u
6240: 38 20 6f 70 50 72 6f 70 65 72 74 79 20 3d 20 73  8 opProperty = s
6250: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
6260: 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  erty[pOp->opcode
6270: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70  ];.      if( (op
6280: 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47  Property & OPFLG
6290: 5f 49 4e 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  _IN1)!=0 ){.    
62a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
62b0: 3e 70 31 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p1>0 );.       
62c0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
62d0: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
62e0: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
62f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
6300: 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
6310: 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20  Op->p1]) );.    
6320: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
6330: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49  te3VdbeCheckMemI
6340: 6e 76 61 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b  nvariants(&aMem[
6350: 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20  pOp->p1]) );.   
6360: 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
6370: 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 26 61 4d  ACE(pOp->p1, &aM
6380: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20  em[pOp->p1]);.  
6390: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
63a0: 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50  (opProperty & OP
63b0: 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b 0a 20  FLG_IN2)!=0 ){. 
63c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
63d0: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
63e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
63f0: 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p2<=(p->nMem+1 
6400: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
6410: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6420: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65   memIsValid(&aMe
6430: 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a 20  m[pOp->p2]) );. 
6440: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
6450: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
6460: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d  emInvariants(&aM
6470: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a  em[pOp->p2]) );.
6480: 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
6490: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
64a0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b  &aMem[pOp->p2]);
64b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
64c0: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
64d0: 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d 30 20 29   OPFLG_IN3)!=0 )
64e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
64f0: 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20  ( pOp->p3>0 );. 
6500: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6510: 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
6520: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
6530: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
6540: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
6550: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29  aMem[pOp->p3]) )
6560: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6570: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
6580: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
6590: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20  &aMem[pOp->p3]) 
65a0: 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53  );.        REGIS
65b0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
65c0: 33 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  3, &aMem[pOp->p3
65d0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
65e0: 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74    if( (opPropert
65f0: 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32 29 21  y & OPFLG_OUT2)!
6600: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
6610: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
6620: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
6630: 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e  t( pOp->p2<=(p->
6640: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
6650: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
6660: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
6670: 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  (p, &aMem[pOp->p
6680: 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
6690: 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72     if( (opProper
66a0: 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29  ty & OPFLG_OUT3)
66b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
66c0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
66d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
66e0: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d  rt( pOp->p3<=(p-
66f0: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
6700: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
6710: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
6720: 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  e(p, &aMem[pOp->
6730: 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p3]);.      }.  
6740: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
6750: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
6760: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
6770: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
6780: 20 20 70 4f 72 69 67 4f 70 20 3d 20 70 4f 70 3b    pOrigOp = pOp;
6790: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 73  .#endif.  .    s
67a0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
67b0: 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  de ){../********
67c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6800: 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74 20 66 6f  *****.** What fo
6810: 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61 73 73 69  llows is a massi
6820: 76 65 20 73 77 69 74 63 68 20 73 74 61 74 65 6d  ve switch statem
6830: 65 6e 74 20 77 68 65 72 65 20 65 61 63 68 20 63  ent where each c
6840: 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ase implements a
6850: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 73  .** separate ins
6860: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
6870: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
6880: 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f 77 20 74    If we follow t
6890: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69 6e 64 65  he usual.** inde
68a0: 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65 6e 74 69  ntation conventi
68b0: 6f 6e 73 2c 20 65 61 63 68 20 63 61 73 65 20 73  ons, each case s
68c0: 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65  hould be indente
68d0: 64 20 62 79 20 36 20 73 70 61 63 65 73 2e 20 20  d by 6 spaces.  
68e0: 42 75 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  But.** that is a
68f0: 20 6c 6f 74 20 6f 66 20 77 61 73 74 65 64 20 73   lot of wasted s
6900: 70 61 63 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  pace on the left
6910: 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20 74 68 65   margin.  So the
6920: 20 63 6f 64 65 20 77 69 74 68 69 6e 0a 2a 2a 20   code within.** 
6930: 74 68 65 20 73 77 69 74 63 68 20 73 74 61 74 65  the switch state
6940: 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65 61 6b 20  ment will break 
6950: 77 69 74 68 20 63 6f 6e 76 65 6e 74 69 6f 6e 20  with convention 
6960: 61 6e 64 20 62 65 20 66 6c 75 73 68 2d 6c 65 66  and be flush-lef
6970: 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a 20 62 69  t. Another.** bi
6980: 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69 6d 69 6c  g comment (simil
6990: 61 72 20 74 6f 20 74 68 69 73 20 6f 6e 65 29 20  ar to this one) 
69a0: 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65 20 70 6f  will mark the po
69b0: 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
69c0: 77 68 65 72 65 0a 2a 2a 20 77 65 20 74 72 61 6e  where.** we tran
69d0: 73 69 74 69 6f 6e 20 62 61 63 6b 20 74 6f 20 6e  sition back to n
69e0: 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f  ormal indentatio
69f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
6a00: 6d 61 74 74 69 6e 67 20 6f 66 20 65 61 63 68 20  matting of each 
6a10: 63 61 73 65 20 69 73 20 69 6d 70 6f 72 74 61 6e  case is importan
6a20: 74 2e 20 20 54 68 65 20 6d 61 6b 65 66 69 6c 65  t.  The makefile
6a30: 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a 2a 20 67   for SQLite.** g
6a40: 65 6e 65 72 61 74 65 73 20 74 77 6f 20 43 20 66  enerates two C f
6a50: 69 6c 65 73 20 22 6f 70 63 6f 64 65 73 2e 68 22  iles "opcodes.h"
6a60: 20 61 6e 64 20 22 6f 70 63 6f 64 65 73 2e 63 22   and "opcodes.c"
6a70: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69   by scanning thi
6a80: 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f 6b 69 6e  s.** file lookin
6a90: 67 20 66 6f 72 20 6c 69 6e 65 73 20 74 68 61 74  g for lines that
6aa0: 20 62 65 67 69 6e 20 77 69 74 68 20 22 63 61 73   begin with "cas
6ab0: 65 20 4f 50 5f 22 2e 20 20 54 68 65 20 6f 70 63  e OP_".  The opc
6ac0: 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a 2a 2a 20  odes.h files.** 
6ad0: 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65 64 20 77  will be filled w
6ae0: 69 74 68 20 23 64 65 66 69 6e 65 73 20 74 68 61  ith #defines tha
6af0: 74 20 67 69 76 65 20 75 6e 69 71 75 65 20 69 6e  t give unique in
6b00: 74 65 67 65 72 20 76 61 6c 75 65 73 20 74 6f 20  teger values to 
6b10: 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64 65 20 61  each.** opcode a
6b20: 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 73 2e 63  nd the opcodes.c
6b30: 20 66 69 6c 65 20 69 73 20 66 69 6c 6c 65 64 20   file is filled 
6b40: 77 69 74 68 20 61 6e 20 61 72 72 61 79 20 6f 66  with an array of
6b50: 20 73 74 72 69 6e 67 73 20 77 68 65 72 65 0a 2a   strings where.*
6b60: 2a 20 65 61 63 68 20 73 74 72 69 6e 67 20 69 73  * each string is
6b70: 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
6b80: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  me for the corre
6b90: 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f 64 65 2e  sponding opcode.
6ba0: 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 61 73 65    If the.** case
6bb0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f   statement is fo
6bc0: 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6d 6d  llowed by a comm
6bd0: 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ent of the form 
6be0: 22 2f 23 20 73 61 6d 65 20 61 73 20 2e 2e 2e 20  "/# same as ... 
6bf0: 23 2f 22 0a 2a 2a 20 74 68 61 74 20 63 6f 6d 6d  #/".** that comm
6c00: 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ent is used to d
6c10: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 72  etermine the par
6c20: 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
6c30: 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a   the opcode..**.
6c40: 2a 2a 20 4f 74 68 65 72 20 6b 65 79 77 6f 72 64  ** Other keyword
6c50: 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74  s in the comment
6c60: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 65 61   that follows ea
6c70: 63 68 20 63 61 73 65 20 61 72 65 20 75 73 65 64  ch case are used
6c80: 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74   to.** construct
6c90: 20 74 68 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49   the OPFLG_INITI
6ca0: 41 4c 49 5a 45 52 20 76 61 6c 75 65 20 74 68 61  ALIZER value tha
6cb0: 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6f 70  t initializes op
6cc0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 5d 2e 0a  codeProperty[]..
6cd0: 2a 2a 20 4b 65 79 77 6f 72 64 73 20 69 6e 63 6c  ** Keywords incl
6ce0: 75 64 65 3a 20 69 6e 31 2c 20 69 6e 32 2c 20 69  ude: in1, in2, i
6cf0: 6e 33 2c 20 6f 75 74 32 2c 20 6f 75 74 33 2e 20  n3, out2, out3. 
6d00: 20 53 65 65 0a 2a 2a 20 74 68 65 20 6d 6b 6f 70   See.** the mkop
6d10: 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
6d20: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
6d30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
6d40: 2a 2a 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ** Documentation
6d50: 20 61 62 6f 75 74 20 56 44 42 45 20 6f 70 63 6f   about VDBE opco
6d60: 64 65 73 20 69 73 20 67 65 6e 65 72 61 74 65 64  des is generated
6d70: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69   by scanning thi
6d80: 73 20 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 6c 69  s file.** for li
6d90: 6e 65 73 20 6f 66 20 74 68 61 74 20 63 6f 6e 74  nes of that cont
6da0: 61 69 6e 20 22 4f 70 63 6f 64 65 3a 22 2e 20 20  ain "Opcode:".  
6db0: 54 68 61 74 20 6c 69 6e 65 20 61 6e 64 20 61 6c  That line and al
6dc0: 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
6dd0: 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73 20 61 72  comment lines ar
6de0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 67 65  e used in the ge
6df0: 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  neration of the 
6e00: 6f 70 63 6f 64 65 2e 68 74 6d 6c 20 64 6f 63 75  opcode.html docu
6e10: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  mentation.** fil
6e20: 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59  e..**.** SUMMARY
6e30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 6d  :.**.**     Form
6e40: 61 74 74 69 6e 67 20 69 73 20 69 6d 70 6f 72 74  atting is import
6e50: 61 6e 74 20 74 6f 20 73 63 72 69 70 74 73 20 74  ant to scripts t
6e60: 68 61 74 20 73 63 61 6e 20 74 68 69 73 20 66 69  hat scan this fi
6e70: 6c 65 2e 0a 2a 2a 20 20 20 20 20 44 6f 20 6e 6f  le..**     Do no
6e80: 74 20 64 65 76 69 61 74 65 20 66 72 6f 6d 20 74  t deviate from t
6e90: 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 73 74  he formatting st
6ea0: 79 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  yle currently in
6eb0: 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a   use..**.*******
6ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6f00: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  ******/../* Opco
6f10: 64 65 3a 20 20 47 6f 74 6f 20 2a 20 50 32 20 2a  de:  Goto * P2 *
6f20: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e   * *.**.** An un
6f30: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70  conditional jump
6f40: 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a   to address P2..
6f50: 2a 2a 20 54 68 65 20 6e 65 78 74 20 69 6e 73 74  ** The next inst
6f60: 72 75 63 74 69 6f 6e 20 65 78 65 63 75 74 65 64  ruction executed
6f70: 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65   will be .** the
6f80: 20 6f 6e 65 20 61 74 20 69 6e 64 65 78 20 50 32   one at index P2
6f90: 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
6fa0: 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72  ing of.** the pr
6fb0: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ogram..**.** The
6fc0: 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   P1 parameter is
6fd0: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 75 73   not actually us
6fe0: 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  ed by this opcod
6ff0: 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 74 0a  e.  However, it.
7000: 2a 2a 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  ** is sometimes 
7010: 73 65 74 20 74 6f 20 31 20 69 6e 73 74 65 61 64  set to 1 instead
7020: 20 6f 66 20 30 20 61 73 20 61 20 68 69 6e 74 20   of 0 as a hint 
7030: 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  to the command-l
7040: 69 6e 65 20 73 68 65 6c 6c 0a 2a 2a 20 74 68 61  ine shell.** tha
7050: 74 20 74 68 69 73 20 47 6f 74 6f 20 69 73 20 74  t this Goto is t
7060: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c  he bottom of a l
7070: 6f 6f 70 20 61 6e 64 20 74 68 61 74 20 74 68 65  oop and that the
7080: 20 6c 69 6e 65 73 20 66 72 6f 6d 20 50 32 20 64   lines from P2 d
7090: 6f 77 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 63 75  own.** to the cu
70a0: 72 72 65 6e 74 20 6c 69 6e 65 20 73 68 6f 75 6c  rrent line shoul
70b0: 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 66 6f  d be indented fo
70c0: 72 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74  r EXPLAIN output
70d0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 74  ..*/.case OP_Got
70e0: 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  o: {            
70f0: 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 6a 75 6d 70   /* jump */.jump
7100: 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b  _to_p2_and_check
7110: 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3a 0a  _for_interrupt:.
7120: 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70    pOp = &aOp[pOp
7130: 2d 3e 70 32 20 2d 20 31 5d 3b 0a 0a 20 20 2f 2a  ->p2 - 1];..  /*
7140: 20 4f 70 63 6f 64 65 73 20 74 68 61 74 20 61 72   Opcodes that ar
7150: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 62 6f  e used as the bo
7160: 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f 70 20 28  ttom of a loop (
7170: 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
7180: 2c 0a 20 20 2a 2a 20 4f 50 5f 56 4e 65 78 74 2c  ,.  ** OP_VNext,
7190: 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78   or OP_SorterNex
71a0: 74 29 20 61 6c 6c 20 6a 75 6d 70 20 68 65 72 65  t) all jump here
71b0: 20 75 70 6f 6e 0a 20 20 2a 2a 20 63 6f 6d 70 6c   upon.  ** compl
71c0: 65 74 69 6f 6e 2e 20 20 43 68 65 63 6b 20 74 6f  etion.  Check to
71d0: 20 73 65 65 20 69 66 20 73 71 6c 69 74 65 33 5f   see if sqlite3_
71e0: 69 6e 74 65 72 72 75 70 74 28 29 20 68 61 73 20  interrupt() has 
71f0: 62 65 65 6e 20 63 61 6c 6c 65 64 0a 20 20 2a 2a  been called.  **
7200: 20 6f 72 20 69 66 20 74 68 65 20 70 72 6f 67 72   or if the progr
7210: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 6e 65 65  ess callback nee
7220: 64 73 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ds to be invoked
7230: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  . .  **.  ** Thi
7240: 73 20 63 6f 64 65 20 75 73 65 73 20 75 6e 73 74  s code uses unst
7250: 72 75 63 74 75 72 65 64 20 22 67 6f 74 6f 22 20  ructured "goto" 
7260: 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 64  statements and d
7270: 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 20 63 6c 65  oes not look cle
7280: 61 6e 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 61  an..  ** But tha
7290: 74 20 69 73 20 6e 6f 74 20 64 75 65 20 74 6f 20  t is not due to 
72a0: 73 6c 6f 70 70 79 20 63 6f 64 69 6e 67 20 68 61  sloppy coding ha
72b0: 62 69 74 73 2e 20 54 68 65 20 63 6f 64 65 20 69  bits. The code i
72c0: 73 20 77 72 69 74 74 65 6e 20 74 68 69 73 0a 20  s written this. 
72d0: 20 2a 2a 20 77 61 79 20 66 6f 72 20 70 65 72 66   ** way for perf
72e0: 6f 72 6d 61 6e 63 65 2c 20 74 6f 20 61 76 6f 69  ormance, to avoi
72f0: 64 20 68 61 76 69 6e 67 20 74 6f 20 72 75 6e 20  d having to run 
7300: 74 68 65 20 69 6e 74 65 72 72 75 70 74 20 61 6e  the interrupt an
7310: 64 20 70 72 6f 67 72 65 73 73 0a 20 20 2a 2a 20  d progress.  ** 
7320: 63 68 65 63 6b 73 20 6f 6e 20 65 76 65 72 79 20  checks on every 
7330: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 68 65  opcode.  This he
7340: 6c 70 73 20 73 71 6c 69 74 65 33 5f 73 74 65 70  lps sqlite3_step
7350: 28 29 20 74 6f 20 72 75 6e 20 61 62 6f 75 74 20  () to run about 
7360: 31 2e 35 25 0a 20 20 2a 2a 20 66 61 73 74 65 72  1.5%.  ** faster
7370: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 22 76   according to "v
7380: 61 6c 67 72 69 6e 64 20 2d 2d 74 6f 6f 6c 3d 63  algrind --tool=c
7390: 61 63 68 65 67 72 69 6e 64 22 20 2a 2f 0a 63 68  achegrind" */.ch
73a0: 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
73b0: 74 3a 0a 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  t:.  if( db->u1.
73c0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 20  isInterrupted ) 
73d0: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
73e0: 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a 23 69 66  o_interrupt;.#if
73f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7400: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
7410: 43 4b 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65  CK.  /* Call the
7420: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
7430: 63 6b 20 69 66 20 69 74 20 69 73 20 63 6f 6e 66  ck if it is conf
7440: 69 67 75 72 65 64 20 61 6e 64 20 74 68 65 20 72  igured and the r
7450: 65 71 75 69 72 65 64 20 6e 75 6d 62 65 72 0a 20  equired number. 
7460: 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f 70 73 20   ** of VDBE ops 
7470: 68 61 76 65 20 62 65 65 6e 20 65 78 65 63 75 74  have been execut
7480: 65 64 20 28 65 69 74 68 65 72 20 73 69 6e 63 65  ed (either since
7490: 20 74 68 69 73 20 69 6e 76 6f 63 61 74 69 6f 6e   this invocation
74a0: 20 6f 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   of.  ** sqlite3
74b0: 56 64 62 65 45 78 65 63 28 29 20 6f 72 20 73 69  VdbeExec() or si
74c0: 6e 63 65 20 6c 61 73 74 20 74 69 6d 65 20 74 68  nce last time th
74d0: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
74e0: 61 63 6b 20 77 61 73 20 63 61 6c 6c 65 64 29 2e  ack was called).
74f0: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72 6f  .  ** If the pro
7500: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72  gress callback r
7510: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
7520: 20 65 78 69 74 20 74 68 65 20 76 69 72 74 75 61   exit the virtua
7530: 6c 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a 20  l machine with. 
7540: 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63 6f 64   ** a return cod
7550: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a  e SQLITE_ABORT..
7560: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 56    */.  while( nV
7570: 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72 65 73 73  mStep>=nProgress
7580: 4c 69 6d 69 74 20 26 26 20 64 62 2d 3e 78 50 72  Limit && db->xPr
7590: 6f 67 72 65 73 73 21 3d 30 20 29 7b 0a 20 20 20  ogress!=0 ){.   
75a0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 50 72   assert( db->nPr
75b0: 6f 67 72 65 73 73 4f 70 73 21 3d 30 20 29 3b 0a  ogressOps!=0 );.
75c0: 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d      nProgressLim
75d0: 69 74 20 2b 3d 20 64 62 2d 3e 6e 50 72 6f 67 72  it += db->nProgr
75e0: 65 73 73 4f 70 73 3b 0a 20 20 20 20 69 66 28 20  essOps;.    if( 
75f0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 28 64 62  db->xProgress(db
7600: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 29 20  ->pProgressArg) 
7610: 29 7b 0a 20 20 20 20 20 20 6e 50 72 6f 67 72 65  ){.      nProgre
7620: 73 73 4c 69 6d 69 74 20 3d 20 30 78 66 66 66 66  ssLimit = 0xffff
7630: 66 66 66 66 3b 0a 20 20 20 20 20 20 72 63 20 3d  ffff;.      rc =
7640: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
7650: 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62  T;.      goto ab
7660: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
7670: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7680: 69 66 0a 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d  if.  .  break;.}
7690: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f  ../* Opcode:  Go
76a0: 73 75 62 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  sub P1 P2 * * *.
76b0: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
76c0: 63 75 72 72 65 6e 74 20 61 64 64 72 65 73 73 20  current address 
76d0: 6f 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 31  onto register P1
76e0: 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 6a 75 6d  .** and then jum
76f0: 70 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e  p to address P2.
7700: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 73 75  .*/.case OP_Gosu
7710: 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  b: {            
7720: 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73  /* jump */.  ass
7730: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
7740: 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e  & pOp->p1<=(p->n
7750: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
7760: 6f 72 29 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20  or) );.  pIn1 = 
7770: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
7780: 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d 65    assert( VdbeMe
7790: 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31 29 3d 3d  mDynamic(pIn1)==
77a0: 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  0 );.  memAboutT
77b0: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
77c0: 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
77d0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e  = MEM_Int;.  pIn
77e0: 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74 29 28 70  1->u.i = (int)(p
77f0: 4f 70 2d 61 4f 70 29 3b 0a 20 20 52 45 47 49 53  Op-aOp);.  REGIS
7800: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
7810: 31 2c 20 70 49 6e 31 29 3b 0a 0a 20 20 2f 2a 20  1, pIn1);..  /* 
7820: 4d 6f 73 74 20 6a 75 6d 70 20 6f 70 65 72 61 74  Most jump operat
7830: 69 6f 6e 73 20 64 6f 20 61 20 67 6f 74 6f 20 74  ions do a goto t
7840: 6f 20 74 68 69 73 20 73 70 6f 74 20 69 6e 20 6f  o this spot in o
7850: 72 64 65 72 20 74 6f 20 75 70 64 61 74 65 0a 20  rder to update. 
7860: 20 2a 2a 20 74 68 65 20 70 4f 70 20 70 6f 69 6e   ** the pOp poin
7870: 74 65 72 2e 20 2a 2f 0a 6a 75 6d 70 5f 74 6f 5f  ter. */.jump_to_
7880: 70 32 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70  p2:.  pOp = &aOp
7890: 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20  [pOp->p2 - 1];. 
78a0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
78b0: 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50 31  code:  Return P1
78c0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a   * * * *.**.** J
78d0: 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
78e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74 65  instruction afte
78f0: 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e  r the address in
7900: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 41   register P1.  A
7910: 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 75 6d 70  fter.** the jump
7920: 2c 20 72 65 67 69 73 74 65 72 20 50 31 20 62 65  , register P1 be
7930: 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e 65 64 2e  comes undefined.
7940: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 75  .*/.case OP_Retu
7950: 72 6e 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  rn: {           
7960: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  /* in1 */.  pIn1
7970: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
7980: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
7990: 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e  1->flags==MEM_In
79a0: 74 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f  t );.  pOp = &aO
79b0: 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20  p[pIn1->u.i];.  
79c0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pIn1->flags = ME
79d0: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 62  M_Undefined;.  b
79e0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
79f0: 64 65 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e  de: InitCoroutin
7a00: 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
7a10: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 72 65 67 69  *.** Set up regi
7a20: 73 74 65 72 20 50 31 20 73 6f 20 74 68 61 74 20  ster P1 so that 
7a30: 69 74 20 77 69 6c 6c 20 59 69 65 6c 64 20 74 6f  it will Yield to
7a40: 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 0a 2a   the coroutine.*
7a50: 2a 20 6c 6f 63 61 74 65 64 20 61 74 20 61 64 64  * located at add
7a60: 72 65 73 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49  ress P3..**.** I
7a70: 66 20 50 32 21 3d 30 20 74 68 65 6e 20 74 68 65  f P2!=0 then the
7a80: 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
7a90: 6d 65 6e 74 61 74 69 6f 6e 20 69 6d 6d 65 64 69  mentation immedi
7aa0: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 0a 2a 2a  ately follows.**
7ab0: 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 53   this opcode.  S
7ac0: 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  o jump over the 
7ad0: 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
7ae0: 65 6e 74 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 61  entation to.** a
7af0: 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 0a 2a 2a  ddress P2..**.**
7b00: 20 53 65 65 20 61 6c 73 6f 3a 20 45 6e 64 43 6f   See also: EndCo
7b10: 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20  routine.*/.case 
7b20: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
7b30: 3a 20 7b 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20  : {     /* jump 
7b40: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
7b50: 2d 3e 70 31 3e 30 20 26 26 20 20 70 4f 70 2d 3e  ->p1>0 &&  pOp->
7b60: 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p1<=(p->nMem+1 -
7b70: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
7b80: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
7b90: 32 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  2>=0 && pOp->p2<
7ba0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 61 73 73 65  p->nOp );.  asse
7bb0: 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26  rt( pOp->p3>=0 &
7bc0: 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 4f 70  & pOp->p3<p->nOp
7bd0: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d   );.  pOut = &aM
7be0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
7bf0: 73 73 65 72 74 28 20 21 56 64 62 65 4d 65 6d 44  ssert( !VdbeMemD
7c00: 79 6e 61 6d 69 63 28 70 4f 75 74 29 20 29 3b 0a  ynamic(pOut) );.
7c10: 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f    pOut->u.i = pO
7c20: 70 2d 3e 70 33 20 2d 20 31 3b 0a 20 20 70 4f 75  p->p3 - 1;.  pOu
7c30: 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  t->flags = MEM_I
7c40: 6e 74 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  nt;.  if( pOp->p
7c50: 32 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  2 ) goto jump_to
7c60: 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
7c70: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 45 6e 64  ./* Opcode:  End
7c80: 43 6f 72 6f 75 74 69 6e 65 20 50 31 20 2a 20 2a  Coroutine P1 * *
7c90: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69   * *.**.** The i
7ca0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 74 68  nstruction at th
7cb0: 65 20 61 64 64 72 65 73 73 20 69 6e 20 72 65 67  e address in reg
7cc0: 69 73 74 65 72 20 50 31 20 69 73 20 61 20 59 69  ister P1 is a Yi
7cd0: 65 6c 64 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  eld..** Jump to 
7ce0: 74 68 65 20 50 32 20 70 61 72 61 6d 65 74 65 72  the P2 parameter
7cf0: 20 6f 66 20 74 68 61 74 20 59 69 65 6c 64 2e 0a   of that Yield..
7d00: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 75 6d  ** After the jum
7d10: 70 2c 20 72 65 67 69 73 74 65 72 20 50 31 20 62  p, register P1 b
7d20: 65 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e 65 64  ecomes undefined
7d30: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
7d40: 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 0a  : InitCoroutine.
7d50: 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 6e 64 43 6f  */.case OP_EndCo
7d60: 72 6f 75 74 69 6e 65 3a 20 7b 20 20 20 20 20 20  routine: {      
7d70: 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20       /* in1 */. 
7d80: 20 56 64 62 65 4f 70 20 2a 70 43 61 6c 6c 65 72   VdbeOp *pCaller
7d90: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
7da0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
7db0: 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
7dc0: 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61  ==MEM_Int );.  a
7dd0: 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 75 2e 69  ssert( pIn1->u.i
7de0: 3e 3d 30 20 26 26 20 70 49 6e 31 2d 3e 75 2e 69  >=0 && pIn1->u.i
7df0: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 43 61  <p->nOp );.  pCa
7e00: 6c 6c 65 72 20 3d 20 26 61 4f 70 5b 70 49 6e 31  ller = &aOp[pIn1
7e10: 2d 3e 75 2e 69 5d 3b 0a 20 20 61 73 73 65 72 74  ->u.i];.  assert
7e20: 28 20 70 43 61 6c 6c 65 72 2d 3e 6f 70 63 6f 64  ( pCaller->opcod
7e30: 65 3d 3d 4f 50 5f 59 69 65 6c 64 20 29 3b 0a 20  e==OP_Yield );. 
7e40: 20 61 73 73 65 72 74 28 20 70 43 61 6c 6c 65 72   assert( pCaller
7e50: 2d 3e 70 32 3e 3d 30 20 26 26 20 70 43 61 6c 6c  ->p2>=0 && pCall
7e60: 65 72 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b  er->p2<p->nOp );
7e70: 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 43  .  pOp = &aOp[pC
7e80: 61 6c 6c 65 72 2d 3e 70 32 20 2d 20 31 5d 3b 0a  aller->p2 - 1];.
7e90: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20    pIn1->flags = 
7ea0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
7eb0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
7ec0: 63 6f 64 65 3a 20 20 59 69 65 6c 64 20 50 31 20  code:  Yield P1 
7ed0: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  P2 * * *.**.** S
7ee0: 77 61 70 20 74 68 65 20 70 72 6f 67 72 61 6d 20  wap the program 
7ef0: 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74 68 65  counter with the
7f00: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
7f10: 65 72 20 50 31 2e 20 20 54 68 69 73 0a 2a 2a 20  er P1.  This.** 
7f20: 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
7f30: 66 20 79 69 65 6c 64 69 6e 67 20 74 6f 20 61 20  f yielding to a 
7f40: 63 6f 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  coroutine..**.**
7f50: 20 49 66 20 74 68 65 20 63 6f 72 6f 75 74 69 6e   If the coroutin
7f60: 65 20 74 68 61 74 20 69 73 20 6c 61 75 6e 63 68  e that is launch
7f70: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72  ed by this instr
7f80: 75 63 74 69 6f 6e 20 65 6e 64 73 20 77 69 74 68  uction ends with
7f90: 0a 2a 2a 20 59 69 65 6c 64 20 6f 72 20 52 65 74  .** Yield or Ret
7fa0: 75 72 6e 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  urn then continu
7fb0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  e to the next in
7fc0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20  struction.  But 
7fd0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 72 6f 75 74  if.** the corout
7fe0: 69 6e 65 20 6c 61 75 6e 63 68 65 64 20 62 79 20  ine launched by 
7ff0: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
8000: 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a 20 45 6e   ends with.** En
8010: 64 43 6f 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  dCoroutine, then
8020: 20 6a 75 6d 70 20 74 6f 20 50 32 20 72 61 74 68   jump to P2 rath
8030: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 6e 75 69  er than continui
8040: 6e 67 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e  ng with the.** n
8050: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
8060: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
8070: 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 0a 2a   InitCoroutine.*
8080: 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65 6c 64 3a  /.case OP_Yield:
8090: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
80a0: 20 69 6e 31 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20   in1, jump */.  
80b0: 69 6e 74 20 70 63 44 65 73 74 3b 0a 20 20 70 49  int pcDest;.  pI
80c0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
80d0: 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 56  p1];.  assert( V
80e0: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49  dbeMemDynamic(pI
80f0: 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  n1)==0 );.  pIn1
8100: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
8110: 74 3b 0a 20 20 70 63 44 65 73 74 20 3d 20 28 69  t;.  pcDest = (i
8120: 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20  nt)pIn1->u.i;.  
8130: 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74  pIn1->u.i = (int
8140: 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
8150: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
8160: 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20  Op->p1, pIn1);. 
8170: 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 44 65   pOp = &aOp[pcDe
8180: 73 74 5d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  st];.  break;.}.
8190: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c  ./* Opcode:  Hal
81a0: 74 49 66 4e 75 6c 6c 20 20 50 31 20 50 32 20 50  tIfNull  P1 P2 P
81b0: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
81c0: 73 69 73 3a 20 69 66 20 72 5b 50 33 5d 3d 6e 75  sis: if r[P3]=nu
81d0: 6c 6c 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 43 68  ll halt.**.** Ch
81e0: 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eck the value in
81f0: 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 20 49   register P3.  I
8200: 66 20 69 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  f it is NULL the
8210: 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a 2a 2a 20  n Halt using.** 
8220: 70 61 72 61 6d 65 74 65 72 20 50 31 2c 20 50 32  parameter P1, P2
8230: 2c 20 61 6e 64 20 50 34 20 61 73 20 69 66 20 74  , and P4 as if t
8240: 68 69 73 20 77 65 72 65 20 61 20 48 61 6c 74 20  his were a Halt 
8250: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  instruction.  If
8260: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e   the.** value in
8270: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
8280: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
8290: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
82a0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 50   no-op..** The P
82b0: 35 20 70 61 72 61 6d 65 74 65 72 20 73 68 6f 75  5 parameter shou
82c0: 6c 64 20 62 65 20 31 2e 0a 2a 2f 0a 63 61 73 65  ld be 1..*/.case
82d0: 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a 20   OP_HaltIfNull: 
82e0: 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f  {      /* in3 */
82f0: 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
8300: 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66  pOp->p3];.#ifdef
8310: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8320: 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f  if( pOp->p2==OE_
8330: 41 62 6f 72 74 20 29 7b 20 73 71 6c 69 74 65 33  Abort ){ sqlite3
8340: 56 64 62 65 41 73 73 65 72 74 41 62 6f 72 74 61  VdbeAssertAborta
8350: 62 6c 65 28 70 29 3b 20 7d 0a 23 65 6e 64 69 66  ble(p); }.#endif
8360: 0a 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c  .  if( (pIn3->fl
8370: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
8380: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a  =0 ) break;.  /*
8390: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
83a0: 74 6f 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a  to OP_Halt */.}.
83b0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c  ./* Opcode:  Hal
83c0: 74 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a  t P1 P2 * P4 P5.
83d0: 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64  **.** Exit immed
83e0: 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65  iately.  All ope
83f0: 6e 20 63 75 72 73 6f 72 73 2c 20 65 74 63 20 61  n cursors, etc a
8400: 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74  re closed.** aut
8410: 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a  omatically..**.*
8420: 2a 20 50 31 20 69 73 20 74 68 65 20 72 65 73 75  * P1 is the resu
8430: 6c 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  lt code returned
8440: 20 62 79 20 73 71 6c 69 74 65 33 5f 65 78 65 63   by sqlite3_exec
8450: 28 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 73 65  (), sqlite3_rese
8460: 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  t(),.** or sqlit
8470: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20  e3_finalize().  
8480: 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c  For a normal hal
8490: 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62  t, this should b
84a0: 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e  e SQLITE_OK (0).
84b0: 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c 20  .** For errors, 
84c0: 69 74 20 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f  it can be some o
84d0: 74 68 65 72 20 76 61 6c 75 65 2e 20 20 49 66 20  ther value.  If 
84e0: 50 31 21 3d 30 20 74 68 65 6e 20 50 32 20 77 69  P1!=0 then P2 wi
84f0: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  ll determine.** 
8500: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
8510: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63  o rollback the c
8520: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
8530: 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c  on.  Do not roll
8540: 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f  back.** if P2==O
8550: 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68 65 20 72  E_Fail. Do the r
8560: 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f  ollback if P2==O
8570: 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20  E_Rollback.  If 
8580: 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a  P2==OE_Abort,.**
8590: 20 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20 61   then back out a
85a0: 6c 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ll changes that 
85b0: 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 64 75  have occurred du
85c0: 72 69 6e 67 20 74 68 69 73 20 65 78 65 63 75 74  ring this execut
85d0: 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
85e0: 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 72  BE, but do not r
85f0: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
8600: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
8610: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c  If P4 is not nul
8620: 6c 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e 20  l then it is an 
8630: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
8640: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69  ring..**.** P5 i
8650: 73 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65  s a value betwee
8660: 6e 20 30 20 61 6e 64 20 34 2c 20 69 6e 63 6c 75  n 0 and 4, inclu
8670: 73 69 76 65 2c 20 74 68 61 74 20 6d 6f 64 69 66  sive, that modif
8680: 69 65 73 20 74 68 65 20 50 34 20 73 74 72 69 6e  ies the P4 strin
8690: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20  g..**.**    0:  
86a0: 28 6e 6f 20 63 68 61 6e 67 65 29 0a 2a 2a 20 20  (no change).**  
86b0: 20 20 31 3a 20 20 4e 4f 54 20 4e 55 4c 4c 20 63    1:  NOT NULL c
86c0: 6f 6e 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  ontraint failed:
86d0: 20 50 34 0a 2a 2a 20 20 20 20 32 3a 20 20 55 4e   P4.**    2:  UN
86e0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
86f0: 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20  failed: P4.**   
8700: 20 33 3a 20 20 43 48 45 43 4b 20 63 6f 6e 73 74   3:  CHECK const
8710: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34  raint failed: P4
8720: 0a 2a 2a 20 20 20 20 34 3a 20 20 46 4f 52 45 49  .**    4:  FOREI
8730: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
8740: 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a  t failed: P4.**.
8750: 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20  ** If P5 is not 
8760: 7a 65 72 6f 20 61 6e 64 20 50 34 20 69 73 20 4e  zero and P4 is N
8770: 55 4c 4c 2c 20 74 68 65 6e 20 65 76 65 72 79 74  ULL, then everyt
8780: 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 22  hing after the "
8790: 3a 22 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64  :" is.** omitted
87a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
87b0: 20 61 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c   an implied "Hal
87c0: 74 20 30 20 30 20 30 22 20 69 6e 73 74 72 75 63  t 0 0 0" instruc
87d0: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74  tion inserted at
87e0: 20 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66   the very end of
87f0: 0a 2a 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61  .** every progra
8800: 6d 2e 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61  m.  So a jump pa
8810: 73 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74  st the last inst
8820: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ruction of the p
8830: 72 6f 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65  rogram.** is the
8840: 20 73 61 6d 65 20 61 73 20 65 78 65 63 75 74 69   same as executi
8850: 6e 67 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65  ng Halt..*/.case
8860: 20 4f 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 56 64   OP_Halt: {.  Vd
8870: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
8880: 0a 20 20 69 6e 74 20 70 63 78 3b 0a 0a 20 20 70  .  int pcx;..  p
8890: 63 78 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d  cx = (int)(pOp -
88a0: 20 61 4f 70 29 3b 0a 23 69 66 64 65 66 20 53 51   aOp);.#ifdef SQ
88b0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
88c0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
88d0: 72 74 20 29 7b 20 73 71 6c 69 74 65 33 56 64 62  rt ){ sqlite3Vdb
88e0: 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c 65  eAssertAbortable
88f0: 28 70 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  (p); }.#endif.  
8900: 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c  if( pOp->p1==SQL
8910: 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 46 72  ITE_OK && p->pFr
8920: 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 48 61  ame ){.    /* Ha
8930: 6c 74 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  lt the sub-progr
8940: 61 6d 2e 20 52 65 74 75 72 6e 20 63 6f 6e 74 72  am. Return contr
8950: 6f 6c 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ol to the parent
8960: 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70   frame. */.    p
8970: 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d  Frame = p->pFram
8980: 65 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  e;.    p->pFrame
8990: 20 3d 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65   = pFrame->pPare
89a0: 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d  nt;.    p->nFram
89b0: 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e--;.    sqlite3
89c0: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
89d0: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
89e0: 20 20 20 20 70 63 78 20 3d 20 73 71 6c 69 74 65      pcx = sqlite
89f0: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
8a00: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 69  e(pFrame);.    i
8a10: 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49  f( pOp->p2==OE_I
8a20: 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 2f  gnore ){.      /
8a30: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 70 63  * Instruction pc
8a40: 78 20 69 73 20 74 68 65 20 4f 50 5f 50 72 6f 67  x is the OP_Prog
8a50: 72 61 6d 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ram that invoked
8a60: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
8a70: 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65   .      ** curre
8a80: 6e 74 6c 79 20 62 65 69 6e 67 20 68 61 6c 74 65  ntly being halte
8a90: 64 2e 20 49 66 20 74 68 65 20 70 32 20 69 6e 73  d. If the p2 ins
8aa0: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 69 73  truction of this
8ab0: 20 4f 50 5f 48 61 6c 74 0a 20 20 20 20 20 20 2a   OP_Halt.      *
8ac0: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  * instruction is
8ad0: 20 73 65 74 20 74 6f 20 4f 45 5f 49 67 6e 6f 72   set to OE_Ignor
8ae0: 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d  e, then the sub-
8af0: 70 72 6f 67 72 61 6d 20 69 73 20 74 68 72 6f 77  program is throw
8b00: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ing.      ** an 
8b10: 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69 6f 6e  IGNORE exception
8b20: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
8b30: 75 6d 70 20 74 6f 20 74 68 65 20 61 64 64 72 65  ump to the addre
8b40: 73 73 20 73 70 65 63 69 66 69 65 64 0a 20 20 20  ss specified.   
8b50: 20 20 20 2a 2a 20 61 73 20 74 68 65 20 70 32 20     ** as the p2 
8b60: 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 4f  of the calling O
8b70: 50 5f 50 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20  P_Program.  */. 
8b80: 20 20 20 20 20 70 63 78 20 3d 20 70 2d 3e 61 4f       pcx = p->aO
8b90: 70 5b 70 63 78 5d 2e 70 32 2d 31 3b 0a 20 20 20  p[pcx].p2-1;.   
8ba0: 20 7d 0a 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e   }.    aOp = p->
8bb0: 61 4f 70 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20  aOp;.    aMem = 
8bc0: 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 4f 70  p->aMem;.    pOp
8bd0: 20 3d 20 26 61 4f 70 5b 70 63 78 5d 3b 0a 20 20   = &aOp[pcx];.  
8be0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70    break;.  }.  p
8bf0: 2d 3e 72 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  ->rc = pOp->p1;.
8c00: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
8c10: 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a   = (u8)pOp->p2;.
8c20: 20 20 70 2d 3e 70 63 20 3d 20 70 63 78 3b 0a 20    p->pc = pcx;. 
8c30: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
8c40: 3c 3d 34 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  <=4 );.  if( p->
8c50: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  rc ){.    if( pO
8c60: 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 73  p->p5 ){.      s
8c70: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8c80: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
8c90: 5d 20 3d 20 7b 20 22 4e 4f 54 20 4e 55 4c 4c 22  ] = { "NOT NULL"
8ca0: 2c 20 22 55 4e 49 51 55 45 22 2c 20 22 43 48 45  , "UNIQUE", "CHE
8cb0: 43 4b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  CK",.           
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 20 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 22 20    "FOREIGN KEY" 
8cf0: 7d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  };.      testcas
8d00: 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b  e( pOp->p5==1 );
8d10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8d20: 20 70 4f 70 2d 3e 70 35 3d 3d 32 20 29 3b 0a 20   pOp->p5==2 );. 
8d30: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8d40: 4f 70 2d 3e 70 35 3d 3d 33 20 29 3b 0a 20 20 20  Op->p5==3 );.   
8d50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70     testcase( pOp
8d60: 2d 3e 70 35 3d 3d 34 20 29 3b 0a 20 20 20 20 20  ->p5==4 );.     
8d70: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
8d80: 72 28 70 2c 20 22 25 73 20 63 6f 6e 73 74 72 61  r(p, "%s constra
8d90: 69 6e 74 20 66 61 69 6c 65 64 22 2c 20 61 7a 54  int failed", azT
8da0: 79 70 65 5b 70 4f 70 2d 3e 70 35 2d 31 5d 29 3b  ype[pOp->p5-1]);
8db0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
8dc0: 70 34 2e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  p4.z ){.        
8dd0: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
8de0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
8df0: 22 25 7a 3a 20 25 73 22 2c 20 70 2d 3e 7a 45 72  "%z: %s", p->zEr
8e00: 72 4d 73 67 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  rMsg, pOp->p4.z)
8e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8e20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8e30: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
8e40: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
8e50: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8e60: 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20  e3_log(pOp->p1, 
8e70: 22 61 62 6f 72 74 20 61 74 20 25 64 20 69 6e 20  "abort at %d in 
8e80: 5b 25 73 5d 3a 20 25 73 22 2c 20 70 63 78 2c 20  [%s]: %s", pcx, 
8e90: 70 2d 3e 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72 72  p->zSql, p->zErr
8ea0: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  Msg);.  }.  rc =
8eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
8ec0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  (p);.  assert( r
8ed0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
8ee0: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
8ef0: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  || rc==SQLITE_ER
8f00: 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ROR );.  if( rc=
8f10: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
8f20: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
8f30: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
8f40: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
8f50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
8f60: 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  p->rc&0xff)==SQL
8f70: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
8f80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
8f90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64  ==SQLITE_OK || d
8fa0: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
8fb0: 3e 30 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72  >0 || db->nDefer
8fc0: 72 65 64 49 6d 6d 43 6f 6e 73 3e 30 20 29 3b 0a  redImmCons>0 );.
8fd0: 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 20 3f      rc = p->rc ?
8fe0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20   SQLITE_ERROR : 
8ff0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
9000: 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74  .  goto vdbe_ret
9010: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  urn;.}../* Opcod
9020: 65 3a 20 49 6e 74 65 67 65 72 20 50 31 20 50 32  e: Integer P1 P2
9030: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
9040: 69 73 3a 20 72 5b 50 32 5d 3d 50 31 0a 2a 2a 0a  is: r[P2]=P1.**.
9050: 2a 2a 20 54 68 65 20 33 32 2d 62 69 74 20 69 6e  ** The 32-bit in
9060: 74 65 67 65 72 20 76 61 6c 75 65 20 50 31 20 69  teger value P1 i
9070: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 72  s written into r
9080: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
9090: 61 73 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20  ase OP_Integer: 
90a0: 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74  {         /* out
90b0: 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75  2 */.  pOut = ou
90c0: 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
90d0: 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  pOp);.  pOut->u.
90e0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62  i = pOp->p1;.  b
90f0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
9100: 64 65 3a 20 49 6e 74 36 34 20 2a 20 50 32 20 2a  de: Int64 * P2 *
9110: 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
9120: 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a  s: r[P2]=P4.**.*
9130: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
9140: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e  r to a 64-bit in
9150: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20  teger value..** 
9160: 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65  Write that value
9170: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
9180: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  2..*/.case OP_In
9190: 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20 20  t64: {          
91a0: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f   /* out2 */.  pO
91b0: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
91c0: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61  ase(p, pOp);.  a
91d0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70  ssert( pOp->p4.p
91e0: 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  I64!=0 );.  pOut
91f0: 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 34  ->u.i = *pOp->p4
9200: 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a  .pI64;.  break;.
9210: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9220: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
9230: 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a  POINT./* Opcode:
9240: 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34 20   Real * P2 * P4 
9250: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
9260: 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50 34  [P2]=P4.**.** P4
9270: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
9280: 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69   a 64-bit floati
9290: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a  ng point value..
92a0: 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 61  ** Write that va
92b0: 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  lue into registe
92c0: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
92d0: 5f 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20  _Real: {        
92e0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
92f0: 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74 32 20 2a 2f  K_FLOAT, out2 */
9300: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
9310: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
9320: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
9330: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73  = MEM_Real;.  as
9340: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
9350: 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  NaN(*pOp->p4.pRe
9360: 61 6c 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75  al) );.  pOut->u
9370: 2e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  .r = *pOp->p4.pR
9380: 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  eal;.  break;.}.
9390: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64  #endif../* Opcod
93a0: 65 3a 20 53 74 72 69 6e 67 38 20 2a 20 50 32 20  e: String8 * P2 
93b0: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
93c0: 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 0a 2a  is: r[P2]='P4'.*
93d0: 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 74  *.** P4 points t
93e0: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
93f0: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e  ed UTF-8 string.
9400: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
9410: 74 72 61 6e 73 66 6f 72 6d 65 64 20 0a 2a 2a 20  transformed .** 
9420: 69 6e 74 6f 20 61 20 53 74 72 69 6e 67 20 6f 70  into a String op
9430: 63 6f 64 65 20 62 65 66 6f 72 65 20 69 74 20 69  code before it i
9440: 73 20 65 78 65 63 75 74 65 64 20 66 6f 72 20 74  s executed for t
9450: 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e 20 20  he first time.  
9460: 44 75 72 69 6e 67 0a 2a 2a 20 74 68 69 73 20 74  During.** this t
9470: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 74  ransformation, t
9480: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 73 74 72  he length of str
9490: 69 6e 67 20 50 34 20 69 73 20 63 6f 6d 70 75 74  ing P4 is comput
94a0: 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
94b0: 20 61 73 20 74 68 65 20 50 31 20 70 61 72 61 6d   as the P1 param
94c0: 65 74 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  eter..*/.case OP
94d0: 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20 20  _String8: {     
94e0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
94f0: 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 20 2a  K_STRING, out2 *
9500: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
9510: 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f  >p4.z!=0 );.  pO
9520: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
9530: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
9540: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
9550: 53 74 72 69 6e 67 3b 0a 20 20 70 4f 70 2d 3e 70  String;.  pOp->p
9560: 31 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  1 = sqlite3Strle
9570: 6e 33 30 28 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  n30(pOp->p4.z);.
9580: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9590: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
95a0: 20 65 6e 63 6f 64 69 6e 67 21 3d 53 51 4c 49 54   encoding!=SQLIT
95b0: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 72 63  E_UTF8 ){.    rc
95c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
95d0: 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 70 4f  mSetStr(pOut, pO
95e0: 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c  p->p4.z, -1, SQL
95f0: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
9600: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73  _STATIC);.    as
9610: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
9620: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
9630: 45 5f 54 4f 4f 42 49 47 20 29 3b 0a 20 20 20 20  E_TOOBIG );.    
9640: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 74 6f  if( rc ) goto to
9650: 6f 5f 62 69 67 3b 0a 20 20 20 20 69 66 28 20 53  o_big;.    if( S
9660: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
9670: 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
9680: 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69  ing(pOut, encodi
9690: 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ng) ) goto no_me
96a0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
96b0: 4f 75 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30 20  Out->szMalloc>0 
96c0: 26 26 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63  && pOut->zMalloc
96d0: 3d 3d 70 4f 75 74 2d 3e 7a 20 29 3b 0a 20 20 20  ==pOut->z );.   
96e0: 20 61 73 73 65 72 74 28 20 56 64 62 65 4d 65 6d   assert( VdbeMem
96f0: 44 79 6e 61 6d 69 63 28 70 4f 75 74 29 3d 3d 30  Dynamic(pOut)==0
9700: 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 73 7a   );.    pOut->sz
9710: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
9720: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pOut->flags |= M
9730: 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 69  EM_Static;.    i
9740: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
9750: 50 34 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  P4_DYNAMIC ){.  
9760: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9770: 65 28 64 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  e(db, pOp->p4.z)
9780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d  ;.    }.    pOp-
9790: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
97a0: 41 4d 49 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  AMIC;.    pOp->p
97b0: 34 2e 7a 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20  4.z = pOut->z;. 
97c0: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75     pOp->p1 = pOu
97d0: 74 2d 3e 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  t->n;.  }.#endif
97e0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64  .  if( pOp->p1>d
97f0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
9800: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
9810: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
9820: 69 67 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ig;.  }.  assert
9830: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9840: 29 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  );.  /* Fall thr
9850: 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
9860: 20 63 61 73 65 2c 20 4f 50 5f 53 74 72 69 6e 67   case, OP_String
9870: 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f   */.}.  ./* Opco
9880: 64 65 3a 20 53 74 72 69 6e 67 20 50 31 20 50 32  de: String P1 P2
9890: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
98a0: 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34  opsis: r[P2]='P4
98b0: 27 20 28 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a  ' (len=P1).**.**
98c0: 20 54 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75   The string valu
98d0: 65 20 50 34 20 6f 66 20 6c 65 6e 67 74 68 20 50  e P4 of length P
98e0: 31 20 28 62 79 74 65 73 29 20 69 73 20 73 74 6f  1 (bytes) is sto
98f0: 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
9900: 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 20  P2..**.** If P3 
9910: 69 73 20 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20  is not zero and 
9920: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
9930: 65 67 69 73 74 65 72 20 50 33 20 69 73 20 65 71  egister P3 is eq
9940: 75 61 6c 20 74 6f 20 50 35 2c 20 74 68 65 6e 0a  ual to P5, then.
9950: 2a 2a 20 74 68 65 20 64 61 74 61 74 79 70 65 20  ** the datatype 
9960: 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
9970: 50 32 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  P2 is converted 
9980: 74 6f 20 42 4c 4f 42 2e 20 20 54 68 65 20 63 6f  to BLOB.  The co
9990: 6e 74 65 6e 74 20 69 73 0a 2a 2a 20 74 68 65 20  ntent is.** the 
99a0: 73 61 6d 65 20 73 65 71 75 65 6e 63 65 20 6f 66  same sequence of
99b0: 20 62 79 74 65 73 2c 20 69 74 20 69 73 20 6d 65   bytes, it is me
99c0: 72 65 6c 79 20 69 6e 74 65 72 70 72 65 74 65 64  rely interpreted
99d0: 20 61 73 20 61 20 42 4c 4f 42 20 69 6e 73 74 65   as a BLOB inste
99e0: 61 64 0a 2a 2a 20 6f 66 20 61 20 73 74 72 69 6e  ad.** of a strin
99f0: 67 2c 20 61 73 20 69 66 20 69 74 20 68 61 64 20  g, as if it had 
9a00: 62 65 65 6e 20 43 41 53 54 2e 20 20 49 6e 20 6f  been CAST.  In o
9a10: 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a  ther words:.**.*
9a20: 2a 20 69 66 28 20 50 33 21 3d 30 20 61 6e 64 20  * if( P3!=0 and 
9a30: 72 65 67 5b 50 33 5d 3d 3d 50 35 20 29 20 72 65  reg[P3]==P5 ) re
9a40: 67 5b 50 32 5d 20 3a 3d 20 43 41 53 54 28 72 65  g[P2] := CAST(re
9a50: 67 5b 50 32 5d 20 61 73 20 42 4c 4f 42 29 0a 2a  g[P2] as BLOB).*
9a60: 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67  /.case OP_String
9a70: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  : {          /* 
9a80: 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74  out2 */.  assert
9a90: 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  ( pOp->p4.z!=0 )
9aa0: 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ;.  pOut = out2P
9ab0: 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
9ac0: 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  );.  pOut->flags
9ad0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53   = MEM_Str|MEM_S
9ae0: 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  tatic|MEM_Term;.
9af0: 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d    pOut->z = pOp-
9b00: 3e 70 34 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e  >p4.z;.  pOut->n
9b10: 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f   = pOp->p1;.  pO
9b20: 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69  ut->enc = encodi
9b30: 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  ng;.  UPDATE_MAX
9b40: 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
9b50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9b60: 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43  LIKE_DOESNT_MATC
9b70: 48 5f 42 4c 4f 42 53 0a 20 20 69 66 28 20 70 4f  H_BLOBS.  if( pO
9b80: 70 2d 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20 61  p->p3>0 ){.    a
9b90: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d  ssert( pOp->p3<=
9ba0: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
9bb0: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
9bc0: 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
9bd0: 2d 3e 70 33 5d 3b 0a 20 20 20 20 61 73 73 65 72  ->p3];.    asser
9be0: 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  t( pIn3->flags &
9bf0: 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
9c00: 69 66 28 20 70 49 6e 33 2d 3e 75 2e 69 3d 3d 70  if( pIn3->u.i==p
9c10: 4f 70 2d 3e 70 35 20 29 20 70 4f 75 74 2d 3e 66  Op->p5 ) pOut->f
9c20: 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c  lags = MEM_Blob|
9c30: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54  MEM_Static|MEM_T
9c40: 65 72 6d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  erm;.  }.#endif.
9c50: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
9c60: 70 63 6f 64 65 3a 20 4e 75 6c 6c 20 50 31 20 50  pcode: Null P1 P
9c70: 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
9c80: 70 73 69 73 3a 20 72 5b 50 32 2e 2e 50 33 5d 3d  psis: r[P2..P3]=
9c90: 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  NULL.**.** Write
9ca0: 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67   a NULL into reg
9cb0: 69 73 74 65 72 73 20 50 32 2e 20 20 49 66 20 50  isters P2.  If P
9cc0: 33 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  3 greater than P
9cd0: 32 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69  2, then also wri
9ce0: 74 65 0a 2a 2a 20 4e 55 4c 4c 20 69 6e 74 6f 20  te.** NULL into 
9cf0: 72 65 67 69 73 74 65 72 20 50 33 20 61 6e 64 20  register P3 and 
9d00: 65 76 65 72 79 20 72 65 67 69 73 74 65 72 20 69  every register i
9d10: 6e 20 62 65 74 77 65 65 6e 20 50 32 20 61 6e 64  n between P2 and
9d20: 20 50 33 2e 20 20 49 66 20 50 33 0a 2a 2a 20 69   P3.  If P3.** i
9d30: 73 20 6c 65 73 73 20 74 68 61 6e 20 50 32 20 28  s less than P2 (
9d40: 74 79 70 69 63 61 6c 6c 79 20 50 33 20 69 73 20  typically P3 is 
9d50: 7a 65 72 6f 29 20 74 68 65 6e 20 6f 6e 6c 79 20  zero) then only 
9d60: 72 65 67 69 73 74 65 72 20 50 32 20 69 73 0a 2a  register P2 is.*
9d70: 2a 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  * set to NULL..*
9d80: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 76  *.** If the P1 v
9d90: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  alue is non-zero
9da0: 2c 20 74 68 65 6e 20 61 6c 73 6f 20 73 65 74 20  , then also set 
9db0: 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20  the MEM_Cleared 
9dc0: 66 6c 61 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20  flag so that.** 
9dd0: 4e 55 4c 4c 20 76 61 6c 75 65 73 20 77 69 6c 6c  NULL values will
9de0: 20 6e 6f 74 20 63 6f 6d 70 61 72 65 20 65 71 75   not compare equ
9df0: 61 6c 20 65 76 65 6e 20 69 66 20 53 51 4c 49 54  al even if SQLIT
9e00: 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20  E_NULLEQ is set 
9e10: 6f 6e 0a 2a 2a 20 4f 50 5f 4e 65 20 6f 72 20 4f  on.** OP_Ne or O
9e20: 50 5f 45 71 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  P_Eq..*/.case OP
9e30: 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20  _Null: {        
9e40: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
9e50: 69 6e 74 20 63 6e 74 3b 0a 20 20 75 31 36 20 6e  int cnt;.  u16 n
9e60: 75 6c 6c 46 6c 61 67 3b 0a 20 20 70 4f 75 74 20  ullFlag;.  pOut 
9e70: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
9e80: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 63 6e 74 20  (p, pOp);.  cnt 
9e90: 3d 20 70 4f 70 2d 3e 70 33 2d 70 4f 70 2d 3e 70  = pOp->p3-pOp->p
9ea0: 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  2;.  assert( pOp
9eb0: 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
9ec0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
9ed0: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
9ee0: 3d 20 6e 75 6c 6c 46 6c 61 67 20 3d 20 70 4f 70  = nullFlag = pOp
9ef0: 2d 3e 70 31 20 3f 20 28 4d 45 4d 5f 4e 75 6c 6c  ->p1 ? (MEM_Null
9f00: 7c 4d 45 4d 5f 43 6c 65 61 72 65 64 29 20 3a 20  |MEM_Cleared) : 
9f10: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 70 4f 75 74  MEM_Null;.  pOut
9f20: 2d 3e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ->n = 0;.#ifdef 
9f30: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
9f40: 4f 75 74 2d 3e 75 54 65 6d 70 20 3d 20 30 3b 0a  Out->uTemp = 0;.
9f50: 23 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20  #endif.  while( 
9f60: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75  cnt>0 ){.    pOu
9f70: 74 2b 2b 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75  t++;.    memAbou
9f80: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
9f90: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
9fa0: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
9fb0: 75 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  ut);.    pOut->f
9fc0: 6c 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b  lags = nullFlag;
9fd0: 0a 20 20 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30  .    pOut->n = 0
9fe0: 3b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d  ;.    cnt--;.  }
9ff0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
a000: 4f 70 63 6f 64 65 3a 20 53 6f 66 74 4e 75 6c 6c  Opcode: SoftNull
a010: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 20 53   P1 * * * *.** S
a020: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 4e  ynopsis: r[P1]=N
a030: 55 4c 4c 0a 2a 2a 0a 2a 2a 20 53 65 74 20 72 65  ULL.**.** Set re
a040: 67 69 73 74 65 72 20 50 31 20 74 6f 20 68 61 76  gister P1 to hav
a050: 65 20 74 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c  e the value NULL
a060: 20 61 73 20 73 65 65 6e 20 62 79 20 74 68 65 20   as seen by the 
a070: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 0a 2a 2a  OP_MakeRecord.**
a080: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 62 75   instruction, bu
a090: 74 20 64 6f 20 6e 6f 74 20 66 72 65 65 20 61 6e  t do not free an
a0a0: 79 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  y string or blob
a0b0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
a0c0: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72  ed with.** the r
a0d0: 65 67 69 73 74 65 72 2c 20 73 6f 20 74 68 61 74  egister, so that
a0e0: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 77 61   if the value wa
a0f0: 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c  s a string or bl
a100: 6f 62 20 74 68 61 74 20 77 61 73 0a 2a 2a 20 70  ob that was.** p
a110: 72 65 76 69 6f 75 73 6c 79 20 63 6f 70 69 65 64  reviously copied
a120: 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2c   using OP_SCopy,
a130: 20 74 68 65 20 63 6f 70 69 65 73 20 77 69 6c 6c   the copies will
a140: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 62 65 20   continue to be 
a150: 76 61 6c 69 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  valid..*/.case O
a160: 50 5f 53 6f 66 74 4e 75 6c 6c 3a 20 7b 0a 20 20  P_SoftNull: {.  
a170: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
a180: 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70  0 && pOp->p1<=(p
a190: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
a1a0: 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74  ursor) );.  pOut
a1b0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
a1c0: 5d 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  ];.  pOut->flags
a1d0: 20 3d 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73 26   = (pOut->flags&
a1e0: 7e 28 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 7c  ~(MEM_Undefined|
a1f0: 4d 45 4d 5f 41 66 66 4d 61 73 6b 29 29 7c 4d 45  MEM_AffMask))|ME
a200: 4d 5f 4e 75 6c 6c 3b 0a 20 20 62 72 65 61 6b 3b  M_Null;.  break;
a210: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42  .}../* Opcode: B
a220: 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34 20 2a  lob P1 P2 * P4 *
a230: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
a240: 50 32 5d 3d 50 34 20 28 6c 65 6e 3d 50 31 29 0a  P2]=P4 (len=P1).
a250: 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20  **.** P4 points 
a260: 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  to a blob of dat
a270: 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e  a P1 bytes long.
a280: 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a 20    Store this.** 
a290: 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65 72  blob in register
a2a0: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
a2b0: 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20 20  Blob: {         
a2c0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
a2d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
a2e0: 3e 70 31 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  >p1 <= SQLITE_MA
a2f0: 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 70 4f  X_LENGTH );.  pO
a300: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
a310: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 73  ase(p, pOp);.  s
a320: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
a330: 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70  Str(pOut, pOp->p
a340: 34 2e 7a 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c  4.z, pOp->p1, 0,
a350: 20 30 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63   0);.  pOut->enc
a360: 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55   = encoding;.  U
a370: 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
a380: 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
a390: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
a3a0: 20 56 61 72 69 61 62 6c 65 20 50 31 20 50 32 20   Variable P1 P2 
a3b0: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
a3c0: 69 73 3a 20 72 5b 50 32 5d 3d 70 61 72 61 6d 65  is: r[P2]=parame
a3d0: 74 65 72 28 50 31 2c 50 34 29 0a 2a 2a 0a 2a 2a  ter(P1,P4).**.**
a3e0: 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 76 61   Transfer the va
a3f0: 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 70 61  lues of bound pa
a400: 72 61 6d 65 74 65 72 20 50 31 20 69 6e 74 6f 20  rameter P1 into 
a410: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a  register P2.**.*
a420: 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  * If the paramet
a430: 65 72 20 69 73 20 6e 61 6d 65 64 2c 20 74 68 65  er is named, the
a440: 6e 20 69 74 73 20 6e 61 6d 65 20 61 70 70 65 61  n its name appea
a450: 72 73 20 69 6e 20 50 34 2e 0a 2a 2a 20 54 68 65  rs in P4..** The
a460: 20 50 34 20 76 61 6c 75 65 20 69 73 20 75 73 65   P4 value is use
a470: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62 69 6e  d by sqlite3_bin
a480: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
a490: 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  ()..*/.case OP_V
a4a0: 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20 20 20  ariable: {      
a4b0: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
a4c0: 0a 20 20 4d 65 6d 20 2a 70 56 61 72 3b 20 20 20  .  Mem *pVar;   
a4d0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 62 65 69      /* Value bei
a4e0: 6e 67 20 74 72 61 6e 73 66 65 72 72 65 64 20 2a  ng transferred *
a4f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  /..  assert( pOp
a500: 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p1>0 && pOp->p
a510: 31 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20  1<=p->nVar );.  
a520: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
a530: 7a 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e  z==0 || pOp->p4.
a540: 7a 3d 3d 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  z==sqlite3VListN
a550: 75 6d 54 6f 4e 61 6d 65 28 70 2d 3e 70 56 4c 69  umToName(p->pVLi
a560: 73 74 2c 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20  st,pOp->p1) );. 
a570: 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56 61 72   pVar = &p->aVar
a580: 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20  [pOp->p1 - 1];. 
a590: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
a5a0: 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72 29 20  MemTooBig(pVar) 
a5b0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
a5c0: 62 69 67 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20  big;.  }.  pOut 
a5d0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
a5e0: 3b 0a 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44  ;.  if( VdbeMemD
a5f0: 79 6e 61 6d 69 63 28 70 4f 75 74 29 20 29 20 73  ynamic(pOut) ) s
a600: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
a610: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 6d 65  Null(pOut);.  me
a620: 6d 63 70 79 28 70 4f 75 74 2c 20 70 56 61 72 2c  mcpy(pOut, pVar,
a630: 20 4d 45 4d 43 45 4c 4c 53 49 5a 45 29 3b 0a 20   MEMCELLSIZE);. 
a640: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 26 3d 20   pOut->flags &= 
a650: 7e 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70  ~(MEM_Dyn|MEM_Ep
a660: 68 65 6d 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  hem);.  pOut->fl
a670: 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 61 74 69  ags |= MEM_Stati
a680: 63 7c 4d 45 4d 5f 46 72 6f 6d 42 69 6e 64 3b 0a  c|MEM_FromBind;.
a690: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
a6a0: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
a6b0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
a6c0: 64 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20 50  de: Move P1 P2 P
a6d0: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
a6e0: 73 3a 20 72 5b 50 32 40 50 33 5d 3d 72 5b 50 31  s: r[P2@P3]=r[P1
a6f0: 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20  @P3].**.** Move 
a700: 74 68 65 20 50 33 20 76 61 6c 75 65 73 20 69 6e  the P3 values in
a710: 20 72 65 67 69 73 74 65 72 20 50 31 2e 2e 50 31   register P1..P1
a720: 2b 50 33 2d 31 20 6f 76 65 72 20 69 6e 74 6f 0a  +P3-1 over into.
a730: 2a 2a 20 72 65 67 69 73 74 65 72 73 20 50 32 2e  ** registers P2.
a740: 2e 50 32 2b 50 33 2d 31 2e 20 20 52 65 67 69 73  .P2+P3-1.  Regis
a750: 74 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 2d 31  ters P1..P1+P3-1
a760: 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c   are.** left hol
a770: 64 69 6e 67 20 61 20 4e 55 4c 4c 2e 20 20 49 74  ding a NULL.  It
a780: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72   is an error for
a790: 20 72 65 67 69 73 74 65 72 20 72 61 6e 67 65 73   register ranges
a7a0: 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20  .** P1..P1+P3-1 
a7b0: 61 6e 64 20 50 32 2e 2e 50 32 2b 50 33 2d 31 20  and P2..P2+P3-1 
a7c0: 74 6f 20 6f 76 65 72 6c 61 70 2e 20 20 49 74 20  to overlap.  It 
a7d0: 69 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 66  is an error.** f
a7e0: 6f 72 20 50 33 20 74 6f 20 62 65 20 6c 65 73 73  or P3 to be less
a7f0: 20 74 68 61 6e 20 31 2e 0a 2a 2f 0a 63 61 73 65   than 1..*/.case
a800: 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20 69 6e   OP_Move: {.  in
a810: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  t n;           /
a820: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  * Number of regi
a830: 73 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63 6f  sters left to co
a840: 70 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20  py */.  int p1; 
a850: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
a860: 73 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72 6f  ster to copy fro
a870: 6d 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20  m */.  int p2;  
a880: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
a890: 74 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20 2a  ter to copy to *
a8a0: 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33  /..  n = pOp->p3
a8b0: 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31  ;.  p1 = pOp->p1
a8c0: 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32  ;.  p2 = pOp->p2
a8d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
a8e0: 26 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30 20  && p1>0 && p2>0 
a8f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 2b  );.  assert( p1+
a900: 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70  n<=p2 || p2+n<=p
a910: 31 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26  1 );..  pIn1 = &
a920: 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74  aMem[p1];.  pOut
a930: 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20   = &aMem[p2];.  
a940: 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
a950: 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e  pOut<=&aMem[(p->
a960: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
a970: 73 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61 73 73  sor)] );.    ass
a980: 65 72 74 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d  ert( pIn1<=&aMem
a990: 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  [(p->nMem+1 - p-
a9a0: 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20  >nCursor)] );.  
a9b0: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
a9c0: 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20  alid(pIn1) );.  
a9d0: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
a9e0: 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20  ge(p, pOut);.   
a9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d   sqlite3VdbeMemM
aa00: 6f 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29 3b  ove(pOut, pIn1);
aa10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aa20: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 4f 75  EBUG.    if( pOu
aa30: 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3e 3d 26  t->pScopyFrom>=&
aa40: 61 4d 65 6d 5b 70 31 5d 20 26 26 20 70 4f 75 74  aMem[p1] && pOut
aa50: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3c 70 4f 75  ->pScopyFrom<pOu
aa60: 74 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d  t ){.      pOut-
aa70: 3e 70 53 63 6f 70 79 46 72 6f 6d 20 2b 3d 20 70  >pScopyFrom += p
aa80: 4f 70 2d 3e 70 32 20 2d 20 70 31 3b 0a 20 20 20  Op->p2 - p1;.   
aa90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 65   }.#endif.    De
aaa0: 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75  ephemeralize(pOu
aab0: 74 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52  t);.    REGISTER
aac0: 5f 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f 75  _TRACE(p2++, pOu
aad0: 74 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a  t);.    pIn1++;.
aae0: 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d 77      pOut++;.  }w
aaf0: 68 69 6c 65 28 20 2d 2d 6e 20 29 3b 0a 20 20 62  hile( --n );.  b
ab00: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
ab10: 64 65 3a 20 43 6f 70 79 20 50 31 20 50 32 20 50  de: Copy P1 P2 P
ab20: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
ab30: 73 3a 20 72 5b 50 32 40 50 33 2b 31 5d 3d 72 5b  s: r[P2@P3+1]=r[
ab40: 50 31 40 50 33 2b 31 5d 0a 2a 2a 0a 2a 2a 20 4d  P1@P3+1].**.** M
ab50: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72 65  ake a copy of re
ab60: 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50  gisters P1..P1+P
ab70: 33 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73  3 into registers
ab80: 20 50 32 2e 2e 50 32 2b 50 33 2e 0a 2a 2a 0a 2a   P2..P2+P3..**.*
ab90: 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  * This instructi
aba0: 6f 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70 20  on makes a deep 
abb0: 63 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75  copy of the valu
abc0: 65 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65 0a  e.  A duplicate.
abd0: 2a 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61 6e  ** is made of an
abe0: 79 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  y string or blob
abf0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20   constant.  See 
ac00: 61 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a  also OP_SCopy..*
ac10: 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20  /.case OP_Copy: 
ac20: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20  {.  int n;..  n 
ac30: 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 49 6e  = pOp->p3;.  pIn
ac40: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
ac50: 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  1];.  pOut = &aM
ac60: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  em[pOp->p2];.  a
ac70: 73 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49 6e  ssert( pOut!=pIn
ac80: 31 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  1 );.  while( 1 
ac90: 29 7b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54  ){.    memAboutT
aca0: 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
acb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
acc0: 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
acd0: 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f  pOut, pIn1, MEM_
ace0: 45 70 68 65 6d 29 3b 0a 20 20 20 20 44 65 65 70  Ephem);.    Deep
acf0: 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29  hemeralize(pOut)
ad00: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ad10: 44 45 42 55 47 0a 20 20 20 20 70 4f 75 74 2d 3e  DEBUG.    pOut->
ad20: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
ad30: 23 65 6e 64 69 66 0a 20 20 20 20 52 45 47 49 53  #endif.    REGIS
ad40: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
ad50: 32 2b 70 4f 70 2d 3e 70 33 2d 6e 2c 20 70 4f 75  2+pOp->p3-n, pOu
ad60: 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e 2d 2d  t);.    if( (n--
ad70: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
ad80: 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20 70 49    pOut++;.    pI
ad90: 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61  n1++;.  }.  brea
ada0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
adb0: 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a   SCopy P1 P2 * *
adc0: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
add0: 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  r[P2]=r[P1].**.*
ade0: 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77  * Make a shallow
adf0: 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65   copy of registe
ae00: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
ae10: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
ae20: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61  s instruction ma
ae30: 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  kes a shallow co
ae40: 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e  py of the value.
ae50: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
ae60: 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f 72  * is a string or
ae70: 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74 68 65 20   blob, then the 
ae80: 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20 61 20 70  copy is only a p
ae90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
aea0: 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64 20 68 65   original and he
aeb0: 6e 63 65 20 69 66 20 74 68 65 20 6f 72 69 67 69  nce if the origi
aec0: 6e 61 6c 20 63 68 61 6e 67 65 73 20 73 6f 20 77  nal changes so w
aed0: 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e 0a 2a 2a  ill the copy..**
aee0: 20 57 6f 72 73 65 2c 20 69 66 20 74 68 65 20 6f   Worse, if the o
aef0: 72 69 67 69 6e 61 6c 20 69 73 20 64 65 61 6c 6c  riginal is deall
af00: 6f 63 61 74 65 64 2c 20 74 68 65 20 63 6f 70 79  ocated, the copy
af10: 20 62 65 63 6f 6d 65 73 20 69 6e 76 61 6c 69 64   becomes invalid
af20: 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65 20 70 72  ..** Thus the pr
af30: 6f 67 72 61 6d 20 6d 75 73 74 20 67 75 61 72 61  ogram must guara
af40: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 6f 72  ntee that the or
af50: 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  iginal will not 
af60: 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72 69 6e 67  change.** during
af70: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
af80: 20 74 68 65 20 63 6f 70 79 2e 20 20 55 73 65 20   the copy.  Use 
af90: 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61 6b 65 20  OP_Copy to make 
afa0: 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f  a complete.** co
afb0: 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  py..*/.case OP_S
afc0: 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20  Copy: {         
afd0: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
afe0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
aff0: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
b000: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
b010: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d    assert( pOut!=
b020: 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  pIn1 );.  sqlite
b030: 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
b040: 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20  opy(pOut, pIn1, 
b050: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 23 69 66 64  MEM_Ephem);.#ifd
b060: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b070: 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72    pOut->pScopyFr
b080: 6f 6d 20 3d 20 70 49 6e 31 3b 0a 20 20 70 4f 75  om = pIn1;.  pOu
b090: 74 2d 3e 6d 53 63 6f 70 79 46 6c 61 67 73 20 3d  t->mScopyFlags =
b0a0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a 23 65   pIn1->flags;.#e
b0b0: 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ndif.  break;.}.
b0c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 43  ./* Opcode: IntC
b0d0: 6f 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  opy P1 P2 * * *.
b0e0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
b0f0: 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  2]=r[P1].**.** T
b100: 72 61 6e 73 66 65 72 20 74 68 65 20 69 6e 74 65  ransfer the inte
b110: 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20 69  ger value held i
b120: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e  n register P1 in
b130: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
b140: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
b150: 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
b160: 6f 6e 20 6f 66 20 53 43 6f 70 79 20 74 68 61 74  on of SCopy that
b170: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
b180: 69 6e 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65  integer.** value
b190: 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  s..*/.case OP_In
b1a0: 74 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20  tCopy: {        
b1b0: 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
b1c0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
b1d0: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
b1e0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
b1f0: 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
b200: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
b210: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74  Op->p2];.  sqlit
b220: 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
b230: 34 28 70 4f 75 74 2c 20 70 49 6e 31 2d 3e 75 2e  4(pOut, pIn1->u.
b240: 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  i);.  break;.}..
b250: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c  /* Opcode: Resul
b260: 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 2a  tRow P1 P2 * * *
b270: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6f 75  .** Synopsis: ou
b280: 74 70 75 74 3d 72 5b 50 31 40 50 32 5d 0a 2a 2a  tput=r[P1@P2].**
b290: 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
b2a0: 73 20 50 31 20 74 68 72 6f 75 67 68 20 50 31 2b  s P1 through P1+
b2b0: 50 32 2d 31 20 63 6f 6e 74 61 69 6e 20 61 20 73  P2-1 contain a s
b2c0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 0a 2a 2a 20  ingle row of.** 
b2d0: 72 65 73 75 6c 74 73 2e 20 54 68 69 73 20 6f 70  results. This op
b2e0: 63 6f 64 65 20 63 61 75 73 65 73 20 74 68 65 20  code causes the 
b2f0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
b300: 61 6c 6c 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  all to terminate
b310: 0a 2a 2a 20 77 69 74 68 20 61 6e 20 53 51 4c 49  .** with an SQLI
b320: 54 45 5f 52 4f 57 20 72 65 74 75 72 6e 20 63 6f  TE_ROW return co
b330: 64 65 20 61 6e 64 20 69 74 20 73 65 74 73 20 75  de and it sets u
b340: 70 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74  p the sqlite3_st
b350: 6d 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  mt.** structure 
b360: 74 6f 20 70 72 6f 76 69 64 65 20 61 63 63 65 73  to provide acces
b370: 73 20 74 6f 20 74 68 65 20 72 28 50 31 29 2e 2e  s to the r(P1)..
b380: 72 28 50 31 2b 50 32 2d 31 29 20 76 61 6c 75 65  r(P1+P2-1) value
b390: 73 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  s as.** the resu
b3a0: 6c 74 20 72 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20  lt row..*/.case 
b3b0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 3a 20 7b 0a  OP_ResultRow: {.
b3c0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69    Mem *pMem;.  i
b3d0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
b3e0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70  p->nResColumn==p
b3f0: 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 61 73 73 65  Op->p2 );.  asse
b400: 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b  rt( pOp->p1>0 );
b410: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
b420: 70 31 2b 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e  p1+pOp->p2<=(p->
b430: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
b440: 73 6f 72 29 2b 31 20 29 3b 0a 0a 20 20 2f 2a 20  sor)+1 );..  /* 
b450: 49 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  If this statemen
b460: 74 20 68 61 73 20 76 69 6f 6c 61 74 65 64 20 69  t has violated i
b470: 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
b480: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
b490: 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  , do.  ** not re
b4a0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
b4b0: 6f 66 20 72 6f 77 73 20 6d 6f 64 69 66 69 65 64  of rows modified
b4c0: 2e 20 41 6e 64 20 64 6f 20 6e 6f 74 20 52 45 4c  . And do not REL
b4d0: 45 41 53 45 20 74 68 65 20 73 74 61 74 65 6d 65  EASE the stateme
b4e0: 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  nt.  ** transact
b4f0: 69 6f 6e 2e 20 49 74 20 6e 65 65 64 73 20 74 6f  ion. It needs to
b500: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
b510: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
b520: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
b530: 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
b540: 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 61 73 73  , 0)) ){.    ass
b550: 65 72 74 28 20 64 62 2d 3e 66 6c 61 67 73 26 53  ert( db->flags&S
b560: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
b570: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b580: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
b590: 6c 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  l );.    goto ab
b5a0: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
b5b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
b5c0: 68 65 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  he SQLITE_CountR
b5d0: 6f 77 73 20 66 6c 61 67 20 69 73 20 73 65 74 20  ows flag is set 
b5e0: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73  in sqlite3.flags
b5f0: 20 6d 61 73 6b 2c 20 74 68 65 6e 20 0a 20 20 2a   mask, then .  *
b600: 2a 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73  * DML statements
b610: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63   invoke this opc
b620: 6f 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 68  ode to return th
b630: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b640: 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20   .  ** modified 
b650: 74 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68 69  to the user. Thi
b660: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  s is the only wa
b670: 79 20 74 68 61 74 20 61 20 56 4d 20 74 68 61 74  y that a VM that
b680: 0a 20 20 2a 2a 20 6f 70 65 6e 73 20 61 20 73 74  .  ** opens a st
b690: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
b6a0: 69 6f 6e 20 6d 61 79 20 69 6e 76 6f 6b 65 20 74  ion may invoke t
b6b0: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a  his opcode..  **
b6c0: 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65 20 74 68  .  ** In case th
b6d0: 69 73 20 69 73 20 73 75 63 68 20 61 20 73 74 61  is is such a sta
b6e0: 74 65 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e  tement, close an
b6f0: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  y statement tran
b700: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  saction.  ** ope
b710: 6e 65 64 20 62 79 20 74 68 69 73 20 56 4d 20 62  ned by this VM b
b720: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
b730: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75  control to the u
b740: 73 65 72 2e 20 54 68 69 73 20 69 73 20 74 6f 0a  ser. This is to.
b750: 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74    ** ensure that
b760: 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
b770: 61 63 74 69 6f 6e 73 20 61 72 65 20 61 6c 77 61  actions are alwa
b780: 79 73 20 6e 65 73 74 65 64 2c 20 6e 6f 74 20 6f  ys nested, not o
b790: 76 65 72 6c 61 70 70 69 6e 67 2e 0a 20 20 2a 2a  verlapping..  **
b7a0: 20 49 66 20 74 68 65 20 6f 70 65 6e 20 73 74 61   If the open sta
b7b0: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
b7c0: 6f 6e 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64  on is not closed
b7d0: 20 68 65 72 65 2c 20 74 68 65 6e 20 74 68 65 20   here, then the 
b7e0: 75 73 65 72 0a 20 20 2a 2a 20 6d 61 79 20 73 74  user.  ** may st
b7f0: 65 70 20 61 6e 6f 74 68 65 72 20 56 4d 20 74 68  ep another VM th
b800: 61 74 20 6f 70 65 6e 73 20 69 74 73 20 6f 77 6e  at opens its own
b810: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
b820: 61 63 74 69 6f 6e 2e 20 54 68 69 73 0a 20 20 2a  action. This.  *
b830: 2a 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 6f 76  * may lead to ov
b840: 65 72 6c 61 70 70 69 6e 67 20 73 74 61 74 65 6d  erlapping statem
b850: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
b860: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
b870: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
b880: 63 74 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 61  ction is never a
b890: 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73   top-level trans
b8a0: 61 63 74 69 6f 6e 2e 20 20 48 65 6e 63 65 0a 20  action.  Hence. 
b8b0: 20 2a 2a 20 74 68 65 20 52 45 4c 45 41 53 45 20   ** the RELEASE 
b8c0: 63 61 6c 6c 20 62 65 6c 6f 77 20 63 61 6e 20 6e  call below can n
b8d0: 65 76 65 72 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a  ever fail..  */.
b8e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
b8f0: 61 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64 62  atement==0 || db
b900: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43  ->flags&SQLITE_C
b910: 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20 72 63  ountRows );.  rc
b920: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c   = sqlite3VdbeCl
b930: 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20  oseStatement(p, 
b940: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
b950: 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  E);.  assert( rc
b960: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
b970: 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20    /* Invalidate 
b980: 61 6c 6c 20 65 70 68 65 6d 65 72 61 6c 20 63 75  all ephemeral cu
b990: 72 73 6f 72 20 72 6f 77 20 63 61 63 68 65 73 20  rsor row caches 
b9a0: 2a 2f 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  */.  p->cacheCtr
b9b0: 20 3d 20 28 70 2d 3e 63 61 63 68 65 43 74 72 20   = (p->cacheCtr 
b9c0: 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61  + 2)|1;..  /* Ma
b9d0: 6b 65 20 73 75 72 65 20 74 68 65 20 72 65 73 75  ke sure the resu
b9e0: 6c 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  lts of the curre
b9f0: 6e 74 20 72 6f 77 20 61 72 65 20 5c 30 30 30 20  nt row are \000 
ba00: 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 2a 2a 20  terminated.  ** 
ba10: 61 6e 64 20 68 61 76 65 20 61 6e 20 61 73 73 69  and have an assi
ba20: 67 6e 65 64 20 74 79 70 65 2e 20 20 54 68 65 20  gned type.  The 
ba30: 72 65 73 75 6c 74 73 20 61 72 65 20 64 65 2d 65  results are de-e
ba40: 70 68 65 6d 65 72 61 6c 69 7a 65 64 20 61 73 0a  phemeralized as.
ba50: 20 20 2a 2a 20 61 20 73 69 64 65 20 65 66 66 65    ** a side effe
ba60: 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20  ct..  */.  pMem 
ba70: 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  = p->pResultSet 
ba80: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
ba90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
baa0: 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20  Op->p2; i++){.  
bab0: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
bac0: 61 6c 69 64 28 26 70 4d 65 6d 5b 69 5d 29 20 29  alid(&pMem[i]) )
bad0: 3b 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61  ;.    Deephemera
bae0: 6c 69 7a 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a  lize(&pMem[i]);.
baf0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65      assert( (pMe
bb00: 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  m[i].flags & MEM
bb10: 5f 45 70 68 65 6d 29 3d 3d 30 0a 20 20 20 20 20  _Ephem)==0.     
bb20: 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 65 6d 5b         || (pMem[
bb30: 69 5d 2e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  i].flags & (MEM_
bb40: 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  Str|MEM_Blob))==
bb50: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
bb60: 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e  VdbeMemNulTermin
bb70: 61 74 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20  ate(&pMem[i]);. 
bb80: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
bb90: 45 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d  E(pOp->p1+i, &pM
bba0: 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  em[i]);.  }.  if
bbb0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bbc0: 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  ed ) goto no_mem
bbd0: 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54 72  ;..  if( db->mTr
bbe0: 61 63 65 20 26 20 53 51 4c 49 54 45 5f 54 52 41  ace & SQLITE_TRA
bbf0: 43 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 64 62  CE_ROW ){.    db
bc00: 2d 3e 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f  ->xTrace(SQLITE_
bc10: 54 52 41 43 45 5f 52 4f 57 2c 20 64 62 2d 3e 70  TRACE_ROW, db->p
bc20: 54 72 61 63 65 41 72 67 2c 20 70 2c 20 30 29 3b  TraceArg, p, 0);
bc30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
bc40: 6e 20 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 2a  n SQLITE_ROW.  *
bc50: 2f 0a 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74  /.  p->pc = (int
bc60: 29 28 70 4f 70 20 2d 20 61 4f 70 29 20 2b 20 31  )(pOp - aOp) + 1
bc70: 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
bc80: 52 4f 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65  ROW;.  goto vdbe
bc90: 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f  _return;.}../* O
bca0: 70 63 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31  pcode: Concat P1
bcb0: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
bcc0: 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b  nopsis: r[P3]=r[
bcd0: 50 32 5d 2b 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  P2]+r[P1].**.** 
bce0: 41 64 64 20 74 68 65 20 74 65 78 74 20 69 6e 20  Add the text in 
bcf0: 72 65 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f  register P1 onto
bd00: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bd10: 74 65 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73  text in.** regis
bd20: 74 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65  ter P2 and store
bd30: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
bd40: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
bd50: 66 20 65 69 74 68 65 72 20 74 68 65 20 50 31 20  f either the P1 
bd60: 6f 72 20 50 32 20 74 65 78 74 20 61 72 65 20 4e  or P2 text are N
bd70: 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e  ULL then store N
bd80: 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a  ULL in P3..**.**
bd90: 20 20 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31     P3 = P2 || P1
bda0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  .**.** It is ill
bdb0: 65 67 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20  egal for P1 and 
bdc0: 50 33 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  P3 to be the sam
bdd0: 65 20 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65  e register. Some
bde0: 74 69 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20  times,.** if P3 
bdf0: 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 69  is the same regi
be00: 73 74 65 72 20 61 73 20 50 32 2c 20 74 68 65 20  ster as P2, the 
be10: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
be20: 73 20 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f  s able.** to avo
be30: 69 64 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a  id a memcpy()..*
be40: 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74  /.case OP_Concat
be50: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
be60: 20 73 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43   same as TK_CONC
be70: 41 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  AT, in1, in2, ou
be80: 74 33 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74  t3 */.  i64 nByt
be90: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
bea0: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
beb0: 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20 6f   output string o
bec0: 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 75 31 36 20  r blob */.  u16 
bed0: 66 6c 61 67 73 31 3b 20 20 20 20 20 20 20 20 20  flags1;         
bee0: 2f 2a 20 49 6e 69 74 69 61 6c 20 66 6c 61 67 73  /* Initial flags
bef0: 20 66 6f 72 20 50 31 20 2a 2f 0a 20 20 75 31 36   for P1 */.  u16
bf00: 20 66 6c 61 67 73 32 3b 20 20 20 20 20 20 20 20   flags2;        
bf10: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 66 6c 61 67   /* Initial flag
bf20: 73 20 66 6f 72 20 50 32 20 2a 2f 0a 0a 20 20 70  s for P2 */..  p
bf30: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
bf40: 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26  >p1];.  pIn2 = &
bf50: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
bf60: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
bf70: 70 2d 3e 70 33 5d 3b 0a 20 20 74 65 73 74 63 61  p->p3];.  testca
bf80: 73 65 28 20 70 49 6e 31 3d 3d 70 49 6e 32 20 29  se( pIn1==pIn2 )
bf90: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
bfa0: 75 74 3d 3d 70 49 6e 32 20 29 3b 0a 20 20 61 73  ut==pIn2 );.  as
bfb0: 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f 75 74  sert( pIn1!=pOut
bfc0: 20 29 3b 0a 20 20 66 6c 61 67 73 31 20 3d 20 70   );.  flags1 = p
bfd0: 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 74 65  In1->flags;.  te
bfe0: 73 74 63 61 73 65 28 20 66 6c 61 67 73 31 20 26  stcase( flags1 &
bff0: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 74   MEM_Null );.  t
c000: 65 73 74 63 61 73 65 28 20 70 49 6e 32 2d 3e 66  estcase( pIn2->f
c010: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
c020: 29 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 31  );.  if( (flags1
c030: 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20   | pIn2->flags) 
c040: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
c050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
c060: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
c070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
c080: 69 66 28 20 28 66 6c 61 67 73 31 20 26 20 28 4d  if( (flags1 & (M
c090: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
c0a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
c0b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
c0c0: 72 69 6e 67 69 66 79 28 70 49 6e 31 2c 65 6e 63  ringify(pIn1,enc
c0d0: 6f 64 69 6e 67 2c 30 29 20 29 20 67 6f 74 6f 20  oding,0) ) goto 
c0e0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 66 6c 61 67  no_mem;.    flag
c0f0: 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73  s1 = pIn1->flags
c100: 20 26 20 7e 4d 45 4d 5f 53 74 72 3b 0a 20 20 7d   & ~MEM_Str;.  }
c110: 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 31  else if( (flags1
c120: 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 21 3d 30 20   & MEM_Zero)!=0 
c130: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
c140: 65 33 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42  e3VdbeMemExpandB
c150: 6c 6f 62 28 70 49 6e 31 29 20 29 20 67 6f 74 6f  lob(pIn1) ) goto
c160: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 66 6c 61   no_mem;.    fla
c170: 67 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67  gs1 = pIn1->flag
c180: 73 20 26 20 7e 4d 45 4d 5f 53 74 72 3b 0a 20 20  s & ~MEM_Str;.  
c190: 7d 0a 20 20 66 6c 61 67 73 32 20 3d 20 70 49 6e  }.  flags2 = pIn
c1a0: 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  2->flags;.  if( 
c1b0: 28 66 6c 61 67 73 32 20 26 20 28 4d 45 4d 5f 53  (flags2 & (MEM_S
c1c0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  tr|MEM_Blob))==0
c1d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
c1e0: 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67  te3VdbeMemString
c1f0: 69 66 79 28 70 49 6e 32 2c 65 6e 63 6f 64 69 6e  ify(pIn2,encodin
c200: 67 2c 30 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  g,0) ) goto no_m
c210: 65 6d 3b 0a 20 20 20 20 66 6c 61 67 73 32 20 3d  em;.    flags2 =
c220: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 7e   pIn2->flags & ~
c230: 4d 45 4d 5f 53 74 72 3b 0a 20 20 7d 65 6c 73 65  MEM_Str;.  }else
c240: 20 69 66 28 20 28 66 6c 61 67 73 32 20 26 20 4d   if( (flags2 & M
c250: 45 4d 5f 5a 65 72 6f 29 21 3d 30 20 29 7b 0a 20  EM_Zero)!=0 ){. 
c260: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
c270: 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28  beMemExpandBlob(
c280: 70 49 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  pIn2) ) goto no_
c290: 6d 65 6d 3b 0a 20 20 20 20 66 6c 61 67 73 32 20  mem;.    flags2 
c2a0: 3d 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20  = pIn2->flags & 
c2b0: 7e 4d 45 4d 5f 53 74 72 3b 0a 20 20 7d 0a 20 20  ~MEM_Str;.  }.  
c2c0: 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e 6e 20  nByte = pIn1->n 
c2d0: 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28  + pIn2->n;.  if(
c2e0: 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69   nByte>db->aLimi
c2f0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
c300: 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f  ENGTH] ){.    go
c310: 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
c320: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
c330: 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28  eMemGrow(pOut, (
c340: 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20 70 4f 75  int)nByte+2, pOu
c350: 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20 20 20 20  t==pIn2) ){.    
c360: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
c370: 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
c380: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72 29  g(pOut, MEM_Str)
c390: 3b 0a 20 20 69 66 28 20 70 4f 75 74 21 3d 70 49  ;.  if( pOut!=pI
c3a0: 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  n2 ){.    memcpy
c3b0: 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e  (pOut->z, pIn2->
c3c0: 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20 20  z, pIn2->n);.   
c3d0: 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e   assert( (pIn2->
c3e0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29  flags & MEM_Dyn)
c3f0: 20 3d 3d 20 28 66 6c 61 67 73 32 20 26 20 4d 45   == (flags2 & ME
c400: 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20 70 49  M_Dyn) );.    pI
c410: 6e 32 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  n2->flags = flag
c420: 73 32 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  s2;.  }.  memcpy
c430: 28 26 70 4f 75 74 2d 3e 7a 5b 70 49 6e 32 2d 3e  (&pOut->z[pIn2->
c440: 6e 5d 2c 20 70 49 6e 31 2d 3e 7a 2c 20 70 49 6e  n], pIn1->z, pIn
c450: 31 2d 3e 6e 29 3b 0a 20 20 61 73 73 65 72 74 28  1->n);.  assert(
c460: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
c470: 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61  MEM_Dyn) == (fla
c480: 67 73 31 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29  gs1 & MEM_Dyn) )
c490: 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
c4a0: 3d 20 66 6c 61 67 73 31 3b 0a 20 20 70 4f 75 74  = flags1;.  pOut
c4b0: 2d 3e 7a 5b 6e 42 79 74 65 5d 3d 30 3b 0a 20 20  ->z[nByte]=0;.  
c4c0: 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b 31 5d  pOut->z[nByte+1]
c4d0: 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c   = 0;.  pOut->fl
c4e0: 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b  ags |= MEM_Term;
c4f0: 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e  .  pOut->n = (in
c500: 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d  t)nByte;.  pOut-
c510: 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  >enc = encoding;
c520: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
c530: 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20  OBSIZE(pOut);.  
c540: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
c550: 6f 64 65 3a 20 41 64 64 20 50 31 20 50 32 20 50  ode: Add P1 P2 P
c560: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
c570: 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2b 72  s: r[P3]=r[P1]+r
c580: 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74  [P2].**.** Add t
c590: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
c5a0: 73 74 65 72 20 50 31 20 74 6f 20 74 68 65 20 76  ster P1 to the v
c5b0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
c5c0: 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65   P2.** and store
c5d0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
c5e0: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
c5f0: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
c600: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
c610: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
c620: 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74 69 70  * Opcode: Multip
c630: 6c 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ly P1 P2 P3 * *.
c640: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
c650: 33 5d 3d 72 5b 50 31 5d 2a 72 5b 50 32 5d 0a 2a  3]=r[P1]*r[P2].*
c660: 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 69 70 6c 79  *.**.** Multiply
c670: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
c680: 67 69 73 74 65 72 20 50 31 20 62 79 20 74 68 65  gister P1 by the
c690: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
c6a0: 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f  er P2.** and sto
c6b0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
c6c0: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
c6d0: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
c6e0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
c6f0: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
c700: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 75 62 74  ./* Opcode: Subt
c710: 72 61 63 74 20 50 31 20 50 32 20 50 33 20 2a 20  ract P1 P2 P3 * 
c720: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
c730: 5b 50 33 5d 3d 72 5b 50 32 5d 2d 72 5b 50 31 5d  [P3]=r[P2]-r[P1]
c740: 0a 2a 2a 0a 2a 2a 20 53 75 62 74 72 61 63 74 20  .**.** Subtract 
c750: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
c760: 69 73 74 65 72 20 50 31 20 66 72 6f 6d 20 74 68  ister P1 from th
c770: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
c780: 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74  ter P2.** and st
c790: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
c7a0: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
c7b0: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
c7c0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
c7d0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
c7e0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 69 76  /./* Opcode: Div
c7f0: 69 64 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ide P1 P2 P3 * *
c800: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
c810: 50 33 5d 3d 72 5b 50 32 5d 2f 72 5b 50 31 5d 0a  P3]=r[P2]/r[P1].
c820: 2a 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74 68 65  **.** Divide the
c830: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
c840: 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61 6c  er P1 by the val
c850: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
c860: 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  2.** and store t
c870: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
c880: 69 73 74 65 72 20 50 33 20 28 50 33 3d 50 32 2f  ister P3 (P3=P2/
c890: 50 31 29 2e 20 49 66 20 74 68 65 20 76 61 6c 75  P1). If the valu
c8a0: 65 20 69 6e 20 0a 2a 2a 20 72 65 67 69 73 74 65  e in .** registe
c8b0: 72 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68  r P1 is zero, th
c8c0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
c8d0: 20 4e 55 4c 4c 2e 20 49 66 20 65 69 74 68 65 72   NULL. If either
c8e0: 20 69 6e 70 75 74 20 69 73 20 0a 2a 2a 20 4e 55   input is .** NU
c8f0: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
c900: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
c910: 63 6f 64 65 3a 20 52 65 6d 61 69 6e 64 65 72 20  code: Remainder 
c920: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
c930: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
c940: 72 5b 50 32 5d 25 72 5b 50 31 5d 0a 2a 2a 0a 2a  r[P2]%r[P1].**.*
c950: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65  * Compute the re
c960: 6d 61 69 6e 64 65 72 20 61 66 74 65 72 20 69 6e  mainder after in
c970: 74 65 67 65 72 20 72 65 67 69 73 74 65 72 20 50  teger register P
c980: 32 20 69 73 20 64 69 76 69 64 65 64 20 62 79 20  2 is divided by 
c990: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20  .** register P1 
c9a0: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
c9b0: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
c9c0: 20 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20   P3. .** If the 
c9d0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
c9e0: 72 20 50 31 20 69 73 20 7a 65 72 6f 20 74 68 65  r P1 is zero the
c9f0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
ca00: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70  .** If either op
ca10: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74  erand is NULL, t
ca20: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
ca30: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64  L..*/.case OP_Ad
ca40: 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d:              
ca50: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
ca60: 54 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20 69 6e  TK_PLUS, in1, in
ca70: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
ca80: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20  OP_Subtract:    
ca90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
caa0: 65 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c 20 69  e as TK_MINUS, i
cab0: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
cac0: 0a 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c  .case OP_Multipl
cad0: 79 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y:              
cae0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54  /* same as TK_ST
caf0: 41 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  AR, in1, in2, ou
cb00: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 69  t3 */.case OP_Di
cb10: 76 69 64 65 3a 20 20 20 20 20 20 20 20 20 20 20  vide:           
cb20: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
cb30: 54 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c 20 69  TK_SLASH, in1, i
cb40: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
cb50: 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a 20 7b   OP_Remainder: {
cb60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
cb70: 6d 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20 69 6e  me as TK_REM, in
cb80: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
cb90: 20 20 63 68 61 72 20 62 49 6e 74 69 6e 74 3b 20    char bIntint; 
cba0: 20 20 2f 2a 20 53 74 61 72 74 65 64 20 6f 75 74    /* Started out
cbb0: 20 61 73 20 74 77 6f 20 69 6e 74 65 67 65 72 20   as two integer 
cbc0: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 75 31  operands */.  u1
cbd0: 36 20 66 6c 61 67 73 3b 20 20 20 20 20 20 2f 2a  6 flags;      /*
cbe0: 20 43 6f 6d 62 69 6e 65 64 20 4d 45 4d 5f 2a 20   Combined MEM_* 
cbf0: 66 6c 61 67 73 20 66 72 6f 6d 20 62 6f 74 68 20  flags from both 
cc00: 69 6e 70 75 74 73 20 2a 2f 0a 20 20 75 31 36 20  inputs */.  u16 
cc10: 74 79 70 65 31 3b 20 20 20 20 20 20 2f 2a 20 4e  type1;      /* N
cc20: 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20 6c  umeric type of l
cc30: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
cc40: 20 75 31 36 20 74 79 70 65 32 3b 20 20 20 20 20   u16 type2;     
cc50: 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79 70 65   /* Numeric type
cc60: 20 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e   of right operan
cc70: 64 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 20 20  d */.  i64 iA;  
cc80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
cc90: 72 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 20  r value of left 
cca0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36 34  operand */.  i64
ccb0: 20 69 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   iB;         /* 
ccc0: 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f 66  Integer value of
ccd0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
cce0: 2f 0a 20 20 64 6f 75 62 6c 65 20 72 41 3b 20 20  /.  double rA;  
ccf0: 20 20 20 20 2f 2a 20 52 65 61 6c 20 76 61 6c 75      /* Real valu
cd00: 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e  e of left operan
cd10: 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 42  d */.  double rB
cd20: 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76  ;      /* Real v
cd30: 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f 70  alue of right op
cd40: 65 72 61 6e 64 20 2a 2f 0a 0a 20 20 70 49 6e 31  erand */..  pIn1
cd50: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
cd60: 5d 3b 0a 20 20 74 79 70 65 31 20 3d 20 6e 75 6d  ];.  type1 = num
cd70: 65 72 69 63 54 79 70 65 28 70 49 6e 31 29 3b 0a  ericType(pIn1);.
cd80: 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
cd90: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 74 79 70 65 32  Op->p2];.  type2
cda0: 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65 28 70   = numericType(p
cdb0: 49 6e 32 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26  In2);.  pOut = &
cdc0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
cdd0: 20 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d 3e 66   flags = pIn1->f
cde0: 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61  lags | pIn2->fla
cdf0: 67 73 3b 0a 20 20 69 66 28 20 28 74 79 70 65 31  gs;.  if( (type1
ce00: 20 26 20 74 79 70 65 32 20 26 20 4d 45 4d 5f 49   & type2 & MEM_I
ce10: 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 41  nt)!=0 ){.    iA
ce20: 20 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20   = pIn1->u.i;.  
ce30: 20 20 69 42 20 3d 20 70 49 6e 32 2d 3e 75 2e 69    iB = pIn2->u.i
ce40: 3b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20 3d 20  ;.    bIntint = 
ce50: 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  1;.    switch( p
ce60: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
ce70: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a      case OP_Add:
ce80: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
ce90: 65 33 41 64 64 49 6e 74 36 34 28 26 69 42 2c 69  e3AddInt64(&iB,i
cea0: 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74  A) ) goto fp_mat
ceb0: 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  h;  break;.     
cec0: 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63   case OP_Subtrac
ced0: 74 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  t:  if( sqlite3S
cee0: 75 62 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20  ubInt64(&iB,iA) 
cef0: 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20  ) goto fp_math; 
cf00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
cf10: 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20  se OP_Multiply: 
cf20: 20 69 66 28 20 73 71 6c 69 74 65 33 4d 75 6c 49   if( sqlite3MulI
cf30: 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29 20 67  nt64(&iB,iA) ) g
cf40: 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72  oto fp_math;  br
cf50: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
cf60: 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20 20  OP_Divide: {.   
cf70: 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29       if( iA==0 )
cf80: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
cf90: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
cfa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
cfb0: 3d 2d 31 20 26 26 20 69 42 3d 3d 53 4d 41 4c 4c  =-1 && iB==SMALL
cfc0: 45 53 54 5f 49 4e 54 36 34 20 29 20 67 6f 74 6f  EST_INT64 ) goto
cfd0: 20 66 70 5f 6d 61 74 68 3b 0a 20 20 20 20 20 20   fp_math;.      
cfe0: 20 20 69 42 20 2f 3d 20 69 41 3b 0a 20 20 20 20    iB /= iA;.    
cff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d000: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
d010: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
d020: 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69  iA==0 ) goto ari
d030: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
d040: 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  s_null;.        
d050: 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20  if( iA==-1 ) iA 
d060: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 42 20  = 1;.        iB 
d070: 25 3d 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62  %= iA;.        b
d080: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d090: 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e    }.    pOut->u.
d0a0: 69 20 3d 20 69 42 3b 0a 20 20 20 20 4d 65 6d 53  i = iB;.    MemS
d0b0: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
d0c0: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c   MEM_Int);.  }el
d0d0: 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
d0e0: 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a  MEM_Null)!=0 ){.
d0f0: 20 20 20 20 67 6f 74 6f 20 61 72 69 74 68 6d 65      goto arithme
d100: 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75  tic_result_is_nu
d110: 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ll;.  }else{.   
d120: 20 62 49 6e 74 69 6e 74 20 3d 20 30 3b 0a 66 70   bIntint = 0;.fp
d130: 5f 6d 61 74 68 3a 0a 20 20 20 20 72 41 20 3d 20  _math:.    rA = 
d140: 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56  sqlite3VdbeRealV
d150: 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 20 20  alue(pIn1);.    
d160: 72 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rB = sqlite3Vdbe
d170: 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 32 29 3b  RealValue(pIn2);
d180: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70  .    switch( pOp
d190: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ->opcode ){.    
d1a0: 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20    case OP_Add:  
d1b0: 20 20 20 20 20 20 20 72 42 20 2b 3d 20 72 41 3b         rB += rA;
d1c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d1d0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74      case OP_Subt
d1e0: 72 61 63 74 3a 20 20 20 20 72 42 20 2d 3d 20 72  ract:    rB -= r
d1f0: 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  A;       break;.
d200: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75        case OP_Mu
d210: 6c 74 69 70 6c 79 3a 20 20 20 20 72 42 20 2a 3d  ltiply:    rB *=
d220: 20 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b   rA;       break
d230: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
d240: 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20  Divide: {.      
d250: 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49    /* (double)0 I
d260: 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
d270: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
d280: 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  OINT... */.     
d290: 20 20 20 69 66 28 20 72 41 3d 3d 28 64 6f 75 62     if( rA==(doub
d2a0: 6c 65 29 30 20 29 20 67 6f 74 6f 20 61 72 69 74  le)0 ) goto arit
d2b0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
d2c0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 72  _null;.        r
d2d0: 42 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20 20 20  B /= rA;.       
d2e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d2f0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
d300: 0a 20 20 20 20 20 20 20 20 69 41 20 3d 20 73 71  .        iA = sq
d310: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
d320: 65 28 70 49 6e 31 29 3b 0a 20 20 20 20 20 20 20  e(pIn1);.       
d330: 20 69 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62   iB = sqlite3Vdb
d340: 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b  eIntValue(pIn2);
d350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
d360: 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d  =0 ) goto arithm
d370: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
d380: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ull;.        if(
d390: 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d 20 31   iA==-1 ) iA = 1
d3a0: 3b 0a 20 20 20 20 20 20 20 20 72 42 20 3d 20 28  ;.        rB = (
d3b0: 64 6f 75 62 6c 65 29 28 69 42 20 25 20 69 41 29  double)(iB % iA)
d3c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
d3e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
d3f0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
d400: 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
d410: 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54   rB;.    MemSetT
d420: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
d430: 4d 5f 49 6e 74 29 3b 0a 23 65 6c 73 65 0a 20 20  M_Int);.#else.  
d440: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e    if( sqlite3IsN
d450: 61 4e 28 72 42 29 20 29 7b 0a 20 20 20 20 20 20  aN(rB) ){.      
d460: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
d470: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
d480: 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e      }.    pOut->
d490: 75 2e 72 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65  u.r = rB;.    Me
d4a0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
d4b0: 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20  t, MEM_Real);.  
d4c0: 20 20 69 66 28 20 28 28 74 79 70 65 31 7c 74 79    if( ((type1|ty
d4d0: 70 65 32 29 26 28 4d 45 4d 5f 52 65 61 6c 7c 4d  pe2)&(MEM_Real|M
d4e0: 45 4d 5f 49 6e 74 52 65 61 6c 29 29 3d 3d 30 20  EM_IntReal))==0 
d4f0: 26 26 20 21 62 49 6e 74 69 6e 74 20 29 7b 0a 20  && !bIntint ){. 
d500: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d510: 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28  IntegerAffinity(
d520: 70 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pOut);.    }.#en
d530: 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  dif.  }.  break;
d540: 0a 0a 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  ..arithmetic_res
d550: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20 73  ult_is_null:.  s
d560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
d570: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 62 72  Null(pOut);.  br
d580: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
d590: 65 3a 20 43 6f 6c 6c 53 65 71 20 50 31 20 2a 20  e: CollSeq P1 * 
d5a0: 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  * P4.**.** P4 is
d5b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
d5c0: 43 6f 6c 6c 53 65 71 20 6f 62 6a 65 63 74 2e 20  CollSeq object. 
d5d0: 49 66 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  If the next call
d5e0: 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74   to a user funct
d5f0: 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67  ion.** or aggreg
d600: 61 74 65 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ate calls sqlite
d610: 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28  3GetFuncCollSeq(
d620: 29 2c 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  ), this collatio
d630: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a  n sequence will.
d640: 2a 2a 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ** be returned. 
d650: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
d660: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
d670: 28 29 2c 20 6d 61 78 28 29 20 61 6e 64 20 6e 75  (), max() and nu
d680: 6c 6c 69 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69  llif().** functi
d690: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31  ons..**.** If P1
d6a0: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
d6b0: 65 6e 20 69 74 20 69 73 20 61 20 72 65 67 69 73  en it is a regis
d6c0: 74 65 72 20 74 68 61 74 20 61 20 73 75 62 73 65  ter that a subse
d6d0: 71 75 65 6e 74 20 6d 69 6e 28 29 20 6f 72 0a 2a  quent min() or.*
d6e0: 2a 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74  * max() aggregat
d6f0: 65 20 77 69 6c 6c 20 73 65 74 20 74 6f 20 31 20  e will set to 1 
d700: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  if the current r
d710: 6f 77 20 69 73 20 6e 6f 74 20 74 68 65 20 6d 69  ow is not the mi
d720: 6e 69 6d 75 6d 20 6f 72 0a 2a 2a 20 6d 61 78 69  nimum or.** maxi
d730: 6d 75 6d 2e 20 20 54 68 65 20 50 31 20 72 65 67  mum.  The P1 reg
d740: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
d750: 69 7a 65 64 20 74 6f 20 30 20 62 79 20 74 68 69  ized to 0 by thi
d760: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  s instruction..*
d770: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
d780: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ce used by the i
d790: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
d7a0: 20 74 68 65 20 61 66 6f 72 65 6d 65 6e 74 69 6f   the aforementio
d7b0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  ned functions.**
d7c0: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
d7d0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d7e0: 6e 63 65 20 73 65 74 20 62 79 20 74 68 69 73 20  nce set by this 
d7f0: 6f 70 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 76  opcode is not av
d800: 61 69 6c 61 62 6c 65 0a 2a 2a 20 70 75 62 6c 69  ailable.** publi
d810: 63 6c 79 2e 20 20 4f 6e 6c 79 20 62 75 69 6c 74  cly.  Only built
d820: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  -in functions ha
d830: 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 69  ve access to thi
d840: 73 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61  s feature..*/.ca
d850: 73 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b  se OP_CollSeq: {
d860: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
d870: 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
d880: 45 51 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  EQ );.  if( pOp-
d890: 3e 70 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >p1 ){.    sqlit
d8a0: 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
d8b0: 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  4(&aMem[pOp->p1]
d8c0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  , 0);.  }.  brea
d8d0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
d8e0: 20 42 69 74 41 6e 64 20 50 31 20 50 32 20 50 33   BitAnd P1 P2 P3
d8f0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
d900: 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 26 72 5b  : r[P3]=r[P1]&r[
d910: 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74  P2].**.** Take t
d920: 68 65 20 62 69 74 2d 77 69 73 65 20 41 4e 44 20  he bit-wise AND 
d930: 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  of the values in
d940: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
d950: 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65   P2 and.** store
d960: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
d970: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
d980: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
d990: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
d9a0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
d9b0: 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 4f 72 20  * Opcode: BitOr 
d9c0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
d9d0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
d9e0: 72 5b 50 31 5d 7c 72 5b 50 32 5d 0a 2a 2a 0a 2a  r[P1]|r[P2].**.*
d9f0: 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77  * Take the bit-w
da00: 69 73 65 20 4f 52 20 6f 66 20 74 68 65 20 76 61  ise OR of the va
da10: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
da20: 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a   P1 and P2 and.*
da30: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
da40: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
da50: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
da60: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
da70: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
da80: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
da90: 20 53 68 69 66 74 4c 65 66 74 20 50 31 20 50 32   ShiftLeft P1 P2
daa0: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
dab0: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d  sis: r[P3]=r[P2]
dac0: 3c 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68  <<r[P1].**.** Sh
dad0: 69 66 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  ift the integer 
dae0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
daf0: 72 20 50 32 20 74 6f 20 74 68 65 20 6c 65 66 74  r P2 to the left
db00: 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   by the.** numbe
db10: 72 20 6f 66 20 62 69 74 73 20 73 70 65 63 69 66  r of bits specif
db20: 69 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67  ied by the integ
db30: 65 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  er in register P
db40: 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  1..** Store the 
db50: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
db60: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
db70: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
db80: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
db90: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
dba0: 6f 64 65 3a 20 53 68 69 66 74 52 69 67 68 74 20  ode: ShiftRight 
dbb0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
dbc0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
dbd0: 72 5b 50 32 5d 3e 3e 72 5b 50 31 5d 0a 2a 2a 0a  r[P2]>>r[P1].**.
dbe0: 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e 74  ** Shift the int
dbf0: 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72 65  eger value in re
dc00: 67 69 73 74 65 72 20 50 32 20 74 6f 20 74 68 65  gister P2 to the
dc10: 20 72 69 67 68 74 20 62 79 20 74 68 65 0a 2a 2a   right by the.**
dc20: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
dc30: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
dc40: 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69   integer in regi
dc50: 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72  ster P1..** Stor
dc60: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
dc70: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
dc80: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
dc90: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
dca0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
dcb0: 63 61 73 65 20 4f 50 5f 42 69 74 41 6e 64 3a 20  case OP_BitAnd: 
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49  /* same as TK_BI
dce0: 54 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  TAND, in1, in2, 
dcf0: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
dd00: 42 69 74 4f 72 3a 20 20 20 20 20 20 20 20 20 20  BitOr:          
dd10: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
dd20: 61 73 20 54 4b 5f 42 49 54 4f 52 2c 20 69 6e 31  as TK_BITOR, in1
dd30: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
dd40: 61 73 65 20 4f 50 5f 53 68 69 66 74 4c 65 66 74  ase OP_ShiftLeft
dd50: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
dd60: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 53 48  * same as TK_LSH
dd70: 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  IFT, in1, in2, o
dd80: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ut3 */.case OP_S
dd90: 68 69 66 74 52 69 67 68 74 3a 20 7b 20 20 20 20  hiftRight: {    
dda0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
ddb0: 73 20 54 4b 5f 52 53 48 49 46 54 2c 20 69 6e 31  s TK_RSHIFT, in1
ddc0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
ddd0: 20 69 36 34 20 69 41 3b 0a 20 20 75 36 34 20 75   i64 iA;.  u64 u
dde0: 41 3b 0a 20 20 69 36 34 20 69 42 3b 0a 20 20 75  A;.  i64 iB;.  u
ddf0: 38 20 6f 70 3b 0a 0a 20 20 70 49 6e 31 20 3d 20  8 op;..  pIn1 = 
de00: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
de10: 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
de20: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20  Op->p2];.  pOut 
de30: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
de40: 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
de50: 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61  lags | pIn2->fla
de60: 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  gs) & MEM_Null )
de70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
de80: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
de90: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
dea0: 7d 0a 20 20 69 41 20 3d 20 73 71 6c 69 74 65 33  }.  iA = sqlite3
deb0: 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
dec0: 32 29 3b 0a 20 20 69 42 20 3d 20 73 71 6c 69 74  2);.  iB = sqlit
ded0: 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
dee0: 49 6e 31 29 3b 0a 20 20 6f 70 20 3d 20 70 4f 70  In1);.  op = pOp
def0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 69 66 28 20  ->opcode;.  if( 
df00: 6f 70 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 7b  op==OP_BitAnd ){
df10: 0a 20 20 20 20 69 41 20 26 3d 20 69 42 3b 0a 20  .    iA &= iB;. 
df20: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 4f   }else if( op==O
df30: 50 5f 42 69 74 4f 72 20 29 7b 0a 20 20 20 20 69  P_BitOr ){.    i
df40: 41 20 7c 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65  A |= iB;.  }else
df50: 20 69 66 28 20 69 42 21 3d 30 20 29 7b 0a 20 20   if( iB!=0 ){.  
df60: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50    assert( op==OP
df70: 5f 53 68 69 66 74 52 69 67 68 74 20 7c 7c 20 6f  _ShiftRight || o
df80: 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  p==OP_ShiftLeft 
df90: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 68  );..    /* If sh
dfa0: 69 66 74 69 6e 67 20 62 79 20 61 20 6e 65 67 61  ifting by a nega
dfb0: 74 69 76 65 20 61 6d 6f 75 6e 74 2c 20 73 68 69  tive amount, shi
dfc0: 66 74 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ft in the other 
dfd0: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  direction */.   
dfe0: 20 69 66 28 20 69 42 3c 30 20 29 7b 0a 20 20 20   if( iB<0 ){.   
dff0: 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 68     assert( OP_Sh
e000: 69 66 74 52 69 67 68 74 3d 3d 4f 50 5f 53 68 69  iftRight==OP_Shi
e010: 66 74 4c 65 66 74 2b 31 20 29 3b 0a 20 20 20 20  ftLeft+1 );.    
e020: 20 20 6f 70 20 3d 20 32 2a 4f 50 5f 53 68 69 66    op = 2*OP_Shif
e030: 74 4c 65 66 74 20 2b 20 31 20 2d 20 6f 70 3b 0a  tLeft + 1 - op;.
e040: 20 20 20 20 20 20 69 42 20 3d 20 69 42 3e 28 2d        iB = iB>(-
e050: 36 34 29 20 3f 20 2d 69 42 20 3a 20 36 34 3b 0a  64) ? -iB : 64;.
e060: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
e070: 42 3e 3d 36 34 20 29 7b 0a 20 20 20 20 20 20 69  B>=64 ){.      i
e080: 41 20 3d 20 28 69 41 3e 3d 30 20 7c 7c 20 6f 70  A = (iA>=0 || op
e090: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 29 20  ==OP_ShiftLeft) 
e0a0: 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 65  ? 0 : -1;.    }e
e0b0: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  lse{.      memcp
e0c0: 79 28 26 75 41 2c 20 26 69 41 2c 20 73 69 7a 65  y(&uA, &iA, size
e0d0: 6f 66 28 75 41 29 29 3b 0a 20 20 20 20 20 20 69  of(uA));.      i
e0e0: 66 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c  f( op==OP_ShiftL
e0f0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 75  eft ){.        u
e100: 41 20 3c 3c 3d 20 69 42 3b 0a 20 20 20 20 20 20  A <<= iB;.      
e110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
e120: 41 20 3e 3e 3d 20 69 42 3b 0a 20 20 20 20 20 20  A >>= iB;.      
e130: 20 20 2f 2a 20 53 69 67 6e 2d 65 78 74 65 6e 64    /* Sign-extend
e140: 20 6f 6e 20 61 20 72 69 67 68 74 20 73 68 69 66   on a right shif
e150: 74 20 6f 66 20 61 20 6e 65 67 61 74 69 76 65 20  t of a negative 
e160: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
e170: 20 20 69 66 28 20 69 41 3c 30 20 29 20 75 41 20    if( iA<0 ) uA 
e180: 7c 3d 20 28 28 28 28 75 36 34 29 30 78 66 66 66  |= ((((u64)0xfff
e190: 66 66 66 66 66 29 3c 3c 33 32 29 7c 30 78 66 66  fffff)<<32)|0xff
e1a0: 66 66 66 66 66 66 29 20 3c 3c 20 28 36 34 2d 69  ffffff) << (64-i
e1b0: 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  B);.      }.    
e1c0: 20 20 6d 65 6d 63 70 79 28 26 69 41 2c 20 26 75    memcpy(&iA, &u
e1d0: 41 2c 20 73 69 7a 65 6f 66 28 69 41 29 29 3b 0a  A, sizeof(iA));.
e1e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74      }.  }.  pOut
e1f0: 2d 3e 75 2e 69 20 3d 20 69 41 3b 0a 20 20 4d 65  ->u.i = iA;.  Me
e200: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
e210: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62  t, MEM_Int);.  b
e220: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
e230: 64 65 3a 20 41 64 64 49 6d 6d 20 20 50 31 20 50  de: AddImm  P1 P
e240: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
e250: 73 69 73 3a 20 72 5b 50 31 5d 3d 72 5b 50 31 5d  sis: r[P1]=r[P1]
e260: 2b 50 32 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74  +P2.** .** Add t
e270: 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32 20 74  he constant P2 t
e280: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  o the value in r
e290: 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54  egister P1..** T
e2a0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
e2b0: 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  ays an integer..
e2c0: 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61  **.** To force a
e2d0: 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62  ny register to b
e2e0: 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75  e an integer, ju
e2f0: 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73  st add 0..*/.cas
e300: 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20  e OP_AddImm: {  
e310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
e320: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
e330: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d  em[pOp->p1];.  m
e340: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
e350: 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  p, pIn1);.  sqli
e360: 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
e370: 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49  rify(pIn1);.  pI
e380: 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e  n1->u.i += pOp->
e390: 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
e3a0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42  /* Opcode: MustB
e3b0: 65 49 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  eInt P1 P2 * * *
e3c0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68  .** .** Force th
e3d0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
e3e0: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 6e 20  ter P1 to be an 
e3f0: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65  integer.  If the
e400: 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20   value.** in P1 
e410: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
e420: 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20  r and cannot be 
e430: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
e440: 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74  n integer.** wit
e450: 68 6f 75 74 20 64 61 74 61 20 6c 6f 73 73 2c 20  hout data loss, 
e460: 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
e470: 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20  ately to P2, or 
e480: 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73  if P2==0.** rais
e490: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d  e an SQLITE_MISM
e4a0: 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a  ATCH exception..
e4b0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73 74 42  */.case OP_MustB
e4c0: 65 49 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  eInt: {         
e4d0: 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
e4e0: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
e4f0: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
e500: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
e510: 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a   MEM_Int)==0 ){.
e520: 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74      applyAffinit
e530: 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41  y(pIn1, SQLITE_A
e540: 46 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f  FF_NUMERIC, enco
e550: 64 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 28  ding);.    if( (
e560: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
e570: 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Int)==0 ){.   
e580: 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
e590: 65 6e 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  en(1, 2);.      
e5a0: 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29  if( pOp->p2==0 )
e5b0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
e5c0: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3b 0a  QLITE_MISMATCH;.
e5d0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
e5e0: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
e5f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e600: 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f        goto jump_
e610: 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20  to_p2;.      }. 
e620: 20 20 20 7d 0a 20 20 7d 0a 20 20 56 64 62 65 42     }.  }.  VdbeB
e630: 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c 20 32 29  ranchTaken(0, 2)
e640: 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
e650: 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 49 6e 74  ag(pIn1, MEM_Int
e660: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23  );.  break;.}..#
e670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e680: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
e690: 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61  T./* Opcode: Rea
e6a0: 6c 41 66 66 69 6e 69 74 79 20 50 31 20 2a 20 2a  lAffinity P1 * *
e6b0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65   * *.**.** If re
e6c0: 67 69 73 74 65 72 20 50 31 20 68 6f 6c 64 73 20  gister P1 holds 
e6d0: 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 76 65  an integer conve
e6e0: 72 74 20 69 74 20 74 6f 20 61 20 72 65 61 6c 20  rt it to a real 
e6f0: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
e700: 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  s opcode is used
e710: 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67   when extracting
e720: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
e730: 6d 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a  m a column that.
e740: 2a 2a 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  ** has REAL affi
e750: 6e 69 74 79 2e 20 20 53 75 63 68 20 63 6f 6c 75  nity.  Such colu
e760: 6d 6e 20 76 61 6c 75 65 73 20 6d 61 79 20 73 74  mn values may st
e770: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
e780: 0a 2a 2a 20 69 6e 74 65 67 65 72 73 2c 20 66 6f  .** integers, fo
e790: 72 20 73 70 61 63 65 20 65 66 66 69 63 69 65 6e  r space efficien
e7a0: 63 79 2c 20 62 75 74 20 61 66 74 65 72 20 65 78  cy, but after ex
e7b0: 74 72 61 63 74 69 6f 6e 20 77 65 20 77 61 6e 74  traction we want
e7c0: 20 74 68 65 6d 0a 2a 2a 20 74 6f 20 68 61 76 65   them.** to have
e7d0: 20 6f 6e 6c 79 20 61 20 72 65 61 6c 20 76 61 6c   only a real val
e7e0: 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ue..*/.case OP_R
e7f0: 65 61 6c 41 66 66 69 6e 69 74 79 3a 20 7b 20 20  ealAffinity: {  
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  /* in1 */.  pIn1
e820: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
e830: 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66  ];.  if( pIn1->f
e840: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  lags & (MEM_Int|
e850: 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a  MEM_IntReal) ){.
e860: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
e870: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
e880: 49 6e 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  Int );.    testc
e890: 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ase( pIn1->flags
e8a0: 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29   & MEM_IntReal )
e8b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e8c0: 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e 31  eMemRealify(pIn1
e8d0: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
e8e0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
e8f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
e900: 53 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 61  ST./* Opcode: Ca
e910: 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  st P1 P2 * * *.*
e920: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66 66 69  * Synopsis: affi
e930: 6e 69 74 79 28 72 5b 50 31 5d 29 0a 2a 2a 0a 2a  nity(r[P1]).**.*
e940: 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75  * Force the valu
e950: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
e960: 20 74 6f 20 62 65 20 74 68 65 20 74 79 70 65 20   to be the type 
e970: 64 65 66 69 6e 65 64 20 62 79 20 50 32 2e 0a 2a  defined by P2..*
e980: 2a 20 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c  * .** <ul>.** <l
e990: 69 3e 20 50 32 3d 3d 27 41 27 20 26 72 61 72 72  i> P2=='A' &rarr
e9a0: 3b 20 42 4c 4f 42 0a 2a 2a 20 3c 6c 69 3e 20 50  ; BLOB.** <li> P
e9b0: 32 3d 3d 27 42 27 20 26 72 61 72 72 3b 20 54 45  2=='B' &rarr; TE
e9c0: 58 54 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27  XT.** <li> P2=='
e9d0: 43 27 20 26 72 61 72 72 3b 20 4e 55 4d 45 52 49  C' &rarr; NUMERI
e9e0: 43 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 44  C.** <li> P2=='D
e9f0: 27 20 26 72 61 72 72 3b 20 49 4e 54 45 47 45 52  ' &rarr; INTEGER
ea00: 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 45 27  .** <li> P2=='E'
ea10: 20 26 72 61 72 72 3b 20 52 45 41 4c 0a 2a 2a 20   &rarr; REAL.** 
ea20: 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  </ul>.**.** A NU
ea30: 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  LL value is not 
ea40: 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
ea50: 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d  routine.  It rem
ea60: 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  ains NULL..*/.ca
ea70: 73 65 20 4f 50 5f 43 61 73 74 3a 20 7b 20 20 20  se OP_Cast: {   
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ea90: 2a 20 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72  * in1 */.  asser
eaa0: 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 53 51 4c 49  t( pOp->p2>=SQLI
eab0: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 26 26 20 70  TE_AFF_BLOB && p
eac0: 4f 70 2d 3e 70 32 3c 3d 53 51 4c 49 54 45 5f 41  Op->p2<=SQLITE_A
ead0: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 74 65 73  FF_REAL );.  tes
eae0: 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d  tcase( pOp->p2==
eaf0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
eb00: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
eb10: 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41  Op->p2==SQLITE_A
eb20: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 74 65 73  FF_BLOB );.  tes
eb30: 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d  tcase( pOp->p2==
eb40: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
eb50: 49 43 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  IC );.  testcase
eb60: 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  ( pOp->p2==SQLIT
eb70: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
eb80: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70  .  testcase( pOp
eb90: 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46  ->p2==SQLITE_AFF
eba0: 5f 52 45 41 4c 20 29 3b 0a 20 20 70 49 6e 31 20  _REAL );.  pIn1 
ebb0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
ebc0: 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
ebd0: 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20  ange(p, pIn1);. 
ebe0: 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62   rc = ExpandBlob
ebf0: 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65  (pIn1);.  sqlite
ec00: 33 56 64 62 65 4d 65 6d 43 61 73 74 28 70 49 6e  3VdbeMemCast(pIn
ec10: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 65 6e 63 6f  1, pOp->p2, enco
ec20: 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f  ding);.  UPDATE_
ec30: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e  MAX_BLOBSIZE(pIn
ec40: 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  1);.  if( rc ) g
ec50: 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
ec60: 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
ec70: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ec80: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
ec90: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71 20  ../* Opcode: Eq 
eca0: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
ecb0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
ecc0: 5b 50 33 5d 3d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  [P3]==r[P1].**.*
ecd0: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
ece0: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
ecf0: 20 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66 20   P1 and P3.  If 
ed00: 72 65 67 28 50 33 29 3d 3d 72 65 67 28 50 31 29  reg(P3)==reg(P1)
ed10: 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f   then.** jump to
ed20: 20 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72   address P2.  Or
ed30: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   if the SQLITE_S
ed40: 54 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20 73  TOREP2 flag is s
ed50: 65 74 20 69 6e 20 50 35 2c 20 74 68 65 6e 0a 2a  et in P5, then.*
ed60: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
ed70: 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
ed80: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
ed90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
eda0: 45 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69  E_AFF_MASK porti
edb0: 6f 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65  on of P5 must be
edc0: 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
edd0: 72 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49  racter -.** SQLI
ede0: 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c  TE_AFF_TEXT, SQL
edf0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c  ITE_AFF_INTEGER,
ee00: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41   and so forth. A
ee10: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
ee20: 65 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20  e .** to coerce 
ee30: 62 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f  both inputs acco
ee40: 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66  rding to this af
ee50: 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68  finity before th
ee60: 65 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e.** comparison 
ee70: 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20  is made. If the 
ee80: 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20  SQLITE_AFF_MASK 
ee90: 69 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75  is 0x00, then nu
eea0: 6d 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74  meric.** affinit
eeb0: 79 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20  y is used. Note 
eec0: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
eed0: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72  y conversions ar
eee0: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b  e stored.** back
eef0: 20 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20   into the input 
ef00: 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64  registers P1 and
ef10: 20 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70   P3.  So this op
ef20: 63 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a  code can cause.*
ef30: 2a 20 70 65 72 73 69 73 74 65 6e 74 20 63 68 61  * persistent cha
ef40: 6e 67 65 73 20 74 6f 20 72 65 67 69 73 74 65 72  nges to register
ef50: 73 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a  s P1 and P3..**.
ef60: 2a 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76  ** Once any conv
ef70: 65 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b  ersions have tak
ef80: 65 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65  en place, and ne
ef90: 69 74 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e  ither value is N
efa0: 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c  ULL, .** the val
efb0: 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  ues are compared
efc0: 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
efd0: 20 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20   are blobs then 
efe0: 6d 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75  memcmp() is.** u
eff0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
f000: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
f010: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
f020: 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
f030: 2a 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68 65  ** are text, the
f040: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
f050: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
f060: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
f070: 6e 0a 2a 2a 20 50 34 20 69 73 20 75 73 65 64 20  n.** P4 is used 
f080: 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72  to do the compar
f090: 69 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20  ison.  If P4 is 
f0a0: 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 68  not specified th
f0b0: 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69  en.** memcmp() i
f0c0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
f0d0: 65 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20  e text string.  
f0e0: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61  If both values a
f0f0: 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74  re.** numeric, t
f100: 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f  hen a numeric co
f110: 6d 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64  mparison is used
f120: 2e 20 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c  . If the two val
f130: 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69  ues.** are of di
f140: 66 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74  fferent types, t
f150: 68 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20  hen numbers are 
f160: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
f170: 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20  than.** strings 
f180: 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
f190: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
f1a0: 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a  than blobs..**.*
f1b0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  * If SQLITE_NULL
f1c0: 45 51 20 69 73 20 73 65 74 20 69 6e 20 50 35 20  EQ is set in P5 
f1d0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
f1e0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  of comparison is
f1f0: 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 0a 2a   always either.*
f200: 2a 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20  * true or false 
f210: 61 6e 64 20 69 73 20 6e 65 76 65 72 20 4e 55 4c  and is never NUL
f220: 4c 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65 72  L.  If both oper
f230: 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 74 68  ands are NULL th
f240: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  en the result.**
f250: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
f260: 73 20 74 72 75 65 2e 20 20 49 66 20 65 69 74 68  s true.  If eith
f270: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
f280: 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  LL then the resu
f290: 6c 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20  lt is false..** 
f2a0: 49 66 20 6e 65 69 74 68 65 72 20 6f 70 65 72 61  If neither opera
f2b0: 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 20 72  nd is NULL the r
f2c0: 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d  esult is the sam
f2d0: 65 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65  e as it would be
f2e0: 20 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54   if.** the SQLIT
f2f0: 45 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65  E_NULLEQ flag we
f300: 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  re omitted from 
f310: 50 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74  P5..**.** If bot
f320: 68 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  h SQLITE_STOREP2
f330: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4b 45 45 50   and SQLITE_KEEP
f340: 4e 55 4c 4c 20 66 6c 61 67 73 20 61 72 65 20 73  NULL flags are s
f350: 65 74 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63  et then the.** c
f360: 6f 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20  ontent of r[P2] 
f370: 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20  is only changed 
f380: 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  if the new value
f390: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 30 20 28 66   is NULL or 0 (f
f3a0: 61 6c 73 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68  alse)..** In oth
f3b0: 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 69 6f  er words, a prio
f3c0: 72 20 72 5b 50 32 5d 20 76 61 6c 75 65 20 77 69  r r[P2] value wi
f3d0: 6c 6c 20 6e 6f 74 20 62 65 20 6f 76 65 72 77 72  ll not be overwr
f3e0: 69 74 74 65 6e 20 62 79 20 31 20 28 74 72 75 65  itten by 1 (true
f3f0: 29 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  )..*/./* Opcode:
f400: 20 4e 65 20 50 31 20 50 32 20 50 33 20 50 34 20   Ne P1 P2 P3 P4 
f410: 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
f420: 49 46 20 72 5b 50 33 5d 21 3d 72 5b 50 31 5d 0a  IF r[P3]!=r[P1].
f430: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
f440: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 45   just like the E
f450: 71 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  q opcode except 
f460: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
f470: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
f480: 20 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65 67   operands in reg
f490: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33  isters P1 and P3
f4a0: 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2e 20   are not equal. 
f4b0: 20 53 65 65 20 74 68 65 20 45 71 20 6f 70 63 6f   See the Eq opco
f4c0: 64 65 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69  de for.** additi
f4d0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
f4e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20  ..**.** If both 
f4f0: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 61  SQLITE_STOREP2 a
f500: 6e 64 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  nd SQLITE_KEEPNU
f510: 4c 4c 20 66 6c 61 67 73 20 61 72 65 20 73 65 74  LL flags are set
f520: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e   then the.** con
f530: 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69 73  tent of r[P2] is
f540: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66   only changed if
f550: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69   the new value i
f560: 73 20 4e 55 4c 4c 20 6f 72 20 31 20 28 74 72 75  s NULL or 1 (tru
f570: 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  e)..** In other 
f580: 77 6f 72 64 73 2c 20 61 20 70 72 69 6f 72 20 72  words, a prior r
f590: 5b 50 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c 20  [P2] value will 
f5a0: 6e 6f 74 20 62 65 20 6f 76 65 72 77 72 69 74 74  not be overwritt
f5b0: 65 6e 20 62 79 20 30 20 28 66 61 6c 73 65 29 2e  en by 0 (false).
f5c0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  .*/./* Opcode: L
f5d0: 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
f5e0: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46  .** Synopsis: IF
f5f0: 20 72 5b 50 33 5d 3c 72 5b 50 31 5d 0a 2a 2a 0a   r[P3]<r[P1].**.
f600: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
f610: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
f620: 72 20 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66  r P1 and P3.  If
f630: 20 72 65 67 28 50 33 29 3c 72 65 67 28 50 31 29   reg(P3)<reg(P1)
f640: 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f   then.** jump to
f650: 20 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72   address P2.  Or
f660: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   if the SQLITE_S
f670: 54 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20 73  TOREP2 flag is s
f680: 65 74 20 69 6e 20 50 35 20 73 74 6f 72 65 0a 2a  et in P5 store.*
f690: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
f6a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 28 30 20 6f 72  comparison (0 or
f6b0: 20 31 20 6f 72 20 4e 55 4c 4c 29 20 69 6e 74 6f   1 or NULL) into
f6c0: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
f6d0: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
f6e0: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74  E_JUMPIFNULL bit
f6f0: 20 6f 66 20 50 35 20 69 73 20 73 65 74 20 61 6e   of P5 is set an
f700: 64 20 65 69 74 68 65 72 20 72 65 67 28 50 31 29  d either reg(P1)
f710: 20 6f 72 0a 2a 2a 20 72 65 67 28 50 33 29 20 69   or.** reg(P3) i
f720: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  s NULL then the 
f730: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 20  take the jump.  
f740: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  If the SQLITE_JU
f750: 4d 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74  MPIFNULL .** bit
f760: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 66   is clear then f
f770: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 65  all through if e
f780: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
f790: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
f7a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
f7b0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20 6d   portion of P5 m
f7c0: 75 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e 69  ust be an affini
f7d0: 74 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a 2a  ty character -.*
f7e0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  * SQLITE_AFF_TEX
f7f0: 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  T, SQLITE_AFF_IN
f800: 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66 6f  TEGER, and so fo
f810: 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  rth. An attempt 
f820: 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 63  is made .** to c
f830: 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75 74  oerce both input
f840: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
f850: 68 69 73 20 61 66 66 69 6e 69 74 79 20 62 65 66  his affinity bef
f860: 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 61  ore the.** compa
f870: 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20 49  rison is made. I
f880: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
f890: 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20 74  _MASK is 0x00, t
f8a0: 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 61  hen numeric.** a
f8b0: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 2e  ffinity is used.
f8c0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
f8d0: 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73 69  ffinity conversi
f8e0: 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  ons are stored.*
f8f0: 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  * back into the 
f900: 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20  input registers 
f910: 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20 74  P1 and P3.  So t
f920: 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20 63  his opcode can c
f930: 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74 65  ause.** persiste
f940: 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72 65  nt changes to re
f950: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
f960: 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  3..**.** Once an
f970: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68 61  y conversions ha
f980: 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c 20  ve taken place, 
f990: 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c 75  and neither valu
f9a0: 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74  e is NULL, .** t
f9b0: 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  he values are co
f9c0: 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68 20  mpared. If both 
f9d0: 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62 73  values are blobs
f9e0: 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20 69   then memcmp() i
f9f0: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74  s.** used to det
fa00: 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75 6c  ermine the resul
fa10: 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  ts of the compar
fa20: 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 76  ison.  If both v
fa30: 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65 78  alues.** are tex
fa40: 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70 72  t, then the appr
fa50: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
fa60: 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69  g function speci
fa70: 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69 73  fied in.** P4 is
fa80: 20 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65    used to do the
fa90: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
faa0: 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63 69   P4 is not speci
fab0: 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d  fied then.** mem
fac0: 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74 6f  cmp() is used to
fad0: 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73 74   compare text st
fae0: 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 76  ring.  If both v
faf0: 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d  alues are.** num
fb00: 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d  eric, then a num
fb10: 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20  eric comparison 
fb20: 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65 20  is used. If the 
fb30: 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  two values.** ar
fb40: 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 74  e of different t
fb50: 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65  ypes, then numbe
fb60: 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
fb70: 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73  d less than.** s
fb80: 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69 6e  trings and strin
fb90: 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  gs are considere
fba0: 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62  d less than blob
fbb0: 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  s..*/./* Opcode:
fbc0: 20 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20   Le P1 P2 P3 P4 
fbd0: 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
fbe0: 49 46 20 72 5b 50 33 5d 3c 3d 72 5b 50 31 5d 0a  IF r[P3]<=r[P1].
fbf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
fc00: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c   just like the L
fc10: 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  t opcode except 
fc20: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
fc30: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
fc40: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
fc50: 73 74 65 72 20 50 33 20 69 73 20 6c 65 73 73 20  ster P3 is less 
fc60: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
fc70: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
fc80: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  ** register P1. 
fc90: 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f   See the Lt opco
fca0: 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
fcb0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
fcc0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74 20  /./* Opcode: Gt 
fcd0: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
fce0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
fcf0: 5b 50 33 5d 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  [P3]>r[P1].**.**
fd00: 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74   This works just
fd10: 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63   like the Lt opc
fd20: 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ode except that 
fd30: 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
fd40: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  n if.** the cont
fd50: 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
fd60: 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68  P3 is greater th
fd70: 61 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  an the content o
fd80: 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31  f.** register P1
fd90: 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70  .  See the Lt op
fda0: 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f  code for additio
fdb0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
fdc0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47  .*/./* Opcode: G
fdd0: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
fde0: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46  .** Synopsis: IF
fdf0: 20 72 5b 50 33 5d 3e 3d 72 5b 50 31 5d 0a 2a 2a   r[P3]>=r[P1].**
fe00: 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
fe10: 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20  ust like the Lt 
fe20: 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68  opcode except th
fe30: 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  at the jump is t
fe40: 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63  aken if.** the c
fe50: 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
fe60: 65 72 20 50 33 20 69 73 20 67 72 65 61 74 65 72  er P3 is greater
fe70: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fe80: 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  o the content of
fe90: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e  .** register P1.
fea0: 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63    See the Lt opc
feb0: 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
fec0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
fed0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 71 3a 20 20  */.case OP_Eq:  
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fef0: 73 61 6d 65 20 61 73 20 54 4b 5f 45 51 2c 20 6a  same as TK_EQ, j
ff00: 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
ff10: 0a 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20  .case OP_Ne:    
ff20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
ff30: 6d 65 20 61 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d  me as TK_NE, jum
ff40: 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63  p, in1, in3 */.c
ff50: 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 20 20  ase OP_Lt:      
ff60: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
ff70: 20 61 73 20 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c   as TK_LT, jump,
ff80: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
ff90: 65 20 4f 50 5f 4c 65 3a 20 20 20 20 20 20 20 20  e OP_Le:        
ffa0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
ffb0: 73 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69  s TK_LE, jump, i
ffc0: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
ffd0: 4f 50 5f 47 74 3a 20 20 20 20 20 20 20 20 20 20  OP_Gt:          
ffe0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
fff0: 54 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_GT, jump, in1
10000 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
10010 5f 47 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  _Ge: {          
10020 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
10030 5f 47 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _GE, jump, in1, 
10040 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  in3 */.  int res
10050 2c 20 72 65 73 32 3b 20 20 20 20 20 20 2f 2a 20  , res2;      /* 
10060 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  Result of the co
10070 6d 70 61 72 69 73 6f 6e 20 6f 66 20 70 49 6e 31  mparison of pIn1
10080 20 61 67 61 69 6e 73 74 20 70 49 6e 33 20 2a 2f   against pIn3 */
10090 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79  .  char affinity
100a0 3b 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69  ;      /* Affini
100b0 74 79 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f  ty to use for co
100c0 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 31  mparison */.  u1
100d0 36 20 66 6c 61 67 73 31 3b 20 20 20 20 20 20 20  6 flags1;       
100e0 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69    /* Copy of ini
100f0 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49  tial value of pI
10100 6e 31 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20 20 75  n1->flags */.  u
10110 31 36 20 66 6c 61 67 73 33 3b 20 20 20 20 20 20  16 flags3;      
10120 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e     /* Copy of in
10130 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
10140 49 6e 33 2d 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20  In3->flags */.. 
10150 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
10160 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d  p->p1];.  pIn3 =
10170 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
10180 0a 20 20 66 6c 61 67 73 31 20 3d 20 70 49 6e 31  .  flags1 = pIn1
10190 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 6c 61 67 73  ->flags;.  flags
101a0 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b  3 = pIn3->flags;
101b0 0a 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c  .  if( (flags1 |
101c0 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 4e 75 6c   flags3)&MEM_Nul
101d0 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  l ){.    /* One 
101e0 6f 72 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  or both operands
101f0 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   are NULL */.   
10200 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53   if( pOp->p5 & S
10210 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a  QLITE_NULLEQ ){.
10220 20 20 20 20 20 20 2f 2a 20 49 66 20 53 51 4c 49        /* If SQLI
10230 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74  TE_NULLEQ is set
10240 20 28 77 68 69 63 68 20 77 69 6c 6c 20 6f 6e 6c   (which will onl
10250 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
10260 6f 70 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  operator is.    
10270 20 20 2a 2a 20 4f 50 5f 45 71 20 6f 72 20 4f 50    ** OP_Eq or OP
10280 5f 4e 65 29 20 74 68 65 6e 20 74 61 6b 65 20 74  _Ne) then take t
10290 68 65 20 6a 75 6d 70 20 6f 72 20 6e 6f 74 20 64  he jump or not d
102a0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
102b0 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  her.      ** or 
102c0 6e 6f 74 20 62 6f 74 68 20 6f 70 65 72 61 6e 64  not both operand
102d0 73 20 61 72 65 20 6e 75 6c 6c 2e 0a 20 20 20 20  s are null..    
102e0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
102f0 74 28 20 28 66 6c 61 67 73 31 20 26 20 4d 45 4d  t( (flags1 & MEM
10300 5f 43 6c 65 61 72 65 64 29 3d 3d 30 20 29 3b 0a  _Cleared)==0 );.
10310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
10320 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f  Op->p5 & SQLITE_
10330 4a 55 4d 50 49 46 4e 55 4c 4c 29 3d 3d 30 20 7c  JUMPIFNULL)==0 |
10340 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
10350 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10360 28 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54  (pOp->p5 & SQLIT
10370 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 21 3d 30  E_JUMPIFNULL)!=0
10380 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66   );.      if( (f
10390 6c 61 67 73 31 26 66 6c 61 67 73 33 26 4d 45 4d  lags1&flags3&MEM
103a0 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20 20 20 20 20  _Null)!=0.      
103b0 20 26 26 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f   && (flags3&MEM_
103c0 43 6c 65 61 72 65 64 29 3d 3d 30 0a 20 20 20 20  Cleared)==0.    
103d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73    ){.        res
103e0 20 3d 20 30 3b 20 20 2f 2a 20 4f 70 65 72 61 6e   = 0;  /* Operan
103f0 64 73 20 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a  ds are equal */.
10400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10410 20 20 20 20 20 72 65 73 20 3d 20 28 28 66 6c 61       res = ((fla
10420 67 73 33 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  gs3 & MEM_Null) 
10430 3f 20 2d 31 20 3a 20 2b 31 29 3b 20 20 2f 2a 20  ? -1 : +1);  /* 
10440 4f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 6f 74  Operands are not
10450 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20   equal */.      
10460 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
10470 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c     /* SQLITE_NUL
10480 4c 45 51 20 69 73 20 63 6c 65 61 72 20 61 6e 64  LEQ is clear and
10490 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
104a0 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 0a 20  erand is NULL,. 
104b0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
104c0 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79   result is alway
104d0 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2a  s NULL..      **
104e0 20 54 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   The jump is tak
104f0 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  en if the SQLITE
10500 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20  _JUMPIFNULL bit 
10510 69 73 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f  is set..      */
10520 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
10530 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52  p5 & SQLITE_STOR
10540 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70  EP2 ){.        p
10550 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
10560 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20 20 69 43  >p2];.        iC
10570 6f 6d 70 61 72 65 20 3d 20 31 3b 20 20 20 20 2f  ompare = 1;    /
10580 2a 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20 6e  * Operands are n
10590 6f 74 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20  ot equal */.    
105a0 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
105b0 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20  ange(p, pOut);. 
105c0 20 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70         MemSetTyp
105d0 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
105e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 52  Null);.        R
105f0 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
10600 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20  p->p2, pOut);.  
10610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10620 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
10630 65 6e 28 32 2c 33 29 3b 0a 20 20 20 20 20 20 20  en(2,3);.       
10640 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53   if( pOp->p5 & S
10650 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
10660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
10670 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
10680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10690 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
106a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
106b0 20 2f 2a 20 4e 65 69 74 68 65 72 20 6f 70 65 72   /* Neither oper
106c0 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 20 20 44 6f  and is NULL.  Do
106d0 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 2a   a comparison. *
106e0 2f 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d  /.    affinity =
106f0 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
10700 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a 20 20 20 20  E_AFF_MASK;.    
10710 69 66 28 20 61 66 66 69 6e 69 74 79 3e 3d 53 51  if( affinity>=SQ
10720 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
10730 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
10740 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33 29 26  lags1 | flags3)&
10750 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
10760 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 26     if( (flags1 &
10770 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e   (MEM_Int|MEM_In
10780 74 52 65 61 6c 7c 4d 45 4d 5f 52 65 61 6c 7c 4d  tReal|MEM_Real|M
10790 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74  EM_Str))==MEM_St
107a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  r ){.          a
107b0 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
107c0 69 74 79 28 70 49 6e 31 2c 30 29 3b 0a 20 20 20  ity(pIn1,0);.   
107d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
107e0 6c 61 67 73 33 3d 3d 70 49 6e 33 2d 3e 66 6c 61  lags3==pIn3->fla
107f0 67 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gs );.          
10800 2f 2a 20 74 65 73 74 63 61 73 65 28 20 66 6c 61  /* testcase( fla
10810 67 73 33 21 3d 70 49 6e 33 2d 3e 66 6c 61 67 73  gs3!=pIn3->flags
10820 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   );.          **
10830 20 74 68 69 73 20 75 73 65 64 20 74 6f 20 62 65   this used to be
10840 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 70   possible with p
10850 49 6e 31 3d 3d 70 49 6e 33 2c 20 62 75 74 20 6e  In1==pIn3, but n
10860 6f 74 20 73 69 6e 63 65 0a 20 20 20 20 20 20 20  ot since.       
10870 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e     ** the column
10880 20 63 61 63 68 65 20 77 61 73 20 72 65 6d 6f 76   cache was remov
10890 65 64 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ed.  The followi
108a0 6e 67 20 61 73 73 69 67 6e 6d 65 6e 74 0a 20 20  ng assignment.  
108b0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 65 73          ** is es
108c0 73 65 6e 74 69 61 6c 6c 79 20 61 20 6e 6f 2d 6f  sentially a no-o
108d0 70 2e 20 20 42 75 74 2c 20 69 74 20 70 72 6f 76  p.  But, it prov
108e0 69 64 65 73 20 64 65 66 65 6e 73 65 2d 69 6e 2d  ides defense-in-
108f0 64 65 70 74 68 0a 20 20 20 20 20 20 20 20 20 20  depth.          
10900 2a 2a 20 69 6e 20 63 61 73 65 20 6f 75 72 20 61  ** in case our a
10910 6e 61 6c 79 73 69 73 20 69 73 20 69 6e 63 6f 72  nalysis is incor
10920 72 65 63 74 2c 20 73 6f 20 69 74 20 69 73 20 6c  rect, so it is l
10930 65 66 74 20 69 6e 2e 20 2a 2f 0a 20 20 20 20 20  eft in. */.     
10940 20 20 20 20 20 66 6c 61 67 73 33 20 3d 20 70 49       flags3 = pI
10950 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  n3->flags;.     
10960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10970 20 28 66 6c 61 67 73 33 20 26 20 28 4d 45 4d 5f   (flags3 & (MEM_
10980 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c  Int|MEM_IntReal|
10990 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72  MEM_Real|MEM_Str
109a0 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ))==MEM_Str ){. 
109b0 20 20 20 20 20 20 20 20 20 61 70 70 6c 79 4e 75           applyNu
109c0 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49  mericAffinity(pI
109d0 6e 33 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  n3,0);.        }
109e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
109f0 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 63 6f 6d  * Handle the com
10a00 6d 6f 6e 20 63 61 73 65 20 6f 66 20 69 6e 74 65  mon case of inte
10a10 67 65 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 68  ger comparison h
10a20 65 72 65 2c 20 61 73 20 61 6e 0a 20 20 20 20 20  ere, as an.     
10a30 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
10a40 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 63 61 6c  , to avoid a cal
10a50 6c 20 74 6f 20 73 71 6c 69 74 65 33 4d 65 6d 43  l to sqlite3MemC
10a60 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 20 20  ompare() */.    
10a70 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
10a80 67 73 20 26 20 70 49 6e 33 2d 3e 66 6c 61 67 73  gs & pIn3->flags
10a90 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
10aa0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
10ab0 6e 33 2d 3e 75 2e 69 20 3e 20 70 49 6e 31 2d 3e  n3->u.i > pIn1->
10ac0 75 2e 69 20 29 7b 20 72 65 73 20 3d 20 2b 31 3b  u.i ){ res = +1;
10ad0 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70   goto compare_op
10ae0 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
10af0 70 49 6e 33 2d 3e 75 2e 69 20 3c 20 70 49 6e 31  pIn3->u.i < pIn1
10b00 2d 3e 75 2e 69 20 29 7b 20 72 65 73 20 3d 20 2d  ->u.i ){ res = -
10b10 31 3b 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65 5f  1; goto compare_
10b20 6f 70 3b 20 7d 0a 20 20 20 20 20 20 20 20 72 65  op; }.        re
10b30 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  s = 0;.        g
10b40 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 0a  oto compare_op;.
10b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10b60 65 20 69 66 28 20 61 66 66 69 6e 69 74 79 3d 3d  e if( affinity==
10b70 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
10b80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c  ){.      if( (fl
10b90 61 67 73 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d  ags1 & MEM_Str)=
10ba0 3d 30 20 26 26 20 28 66 6c 61 67 73 31 26 28 4d  =0 && (flags1&(M
10bb0 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c  EM_Int|MEM_Real|
10bc0 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30  MEM_IntReal))!=0
10bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
10be0 63 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67  case( pIn1->flag
10bf0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
10c00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
10c10 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
10c20 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  EM_Real );.     
10c30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e     testcase( pIn
10c40 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  1->flags & MEM_I
10c50 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  ntReal );.      
10c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
10c70 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c 20  Stringify(pIn1, 
10c80 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a 20 20  encoding, 1);.  
10c90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10ca0 28 66 6c 61 67 73 31 26 4d 45 4d 5f 44 79 6e 29  (flags1&MEM_Dyn)
10cb0 20 21 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73   != (pIn1->flags
10cc0 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20  &MEM_Dyn) );.   
10cd0 20 20 20 20 20 66 6c 61 67 73 31 20 3d 20 28 70       flags1 = (p
10ce0 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45  In1->flags & ~ME
10cf0 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66  M_TypeMask) | (f
10d00 6c 61 67 73 31 20 26 20 4d 45 4d 5f 54 79 70 65  lags1 & MEM_Type
10d10 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 61  Mask);.        a
10d20 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 49 6e  ssert( pIn1!=pIn
10d30 33 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  3 );.      }.   
10d40 20 20 20 69 66 28 20 28 66 6c 61 67 73 33 20 26     if( (flags3 &
10d50 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20   MEM_Str)==0 && 
10d60 28 66 6c 61 67 73 33 26 28 4d 45 4d 5f 49 6e 74  (flags3&(MEM_Int
10d70 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  |MEM_Real|MEM_In
10d80 74 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20  tReal))!=0 ){.  
10d90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10da0 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
10db0 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  M_Int );.       
10dc0 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 33 2d   testcase( pIn3-
10dd0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
10de0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  l );.        tes
10df0 74 63 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c 61  tcase( pIn3->fla
10e00 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c  gs & MEM_IntReal
10e10 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
10e20 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67  te3VdbeMemString
10e30 69 66 79 28 70 49 6e 33 2c 20 65 6e 63 6f 64 69  ify(pIn3, encodi
10e40 6e 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ng, 1);.        
10e50 74 65 73 74 63 61 73 65 28 20 28 66 6c 61 67 73  testcase( (flags
10e60 33 26 4d 45 4d 5f 44 79 6e 29 20 21 3d 20 28 70  3&MEM_Dyn) != (p
10e70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44  In3->flags&MEM_D
10e80 79 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 66  yn) );.        f
10e90 6c 61 67 73 33 20 3d 20 28 70 49 6e 33 2d 3e 66  lags3 = (pIn3->f
10ea0 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54 79 70 65  lags & ~MEM_Type
10eb0 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67 73 33 20  Mask) | (flags3 
10ec0 26 20 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b  & MEM_TypeMask);
10ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10ee0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
10ef0 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
10f00 45 51 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 70 43  EQ || pOp->p4.pC
10f10 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  oll==0 );.    re
10f20 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
10f30 6d 70 61 72 65 28 70 49 6e 33 2c 20 70 49 6e 31  mpare(pIn3, pIn1
10f40 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 29  , pOp->p4.pColl)
10f50 3b 0a 20 20 7d 0a 63 6f 6d 70 61 72 65 5f 6f 70  ;.  }.compare_op
10f60 3a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  :.  /* At this p
10f70 6f 69 6e 74 2c 20 72 65 73 20 69 73 20 6e 65 67  oint, res is neg
10f80 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
10f90 70 6f 73 69 74 69 76 65 20 69 66 20 72 65 67 5b  positive if reg[
10fa0 50 31 5d 20 69 73 0a 20 20 2a 2a 20 6c 65 73 73  P1] is.  ** less
10fb0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
10fc0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
10fd0 20 72 65 67 5b 50 33 5d 2c 20 72 65 73 70 65 63   reg[P3], respec
10fe0 74 69 76 65 6c 79 2e 20 20 43 6f 6d 70 75 74 65  tively.  Compute
10ff0 0a 20 20 2a 2a 20 74 68 65 20 61 6e 73 77 65 72  .  ** the answer
11000 20 74 6f 20 74 68 69 73 20 6f 70 65 72 61 74 6f   to this operato
11010 72 20 69 6e 20 72 65 73 32 2c 20 64 65 70 65 6e  r in res2, depen
11020 64 69 6e 67 20 6f 6e 20 77 68 61 74 20 74 68 65  ding on what the
11030 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 2a 2a   comparison.  **
11040 20 6f 70 65 72 61 74 6f 72 20 61 63 74 75 61 6c   operator actual
11050 6c 79 20 69 73 2e 20 20 54 68 65 20 6e 65 78 74  ly is.  The next
11060 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 64   block of code d
11070 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
11080 63 74 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ct.  ** that the
11090 20 36 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   6 comparison op
110a0 65 72 61 74 6f 72 73 20 61 72 65 20 63 6f 6e 73  erators are cons
110b0 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
110c0 20 69 6e 20 74 68 69 73 0a 20 20 2a 2a 20 6f 72   in this.  ** or
110d0 64 65 72 3a 20 20 4e 45 2c 20 45 51 2c 20 47 54  der:  NE, EQ, GT
110e0 2c 20 4c 45 2c 20 4c 54 2c 20 47 45 20 2a 2f 0a  , LE, LT, GE */.
110f0 20 20 61 73 73 65 72 74 28 20 4f 50 5f 45 71 3d    assert( OP_Eq=
11100 3d 4f 50 5f 4e 65 2b 31 20 29 3b 20 61 73 73 65  =OP_Ne+1 ); asse
11110 72 74 28 20 4f 50 5f 47 74 3d 3d 4f 50 5f 4e 65  rt( OP_Gt==OP_Ne
11120 2b 32 20 29 3b 20 61 73 73 65 72 74 28 20 4f 50  +2 ); assert( OP
11130 5f 4c 65 3d 3d 4f 50 5f 4e 65 2b 33 20 29 3b 0a  _Le==OP_Ne+3 );.
11140 20 20 61 73 73 65 72 74 28 20 4f 50 5f 4c 74 3d    assert( OP_Lt=
11150 3d 4f 50 5f 4e 65 2b 34 20 29 3b 20 61 73 73 65  =OP_Ne+4 ); asse
11160 72 74 28 20 4f 50 5f 47 65 3d 3d 4f 50 5f 4e 65  rt( OP_Ge==OP_Ne
11170 2b 35 20 29 3b 0a 20 20 69 66 28 20 72 65 73 3c  +5 );.  if( res<
11180 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
11190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
111a0 65 2c 20 65 71 2c 20 67 74 2c 20 6c 65 2c 20 6c  e, eq, gt, le, l
111b0 74 2c 20 67 65 20 2a 2f 0a 20 20 20 20 73 74 61  t, ge */.    sta
111c0 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
111d0 65 64 20 63 68 61 72 20 61 4c 54 62 5b 5d 20 3d  ed char aLTb[] =
111e0 20 7b 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 31   { 1,  0,  0,  1
111f0 2c 20 20 31 2c 20 20 30 20 7d 3b 0a 20 20 20 20  ,  1,  0 };.    
11200 72 65 73 32 20 3d 20 61 4c 54 62 5b 70 4f 70 2d  res2 = aLTb[pOp-
11210 3e 6f 70 63 6f 64 65 20 2d 20 4f 50 5f 4e 65 5d  >opcode - OP_Ne]
11220 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65  ;.  }else if( re
11230 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  s==0 ){.    stat
11240 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
11250 64 20 63 68 61 72 20 61 45 51 62 5b 5d 20 3d 20  d char aEQb[] = 
11260 7b 20 30 2c 20 20 31 2c 20 20 30 2c 20 20 31 2c  { 0,  1,  0,  1,
11270 20 20 30 2c 20 20 31 20 7d 3b 0a 20 20 20 20 72    0,  1 };.    r
11280 65 73 32 20 3d 20 61 45 51 62 5b 70 4f 70 2d 3e  es2 = aEQb[pOp->
11290 6f 70 63 6f 64 65 20 2d 20 4f 50 5f 4e 65 5d 3b  opcode - OP_Ne];
112a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
112b0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
112c0 6e 65 64 20 63 68 61 72 20 61 47 54 62 5b 5d 20  ned char aGTb[] 
112d0 3d 20 7b 20 31 2c 20 20 30 2c 20 20 31 2c 20 20  = { 1,  0,  1,  
112e0 30 2c 20 20 30 2c 20 20 31 20 7d 3b 0a 20 20 20  0,  0,  1 };.   
112f0 20 72 65 73 32 20 3d 20 61 47 54 62 5b 70 4f 70   res2 = aGTb[pOp
11300 2d 3e 6f 70 63 6f 64 65 20 2d 20 4f 50 5f 4e 65  ->opcode - OP_Ne
11310 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64  ];.  }..  /* Und
11320 6f 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  o any changes ma
11330 64 65 20 62 79 20 61 70 70 6c 79 41 66 66 69 6e  de by applyAffin
11340 69 74 79 28 29 20 74 6f 20 74 68 65 20 69 6e 70  ity() to the inp
11350 75 74 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f  ut registers. */
11360 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31  .  assert( (pIn1
11370 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
11380 6e 29 20 3d 3d 20 28 66 6c 61 67 73 31 20 26 20  n) == (flags1 & 
11390 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 70 49  MEM_Dyn) );.  pI
113a0 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  n1->flags = flag
113b0 73 31 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  s1;.  assert( (p
113c0 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
113d0 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73 33  _Dyn) == (flags3
113e0 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20   & MEM_Dyn) );. 
113f0 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 66   pIn3->flags = f
11400 6c 61 67 73 33 3b 0a 0a 20 20 69 66 28 20 70 4f  lags3;..  if( pO
11410 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53  p->p5 & SQLITE_S
11420 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 70 4f  TOREP2 ){.    pO
11430 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
11440 70 32 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72  p2];.    iCompar
11450 65 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28  e = res;.    if(
11460 20 28 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49   (pOp->p5 & SQLI
11470 54 45 5f 4b 45 45 50 4e 55 4c 4c 29 21 3d 30 20  TE_KEEPNULL)!=0 
11480 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
11490 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67 20 70 72  KEEPNULL flag pr
114a0 65 76 65 6e 74 73 20 4f 50 5f 45 71 20 66 72 6f  events OP_Eq fro
114b0 6d 20 6f 76 65 72 77 72 69 74 69 6e 67 20 61 20  m overwriting a 
114c0 4e 55 4c 4c 20 77 69 74 68 20 31 0a 20 20 20 20  NULL with 1.    
114d0 20 20 2a 2a 20 61 6e 64 20 70 72 65 76 65 6e 74    ** and prevent
114e0 73 20 4f 50 5f 4e 65 20 66 72 6f 6d 20 6f 76 65  s OP_Ne from ove
114f0 72 77 72 69 74 69 6e 67 20 4e 55 4c 4c 20 77 69  rwriting NULL wi
11500 74 68 20 30 2e 20 20 54 68 69 73 20 66 6c 61 67  th 0.  This flag
11510 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 6e 6c  .      ** is onl
11520 79 20 75 73 65 64 20 69 6e 20 63 6f 6e 74 65 78  y used in contex
11530 74 73 20 77 68 65 72 65 20 65 69 74 68 65 72 3a  ts where either:
11540 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 31 29 20  .      **   (1) 
11550 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 28 72 5b  op==OP_Eq && (r[
11560 50 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50  P2]==NULL || r[P
11570 32 5d 3d 3d 30 29 0a 20 20 20 20 20 20 2a 2a 20  2]==0).      ** 
11580 20 20 28 32 29 20 6f 70 3d 3d 4f 50 5f 4e 65 20    (2) op==OP_Ne 
11590 26 26 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20  && (r[P2]==NULL 
115a0 7c 7c 20 72 5b 50 32 5d 3d 3d 31 29 0a 20 20 20  || r[P2]==1).   
115b0 20 20 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20     ** Therefore 
115c0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
115d0 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68 65  ary to check the
115e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32   content of r[P2
115f0 5d 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 4e  ] for.      ** N
11600 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ULL. */.      as
11610 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
11620 65 3d 3d 4f 50 5f 4e 65 20 7c 7c 20 70 4f 70 2d  e==OP_Ne || pOp-
11630 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 29  >opcode==OP_Eq )
11640 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11650 72 65 73 32 3d 3d 30 20 7c 7c 20 72 65 73 32 3d  res2==0 || res2=
11660 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =1 );.      test
11670 63 61 73 65 28 20 72 65 73 32 3d 3d 30 20 26 26  case( res2==0 &&
11680 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
11690 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Eq );.      tes
116a0 74 63 61 73 65 28 20 72 65 73 32 3d 3d 31 20 26  tcase( res2==1 &
116b0 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  & pOp->opcode==O
116c0 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Eq );.      te
116d0 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d 30 20  stcase( res2==0 
116e0 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  && pOp->opcode==
116f0 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74  OP_Ne );.      t
11700 65 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d 31  estcase( res2==1
11710 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   && pOp->opcode=
11720 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
11730 69 66 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  if( (pOp->opcode
11740 3d 3d 4f 50 5f 45 71 29 3d 3d 72 65 73 32 20 29  ==OP_Eq)==res2 )
11750 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11760 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
11770 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20  ge(p, pOut);.   
11780 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
11790 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pOut, MEM_Int);.
117a0 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20      pOut->u.i = 
117b0 72 65 73 32 3b 0a 20 20 20 20 52 45 47 49 53 54  res2;.    REGIST
117c0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
117d0 2c 20 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  , pOut);.  }else
117e0 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  {.    VdbeBranch
117f0 54 61 6b 65 6e 28 72 65 73 32 21 3d 30 2c 20 28  Taken(res2!=0, (
11800 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
11810 5f 4e 55 4c 4c 45 51 29 3f 32 3a 33 29 3b 0a 20  _NULLEQ)?2:3);. 
11820 20 20 20 69 66 28 20 72 65 73 32 20 29 7b 0a 20     if( res2 ){. 
11830 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74       goto jump_t
11840 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  o_p2;.    }.  }.
11850 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
11860 70 63 6f 64 65 3a 20 45 6c 73 65 4e 6f 74 45 71  pcode: ElseNotEq
11870 20 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   * P2 * * *.**.*
11880 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6d 75  * This opcode mu
11890 73 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  st immediately f
118a0 6f 6c 6c 6f 77 20 61 6e 20 4f 50 5f 4c 74 20 6f  ollow an OP_Lt o
118b0 72 20 4f 50 5f 47 74 20 63 6f 6d 70 61 72 69 73  r OP_Gt comparis
118c0 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  on operator..** 
118d0 49 66 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20  If result of an 
118e0 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f 6e  OP_Eq comparison
118f0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 77 6f   on the same two
11900 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75   operands.** wou
11910 6c 64 20 68 61 76 65 20 62 65 20 4e 55 4c 4c 20  ld have be NULL 
11920 6f 72 20 66 61 6c 73 65 20 28 30 29 2c 20 74 68  or false (0), th
11930 65 6e 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  en then jump to 
11940 50 32 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 72  P2. .** If the r
11950 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f 50 5f 45  esult of an OP_E
11960 71 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 6e 20  q comparison on 
11970 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73  the two previous
11980 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75   operands.** wou
11990 6c 64 20 68 61 76 65 20 62 65 65 6e 20 74 72 75  ld have been tru
119a0 65 20 28 31 29 2c 20 74 68 65 6e 20 66 61 6c 6c  e (1), then fall
119b0 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73   through..*/.cas
119c0 65 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 3a 20  e OP_ElseNotEq: 
119d0 7b 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20  {       /* same 
119e0 61 73 20 54 4b 5f 45 53 43 41 50 45 2c 20 6a 75  as TK_ESCAPE, ju
119f0 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  mp */.  assert( 
11a00 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 61 73 73  pOp>aOp );.  ass
11a10 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
11a20 6f 64 65 3d 3d 4f 50 5f 4c 74 20 7c 7c 20 70 4f  ode==OP_Lt || pO
11a30 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
11a40 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
11a50 20 70 4f 70 5b 2d 31 5d 2e 70 35 20 26 20 53 51   pOp[-1].p5 & SQ
11a60 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 3b 0a  LITE_STOREP2 );.
11a70 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
11a80 6e 28 69 43 6f 6d 70 61 72 65 21 3d 30 2c 20 32  n(iCompare!=0, 2
11a90 29 3b 0a 20 20 69 66 28 20 69 43 6f 6d 70 61 72  );.  if( iCompar
11aa0 65 21 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70  e!=0 ) goto jump
11ab0 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
11ac0 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  .}.../* Opcode: 
11ad0 50 65 72 6d 75 74 61 74 69 6f 6e 20 2a 20 2a 20  Permutation * * 
11ae0 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74  * P4 *.**.** Set
11af0 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
11b00 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f   used by the OP_
11b10 43 6f 6d 70 61 72 65 20 6f 70 65 72 61 74 6f 72  Compare operator
11b20 20 69 6e 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   in the next.** 
11b30 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
11b40 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73  e permutation is
11b50 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50   stored in the P
11b60 34 20 6f 70 65 72 61 6e 64 2e 0a 2a 2a 0a 2a 2a  4 operand..**.**
11b70 20 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   The permutation
11b80 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75   is only valid u
11b90 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 20 4f 50  ntil the next OP
11ba0 5f 43 6f 6d 70 61 72 65 20 74 68 61 74 20 68 61  _Compare that ha
11bb0 73 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f  s.** the OPFLAG_
11bc0 50 45 52 4d 55 54 45 20 62 69 74 20 73 65 74 20  PERMUTE bit set 
11bd0 69 6e 20 50 35 2e 20 54 79 70 69 63 61 6c 6c 79  in P5. Typically
11be0 20 74 68 65 20 4f 50 5f 50 65 72 6d 75 74 61 74   the OP_Permutat
11bf0 69 6f 6e 20 73 68 6f 75 6c 64 20 0a 2a 2a 20 6f  ion should .** o
11c00 63 63 75 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ccur immediately
11c10 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 4f 50   prior to the OP
11c20 5f 43 6f 6d 70 61 72 65 2e 0a 2a 2a 0a 2a 2a 20  _Compare..**.** 
11c30 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
11c40 72 20 69 6e 20 74 68 65 20 50 34 20 69 6e 74 65  r in the P4 inte
11c50 67 65 72 20 61 72 72 61 79 20 69 73 20 74 68 65  ger array is the
11c60 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 61   length of the a
11c70 72 72 61 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  rray.** and does
11c80 20 6e 6f 74 20 62 65 63 6f 6d 65 20 70 61 72 74   not become part
11c90 20 6f 66 20 74 68 65 20 70 65 72 6d 75 74 61 74   of the permutat
11ca0 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
11cb0 50 65 72 6d 75 74 61 74 69 6f 6e 3a 20 7b 0a 20  Permutation: {. 
11cc0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
11cd0 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41  type==P4_INTARRA
11ce0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
11cf0 4f 70 2d 3e 70 34 2e 61 69 20 29 3b 0a 20 20 61  Op->p4.ai );.  a
11d00 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 6f 70  ssert( pOp[1].op
11d10 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6d 70 61 72 65  code==OP_Compare
11d20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
11d30 70 5b 31 5d 2e 70 35 20 26 20 4f 50 46 4c 41 47  p[1].p5 & OPFLAG
11d40 5f 50 45 52 4d 55 54 45 20 29 3b 0a 20 20 62 72  _PERMUTE );.  br
11d50 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
11d60 65 3a 20 43 6f 6d 70 61 72 65 20 50 31 20 50 32  e: Compare P1 P2
11d70 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
11d80 6f 70 73 69 73 3a 20 72 5b 50 31 40 50 33 5d 20  opsis: r[P1@P3] 
11d90 3c 2d 3e 20 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a  <-> r[P2@P3].**.
11da0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 76  ** Compare two v
11db0 65 63 74 6f 72 73 20 6f 66 20 72 65 67 69 73 74  ectors of regist
11dc0 65 72 73 20 69 6e 20 72 65 67 28 50 31 29 2e 2e  ers in reg(P1)..
11dd0 72 65 67 28 50 31 2b 50 33 2d 31 29 20 28 63 61  reg(P1+P3-1) (ca
11de0 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65 63 74 6f  ll this.** vecto
11df0 72 20 22 41 22 29 20 61 6e 64 20 69 6e 20 72 65  r "A") and in re
11e00 67 28 50 32 29 2e 2e 72 65 67 28 50 32 2b 50 33  g(P2)..reg(P2+P3
11e10 2d 31 29 20 28 22 42 22 29 2e 20 20 53 61 76 65  -1) ("B").  Save
11e20 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
11e30 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
11e40 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
11e50 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73  next OP_Jump ins
11e60 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  truct..**.** If 
11e70 50 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c 41  P5 has the OPFLA
11e80 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20 73 65  G_PERMUTE bit se
11e90 74 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 64 65  t, then the orde
11ea0 72 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  r of comparison 
11eb0 69 73 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  is.** determined
11ec0 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
11ed0 65 6e 74 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  ent OP_Permutati
11ee0 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  on operator.  If
11ef0 20 74 68 65 0a 2a 2a 20 4f 50 46 4c 41 47 5f 50   the.** OPFLAG_P
11f00 45 52 4d 55 54 45 20 62 69 74 20 69 73 20 63 6c  ERMUTE bit is cl
11f10 65 61 72 2c 20 74 68 65 6e 20 72 65 67 69 73 74  ear, then regist
11f20 65 72 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20  er are compared 
11f30 69 6e 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  in sequential.**
11f40 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34   order..**.** P4
11f50 20 69 73 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   is a KeyInfo st
11f60 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
11f70 69 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ines collating s
11f80 65 71 75 65 6e 63 65 73 20 61 6e 64 20 73 6f 72  equences and sor
11f90 74 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f 72 20  t.** orders for 
11fa0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
11fb0 20 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   The permutation
11fc0 20 61 70 70 6c 69 65 73 20 74 6f 20 72 65 67 69   applies to regi
11fd0 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20  sters.** only.  
11fe0 54 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d  The KeyInfo elem
11ff0 65 6e 74 73 20 61 72 65 20 75 73 65 64 20 73 65  ents are used se
12000 71 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a  quentially..**.*
12010 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
12020 20 69 73 20 61 20 73 6f 72 74 20 63 6f 6d 70 61   is a sort compa
12030 72 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20  rison, so NULLs 
12040 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a  compare equal,.*
12050 2a 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65 73 73  * NULLs are less
12060 20 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e   than numbers, n
12070 75 6d 62 65 72 73 20 61 72 65 20 6c 65 73 73 20  umbers are less 
12080 74 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a  than strings,.**
12090 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65   and strings are
120a0 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73   less than blobs
120b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d  ..*/.case OP_Com
120c0 70 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b  pare: {.  int n;
120d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
120e0 70 31 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20  p1;.  int p2;.  
120f0 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
12100 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 69  KeyInfo;.  int i
12110 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dx;.  CollSeq *p
12120 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c  Coll;    /* Coll
12130 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
12140 6f 20 75 73 65 20 6f 6e 20 74 68 69 73 20 74 65  o use on this te
12150 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  rm */.  int bRev
12160 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
12170 75 65 20 66 6f 72 20 44 45 53 43 45 4e 44 49 4e  ue for DESCENDIN
12180 47 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  G sort order */.
12190 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b    int *aPermute;
121a0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 65 72 6d       /* The perm
121b0 75 74 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  utation */..  if
121c0 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  ( (pOp->p5 & OPF
121d0 4c 41 47 5f 50 45 52 4d 55 54 45 29 3d 3d 30 20  LAG_PERMUTE)==0 
121e0 29 7b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 20  ){.    aPermute 
121f0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
12200 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e 61 4f    assert( pOp>aO
12210 70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  p );.    assert(
12220 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
12230 3d 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20  =OP_Permutation 
12240 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12250 4f 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50  Op[-1].p4type==P
12260 34 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a 20 20  4_INTARRAY );.  
12270 20 20 61 50 65 72 6d 75 74 65 20 3d 20 70 4f 70    aPermute = pOp
12280 5b 2d 31 5d 2e 70 34 2e 61 69 20 2b 20 31 3b 0a  [-1].p4.ai + 1;.
12290 20 20 20 20 61 73 73 65 72 74 28 20 61 50 65 72      assert( aPer
122a0 6d 75 74 65 21 3d 30 20 29 3b 0a 20 20 7d 0a 20  mute!=0 );.  }. 
122b0 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20   n = pOp->p3;.  
122c0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
122d0 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61  p4.pKeyInfo;.  a
122e0 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
122f0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
12300 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d 20 70 4f  !=0 );.  p1 = pO
12310 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f  p->p1;.  p2 = pO
12320 70 2d 3e 70 32 3b 0a 23 69 66 64 65 66 20 53 51  p->p2;.#ifdef SQ
12330 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
12340 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
12350 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a   int k, mx = 0;.
12360 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
12370 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50 65 72 6d  ; k++) if( aPerm
12380 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d  ute[k]>mx ) mx =
12390 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20   aPermute[k];.  
123a0 20 20 61 73 73 65 72 74 28 20 70 31 3e 30 20 26    assert( p1>0 &
123b0 26 20 70 31 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65  & p1+mx<=(p->nMe
123c0 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
123d0 29 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  )+1 );.    asser
123e0 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6d 78  t( p2>0 && p2+mx
123f0 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
12400 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a  ->nCursor)+1 );.
12410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
12420 65 72 74 28 20 70 31 3e 30 20 26 26 20 70 31 2b  ert( p1>0 && p1+
12430 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  n<=(p->nMem+1 - 
12440 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
12450 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e  .    assert( p2>
12460 30 20 26 26 20 70 32 2b 6e 3c 3d 28 70 2d 3e 6e  0 && p2+n<=(p->n
12470 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
12480 6f 72 29 2b 31 20 29 3b 0a 20 20 7d 0a 23 65 6e  or)+1 );.  }.#en
12490 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
124a0 42 55 47 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  BUG */.  for(i=0
124b0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
124c0 20 69 64 78 20 3d 20 61 50 65 72 6d 75 74 65 20   idx = aPermute 
124d0 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20  ? aPermute[i] : 
124e0 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  i;.    assert( m
124f0 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b  emIsValid(&aMem[
12500 70 31 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20  p1+idx]) );.    
12510 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
12520 69 64 28 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d  id(&aMem[p2+idx]
12530 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45  ) );.    REGISTE
12540 52 5f 54 52 41 43 45 28 70 31 2b 69 64 78 2c 20  R_TRACE(p1+idx, 
12550 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 3b 0a  &aMem[p1+idx]);.
12560 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
12570 43 45 28 70 32 2b 69 64 78 2c 20 26 61 4d 65 6d  CE(p2+idx, &aMem
12580 5b 70 32 2b 69 64 78 5d 29 3b 0a 20 20 20 20 61  [p2+idx]);.    a
12590 73 73 65 72 74 28 20 69 3c 70 4b 65 79 49 6e 66  ssert( i<pKeyInf
125a0 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 29 3b 0a  o->nKeyField );.
125b0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4b 65 79      pColl = pKey
125c0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a  Info->aColl[i];.
125d0 20 20 20 20 62 52 65 76 20 3d 20 70 4b 65 79 49      bRev = pKeyI
125e0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
125f0 69 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65  i];.    iCompare
12600 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
12610 70 61 72 65 28 26 61 4d 65 6d 5b 70 31 2b 69 64  pare(&aMem[p1+id
12620 78 5d 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78  x], &aMem[p2+idx
12630 5d 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  ], pColl);.    i
12640 66 28 20 69 43 6f 6d 70 61 72 65 20 29 7b 0a 20  f( iCompare ){. 
12650 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 20       if( bRev ) 
12660 69 43 6f 6d 70 61 72 65 20 3d 20 2d 69 43 6f 6d  iCompare = -iCom
12670 70 61 72 65 3b 0a 20 20 20 20 20 20 62 72 65 61  pare;.      brea
12680 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  k;.    }.  }.  b
12690 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
126a0 64 65 3a 20 4a 75 6d 70 20 50 31 20 50 32 20 50  de: Jump P1 P2 P
126b0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
126c0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
126d0 69 6f 6e 20 61 74 20 61 64 64 72 65 73 73 20 50  ion at address P
126e0 31 2c 20 50 32 2c 20 6f 72 20 50 33 20 64 65 70  1, P2, or P3 dep
126f0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
12700 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 6f 73 74  r.** in the most
12710 20 72 65 63 65 6e 74 20 4f 50 5f 43 6f 6d 70 61   recent OP_Compa
12720 72 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  re instruction t
12730 68 65 20 50 31 20 76 65 63 74 6f 72 20 77 61 73  he P1 vector was
12740 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 65 71   less than.** eq
12750 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
12760 65 72 20 74 68 61 6e 20 74 68 65 20 50 32 20 76  er than the P2 v
12770 65 63 74 6f 72 2c 20 72 65 73 70 65 63 74 69 76  ector, respectiv
12780 65 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ely..*/.case OP_
12790 4a 75 6d 70 3a 20 7b 20 20 20 20 20 20 20 20 20  Jump: {         
127a0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
127b0 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3c 30 20   if( iCompare<0 
127c0 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  ){.    VdbeBranc
127d0 68 54 61 6b 65 6e 28 30 2c 34 29 3b 20 70 4f 70  hTaken(0,4); pOp
127e0 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 31 20   = &aOp[pOp->p1 
127f0 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  - 1];.  }else if
12800 28 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ( iCompare==0 ){
12810 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
12820 61 6b 65 6e 28 31 2c 34 29 3b 20 70 4f 70 20 3d  aken(1,4); pOp =
12830 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20   &aOp[pOp->p2 - 
12840 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1];.  }else{.   
12850 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
12860 28 32 2c 34 29 3b 20 70 4f 70 20 3d 20 26 61 4f  (2,4); pOp = &aO
12870 70 5b 70 4f 70 2d 3e 70 33 20 2d 20 31 5d 3b 0a  p[pOp->p3 - 1];.
12880 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
12890 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50  /* Opcode: And P
128a0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
128b0 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28  ynopsis: r[P3]=(
128c0 72 5b 50 31 5d 20 26 26 20 72 5b 50 32 5d 29 0a  r[P1] && r[P2]).
128d0 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c  **.** Take the l
128e0 6f 67 69 63 61 6c 20 41 4e 44 20 6f 66 20 74 68  ogical AND of th
128f0 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
12900 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 32 20  sters P1 and P2 
12910 61 6e 64 0a 2a 2a 20 77 72 69 74 65 20 74 68 65  and.** write the
12920 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67   result into reg
12930 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  ister P3..**.** 
12940 49 66 20 65 69 74 68 65 72 20 50 31 20 6f 72 20  If either P1 or 
12950 50 32 20 69 73 20 30 20 28 66 61 6c 73 65 29 20  P2 is 0 (false) 
12960 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
12970 69 73 20 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20  is 0 even if.** 
12980 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20  the other input 
12990 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c  is NULL.  A NULL
129a0 20 61 6e 64 20 74 72 75 65 20 6f 72 20 74 77 6f   and true or two
129b0 20 4e 55 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61   NULLs give.** a
129c0 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f   NULL output..*/
129d0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50  ./* Opcode: Or P
129e0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
129f0 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28  ynopsis: r[P3]=(
12a00 72 5b 50 31 5d 20 7c 7c 20 72 5b 50 32 5d 29 0a  r[P1] || r[P2]).
12a10 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c  **.** Take the l
12a20 6f 67 69 63 61 6c 20 4f 52 20 6f 66 20 74 68 65  ogical OR of the
12a30 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73   values in regis
12a40 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e  ter P1 and P2 an
12a50 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 61  d.** store the a
12a60 6e 73 77 65 72 20 69 6e 20 72 65 67 69 73 74 65  nswer in registe
12a70 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  r P3..**.** If e
12a80 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69  ither P1 or P2 i
12a90 73 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29  s nonzero (true)
12aa0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
12ab0 20 69 73 20 31 20 28 74 72 75 65 29 0a 2a 2a 20   is 1 (true).** 
12ac0 65 76 65 6e 20 69 66 20 74 68 65 20 6f 74 68 65  even if the othe
12ad0 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e  r input is NULL.
12ae0 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c    A NULL and fal
12af0 73 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a  se or two NULLs.
12b00 2a 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f  ** give a NULL o
12b10 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f  utput..*/.case O
12b20 50 5f 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20  P_And:          
12b30 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
12b40 4b 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c  K_AND, in1, in2,
12b50 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50   out3 */.case OP
12b60 5f 4f 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20  _Or: {          
12b70 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
12b80 5f 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  _OR, in1, in2, o
12b90 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b  ut3 */.  int v1;
12ba0 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72      /* Left oper
12bb0 61 6e 64 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20  and:  0==FALSE, 
12bc0 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e  1==TRUE, 2==UNKN
12bd0 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  OWN or NULL */. 
12be0 20 69 6e 74 20 76 32 3b 20 20 20 20 2f 2a 20 52   int v2;    /* R
12bf0 69 67 68 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d  ight operand: 0=
12c00 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c  =FALSE, 1==TRUE,
12c10 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
12c20 55 4c 4c 20 2a 2f 0a 0a 20 20 76 31 20 3d 20 73  ULL */..  v1 = s
12c30 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c 65 61  qlite3VdbeBoolea
12c40 6e 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70 4f 70  nValue(&aMem[pOp
12c50 2d 3e 70 31 5d 2c 20 32 29 3b 0a 20 20 76 32 20  ->p1], 2);.  v2 
12c60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 42 6f 6f  = sqlite3VdbeBoo
12c70 6c 65 61 6e 56 61 6c 75 65 28 26 61 4d 65 6d 5b  leanValue(&aMem[
12c80 70 4f 70 2d 3e 70 32 5d 2c 20 32 29 3b 0a 20 20  pOp->p2], 2);.  
12c90 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
12ca0 3d 4f 50 5f 41 6e 64 20 29 7b 0a 20 20 20 20 73  =OP_And ){.    s
12cb0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
12cc0 67 6e 65 64 20 63 68 61 72 20 61 6e 64 5f 6c 6f  gned char and_lo
12cd0 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 30 2c 20  gic[] = { 0, 0, 
12ce0 30 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 32  0, 0, 1, 2, 0, 2
12cf0 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20  , 2 };.    v1 = 
12d00 61 6e 64 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76  and_logic[v1*3+v
12d10 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  2];.  }else{.   
12d20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
12d30 73 69 67 6e 65 64 20 63 68 61 72 20 6f 72 5f 6c  signed char or_l
12d40 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c  ogic[] = { 0, 1,
12d50 20 32 2c 20 31 2c 20 31 2c 20 31 2c 20 32 2c 20   2, 1, 1, 1, 2, 
12d60 31 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d  1, 2 };.    v1 =
12d70 20 6f 72 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76   or_logic[v1*3+v
12d80 32 5d 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20 3d  2];.  }.  pOut =
12d90 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
12da0 0a 20 20 69 66 28 20 76 31 3d 3d 32 20 29 7b 0a  .  if( v1==2 ){.
12db0 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
12dc0 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c  ag(pOut, MEM_Nul
12dd0 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
12de0 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 31 3b   pOut->u.i = v1;
12df0 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
12e00 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
12e10 74 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  t);.  }.  break;
12e20 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
12e30 73 54 72 75 65 20 50 31 20 50 32 20 50 33 20 50  sTrue P1 P2 P3 P
12e40 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
12e50 20 72 5b 50 32 5d 20 3d 20 63 6f 61 6c 65 73 63   r[P2] = coalesc
12e60 65 28 72 5b 50 31 5d 3d 3d 54 52 55 45 2c 50 33  e(r[P1]==TRUE,P3
12e70 29 20 5e 20 50 34 0a 2a 2a 0a 2a 2a 20 54 68 69  ) ^ P4.**.** Thi
12e80 73 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65 6d 65  s opcode impleme
12e90 6e 74 73 20 74 68 65 20 49 53 20 54 52 55 45 2c  nts the IS TRUE,
12ea0 20 49 53 20 46 41 4c 53 45 2c 20 49 53 20 4e 4f   IS FALSE, IS NO
12eb0 54 20 54 52 55 45 2c 20 61 6e 64 0a 2a 2a 20 49  T TRUE, and.** I
12ec0 53 20 4e 4f 54 20 46 41 4c 53 45 20 6f 70 65 72  S NOT FALSE oper
12ed0 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74  ators..**.** Int
12ee0 65 72 70 72 65 74 20 74 68 65 20 76 61 6c 75 65  erpret the value
12ef0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
12f00 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  as a boolean val
12f10 75 65 2e 20 20 53 74 6f 72 65 20 74 68 61 74 0a  ue.  Store that.
12f20 2a 2a 20 62 6f 6f 6c 65 61 6e 20 28 61 20 30 20  ** boolean (a 0 
12f30 6f 72 20 31 29 20 69 6e 20 72 65 67 69 73 74 65  or 1) in registe
12f40 72 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65  r P2.  Or if the
12f50 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
12f60 65 72 20 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c  er P1 is .** NUL
12f70 4c 2c 20 74 68 65 6e 20 74 68 65 20 50 33 20 69  L, then the P3 i
12f80 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
12f90 73 74 65 72 20 50 32 2e 20 20 49 6e 76 65 72 74  ster P2.  Invert
12fa0 20 74 68 65 20 61 6e 73 77 65 72 20 69 66 20 50   the answer if P
12fb0 34 0a 2a 2a 20 69 73 20 31 2e 0a 2a 2a 0a 2a 2a  4.** is 1..**.**
12fc0 20 54 68 65 20 6c 6f 67 69 63 20 69 73 20 73 75   The logic is su
12fd0 6d 6d 61 72 69 7a 65 64 20 6c 69 6b 65 20 74 68  mmarized like th
12fe0 69 73 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 20 0a  is:.**.** <ul> .
12ff0 2a 2a 20 3c 6c 69 3e 20 49 66 20 50 33 3d 3d 30  ** <li> If P3==0
13000 20 61 6e 64 20 50 34 3d 3d 30 20 20 74 68 65 6e   and P4==0  then
13010 20 20 72 5b 50 32 5d 20 3a 3d 20 72 5b 50 31 5d    r[P2] := r[P1]
13020 20 49 53 20 54 52 55 45 0a 2a 2a 20 3c 6c 69 3e   IS TRUE.** <li>
13030 20 49 66 20 50 33 3d 3d 31 20 61 6e 64 20 50 34   If P3==1 and P4
13040 3d 3d 31 20 20 74 68 65 6e 20 20 72 5b 50 32 5d  ==1  then  r[P2]
13050 20 3a 3d 20 72 5b 50 31 5d 20 49 53 20 46 41 4c   := r[P1] IS FAL
13060 53 45 0a 2a 2a 20 3c 6c 69 3e 20 49 66 20 50 33  SE.** <li> If P3
13070 3d 3d 30 20 61 6e 64 20 50 34 3d 3d 31 20 20 74  ==0 and P4==1  t
13080 68 65 6e 20 20 72 5b 50 32 5d 20 3a 3d 20 72 5b  hen  r[P2] := r[
13090 50 31 5d 20 49 53 20 4e 4f 54 20 54 52 55 45 0a  P1] IS NOT TRUE.
130a0 2a 2a 20 3c 6c 69 3e 20 49 66 20 50 33 3d 3d 31  ** <li> If P3==1
130b0 20 61 6e 64 20 50 34 3d 3d 30 20 20 74 68 65 6e   and P4==0  then
130c0 20 20 72 5b 50 32 5d 20 3a 3d 20 72 5b 50 31 5d    r[P2] := r[P1]
130d0 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 0a 2a 2a   IS NOT FALSE.**
130e0 20 3c 2f 75 6c 3e 0a 2a 2f 0a 63 61 73 65 20 4f   </ul>.*/.case O
130f0 50 5f 49 73 54 72 75 65 3a 20 7b 20 20 20 20 20  P_IsTrue: {     
13100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
13110 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65  , out2 */.  asse
13120 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
13130 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61  =P4_INT32 );.  a
13140 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 69  ssert( pOp->p4.i
13150 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 69  ==0 || pOp->p4.i
13160 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
13170 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 70   pOp->p3==0 || p
13180 4f 70 2d 3e 70 33 3d 3d 31 20 29 3b 0a 20 20 73  Op->p3==1 );.  s
13190 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
131a0 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d  Int64(&aMem[pOp-
131b0 3e 70 32 5d 2c 0a 20 20 20 20 20 20 73 71 6c 69  >p2],.      sqli
131c0 74 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e 56 61  te3VdbeBooleanVa
131d0 6c 75 65 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  lue(&aMem[pOp->p
131e0 31 5d 2c 20 70 4f 70 2d 3e 70 33 29 20 5e 20 70  1], pOp->p3) ^ p
131f0 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 62 72 65  Op->p4.i);.  bre
13200 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
13210 3a 20 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20  : Not P1 P2 * * 
13220 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
13230 5b 50 32 5d 3d 20 21 72 5b 50 31 5d 0a 2a 2a 0a  [P2]= !r[P1].**.
13240 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
13250 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
13260 65 72 20 50 31 20 61 73 20 61 20 62 6f 6f 6c 65  er P1 as a boole
13270 61 6e 20 76 61 6c 75 65 2e 20 20 53 74 6f 72 65  an value.  Store
13280 20 74 68 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20   the.** boolean 
13290 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 20 72 65  complement in re
132a0 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 74  gister P2.  If t
132b0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
132c0 73 74 65 72 20 50 31 20 69 73 20 0a 2a 2a 20 4e  ster P1 is .** N
132d0 55 4c 4c 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c  ULL, then a NULL
132e0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 32   is stored in P2
132f0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74  ..*/.case OP_Not
13300 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
13310 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
13320 5f 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20  _NOT, in1, out2 
13330 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
13340 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f  m[pOp->p1];.  pO
13350 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
13360 70 32 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  p2];.  if( (pIn1
13370 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
13380 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ll)==0 ){.    sq
13390 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49  lite3VdbeMemSetI
133a0 6e 74 36 34 28 70 4f 75 74 2c 20 21 73 71 6c 69  nt64(pOut, !sqli
133b0 74 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e 56 61  te3VdbeBooleanVa
133c0 6c 75 65 28 70 49 6e 31 2c 30 29 29 3b 0a 20 20  lue(pIn1,0));.  
133d0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
133e0 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
133f0 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 62 72  (pOut);.  }.  br
13400 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
13410 65 3a 20 42 69 74 4e 6f 74 20 50 31 20 50 32 20  e: BitNot P1 P2 
13420 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
13430 73 3a 20 72 5b 50 32 5d 3d 20 7e 72 5b 50 31 5d  s: r[P2]= ~r[P1]
13440 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
13450 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
13460 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61  register P1 as a
13470 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f 72  n integer.  Stor
13480 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63 6f  e the.** ones-co
13490 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  mplement of the 
134a0 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  P1 value into re
134b0 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 50  gister P2.  If P
134c0 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55 4c  1 holds.** a NUL
134d0 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20 4e  L then store a N
134e0 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61  ULL in P2..*/.ca
134f0 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 20  se OP_BitNot: { 
13500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
13510 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f 54  ame as TK_BITNOT
13520 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20  , in1, out2 */. 
13530 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
13540 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
13550 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
13560 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
13570 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
13580 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
13590 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
135a0 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  0 ){.    pOut->f
135b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
135c0 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20      pOut->u.i = 
135d0 7e 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56  ~sqlite3VdbeIntV
135e0 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 7d 0a  alue(pIn1);.  }.
135f0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
13600 70 63 6f 64 65 3a 20 4f 6e 63 65 20 50 31 20 50  pcode: Once P1 P
13610 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 61  2 * * *.**.** Fa
13620 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
13630 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
13640 6f 6e 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  on the first tim
13650 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  e this opcode is
13660 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  .** encountered 
13670 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
13680 6f 6e 20 6f 66 20 74 68 65 20 62 79 74 65 2d 63  on of the byte-c
13690 6f 64 65 20 70 72 6f 67 72 61 6d 2e 20 20 4a 75  ode program.  Ju
136a0 6d 70 20 74 6f 20 50 32 0a 2a 2a 20 6f 6e 20 74  mp to P2.** on t
136b0 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 61 6c  he second and al
136c0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 65 6e 63  l subsequent enc
136d0 6f 75 6e 74 65 72 73 20 64 75 72 69 6e 67 20 74  ounters during t
136e0 68 65 20 73 61 6d 65 20 69 6e 76 6f 63 61 74 69  he same invocati
136f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 70 2d 6c 65  on..**.** Top-le
13700 76 65 6c 20 70 72 6f 67 72 61 6d 73 20 64 65 74  vel programs det
13710 65 72 6d 69 6e 65 20 66 69 72 73 74 20 69 6e 76  ermine first inv
13720 6f 63 61 74 69 6f 6e 20 62 79 20 63 6f 6d 70 61  ocation by compa
13730 72 69 6e 67 20 74 68 65 20 50 31 0a 2a 2a 20 6f  ring the P1.** o
13740 70 65 72 61 6e 64 20 61 67 61 69 6e 73 74 20 74  perand against t
13750 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 6f 6e  he P1 operand on
13760 20 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63   the OP_Init opc
13770 6f 64 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  ode at the begin
13780 6e 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ning.** of the p
13790 72 6f 67 72 61 6d 2e 20 20 49 66 20 74 68 65 20  rogram.  If the 
137a0 50 31 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  P1 values differ
137b0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  , then fall thro
137c0 75 67 68 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20  ugh and make.** 
137d0 74 68 65 20 50 31 20 6f 66 20 74 68 69 73 20 6f  the P1 of this o
137e0 70 63 6f 64 65 20 65 71 75 61 6c 20 74 6f 20 74  pcode equal to t
137f0 68 65 20 50 31 20 6f 66 20 4f 50 5f 49 6e 69 74  he P1 of OP_Init
13800 2e 20 20 49 66 20 50 31 20 76 61 6c 75 65 73 20  .  If P1 values 
13810 61 72 65 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20  are.** the same 
13820 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
13830 6d 70 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 75  mp..**.** For su
13840 62 70 72 6f 67 72 61 6d 73 2c 20 74 68 65 72 65  bprograms, there
13850 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 69 6e   is a bitmask in
13860 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 74   the VdbeFrame t
13870 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a  hat determines.*
13880 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
13890 20 74 68 65 20 6a 75 6d 70 20 73 68 6f 75 6c 64   the jump should
138a0 20 62 65 20 74 61 6b 65 6e 2e 20 20 54 68 65 20   be taken.  The 
138b0 62 69 74 6d 61 73 6b 20 69 73 20 6e 65 63 65 73  bitmask is neces
138c0 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20  sary.** because 
138d0 74 68 65 20 73 65 6c 66 2d 61 6c 74 65 72 69 6e  the self-alterin
138e0 67 20 63 6f 64 65 20 74 72 69 63 6b 20 64 6f 65  g code trick doe
138f0 73 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 72 20 72  s not work for r
13900 65 63 75 72 73 69 76 65 0a 2a 2a 20 74 72 69 67  ecursive.** trig
13910 67 65 72 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  gers..*/.case OP
13920 5f 4f 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20  _Once: {        
13930 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
13940 20 20 75 33 32 20 69 41 64 64 72 3b 20 20 20 20    u32 iAddr;    
13950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13960 64 64 72 65 73 73 20 6f 66 20 74 68 69 73 20 69  ddress of this i
13970 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
13980 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b 30  assert( p->aOp[0
13990 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ].opcode==OP_Ini
139a0 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46  t );.  if( p->pF
139b0 72 61 6d 65 20 29 7b 0a 20 20 20 20 69 41 64 64  rame ){.    iAdd
139c0 72 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  r = (int)(pOp - 
139d0 70 2d 3e 61 4f 70 29 3b 0a 20 20 20 20 69 66 28  p->aOp);.    if(
139e0 20 28 70 2d 3e 70 46 72 61 6d 65 2d 3e 61 4f 6e   (p->pFrame->aOn
139f0 63 65 5b 69 41 64 64 72 2f 38 5d 20 26 20 28 31  ce[iAddr/8] & (1
13a00 3c 3c 28 69 41 64 64 72 20 26 20 37 29 29 29 21  <<(iAddr & 7)))!
13a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65  =0 ){.      Vdbe
13a20 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 20 32  BranchTaken(1, 2
13a30 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75  );.      goto ju
13a40 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a  mp_to_p2;.    }.
13a50 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 2d 3e 61      p->pFrame->a
13a60 4f 6e 63 65 5b 69 41 64 64 72 2f 38 5d 20 7c 3d  Once[iAddr/8] |=
13a70 20 31 3c 3c 28 69 41 64 64 72 20 26 20 37 29 3b   1<<(iAddr & 7);
13a80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
13a90 28 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3d 3d  ( p->aOp[0].p1==
13aa0 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 20  pOp->p1 ){.     
13ab0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
13ac0 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 67 6f  (1, 2);.      go
13ad0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
13ae0 20 20 20 7d 0a 20 20 7d 0a 20 20 56 64 62 65 42     }.  }.  VdbeB
13af0 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c 20 32 29  ranchTaken(0, 2)
13b00 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 2d  ;.  pOp->p1 = p-
13b10 3e 61 4f 70 5b 30 5d 2e 70 31 3b 0a 20 20 62 72  >aOp[0].p1;.  br
13b20 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
13b30 65 3a 20 49 66 20 50 31 20 50 32 20 50 33 20 2a  e: If P1 P2 P3 *
13b40 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f   *.**.** Jump to
13b50 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65   P2 if the value
13b60 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
13b70 69 73 20 74 72 75 65 2e 20 20 54 68 65 20 76 61  is true.  The va
13b80 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  lue.** is consid
13b90 65 72 65 64 20 74 72 75 65 20 69 66 20 69 74 20  ered true if it 
13ba0 69 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20 6e  is numeric and n
13bb0 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65  on-zero.  If the
13bc0 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20   value.** in P1 
13bd0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b  is NULL then tak
13be0 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61 6e  e the jump if an
13bf0 64 20 6f 6e 6c 79 20 69 66 20 50 33 20 69 73 20  d only if P3 is 
13c00 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73  non-zero..*/.cas
13c10 65 20 4f 50 5f 49 66 3a 20 20 7b 20 20 20 20 20  e OP_If:  {     
13c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
13c30 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20  p, in1 */.  int 
13c40 63 3b 0a 20 20 63 20 3d 20 73 71 6c 69 74 65 33  c;.  c = sqlite3
13c50 56 64 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65  VdbeBooleanValue
13c60 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c  (&aMem[pOp->p1],
13c70 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 56 64 62   pOp->p3);.  Vdb
13c80 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 63 21 3d  eBranchTaken(c!=
13c90 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 63 20 29  0, 2);.  if( c )
13ca0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
13cb0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
13cc0 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74 20 50   Opcode: IfNot P
13cd0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
13ce0 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
13cf0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
13d00 69 73 74 65 72 20 50 31 20 69 73 20 46 61 6c 73  ister P1 is Fals
13d10 65 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a  e.  The value.**
13d20 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 66   is considered f
13d30 61 6c 73 65 20 69 66 20 69 74 20 68 61 73 20 61  alse if it has a
13d40 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20 6f   numeric value o
13d50 66 20 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20  f zero.  If the 
13d60 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69  value.** in P1 i
13d70 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65  s NULL then take
13d80 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61 6e 64   the jump if and
13d90 20 6f 6e 6c 79 20 69 66 20 50 33 20 69 73 20 6e   only if P3 is n
13da0 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65  on-zero..*/.case
13db0 20 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20   OP_IfNot: {    
13dc0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
13dd0 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b   in1 */.  int c;
13de0 0a 20 20 63 20 3d 20 21 73 71 6c 69 74 65 33 56  .  c = !sqlite3V
13df0 64 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  dbeBooleanValue(
13e00 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20  &aMem[pOp->p1], 
13e10 21 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 56 64 62  !pOp->p3);.  Vdb
13e20 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 63 21 3d  eBranchTaken(c!=
13e30 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 63 20 29  0, 2);.  if( c )
13e40 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
13e50 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
13e60 20 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20   Opcode: IsNull 
13e70 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
13e80 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31  ynopsis: if r[P1
13e90 5d 3d 3d 4e 55 4c 4c 20 67 6f 74 6f 20 50 32 0a  ]==NULL goto P2.
13ea0 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32  **.** Jump to P2
13eb0 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   if the value in
13ec0 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
13ed0 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  NULL..*/.case OP
13ee0 5f 49 73 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20  _IsNull: {      
13ef0 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
13f00 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a 75 6d 70   TK_ISNULL, jump
13f10 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
13f20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
13f30 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
13f40 6b 65 6e 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67  ken( (pIn1->flag
13f50 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30  s & MEM_Null)!=0
13f60 2c 20 32 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  , 2);.  if( (pIn
13f70 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
13f80 75 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 67  ull)!=0 ){.    g
13f90 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
13fa0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
13fb0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75  /* Opcode: NotNu
13fc0 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ll P1 P2 * * *.*
13fd0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72  * Synopsis: if r
13fe0 5b 50 31 5d 21 3d 4e 55 4c 4c 20 67 6f 74 6f 20  [P1]!=NULL goto 
13ff0 50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f  P2.**.** Jump to
14000 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65   P2 if the value
14010 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
14020 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20 0a 2a  is not NULL.  .*
14030 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 4e 75 6c  /.case OP_NotNul
14040 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l: {            
14050 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f  /* same as TK_NO
14060 54 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31  TNULL, jump, in1
14070 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
14080 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56  em[pOp->p1];.  V
14090 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20  dbeBranchTaken( 
140a0 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
140b0 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 2c 20 32 29 3b  EM_Null)==0, 2);
140c0 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
140d0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
140e0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a  =0 ){.    goto j
140f0 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
14100 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
14110 63 6f 64 65 3a 20 49 66 4e 75 6c 6c 52 6f 77 20  code: IfNullRow 
14120 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
14130 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 50 31 2e  Synopsis: if P1.
14140 6e 75 6c 6c 52 6f 77 20 74 68 65 6e 20 72 5b 50  nullRow then r[P
14150 33 5d 3d 4e 55 4c 4c 2c 20 67 6f 74 6f 20 50 32  3]=NULL, goto P2
14160 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  .**.** Check the
14170 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20 73 65   cursor P1 to se
14180 65 20 69 66 20 69 74 20 69 73 20 63 75 72 72 65  e if it is curre
14190 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 74  ntly pointing at
141a0 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 20   a NULL row..** 
141b0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 73  If it is, then s
141c0 65 74 20 72 65 67 69 73 74 65 72 20 50 33 20 74  et register P3 t
141d0 6f 20 4e 55 4c 4c 20 61 6e 64 20 6a 75 6d 70 20  o NULL and jump 
141e0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
141f0 32 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e  2..** If P1 is n
14200 6f 74 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  ot on a NULL row
14210 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  , then fall thro
14220 75 67 68 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ugh without maki
14230 6e 67 20 61 6e 79 0a 2a 2a 20 63 68 61 6e 67 65  ng any.** change
14240 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66  s..*/.case OP_If
14250 4e 75 6c 6c 52 6f 77 3a 20 7b 20 20 20 20 20 20  NullRow: {      
14260 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
14270 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
14280 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
14290 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
142a0 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70  sert( p->apCsr[p
142b0 4f 70 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20  Op->p1]!=0 );.  
142c0 69 66 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  if( p->apCsr[pOp
142d0 2d 3e 70 31 5d 2d 3e 6e 75 6c 6c 52 6f 77 20 29  ->p1]->nullRow )
142e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
142f0 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 61 4d 65 6d  eMemSetNull(aMem
14300 20 2b 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20   + pOp->p3);.   
14310 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
14320 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
14330 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14340 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
14350 4c 5f 46 55 4e 43 0a 2f 2a 20 4f 70 63 6f 64 65  L_FUNC./* Opcode
14360 3a 20 4f 66 66 73 65 74 20 50 31 20 50 32 20 50  : Offset P1 P2 P
14370 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
14380 73 3a 20 72 5b 50 33 5d 20 3d 20 73 71 6c 69 74  s: r[P3] = sqlit
14390 65 5f 6f 66 66 73 65 74 28 50 31 29 0a 2a 2a 0a  e_offset(P1).**.
143a0 2a 2a 20 53 74 6f 72 65 20 69 6e 20 72 65 67 69  ** Store in regi
143b0 73 74 65 72 20 72 5b 50 33 5d 20 74 68 65 20 62  ster r[P3] the b
143c0 79 74 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  yte offset into 
143d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
143e0 65 20 74 68 61 74 20 69 73 20 74 68 65 0a 2a 2a  e that is the.**
143f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
14400 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 65  yload for the re
14410 63 6f 72 64 20 61 74 20 77 68 69 63 68 20 74 68  cord at which th
14420 61 74 20 63 75 72 73 6f 72 20 50 31 20 69 73 20  at cursor P1 is 
14430 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
14440 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 50 32 20  nting..**.** P2 
14450 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  is the column nu
14460 6d 62 65 72 20 66 6f 72 20 74 68 65 20 61 72 67  mber for the arg
14470 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c  ument to the sql
14480 69 74 65 5f 6f 66 66 73 65 74 28 29 20 66 75 6e  ite_offset() fun
14490 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 6f  ction..** This o
144a0 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75  pcode does not u
144b0 73 65 20 50 32 20 69 74 73 65 6c 66 2c 20 62 75  se P2 itself, bu
144c0 74 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 69  t the P2 value i
144d0 73 20 75 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  s used by the.**
144e0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 2e   code generator.
144f0 20 20 54 68 65 20 50 31 2c 20 50 32 2c 20 61 6e    The P1, P2, an
14500 64 20 50 33 20 6f 70 65 72 61 6e 64 73 20 74 6f  d P3 operands to
14510 20 74 68 69 73 20 6f 70 63 6f 64 65 20 61 72 65   this opcode are
14520 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
14530 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 2e 0a 2a  for OP_Column..*
14540 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
14550 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
14560 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69 73 20  le if SQLite is 
14570 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
14580 65 0a 2a 2a 20 2d 44 53 51 4c 49 54 45 5f 45 4e  e.** -DSQLITE_EN
14590 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
145a0 46 55 4e 43 20 6f 70 74 69 6f 6e 2e 0a 2a 2f 0a  FUNC option..*/.
145b0 63 61 73 65 20 4f 50 5f 4f 66 66 73 65 74 3a 20  case OP_Offset: 
145c0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75  {          /* ou
145d0 74 33 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  t3 */.  VdbeCurs
145e0 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68  or *pC;    /* Th
145f0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 2a 2f  e VDBE cursor */
14600 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
14610 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
14620 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
14630 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
14640 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Op->p1];.  pOut 
14650 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  = &p->aMem[pOp->
14660 70 33 5d 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  p3];.  if( NEVER
14670 28 70 43 3d 3d 30 29 20 7c 7c 20 70 43 2d 3e 65  (pC==0) || pC->e
14680 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45  CurType!=CURTYPE
14690 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20 73 71  _BTREE ){.    sq
146a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
146b0 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c  ull(pOut);.  }el
146c0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
146d0 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70  dbeMemSetInt64(p
146e0 4f 75 74 2c 20 73 71 6c 69 74 65 33 42 74 72 65  Out, sqlite3Btre
146f0 65 4f 66 66 73 65 74 28 70 43 2d 3e 75 63 2e 70  eOffset(pC->uc.p
14700 43 75 72 73 6f 72 29 29 3b 0a 20 20 7d 0a 20 20  Cursor));.  }.  
14710 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
14720 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
14730 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
14740 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20   */../* Opcode: 
14750 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20  Column P1 P2 P3 
14760 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
14770 73 3a 20 72 5b 50 33 5d 3d 50 58 0a 2a 2a 0a 2a  s: r[P3]=PX.**.*
14780 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
14790 64 61 74 61 20 74 68 61 74 20 63 75 72 73 6f 72  data that cursor
147a0 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 20 61 73   P1 points to as
147b0 20 61 20 73 74 72 75 63 74 75 72 65 20 62 75 69   a structure bui
147c0 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  lt using.** the 
147d0 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72  MakeRecord instr
147e0 75 63 74 69 6f 6e 2e 20 20 28 53 65 65 20 74 68  uction.  (See th
147f0 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  e MakeRecord opc
14800 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
14810 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  al.** informatio
14820 6e 20 61 62 6f 75 74 20 74 68 65 20 66 6f 72 6d  n about the form
14830 61 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e 29  at of the data.)
14840 20 20 45 78 74 72 61 63 74 20 74 68 65 20 50 32    Extract the P2
14850 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66 72  -th column.** fr
14860 6f 6d 20 74 68 69 73 20 72 65 63 6f 72 64 2e 20  om this record. 
14870 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   If there are le
14880 73 73 20 74 68 61 74 20 28 50 32 2b 31 29 20 0a  ss that (P2+1) .
14890 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  ** values in the
148a0 20 72 65 63 6f 72 64 2c 20 65 78 74 72 61 63 74   record, extract
148b0 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54   a NULL..**.** T
148c0 68 65 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  he value extract
148d0 65 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ed is stored in 
148e0 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a  register P3..**.
148f0 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  ** If the record
14900 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
14910 74 68 61 6e 20 50 32 20 66 69 65 6c 64 73 2c 20  than P2 fields, 
14920 74 68 65 6e 20 65 78 74 72 61 63 74 20 61 20 4e  then extract a N
14930 55 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66 20  ULL.  Or,.** if 
14940 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20  the P4 argument 
14950 69 73 20 61 20 50 34 5f 4d 45 4d 20 75 73 65 20  is a P4_MEM use 
14960 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
14970 20 50 34 20 61 72 67 75 6d 65 6e 74 20 61 73 0a   P4 argument as.
14980 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  ** the result..*
14990 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
149a0 41 47 5f 43 4c 45 41 52 43 41 43 48 45 20 62 69  AG_CLEARCACHE bi
149b0 74 20 69 73 20 73 65 74 20 6f 6e 20 50 35 20 61  t is set on P5 a
149c0 6e 64 20 50 31 20 69 73 20 61 20 70 73 65 75 64  nd P1 is a pseud
149d0 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 0a  o-table cursor,.
149e0 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 63 68  ** then the cach
149f0 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20  e of the cursor 
14a00 69 73 20 72 65 73 65 74 20 70 72 69 6f 72 20 74  is reset prior t
14a10 6f 20 65 78 74 72 61 63 74 69 6e 67 20 74 68 65  o extracting the
14a20 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20   column..** The 
14a30 66 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20  first OP_Column 
14a40 61 67 61 69 6e 73 74 20 61 20 70 73 65 75 64 6f  against a pseudo
14a50 2d 74 61 62 6c 65 20 61 66 74 65 72 20 74 68 65  -table after the
14a60 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
14a70 6e 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  ntent.** registe
14a80 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 73 68  r has changed sh
14a90 6f 75 6c 64 20 68 61 76 65 20 74 68 69 73 20 62  ould have this b
14aa0 69 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  it set..**.** If
14ab0 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 45 4e 47   the OPFLAG_LENG
14ac0 54 48 41 52 47 20 61 6e 64 20 4f 50 46 4c 41 47  THARG and OPFLAG
14ad0 5f 54 59 50 45 4f 46 41 52 47 20 62 69 74 73 20  _TYPEOFARG bits 
14ae0 61 72 65 20 73 65 74 20 6f 6e 20 50 35 20 74 68  are set on P5 th
14af0 65 6e 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  en.** the result
14b00 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
14b10 6f 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61  o only be used a
14b20 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6f  s the argument o
14b30 66 20 61 20 6c 65 6e 67 74 68 28 29 0a 2a 2a 20  f a length().** 
14b40 6f 72 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  or typeof() func
14b50 74 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65  tion, respective
14b60 6c 79 2e 20 20 54 68 65 20 6c 6f 61 64 69 6e 67  ly.  The loading
14b70 20 6f 66 20 6c 61 72 67 65 20 62 6c 6f 62 73 20   of large blobs 
14b80 63 61 6e 20 62 65 0a 2a 2a 20 73 6b 69 70 70 65  can be.** skippe
14b90 64 20 66 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  d for length() a
14ba0 6e 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 6c  nd all content l
14bb0 6f 61 64 69 6e 67 20 63 61 6e 20 62 65 20 73 6b  oading can be sk
14bc0 69 70 70 65 64 20 66 6f 72 20 74 79 70 65 6f 66  ipped for typeof
14bd0 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  ()..*/.case OP_C
14be0 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 69 6e 74 20 70  olumn: {.  int p
14bf0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
14c00 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74   column number t
14c10 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
14c20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20  VdbeCursor *pC; 
14c30 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
14c40 75 72 73 6f 72 20 2a 2f 0a 20 20 42 74 43 75 72  ursor */.  BtCur
14c50 73 6f 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a  sor *pCrsr;   /*
14c60 20 54 68 65 20 42 54 72 65 65 20 63 75 72 73 6f   The BTree curso
14c70 72 20 2a 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66  r */.  u32 *aOff
14c80 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66  set;      /* aOf
14c90 66 73 65 74 5b 69 5d 20 69 73 20 6f 66 66 73 65  fset[i] is offse
14ca0 74 20 74 6f 20 73 74 61 72 74 20 6f 66 20 64 61  t to start of da
14cb0 74 61 20 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75  ta for i-th colu
14cc0 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b  mn */.  int len;
14cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14ce0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
14cf0 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
14d00 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a  for the column *
14d10 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
14d20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
14d30 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4d 65 6d 20  ounter */.  Mem 
14d40 2a 70 44 65 73 74 3b 20 20 20 20 20 20 20 20 2f  *pDest;        /
14d50 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
14d60 20 74 68 65 20 65 78 74 72 61 63 74 65 64 20 76   the extracted v
14d70 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 73 4d  alue */.  Mem sM
14d80 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
14d90 46 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20  For storing the 
14da0 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
14db0 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oded */.  const 
14dc0 75 38 20 2a 7a 44 61 74 61 3b 20 20 20 2f 2a 20  u8 *zData;   /* 
14dd0 50 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  Part of the reco
14de0 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64  rd being decoded
14df0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
14e00 7a 48 64 72 3b 20 20 20 20 2f 2a 20 4e 65 78 74  zHdr;    /* Next
14e10 20 75 6e 70 61 72 73 65 64 20 62 79 74 65 20 6f   unparsed byte o
14e20 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
14e30 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 45 6e 64    const u8 *zEnd
14e40 48 64 72 3b 20 2f 2a 20 50 6f 69 6e 74 65 72 20  Hdr; /* Pointer 
14e50 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 61 66  to first byte af
14e60 74 65 72 20 74 68 65 20 68 65 61 64 65 72 20 2a  ter the header *
14e70 2f 0a 20 20 75 36 34 20 6f 66 66 73 65 74 36 34  /.  u64 offset64
14e80 3b 20 20 20 20 20 20 2f 2a 20 36 34 2d 62 69 74  ;      /* 64-bit
14e90 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32   offset */.  u32
14ea0 20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   t;             
14eb0 2f 2a 20 41 20 74 79 70 65 20 63 6f 64 65 20 66  /* A type code f
14ec0 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20 68  rom the record h
14ed0 65 61 64 65 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a  eader */.  Mem *
14ee0 70 52 65 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  pReg;         /*
14ef0 20 50 73 65 75 64 6f 54 61 62 6c 65 20 69 6e 70   PseudoTable inp
14f00 75 74 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  ut register */..
14f10 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
14f20 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 32 20 3d  pOp->p1];.  p2 =
14f30 20 70 4f 70 2d 3e 70 32 3b 0a 0a 20 20 2f 2a 20   pOp->p2;..  /* 
14f40 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  If the cursor ca
14f50 63 68 65 20 69 73 20 73 74 61 6c 65 20 28 6d 65  che is stale (me
14f60 61 6e 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20  aning it is not 
14f70 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20  currently point 
14f80 61 74 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  at.  ** the corr
14f90 65 63 74 20 72 6f 77 29 20 74 68 65 6e 20 62 72  ect row) then br
14fa0 69 6e 67 20 69 74 20 75 70 2d 74 6f 2d 64 61 74  ing it up-to-dat
14fb0 65 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20 6e  e by doing the n
14fc0 65 63 65 73 73 61 72 79 20 0a 20 20 2a 2a 20 42  ecessary .  ** B
14fd0 2d 54 72 65 65 20 73 65 65 6b 2e 20 2a 2f 0a 20  -Tree seek. */. 
14fe0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
14ff0 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 26 70  eCursorMoveto(&p
15000 43 2c 20 26 70 32 29 3b 0a 20 20 69 66 28 20 72  C, &p2);.  if( r
15010 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
15020 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20  ue_to_error;..  
15030 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
15040 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  0 && pOp->p3<=(p
15050 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
15060 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 44 65 73  ursor) );.  pDes
15070 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
15080 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f  3];.  memAboutTo
15090 43 68 61 6e 67 65 28 70 2c 20 70 44 65 73 74 29  Change(p, pDest)
150a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
150b0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
150c0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
150d0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
150e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 32 3c  );.  assert( p2<
150f0 70 43 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20  pC->nField );.  
15100 61 4f 66 66 73 65 74 20 3d 20 70 43 2d 3e 61 4f  aOffset = pC->aO
15110 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28  ffset;.  assert(
15120 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43   pC->eCurType!=C
15130 55 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20  URTYPE_VTAB );. 
15140 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
15150 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50  rType!=CURTYPE_P
15160 53 45 55 44 4f 20 7c 7c 20 70 43 2d 3e 6e 75 6c  SEUDO || pC->nul
15170 6c 52 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  lRow );.  assert
15180 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d  ( pC->eCurType!=
15190 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 20 29  CURTYPE_SORTER )
151a0 3b 0a 0a 20 20 69 66 28 20 70 43 2d 3e 63 61 63  ;..  if( pC->cac
151b0 68 65 53 74 61 74 75 73 21 3d 70 2d 3e 63 61 63  heStatus!=p->cac
151c0 68 65 43 74 72 20 29 7b 20 20 20 20 20 20 20 20  heCtr ){        
151d0 20 20 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d 49          /*OPTIMI
151e0 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a  ZATION-IF-FALSE*
151f0 2f 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75  /.    if( pC->nu
15200 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 69  llRow ){.      i
15210 66 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  f( pC->eCurType=
15220 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20  =CURTYPE_PSEUDO 
15230 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
15240 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
15250 73 65 20 6f 66 20 61 73 20 70 73 65 75 64 6f 2d  se of as pseudo-
15260 63 75 72 73 6f 72 2c 20 74 68 65 20 73 65 65 6b  cursor, the seek
15270 52 65 73 75 6c 74 20 66 69 65 6c 64 0a 20 20 20  Result field.   
15280 20 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 66 69       ** identifi
15290 65 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  es the register 
152a0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 72  that holds the r
152b0 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20 20 20 20  ecord */.       
152c0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 73 65 65   assert( pC->see
152d0 6b 52 65 73 75 6c 74 3e 30 20 29 3b 0a 20 20 20  kResult>0 );.   
152e0 20 20 20 20 20 70 52 65 67 20 3d 20 26 61 4d 65       pReg = &aMe
152f0 6d 5b 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74  m[pC->seekResult
15300 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
15310 74 28 20 70 52 65 67 2d 3e 66 6c 61 67 73 20 26  t( pReg->flags &
15320 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
15330 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
15340 49 73 56 61 6c 69 64 28 70 52 65 67 29 20 29 3b  IsValid(pReg) );
15350 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 70 61 79  .        pC->pay
15360 6c 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e 73  loadSize = pC->s
15370 7a 52 6f 77 20 3d 20 70 52 65 67 2d 3e 6e 3b 0a  zRow = pReg->n;.
15380 20 20 20 20 20 20 20 20 70 43 2d 3e 61 52 6f 77          pC->aRow
15390 20 3d 20 28 75 38 2a 29 70 52 65 67 2d 3e 7a 3b   = (u8*)pReg->z;
153a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
153b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
153c0 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73  eMemSetNull(pDes
153d0 74 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  t);.        goto
153e0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
153f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15400 65 7b 0a 20 20 20 20 20 20 70 43 72 73 72 20 3d  e{.      pCrsr =
15410 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
15420 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15430 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
15440 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
15450 20 20 20 20 61 73 73 65 72 74 28 20 70 43 72 73      assert( pCrs
15460 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
15470 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
15480 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 72  ursorIsValid(pCr
15490 73 72 29 20 29 3b 0a 20 20 20 20 20 20 70 43 2d  sr) );.      pC-
154a0 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 73  >payloadSize = s
154b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
154c0 61 64 53 69 7a 65 28 70 43 72 73 72 29 3b 0a 20  adSize(pCrsr);. 
154d0 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20       pC->aRow = 
154e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
154f0 6f 61 64 46 65 74 63 68 28 70 43 72 73 72 2c 20  oadFetch(pCrsr, 
15500 26 70 43 2d 3e 73 7a 52 6f 77 29 3b 0a 20 20 20  &pC->szRow);.   
15510 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 73     assert( pC->s
15520 7a 52 6f 77 3c 3d 70 43 2d 3e 70 61 79 6c 6f 61  zRow<=pC->payloa
15530 64 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  dSize );.      a
15540 73 73 65 72 74 28 20 70 43 2d 3e 73 7a 52 6f 77  ssert( pC->szRow
15550 3c 3d 36 35 35 33 36 20 29 3b 20 20 2f 2a 20 4d  <=65536 );  /* M
15560 61 78 69 6d 75 6d 20 70 61 67 65 20 73 69 7a 65  aximum page size
15570 20 69 73 20 36 34 4b 69 42 20 2a 2f 0a 20 20 20   is 64KiB */.   
15580 20 20 20 69 66 28 20 70 43 2d 3e 70 61 79 6c 6f     if( pC->paylo
15590 61 64 53 69 7a 65 20 3e 20 28 75 33 32 29 64 62  adSize > (u32)db
155a0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
155b0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
155c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74 6f  .        goto to
155d0 6f 5f 62 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20  o_big;.      }. 
155e0 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 63 61 63     }.    pC->cac
155f0 68 65 53 74 61 74 75 73 20 3d 20 70 2d 3e 63 61  heStatus = p->ca
15600 63 68 65 43 74 72 3b 0a 20 20 20 20 70 43 2d 3e  cheCtr;.    pC->
15610 69 48 64 72 4f 66 66 73 65 74 20 3d 20 67 65 74  iHdrOffset = get
15620 56 61 72 69 6e 74 33 32 28 70 43 2d 3e 61 52 6f  Varint32(pC->aRo
15630 77 2c 20 61 4f 66 66 73 65 74 5b 30 5d 29 3b 0a  w, aOffset[0]);.
15640 20 20 20 20 70 43 2d 3e 6e 48 64 72 50 61 72 73      pC->nHdrPars
15650 65 64 20 3d 20 30 3b 0a 0a 0a 20 20 20 20 69 66  ed = 0;...    if
15660 28 20 70 43 2d 3e 73 7a 52 6f 77 3c 61 4f 66 66  ( pC->szRow<aOff
15670 73 65 74 5b 30 5d 20 29 7b 20 20 20 20 20 20 2f  set[0] ){      /
15680 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
15690 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 20 20 2f  -FALSE*/.      /
156a0 2a 20 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73 20  * pC->aRow does 
156b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 68 6f 6c 64  not have to hold
156c0 20 74 68 65 20 65 6e 74 69 72 65 20 72 6f 77 2c   the entire row,
156d0 20 62 75 74 20 69 74 20 64 6f 65 73 20 61 74 20   but it does at 
156e0 6c 65 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 6e  least.      ** n
156f0 65 65 64 20 74 6f 20 63 6f 76 65 72 20 74 68 65  eed to cover the
15700 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 72   header of the r
15710 65 63 6f 72 64 2e 20 20 49 66 20 70 43 2d 3e 61  ecord.  If pC->a
15720 52 6f 77 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  Row does not con
15730 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  tain.      ** th
15740 65 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  e complete heade
15750 72 2c 20 74 68 65 6e 20 73 65 74 20 69 74 20 74  r, then set it t
15760 6f 20 7a 65 72 6f 2c 20 66 6f 72 63 69 6e 67 20  o zero, forcing 
15770 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 62 65  the header to be
15780 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69  .      ** dynami
15790 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e  cally allocated.
157a0 20 2a 2f 0a 20 20 20 20 20 20 70 43 2d 3e 61 52   */.      pC->aR
157b0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  ow = 0;.      pC
157c0 2d 3e 73 7a 52 6f 77 20 3d 20 30 3b 0a 0a 20 20  ->szRow = 0;..  
157d0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
157e0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
157f0 61 73 65 20 68 61 73 20 6e 6f 74 20 67 69 76 65  ase has not give
15800 6e 20 75 73 20 61 6e 20 6f 76 65 72 73 69 7a 65  n us an oversize
15810 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 2a   header..      *
15820 2a 20 44 6f 20 74 68 69 73 20 6e 6f 77 20 74 6f  * Do this now to
15830 20 61 76 6f 69 64 20 61 6e 20 6f 76 65 72 73 69   avoid an oversi
15840 7a 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ze memory alloca
15850 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tion..      **. 
15860 20 20 20 20 20 2a 2a 20 54 79 70 65 20 65 6e 74       ** Type ent
15870 72 69 65 73 20 63 61 6e 20 62 65 20 62 65 74 77  ries can be betw
15880 65 65 6e 20 31 20 61 6e 64 20 35 20 62 79 74 65  een 1 and 5 byte
15890 73 20 65 61 63 68 2e 20 20 42 75 74 20 34 20 61  s each.  But 4 a
158a0 6e 64 20 35 20 62 79 74 65 0a 20 20 20 20 20 20  nd 5 byte.      
158b0 2a 2a 20 74 79 70 65 73 20 75 73 65 20 73 6f 20  ** types use so 
158c0 6d 75 63 68 20 64 61 74 61 20 73 70 61 63 65 20  much data space 
158d0 74 68 61 74 20 74 68 65 72 65 20 63 61 6e 20 6f  that there can o
158e0 6e 6c 79 20 62 65 20 34 30 39 36 20 61 6e 64 20  nly be 4096 and 
158f0 33 32 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  32 of.      ** t
15900 68 65 6d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  hem, respectivel
15910 79 2e 20 20 53 6f 20 74 68 65 20 6d 61 78 69 6d  y.  So the maxim
15920 75 6d 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  um header length
15930 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 0a   results from a.
15940 20 20 20 20 20 20 2a 2a 20 33 2d 62 79 74 65 20        ** 3-byte 
15950 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 6f 66  type for each of
15960 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
15970 33 32 37 36 38 20 63 6f 6c 75 6d 6e 73 20 70 6c  32768 columns pl
15980 75 73 20 74 68 72 65 65 0a 20 20 20 20 20 20 2a  us three.      *
15990 2a 20 65 78 74 72 61 20 62 79 74 65 73 20 66 6f  * extra bytes fo
159a0 72 20 74 68 65 20 68 65 61 64 65 72 20 6c 65 6e  r the header len
159b0 67 74 68 20 69 74 73 65 6c 66 2e 20 20 33 32 37  gth itself.  327
159c0 36 38 2a 33 20 2b 20 33 20 3d 20 39 38 33 30 37  68*3 + 3 = 98307
159d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
159e0 20 69 66 28 20 61 4f 66 66 73 65 74 5b 30 5d 20   if( aOffset[0] 
159f0 3e 20 39 38 33 30 37 20 7c 7c 20 61 4f 66 66 73  > 98307 || aOffs
15a00 65 74 5b 30 5d 20 3e 20 70 43 2d 3e 70 61 79 6c  et[0] > pC->payl
15a10 6f 61 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  oadSize ){.     
15a20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d     goto op_colum
15a30 6e 5f 63 6f 72 72 75 70 74 3b 0a 20 20 20 20 20  n_corrupt;.     
15a40 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
15a50 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
15a60 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
15a70 20 42 79 20 73 6b 69 70 70 69 6e 67 20 6f 76 65   By skipping ove
15a80 72 20 74 68 65 20 66 69 72 73 74 20 66 65 77 20  r the first few 
15a90 74 65 73 74 73 0a 20 20 20 20 20 20 2a 2a 20 28  tests.      ** (
15aa0 65 78 3a 20 70 43 2d 3e 6e 48 64 72 50 61 72 73  ex: pC->nHdrPars
15ab0 65 64 3c 3d 70 32 29 20 69 6e 20 74 68 65 20 6e  ed<=p2) in the n
15ac0 65 78 74 20 73 65 63 74 69 6f 6e 2c 20 77 65 20  ext section, we 
15ad0 61 63 68 69 65 76 65 20 61 0a 20 20 20 20 20 20  achieve a.      
15ae0 2a 2a 20 6d 65 61 73 75 72 61 62 6c 65 20 70 65  ** measurable pe
15af0 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a  rformance gain..
15b00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15b10 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
15b20 20 74 61 6b 65 6e 20 65 76 65 6e 20 69 66 20 61   taken even if a
15b30 4f 66 66 73 65 74 5b 30 5d 3d 3d 30 2e 20 20 53  Offset[0]==0.  S
15b40 75 63 68 20 61 20 72 65 63 6f 72 64 20 69 73 20  uch a record is 
15b50 6e 65 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 67  never.      ** g
15b60 65 6e 65 72 61 74 65 64 20 62 79 20 53 51 4c 69  enerated by SQLi
15b70 74 65 2c 20 61 6e 64 20 63 6f 75 6c 64 20 62 65  te, and could be
15b80 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
15b90 75 70 74 69 6f 6e 2c 20 62 75 74 20 77 65 0a 20  uption, but we. 
15ba0 20 20 20 20 20 2a 2a 20 61 63 63 65 70 74 20 69       ** accept i
15bb0 74 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  t for historical
15bc0 20 72 65 61 73 6f 6e 73 2e 20 20 57 68 65 6e 20   reasons.  When 
15bd0 61 4f 66 66 73 65 74 5b 30 5d 3d 3d 30 2c 20 74  aOffset[0]==0, t
15be0 68 65 20 63 6f 64 65 20 74 68 69 73 0a 20 20 20  he code this.   
15bf0 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 6a 75 6d     ** branch jum
15c00 70 73 20 74 6f 20 72 65 61 64 73 20 70 61 73 74  ps to reads past
15c10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15c20 72 65 63 6f 72 64 2c 20 62 75 74 20 6e 65 76 65  record, but neve
15c30 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  r more.      ** 
15c40 74 68 61 6e 20 61 20 66 65 77 20 62 79 74 65 73  than a few bytes
15c50 2e 20 20 45 76 65 6e 20 69 66 20 74 68 65 20 72  .  Even if the r
15c60 65 63 6f 72 64 20 6f 63 63 75 72 73 20 61 74 20  ecord occurs at 
15c70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
15c80 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  age.      ** con
15c90 74 65 6e 74 20 61 72 65 61 2c 20 74 68 65 20 22  tent area, the "
15ca0 70 61 67 65 20 68 65 61 64 65 72 22 20 63 6f 6d  page header" com
15cb0 65 73 20 61 66 74 65 72 20 74 68 65 20 70 61 67  es after the pag
15cc0 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 73 6f  e content and so
15cd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 6f  .      ** this o
15ce0 76 65 72 72 65 61 64 20 69 73 20 68 61 72 6d 6c  verread is harml
15cf0 65 73 73 2e 20 20 53 69 6d 69 6c 61 72 20 6f 76  ess.  Similar ov
15d00 65 72 72 65 61 64 73 20 63 61 6e 20 6f 63 63 75  erreads can occu
15d10 72 20 66 6f 72 20 61 20 63 6f 72 72 75 70 74 0a  r for a corrupt.
15d20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
15d30 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
15d40 0a 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 70  .      zData = p
15d50 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20 20 61  C->aRow;.      a
15d60 73 73 65 72 74 28 20 70 43 2d 3e 6e 48 64 72 50  ssert( pC->nHdrP
15d70 61 72 73 65 64 3c 3d 70 32 20 29 3b 20 20 20 20  arsed<=p2 );    
15d80 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
15d90 6e 61 6c 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20  nal skipped */. 
15da0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
15db0 4f 66 66 73 65 74 5b 30 5d 3d 3d 30 20 29 3b 0a  Offset[0]==0 );.
15dc0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f        goto op_co
15dd0 6c 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65 72  lumn_read_header
15de0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15df0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c  * Make sure at l
15e00 65 61 73 74 20 74 68 65 20 66 69 72 73 74 20 70  east the first p
15e10 32 2b 31 20 65 6e 74 72 69 65 73 20 6f 66 20 74  2+1 entries of t
15e20 68 65 20 68 65 61 64 65 72 20 68 61 76 65 20 62  he header have b
15e30 65 65 6e 0a 20 20 2a 2a 20 70 61 72 73 65 64 20  een.  ** parsed 
15e40 61 6e 64 20 76 61 6c 69 64 20 69 6e 66 6f 72 6d  and valid inform
15e50 61 74 69 6f 6e 20 69 73 20 69 6e 20 61 4f 66 66  ation is in aOff
15e60 73 65 74 5b 5d 20 61 6e 64 20 70 43 2d 3e 61 54  set[] and pC->aT
15e70 79 70 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66  ype[]..  */.  if
15e80 28 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64  ( pC->nHdrParsed
15e90 3c 3d 70 32 20 29 7b 0a 20 20 20 20 2f 2a 20 49  <=p2 ){.    /* I
15ea0 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
15eb0 68 65 61 64 65 72 20 61 76 61 69 6c 61 62 6c 65  header available
15ec0 20 66 6f 72 20 70 61 72 73 69 6e 67 20 69 6e 20   for parsing in 
15ed0 74 68 65 20 72 65 63 6f 72 64 2c 20 74 72 79 0a  the record, try.
15ee0 20 20 20 20 2a 2a 20 74 6f 20 65 78 74 72 61 63      ** to extrac
15ef0 74 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 69 65  t additional fie
15f00 6c 64 73 20 75 70 20 74 68 72 6f 75 67 68 20 74  lds up through t
15f10 68 65 20 70 32 2b 31 2d 74 68 20 66 69 65 6c 64  he p2+1-th field
15f20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
15f30 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 3c   pC->iHdrOffset<
15f40 61 4f 66 66 73 65 74 5b 30 5d 20 29 7b 0a 20 20  aOffset[0] ){.  
15f50 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
15f60 20 7a 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f   zData points to
15f70 20 65 6e 6f 75 67 68 20 6f 66 20 74 68 65 20 72   enough of the r
15f80 65 63 6f 72 64 20 74 6f 20 63 6f 76 65 72 20 74  ecord to cover t
15f90 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
15fa0 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77      if( pC->aRow
15fb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==0 ){.        m
15fc0 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20 30 2c 20  emset(&sMem, 0, 
15fd0 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29 3b 0a 20  sizeof(sMem));. 
15fe0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15ff0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
16000 72 65 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ree(pC->uc.pCurs
16010 6f 72 2c 20 30 2c 20 61 4f 66 66 73 65 74 5b 30  or, 0, aOffset[0
16020 5d 2c 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20  ], &sMem);.     
16030 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16040 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
16050 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
16060 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20          zData = 
16070 28 75 38 2a 29 73 4d 65 6d 2e 7a 3b 0a 20 20 20  (u8*)sMem.z;.   
16080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16090 20 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52    zData = pC->aR
160a0 6f 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  ow;.      }.  . 
160b0 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
160c0 70 43 2d 3e 61 54 79 70 65 5b 69 5d 20 61 6e 64  pC->aType[i] and
160d0 20 61 4f 66 66 73 65 74 5b 69 5d 20 76 61 6c 75   aOffset[i] valu
160e0 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  es through the p
160f0 32 2d 74 68 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  2-th field. */. 
16100 20 20 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61     op_column_rea
16110 64 5f 68 65 61 64 65 72 3a 0a 20 20 20 20 20 20  d_header:.      
16120 69 20 3d 20 70 43 2d 3e 6e 48 64 72 50 61 72 73  i = pC->nHdrPars
16130 65 64 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ed;.      offset
16140 36 34 20 3d 20 61 4f 66 66 73 65 74 5b 69 5d 3b  64 = aOffset[i];
16150 0a 20 20 20 20 20 20 7a 48 64 72 20 3d 20 7a 44  .      zHdr = zD
16160 61 74 61 20 2b 20 70 43 2d 3e 69 48 64 72 4f 66  ata + pC->iHdrOf
16170 66 73 65 74 3b 0a 20 20 20 20 20 20 7a 45 6e 64  fset;.      zEnd
16180 48 64 72 20 3d 20 7a 44 61 74 61 20 2b 20 61 4f  Hdr = zData + aO
16190 66 66 73 65 74 5b 30 5d 3b 0a 20 20 20 20 20 20  ffset[0];.      
161a0 74 65 73 74 63 61 73 65 28 20 7a 48 64 72 3e 3d  testcase( zHdr>=
161b0 7a 45 6e 64 48 64 72 20 29 3b 0a 20 20 20 20 20  zEndHdr );.     
161c0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
161d0 20 28 70 43 2d 3e 61 54 79 70 65 5b 69 5d 20 3d   (pC->aType[i] =
161e0 20 74 20 3d 20 7a 48 64 72 5b 30 5d 29 3c 30 78   t = zHdr[0])<0x
161f0 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  80 ){.          
16200 7a 48 64 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zHdr++;.        
16210 20 20 6f 66 66 73 65 74 36 34 20 2b 3d 20 73 71    offset64 += sq
16220 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65  lite3VdbeOneByte
16230 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29  SerialTypeLen(t)
16240 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16250 0a 20 20 20 20 20 20 20 20 20 20 7a 48 64 72 20  .          zHdr 
16260 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
16270 69 6e 74 33 32 28 7a 48 64 72 2c 20 26 74 29 3b  int32(zHdr, &t);
16280 0a 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 61  .          pC->a
16290 54 79 70 65 5b 69 5d 20 3d 20 74 3b 0a 20 20 20  Type[i] = t;.   
162a0 20 20 20 20 20 20 20 6f 66 66 73 65 74 36 34 20         offset64 
162b0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
162c0 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a  rialTypeLen(t);.
162d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
162e0 20 20 61 4f 66 66 73 65 74 5b 2b 2b 69 5d 20 3d    aOffset[++i] =
162f0 20 28 75 33 32 29 28 6f 66 66 73 65 74 36 34 20   (u32)(offset64 
16300 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
16310 20 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 3d       }while( i<=
16320 70 32 20 26 26 20 7a 48 64 72 3c 7a 45 6e 64 48  p2 && zHdr<zEndH
16330 64 72 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  dr );..      /* 
16340 54 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  The record is co
16350 72 72 75 70 74 20 69 66 20 61 6e 79 20 6f 66 20  rrupt if any of 
16360 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
16370 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 2a 2a  e true:.      **
16380 20 28 31 29 20 74 68 65 20 62 79 74 65 73 20 6f   (1) the bytes o
16390 66 20 74 68 65 20 68 65 61 64 65 72 20 65 78 74  f the header ext
163a0 65 6e 64 20 70 61 73 74 20 74 68 65 20 64 65 63  end past the dec
163b0 6c 61 72 65 64 20 68 65 61 64 65 72 20 73 69 7a  lared header siz
163c0 65 0a 20 20 20 20 20 20 2a 2a 20 28 32 29 20 74  e.      ** (2) t
163d0 68 65 20 65 6e 74 69 72 65 20 68 65 61 64 65 72  he entire header
163e0 20 77 61 73 20 75 73 65 64 20 62 75 74 20 6e 6f   was used but no
163f0 74 20 61 6c 6c 20 64 61 74 61 20 77 61 73 20 75  t all data was u
16400 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 28 33 29  sed.      ** (3)
16410 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
16420 64 61 74 61 20 65 78 74 65 6e 64 73 20 62 65 79  data extends bey
16430 6f 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ond the end of t
16440 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20  he record..     
16450 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 7a   */.      if( (z
16460 48 64 72 3e 3d 7a 45 6e 64 48 64 72 20 26 26 20  Hdr>=zEndHdr && 
16470 28 7a 48 64 72 3e 7a 45 6e 64 48 64 72 20 7c 7c  (zHdr>zEndHdr ||
16480 20 6f 66 66 73 65 74 36 34 21 3d 70 43 2d 3e 70   offset64!=pC->p
16490 61 79 6c 6f 61 64 53 69 7a 65 29 29 0a 20 20 20  ayloadSize)).   
164a0 20 20 20 20 7c 7c 20 28 6f 66 66 73 65 74 36 34      || (offset64
164b0 20 3e 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69   > pC->payloadSi
164c0 7a 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ze).      ){.   
164d0 20 20 20 20 20 69 66 28 20 61 4f 66 66 73 65 74       if( aOffset
164e0 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
164f0 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20      i = 0;.     
16500 20 20 20 20 20 7a 48 64 72 20 3d 20 7a 45 6e 64       zHdr = zEnd
16510 48 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Hdr;.        }el
16520 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
16530 28 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 20  ( pC->aRow==0 ) 
16540 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
16550 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20  lease(&sMem);.  
16560 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f          goto op_
16570 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75 70 74 3b 0a  column_corrupt;.
16580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16590 7d 0a 0a 20 20 20 20 20 20 70 43 2d 3e 6e 48 64  }..      pC->nHd
165a0 72 50 61 72 73 65 64 20 3d 20 69 3b 0a 20 20 20  rParsed = i;.   
165b0 20 20 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65     pC->iHdrOffse
165c0 74 20 3d 20 28 75 33 32 29 28 7a 48 64 72 20 2d  t = (u32)(zHdr -
165d0 20 7a 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69   zData);.      i
165e0 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29  f( pC->aRow==0 )
165f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
16600 65 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20  elease(&sMem);. 
16610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16620 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
16630 20 20 2f 2a 20 49 66 20 61 66 74 65 72 20 74 72    /* If after tr
16640 79 69 6e 67 20 74 6f 20 65 78 74 72 61 63 74 20  ying to extract 
16650 6e 65 77 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  new entries from
16660 20 74 68 65 20 68 65 61 64 65 72 2c 20 6e 48 64   the header, nHd
16670 72 50 61 72 73 65 64 20 69 73 0a 20 20 20 20 2a  rParsed is.    *
16680 2a 20 73 74 69 6c 6c 20 6e 6f 74 20 75 70 20 74  * still not up t
16690 6f 20 70 32 2c 20 74 68 61 74 20 6d 65 61 6e 73  o p2, that means
166a0 20 74 68 61 74 20 74 68 65 20 72 65 63 6f 72 64   that the record
166b0 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
166c0 70 32 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  p2.    ** column
166d0 73 2e 20 20 53 6f 20 74 68 65 20 72 65 73 75 6c  s.  So the resul
166e0 74 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  t will be either
166f0 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
16700 75 65 20 6f 72 20 61 20 4e 55 4c 4c 2e 0a 20 20  ue or a NULL..  
16710 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 2d    */.    if( pC-
16720 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20  >nHdrParsed<=p2 
16730 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
16740 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4d 45 4d  ->p4type==P4_MEM
16750 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16760 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
16770 77 43 6f 70 79 28 70 44 65 73 74 2c 20 70 4f 70  wCopy(pDest, pOp
16780 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d 45 4d 5f 53  ->p4.pMem, MEM_S
16790 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 7d 65  tatic);.      }e
167a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
167b0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
167c0 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  ll(pDest);.     
167d0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70   }.      goto op
167e0 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20  _column_out;.   
167f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
16800 74 20 3d 20 70 43 2d 3e 61 54 79 70 65 5b 70 32  t = pC->aType[p2
16810 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  ];.  }..  /* Ext
16820 72 61 63 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  ract the content
16830 20 66 6f 72 20 74 68 65 20 70 32 2b 31 2d 74 68   for the p2+1-th
16840 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6e 74 72 6f   column.  Contro
16850 6c 20 63 61 6e 20 6f 6e 6c 79 0a 20 20 2a 2a 20  l can only.  ** 
16860 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
16870 20 69 66 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c   if aOffset[p2],
16880 20 61 4f 66 66 73 65 74 5b 70 32 2b 31 5d 2c 20   aOffset[p2+1], 
16890 61 6e 64 20 70 43 2d 3e 61 54 79 70 65 5b 70 32  and pC->aType[p2
168a0 5d 20 61 72 65 0a 20 20 2a 2a 20 61 6c 6c 20 76  ] are.  ** all v
168b0 61 6c 69 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  alid..  */.  ass
168c0 65 72 74 28 20 70 32 3c 70 43 2d 3e 6e 48 64 72  ert( p2<pC->nHdr
168d0 50 61 72 73 65 64 20 29 3b 0a 20 20 61 73 73 65  Parsed );.  asse
168e0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
168f0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  K );.  assert( s
16900 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
16910 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 44 65  emInvariants(pDe
16920 73 74 29 20 29 3b 0a 20 20 69 66 28 20 56 64 62  st) );.  if( Vdb
16930 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 44 65 73  eMemDynamic(pDes
16940 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
16950 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
16960 70 44 65 73 74 29 3b 0a 20 20 7d 0a 20 20 61 73  pDest);.  }.  as
16970 73 65 72 74 28 20 74 3d 3d 70 43 2d 3e 61 54 79  sert( t==pC->aTy
16980 70 65 5b 70 32 5d 20 29 3b 0a 20 20 69 66 28 20  pe[p2] );.  if( 
16990 70 43 2d 3e 73 7a 52 6f 77 3e 3d 61 4f 66 66 73  pC->szRow>=aOffs
169a0 65 74 5b 70 32 2b 31 5d 20 29 7b 0a 20 20 20 20  et[p2+1] ){.    
169b0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  /* This is the c
169c0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
169d0 20 74 68 65 20 64 65 73 69 72 65 64 20 63 6f 6e   the desired con
169e0 74 65 6e 74 20 66 69 74 73 20 6f 6e 20 74 68 65  tent fits on the
169f0 20 6f 72 69 67 69 6e 61 6c 0a 20 20 20 20 2a 2a   original.    **
16a00 20 70 61 67 65 20 2d 20 77 68 65 72 65 20 74 68   page - where th
16a10 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  e content is not
16a20 20 6f 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   on an overflow 
16a30 70 61 67 65 20 2a 2f 0a 20 20 20 20 7a 44 61 74  page */.    zDat
16a40 61 20 3d 20 70 43 2d 3e 61 52 6f 77 20 2b 20 61  a = pC->aRow + a
16a50 4f 66 66 73 65 74 5b 70 32 5d 3b 0a 20 20 20 20  Offset[p2];.    
16a60 69 66 28 20 74 3c 31 32 20 29 7b 0a 20 20 20 20  if( t<12 ){.    
16a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
16a80 69 61 6c 47 65 74 28 7a 44 61 74 61 2c 20 74 2c  ialGet(zData, t,
16a90 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c   pDest);.    }el
16aa0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
16ab0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
16ac0 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 77 65   is a string, we
16ad0 20 6e 65 65 64 20 61 20 70 65 72 73 69 73 74 65   need a persiste
16ae0 6e 74 20 76 61 6c 75 65 2c 20 6e 6f 74 0a 20 20  nt value, not.  
16af0 20 20 20 20 2a 2a 20 61 20 4d 45 4d 5f 45 70 68      ** a MEM_Eph
16b00 65 6d 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  em value.  This 
16b10 62 72 61 6e 63 68 20 69 73 20 61 20 66 61 73 74  branch is a fast
16b20 20 73 68 6f 72 74 2d 63 75 74 20 74 68 61 74 20   short-cut that 
16b30 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  is equivalent.  
16b40 20 20 20 20 2a 2a 20 74 6f 20 63 61 6c 6c 69 6e      ** to callin
16b50 67 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  g sqlite3VdbeSer
16b60 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
16b70 69 74 65 33 56 64 62 65 44 65 65 70 68 65 6d 65  ite3VdbeDeepheme
16b80 72 61 6c 69 7a 65 28 29 2e 0a 20 20 20 20 20 20  ralize()..      
16b90 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
16ba0 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
16bb0 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 2c 20  ] = { MEM_Blob, 
16bc0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
16bd0 20 7d 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d   };.      pDest-
16be0 3e 6e 20 3d 20 6c 65 6e 20 3d 20 28 74 2d 31 32  >n = len = (t-12
16bf0 29 2f 32 3b 0a 20 20 20 20 20 20 70 44 65 73 74  )/2;.      pDest
16c00 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
16c10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  ;.      if( pDes
16c20 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3c 20 6c 65  t->szMalloc < le
16c30 6e 2b 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n+2 ){.        p
16c40 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  Dest->flags = ME
16c50 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
16c60 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
16c70 65 6d 47 72 6f 77 28 70 44 65 73 74 2c 20 6c 65  emGrow(pDest, le
16c80 6e 2b 32 2c 20 30 29 20 29 20 67 6f 74 6f 20 6e  n+2, 0) ) goto n
16c90 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  o_mem;.      }el
16ca0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73  se{.        pDes
16cb0 74 2d 3e 7a 20 3d 20 70 44 65 73 74 2d 3e 7a 4d  t->z = pDest->zM
16cc0 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20  alloc;.      }. 
16cd0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 65 73       memcpy(pDes
16ce0 74 2d 3e 7a 2c 20 7a 44 61 74 61 2c 20 6c 65 6e  t->z, zData, len
16cf0 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
16d00 7a 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  z[len] = 0;.    
16d10 20 20 70 44 65 73 74 2d 3e 7a 5b 6c 65 6e 2b 31    pDest->z[len+1
16d20 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 65  ] = 0;.      pDe
16d30 73 74 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  st->flags = aFla
16d40 67 5b 74 26 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  g[t&1];.    }.  
16d50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 44 65 73 74  }else{.    pDest
16d60 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
16d70 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  ;.    /* This br
16d80 61 6e 63 68 20 68 61 70 70 65 6e 73 20 6f 6e 6c  anch happens onl
16d90 79 20 77 68 65 6e 20 63 6f 6e 74 65 6e 74 20 69  y when content i
16da0 73 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s on overflow pa
16db0 67 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  ges */.    if( (
16dc0 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c  (pOp->p5 & (OPFL
16dd0 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46  AG_LENGTHARG|OPF
16de0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 29 21  LAG_TYPEOFARG))!
16df0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
16e00 28 28 74 3e 3d 31 32 20 26 26 20 28 74 26 31 29  ((t>=12 && (t&1)
16e10 3d 3d 30 29 20 7c 7c 20 28 70 4f 70 2d 3e 70 35  ==0) || (pOp->p5
16e20 20 26 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46   & OPFLAG_TYPEOF
16e30 41 52 47 29 21 3d 30 29 29 0a 20 20 20 20 20 7c  ARG)!=0)).     |
16e40 7c 20 28 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  | (len = sqlite3
16e50 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16e60 6e 28 74 29 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  n(t))==0.    ){.
16e70 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
16e80 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66   is irrelevant f
16e90 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 31  or.      **    1
16ea0 2e 20 74 68 65 20 74 79 70 65 6f 66 28 29 20 66  . the typeof() f
16eb0 75 6e 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 2a  unction,.      *
16ec0 2a 20 20 20 20 32 2e 20 74 68 65 20 6c 65 6e 67  *    2. the leng
16ed0 74 68 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69  th(X) function i
16ee0 66 20 58 20 69 73 20 61 20 62 6c 6f 62 2c 20 61  f X is a blob, a
16ef0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 33  nd.      **    3
16f00 2e 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  . if the content
16f10 20 6c 65 6e 67 74 68 20 69 73 20 7a 65 72 6f 2e   length is zero.
16f20 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 77 65 20  .      ** So we 
16f30 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20 75 73  might as well us
16f40 65 20 62 6f 67 75 73 20 63 6f 6e 74 65 6e 74 20  e bogus content 
16f50 72 61 74 68 65 72 20 74 68 61 6e 20 72 65 61 64  rather than read
16f60 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ing.      ** con
16f70 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
16f80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16f90 2a 2a 20 41 6c 74 68 6f 75 67 68 20 73 71 6c 69  ** Although sqli
16fa0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
16fb0 28 29 20 6d 61 79 20 72 65 61 64 20 61 74 20 6d  () may read at m
16fc0 6f 73 74 20 38 20 62 79 74 65 73 20 66 72 6f 6d  ost 8 bytes from
16fd0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   the.      ** bu
16fe0 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 69  ffer passed to i
16ff0 74 2c 20 64 65 62 75 67 67 69 6e 67 20 66 75 6e  t, debugging fun
17000 63 74 69 6f 6e 20 56 64 62 65 4d 65 6d 50 72 65  ction VdbeMemPre
17010 74 74 79 50 72 69 6e 74 28 29 20 6d 61 79 0a 20  ttyPrint() may. 
17020 20 20 20 20 20 2a 2a 20 72 65 61 64 20 75 70 20       ** read up 
17030 74 6f 20 31 36 2e 20 53 6f 20 31 36 20 62 79 74  to 16. So 16 byt
17040 65 73 20 6f 66 20 62 6f 67 75 73 20 63 6f 6e 74  es of bogus cont
17050 65 6e 74 20 69 73 20 73 75 70 70 6c 69 65 64 2e  ent is supplied.
17060 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17070 73 74 61 74 69 63 20 75 38 20 61 5a 65 72 6f 5b  static u8 aZero[
17080 31 36 5d 3b 20 20 2f 2a 20 54 68 69 73 20 69 73  16];  /* This is
17090 20 74 68 65 20 62 6f 67 75 73 20 63 6f 6e 74 65   the bogus conte
170a0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  nt */.      sqli
170b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
170c0 28 61 5a 65 72 6f 2c 20 74 2c 20 70 44 65 73 74  (aZero, t, pDest
170d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
170e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
170f0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
17100 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
17110 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65   aOffset[p2], le
17120 6e 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20  n, pDest);.     
17130 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17140 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
17150 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
17160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
17170 65 72 69 61 6c 47 65 74 28 28 63 6f 6e 73 74 20  erialGet((const 
17180 75 38 2a 29 70 44 65 73 74 2d 3e 7a 2c 20 74 2c  u8*)pDest->z, t,
17190 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 70   pDest);.      p
171a0 44 65 73 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  Dest->flags &= ~
171b0 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 7d  MEM_Ephem;.    }
171c0 0a 20 20 7d 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f  .  }..op_column_
171d0 6f 75 74 3a 0a 20 20 55 50 44 41 54 45 5f 4d 41  out:.  UPDATE_MA
171e0 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74  X_BLOBSIZE(pDest
171f0 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
17200 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65  ACE(pOp->p3, pDe
17210 73 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 0a 6f  st);.  break;..o
17220 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75 70 74  p_column_corrupt
17230 3a 0a 20 20 69 66 28 20 61 4f 70 5b 30 5d 2e 70  :.  if( aOp[0].p
17240 33 3e 30 20 29 7b 0a 20 20 20 20 70 4f 70 20 3d  3>0 ){.    pOp =
17250 20 26 61 4f 70 5b 61 4f 70 5b 30 5d 2e 70 33 2d   &aOp[aOp[0].p3-
17260 31 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  1];.    break;. 
17270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
17280 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
17290 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 61  BKPT;.    goto a
172a0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
172b0 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 4f 70 63  r;.  }.}../* Opc
172c0 6f 64 65 3a 20 41 66 66 69 6e 69 74 79 20 50 31  ode: Affinity P1
172d0 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
172e0 6e 6f 70 73 69 73 3a 20 61 66 66 69 6e 69 74 79  nopsis: affinity
172f0 28 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a  (r[P1@P2]).**.**
17300 20 41 70 70 6c 79 20 61 66 66 69 6e 69 74 69 65   Apply affinitie
17310 73 20 74 6f 20 61 20 72 61 6e 67 65 20 6f 66 20  s to a range of 
17320 50 32 20 72 65 67 69 73 74 65 72 73 20 73 74 61  P2 registers sta
17330 72 74 69 6e 67 20 77 69 74 68 20 50 31 2e 0a 2a  rting with P1..*
17340 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 73 74 72  *.** P4 is a str
17350 69 6e 67 20 74 68 61 74 20 69 73 20 50 32 20 63  ing that is P2 c
17360 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20  haracters long. 
17370 54 68 65 20 4e 2d 74 68 20 63 68 61 72 61 63 74  The N-th charact
17380 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72  er of the.** str
17390 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  ing indicates th
173a0 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
173b0 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  y that should be
173c0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4e 2d   used for the N-
173d0 74 68 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c  th.** memory cel
173e0 6c 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a  l in the range..
173f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 66 66 69 6e  */.case OP_Affin
17400 69 74 79 3a 20 7b 0a 20 20 63 6f 6e 73 74 20 63  ity: {.  const c
17410 68 61 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20  har *zAffinity; 
17420 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74    /* The affinit
17430 79 20 74 6f 20 62 65 20 61 70 70 6c 69 65 64 20  y to be applied 
17440 2a 2f 0a 0a 20 20 7a 41 66 66 69 6e 69 74 79 20  */..  zAffinity 
17450 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61  = pOp->p4.z;.  a
17460 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79  ssert( zAffinity
17470 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
17480 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20   pOp->p2>0 );.  
17490 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74  assert( zAffinit
174a0 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b  y[pOp->p2]==0 );
174b0 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
174c0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77 68 69 6c  pOp->p1];.  whil
174d0 65 28 20 31 20 2f 2a 65 64 69 74 2d 62 79 2d 62  e( 1 /*edit-by-b
174e0 72 65 61 6b 2a 2f 20 29 7b 0a 20 20 20 20 61 73  reak*/ ){.    as
174f0 73 65 72 74 28 20 70 49 6e 31 20 3c 3d 20 26 70  sert( pIn1 <= &p
17500 2d 3e 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b  ->aMem[(p->nMem+
17510 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d  1 - p->nCursor)]
17520 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17530 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29  memIsValid(pIn1)
17540 20 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66   );.    applyAff
17550 69 6e 69 74 79 28 70 49 6e 31 2c 20 7a 41 66 66  inity(pIn1, zAff
17560 69 6e 69 74 79 5b 30 5d 2c 20 65 6e 63 6f 64 69  inity[0], encodi
17570 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 66  ng);.    if( zAf
17580 66 69 6e 69 74 79 5b 30 5d 3d 3d 53 51 4c 49 54  finity[0]==SQLIT
17590 45 5f 41 46 46 5f 52 45 41 4c 20 26 26 20 28 70  E_AFF_REAL && (p
175a0 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
175b0 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
175c0 20 20 2f 2a 20 57 68 65 6e 20 61 70 70 6c 79 69    /* When applyi
175d0 6e 67 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  ng REAL affinity
175e0 2c 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  , if the result 
175f0 69 73 20 73 74 69 6c 6c 20 4d 45 4d 5f 49 6e 74  is still MEM_Int
17600 2c 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69  , .      ** indi
17610 63 61 74 65 20 74 68 61 74 20 52 45 41 4c 20 69  cate that REAL i
17620 73 20 61 63 74 75 61 6c 6c 79 20 64 65 73 69 72  s actually desir
17630 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 31  ed */.      pIn1
17640 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 49  ->flags |= MEM_I
17650 6e 74 52 65 61 6c 3b 0a 20 20 20 20 20 20 70 49  ntReal;.      pI
17660 6e 31 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45  n1->flags &= ~ME
17670 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  M_Int;.    }.   
17680 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
17690 28 69 6e 74 29 28 70 49 6e 31 2d 61 4d 65 6d 29  (int)(pIn1-aMem)
176a0 2c 20 70 49 6e 31 29 3b 0a 20 20 20 20 7a 41 66  , pIn1);.    zAf
176b0 66 69 6e 69 74 79 2b 2b 3b 0a 20 20 20 20 69 66  finity++;.    if
176c0 28 20 7a 41 66 66 69 6e 69 74 79 5b 30 5d 3d 3d  ( zAffinity[0]==
176d0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
176e0 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65  In1++;.  }.  bre
176f0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
17700 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20 50 31 20  : MakeRecord P1 
17710 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
17720 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 6d 6b  nopsis: r[P3]=mk
17730 72 65 63 28 72 5b 50 31 40 50 32 5d 29 0a 2a 2a  rec(r[P1@P2]).**
17740 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 50 32 20 72  .** Convert P2 r
17750 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
17760 6e 67 20 77 69 74 68 20 50 31 20 69 6e 74 6f 20  ng with P1 into 
17770 74 68 65 20 5b 72 65 63 6f 72 64 20 66 6f 72 6d  the [record form
17780 61 74 5d 0a 2a 2a 20 75 73 65 20 61 73 20 61 20  at].** use as a 
17790 64 61 74 61 20 72 65 63 6f 72 64 20 69 6e 20 61  data record in a
177a0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
177b0 6f 72 20 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69  or as a key.** i
177c0 6e 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65  n an index.  The
177d0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
177e0 65 20 63 61 6e 20 64 65 63 6f 64 65 20 74 68 65  e can decode the
177f0 20 72 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a 2a   record later..*
17800 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61  *.** P4 may be a
17810 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
17820 50 32 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  P2 characters lo
17830 6e 67 2e 20 20 54 68 65 20 4e 2d 74 68 20 63 68  ng.  The N-th ch
17840 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a  aracter of the.*
17850 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74  * string indicat
17860 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  es the column af
17870 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
17880 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
17890 68 65 20 4e 2d 74 68 0a 2a 2a 20 66 69 65 6c 64  he N-th.** field
178a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65   of the index ke
178b0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 70  y..**.** The map
178c0 70 69 6e 67 20 66 72 6f 6d 20 63 68 61 72 61 63  ping from charac
178d0 74 65 72 20 74 6f 20 61 66 66 69 6e 69 74 79 20  ter to affinity 
178e0 69 73 20 67 69 76 65 6e 20 62 79 20 74 68 65 20  is given by the 
178f0 53 51 4c 49 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d  SQLITE_AFF_.** m
17900 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20 69 6e  acros defined in
17910 20 73 71 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a   sqliteInt.h..**
17920 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 4e 55 4c  .** If P4 is NUL
17930 4c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 64 65 78  L then all index
17940 20 66 69 65 6c 64 73 20 68 61 76 65 20 74 68 65   fields have the
17950 20 61 66 66 69 6e 69 74 79 20 42 4c 4f 42 2e 0a   affinity BLOB..
17960 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52  */.case OP_MakeR
17970 65 63 6f 72 64 3a 20 7b 0a 20 20 4d 65 6d 20 2a  ecord: {.  Mem *
17980 70 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  pRec;           
17990 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 65 63    /* The new rec
179a0 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20 6e 44 61  ord */.  u64 nDa
179b0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
179c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
179d0 65 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65  es of data space
179e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72 3b 20   */.  int nHdr; 
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17a00 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17a10 6f 66 20 68 65 61 64 65 72 20 73 70 61 63 65 20  of header space 
17a20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b 20  */.  i64 nByte; 
17a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
17a40 61 74 61 20 73 70 61 63 65 20 72 65 71 75 69 72  ata space requir
17a50 65 64 20 66 6f 72 20 74 68 69 73 20 72 65 63 6f  ed for this reco
17a60 72 64 20 2a 2f 0a 20 20 69 36 34 20 6e 5a 65 72  rd */.  i64 nZer
17a70 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o;             /
17a80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f  * Number of zero
17a90 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e   bytes at the en
17aa0 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  d of the record 
17ab0 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 69 6e 74  */.  int nVarint
17ac0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17ad0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
17ae0 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  n a varint */.  
17af0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
17b00 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 66         /* Type f
17b10 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ield */.  Mem *p
17b20 44 61 74 61 30 3b 20 20 20 20 20 20 20 20 20 20  Data0;          
17b30 20 2f 2a 20 46 69 72 73 74 20 66 69 65 6c 64 20   /* First field 
17b40 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65 64 20 69  to be combined i
17b50 6e 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 2a  nto the record *
17b60 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73 74 3b 20  /.  Mem *pLast; 
17b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
17b80 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  st field of the 
17b90 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
17ba0 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20  nField;         
17bb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17bc0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65  fields in the re
17bd0 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
17be0 7a 41 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20  zAffinity;      
17bf0 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79   /* The affinity
17c00 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
17c10 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
17c20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20 20 20 20  file_format;    
17c30 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f 72 6d 61     /* File forma
17c40 74 20 74 6f 20 75 73 65 20 66 6f 72 20 65 6e 63  t to use for enc
17c50 6f 64 69 6e 67 20 2a 2f 0a 20 20 75 33 32 20 6c  oding */.  u32 l
17c60 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
17c70 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61    /* Length of a
17c80 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 38 20 2a   field */.  u8 *
17c90 7a 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  zHdr;           
17ca0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
17cb0 72 69 74 65 20 6e 65 78 74 20 62 79 74 65 20 6f  rite next byte o
17cc0 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
17cd0 20 20 75 38 20 2a 7a 50 61 79 6c 6f 61 64 3b 20    u8 *zPayload; 
17ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
17cf0 65 20 74 6f 20 77 72 69 74 65 20 6e 65 78 74 20  e to write next 
17d00 62 79 74 65 20 6f 66 20 74 68 65 20 70 61 79 6c  byte of the payl
17d10 6f 61 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73  oad */..  /* Ass
17d20 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  uming the record
17d30 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c   contains N fiel
17d40 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66  ds, the record f
17d50 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a  ormat looks.  **
17d60 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
17d70 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  ** ----------
17d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
17dc0 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c   ** | hdr-size |
17dd0 20 74 79 70 65 20 30 20 7c 20 74 79 70 65 20 31   type 0 | type 1
17de0 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d   | ... | type N-
17df0 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20  1 | data0 | ... 
17e00 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20  | data N-1 | .  
17e10 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
17e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a  -----------.  **
17e60 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73  .  ** Data(0) is
17e70 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
17e80 73 74 65 72 20 50 31 2e 20 20 44 61 74 61 28 31  ster P1.  Data(1
17e90 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67  ) comes from reg
17ea0 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20  ister P1+1.  ** 
17eb0 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20  and so forth..  
17ec0 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70  **.  ** Each typ
17ed0 65 20 66 69 65 6c 64 20 69 73 20 61 20 76 61 72  e field is a var
17ee0 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  int representing
17ef0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
17f00 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f   of the .  ** co
17f10 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
17f20 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71   element (see sq
17f30 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17f40 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a  ype()). The.  **
17f50 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20   hdr-size field 
17f60 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74  is also a varint
17f70 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6f 66   which is the of
17f80 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65  fset from the be
17f90 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20  ginning.  ** of 
17fa0 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61  the record to da
17fb0 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74  ta0..  */.  nDat
17fc0 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  a = 0;         /
17fd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
17fe0 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65 20  s of data space 
17ff0 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20  */.  nHdr = 0;  
18000 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18010 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65  r of bytes of he
18020 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20  ader space */.  
18030 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20  nZero = 0;      
18040 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18050 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
18060 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63  e end of the rec
18070 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  ord */.  nField 
18080 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66  = pOp->p1;.  zAf
18090 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34  finity = pOp->p4
180a0 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46  .z;.  assert( nF
180b0 69 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ield>0 && pOp->p
180c0 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e  2>0 && pOp->p2+n
180d0 46 69 65 6c 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  Field<=(p->nMem+
180e0 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b  1 - p->nCursor)+
180f0 31 20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20  1 );.  pData0 = 
18100 26 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20  &aMem[nField];. 
18110 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70   nField = pOp->p
18120 32 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44  2;.  pLast = &pD
18130 61 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a  ata0[nField-1];.
18140 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20    file_format = 
18150 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
18160 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49 64 65  ormat;..  /* Ide
18170 6e 74 69 66 79 20 74 68 65 20 6f 75 74 70 75 74  ntify the output
18180 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 61   register */.  a
18190 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70  ssert( pOp->p3<p
181a0 4f 70 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70  Op->p1 || pOp->p
181b0 33 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  3>=pOp->p1+pOp->
181c0 70 32 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26  p2 );.  pOut = &
181d0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
181e0 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
181f0 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f  e(p, pOut);..  /
18200 2a 20 41 70 70 6c 79 20 74 68 65 20 72 65 71 75  * Apply the requ
18210 65 73 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  ested affinity t
18220 6f 20 61 6c 6c 20 69 6e 70 75 74 73 0a 20 20 2a  o all inputs.  *
18230 2f 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74  /.  assert( pDat
18240 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 69  a0<=pLast );.  i
18250 66 28 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a  f( zAffinity ){.
18260 20 20 20 20 70 52 65 63 20 3d 20 70 44 61 74 61      pRec = pData
18270 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
18280 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
18290 52 65 63 2c 20 7a 41 66 66 69 6e 69 74 79 5b 30  Rec, zAffinity[0
182a0 5d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  ], encoding);.  
182b0 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
182c0 43 45 28 28 69 6e 74 29 28 70 52 65 63 2d 61 4d  CE((int)(pRec-aM
182d0 65 6d 29 2c 20 70 52 65 63 29 3b 0a 20 20 20 20  em), pRec);.    
182e0 20 20 7a 41 66 66 69 6e 69 74 79 2b 2b 3b 0a 20    zAffinity++;. 
182f0 20 20 20 20 20 70 52 65 63 2b 2b 3b 0a 20 20 20       pRec++;.   
18300 20 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 69     assert( zAffi
18310 6e 69 74 79 5b 30 5d 3d 3d 30 20 7c 7c 20 70 52  nity[0]==0 || pR
18320 65 63 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 20  ec<=pLast );.   
18330 20 7d 77 68 69 6c 65 28 20 7a 41 66 66 69 6e 69   }while( zAffini
18340 74 79 5b 30 5d 20 29 3b 0a 20 20 7d 0a 0a 23 69  ty[0] );.  }..#i
18350 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18360 4c 45 5f 4e 55 4c 4c 5f 54 52 49 4d 0a 20 20 2f  LE_NULL_TRIM.  /
18370 2a 20 4e 55 4c 4c 73 20 63 61 6e 20 62 65 20 73  * NULLs can be s
18380 61 66 65 6c 79 20 74 72 69 6d 6d 65 64 20 66 72  afely trimmed fr
18390 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
183a0 65 20 72 65 63 6f 72 64 2c 20 61 73 20 6c 6f 6e  e record, as lon
183b0 67 20 61 73 0a 20 20 2a 2a 20 61 73 20 74 68 65  g as.  ** as the
183c0 20 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 20 69   schema format i
183d0 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
183e0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 6d 69 74  none of the omit
183f0 74 65 64 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2a  ted columns.  **
18400 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   have a non-NULL
18410 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
18420 20 41 6c 73 6f 2c 20 74 68 65 20 72 65 63 6f 72   Also, the recor
18430 64 20 6d 75 73 74 20 62 65 20 6c 65 66 74 20 77  d must be left w
18440 69 74 68 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73  ith.  ** at leas
18450 74 20 6f 6e 65 20 66 69 65 6c 64 2e 20 20 49 66  t one field.  If
18460 20 50 35 3e 30 20 74 68 65 6e 20 69 74 20 77 69   P5>0 then it wi
18470 6c 6c 20 62 65 20 6f 6e 65 20 6d 6f 72 65 20 74  ll be one more t
18480 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64  han the.  ** ind
18490 65 78 20 6f 66 20 74 68 65 20 72 69 67 68 74 2d  ex of the right-
184a0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 77 69 74 68  most column with
184b0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61   a non-NULL defa
184c0 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ult value */.  i
184d0 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20  f( pOp->p5 ){.  
184e0 20 20 77 68 69 6c 65 28 20 28 70 4c 61 73 74 2d    while( (pLast-
184f0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
18500 6c 29 21 3d 30 20 26 26 20 6e 46 69 65 6c 64 3e  l)!=0 && nField>
18510 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20  pOp->p5 ){.     
18520 20 70 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20   pLast--;.      
18530 6e 46 69 65 6c 64 2d 2d 3b 0a 20 20 20 20 7d 0a  nField--;.    }.
18540 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18550 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
18560 65 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  e elements that 
18570 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68 65  will make up the
18580 20 72 65 63 6f 72 64 20 74 6f 20 66 69 67 75 72   record to figur
18590 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20 6d  e.  ** out how m
185a0 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
185b0 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6e 65  uired for the ne
185c0 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20  w record..  */. 
185d0 20 70 52 65 63 20 3d 20 70 4c 61 73 74 3b 0a 20   pRec = pLast;. 
185e0 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
185f0 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63   memIsValid(pRec
18600 29 20 29 3b 0a 20 20 20 20 73 65 72 69 61 6c 5f  ) );.    serial_
18610 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
18620 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 52 65  beSerialType(pRe
18630 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20  c, file_format, 
18640 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  &len);.    if( p
18650 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rec->flags & MEM
18660 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69  _Zero ){.      i
18670 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
18680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
18690 56 61 6c 75 65 73 20 77 69 74 68 20 4d 45 4d 5f  Values with MEM_
186a0 4e 75 6c 6c 20 61 6e 64 20 4d 45 4d 5f 5a 65 72  Null and MEM_Zer
186b0 6f 20 61 72 65 20 63 72 65 61 74 65 64 20 62 79  o are created by
186c0 20 78 43 6f 6c 75 6d 6e 20 76 69 72 74 75 61 6c   xColumn virtual
186d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
186e0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 6e  e methods that n
186f0 65 76 65 72 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ever invoke sqli
18700 74 65 33 5f 72 65 73 75 6c 74 5f 78 78 78 78 78  te3_result_xxxxx
18710 28 29 20 77 68 69 6c 65 0a 20 20 20 20 20 20 20  () while.       
18720 20 2a 2a 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   ** computing an
18730 20 75 6e 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75   unchanging colu
18740 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 6e 20 55  mn value in an U
18750 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
18760 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 69 76 65  .        ** Give
18770 20 73 75 63 68 20 76 61 6c 75 65 73 20 61 20 73   such values a s
18780 70 65 63 69 61 6c 20 69 6e 74 65 72 6e 61 6c 2d  pecial internal-
18790 75 73 65 2d 6f 6e 6c 79 20 73 65 72 69 61 6c 2d  use-only serial-
187a0 74 79 70 65 20 6f 66 20 31 30 0a 20 20 20 20 20  type of 10.     
187b0 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
187c0 65 79 20 63 61 6e 20 62 65 20 70 61 73 73 65 64  ey can be passed
187d0 20 74 68 72 6f 75 67 68 20 74 6f 20 78 55 70 64   through to xUpd
187e0 61 74 65 20 61 6e 64 20 68 61 76 65 0a 20 20 20  ate and have.   
187f0 20 20 20 20 20 2a 2a 20 61 20 74 72 75 65 20 73       ** a true s
18800 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 6f 63  qlite3_value_noc
18810 68 61 6e 67 65 28 29 2e 20 2a 2f 0a 20 20 20 20  hange(). */.    
18820 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
18830 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 4e 4f 43 48  >p5==OPFLAG_NOCH
18840 4e 47 5f 4d 41 47 49 43 20 7c 7c 20 43 4f 52 52  NG_MAGIC || CORR
18850 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
18860 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
18870 31 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  10;.      }else 
18880 69 66 28 20 6e 44 61 74 61 20 29 7b 0a 20 20 20  if( nData ){.   
18890 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
188a0 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f  VdbeMemExpandBlo
188b0 62 28 70 52 65 63 29 20 29 20 67 6f 74 6f 20 6e  b(pRec) ) goto n
188c0 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  o_mem;.      }el
188d0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 5a 65 72  se{.        nZer
188e0 6f 20 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65  o += pRec->u.nZe
188f0 72 6f 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  ro;.        len 
18900 2d 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f  -= pRec->u.nZero
18910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18920 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 6c 65 6e      nData += len
18930 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
18940 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 37  serial_type==127
18950 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
18960 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
18970 32 38 20 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b  28 );.    nHdr +
18980 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 31  = serial_type<=1
18990 32 37 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33  27 ? 1 : sqlite3
189a0 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
189b0 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 52 65 63  _type);.    pRec
189c0 2d 3e 75 54 65 6d 70 20 3d 20 73 65 72 69 61 6c  ->uTemp = serial
189d0 5f 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 70  _type;.    if( p
189e0 52 65 63 3d 3d 70 44 61 74 61 30 20 29 20 62 72  Rec==pData0 ) br
189f0 65 61 6b 3b 0a 20 20 20 20 70 52 65 63 2d 2d 3b  eak;.    pRec--;
18a00 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 0a 20  .  }while(1);.. 
18a10 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
18a20 20 52 2d 32 32 35 36 34 2d 31 31 36 34 37 20 54   R-22564-11647 T
18a30 68 65 20 68 65 61 64 65 72 20 62 65 67 69 6e 73  he header begins
18a40 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 76   with a single v
18a50 61 72 69 6e 74 0a 20 20 2a 2a 20 77 68 69 63 68  arint.  ** which
18a60 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
18a70 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
18a80 62 79 74 65 73 20 69 6e 20 74 68 65 20 68 65 61  bytes in the hea
18a90 64 65 72 2e 20 54 68 65 20 76 61 72 69 6e 74 0a  der. The varint.
18aa0 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68    ** value is th
18ab0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
18ac0 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 69 6e  ader in bytes in
18ad0 63 6c 75 64 69 6e 67 20 74 68 65 20 73 69 7a 65  cluding the size
18ae0 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 69 74 73   varint.  ** its
18af0 65 6c 66 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  elf. */.  testca
18b00 73 65 28 20 6e 48 64 72 3d 3d 31 32 36 20 29 3b  se( nHdr==126 );
18b10 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 48 64  .  testcase( nHd
18b20 72 3d 3d 31 32 37 20 29 3b 0a 20 20 69 66 28 20  r==127 );.  if( 
18b30 6e 48 64 72 3c 3d 31 32 36 20 29 7b 0a 20 20 20  nHdr<=126 ){.   
18b40 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
18b50 61 73 65 20 2a 2f 0a 20 20 20 20 6e 48 64 72 20  ase */.    nHdr 
18b60 2b 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  += 1;.  }else{. 
18b70 20 20 20 2f 2a 20 52 61 72 65 20 63 61 73 65 20     /* Rare case 
18b80 6f 66 20 61 20 72 65 61 6c 6c 79 20 6c 61 72 67  of a really larg
18b90 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
18ba0 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c 69 74 65  nVarint = sqlite
18bb0 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29  3VarintLen(nHdr)
18bc0 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 6e 56  ;.    nHdr += nV
18bd0 61 72 69 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e  arint;.    if( n
18be0 56 61 72 69 6e 74 3c 73 71 6c 69 74 65 33 56 61  Varint<sqlite3Va
18bf0 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29 20  rintLen(nHdr) ) 
18c00 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42  nHdr++;.  }.  nB
18c10 79 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61  yte = nHdr+nData
18c20 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
18c30 65 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67  e the output reg
18c40 69 73 74 65 72 20 68 61 73 20 61 20 62 75 66 66  ister has a buff
18c50 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
18c60 74 6f 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74  to store .  ** t
18c70 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54  he new record. T
18c80 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
18c90 65 72 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20  er (pOp->p3) is 
18ca0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
18cb0 20 2a 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68   ** be one of th
18cc0 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
18cd0 73 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66  s (because the f
18ce0 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
18cf0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  .  ** sqlite3Vdb
18d00 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
18d10 7a 65 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62  ze() could clobb
18d20 65 72 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  er the value bef
18d30 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 29 2e  ore it is used).
18d40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 42 79 74  .  */.  if( nByt
18d50 65 2b 6e 5a 65 72 6f 3c 3d 70 4f 75 74 2d 3e 73  e+nZero<=pOut->s
18d60 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 2f  zMalloc ){.    /
18d70 2a 20 54 68 65 20 6f 75 74 70 75 74 20 72 65 67  * The output reg
18d80 69 73 74 65 72 20 69 73 20 61 6c 72 65 61 64 79  ister is already
18d90 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
18da0 20 68 6f 6c 64 20 74 68 65 20 72 65 63 6f 72 64   hold the record
18db0 2e 0a 20 20 20 20 2a 2a 20 4e 6f 20 65 72 72 6f  ..    ** No erro
18dc0 72 20 63 68 65 63 6b 73 20 6f 72 20 62 75 66 66  r checks or buff
18dd0 65 72 20 65 6e 6c 61 72 67 65 6d 65 6e 74 20 69  er enlargement i
18de0 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
18df0 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 75 74    pOut->z = pOut
18e00 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 65 6c  ->zMalloc;.  }el
18e10 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20  se{.    /* Need 
18e20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
18e30 74 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  t the output is 
18e40 6e 6f 74 20 74 6f 6f 20 62 69 67 20 61 6e 64 20  not too big and 
18e50 74 68 65 6e 20 65 6e 6c 61 72 67 65 0a 20 20 20  then enlarge.   
18e60 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 72   ** the output r
18e70 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
18e80 74 68 65 20 66 75 6c 6c 20 72 65 73 75 6c 74 20  the full result 
18e90 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  */.    if( nByte
18ea0 2b 6e 5a 65 72 6f 3e 64 62 2d 3e 61 4c 69 6d 69  +nZero>db->aLimi
18eb0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
18ec0 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20  ENGTH] ){.      
18ed0 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
18ee0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
18ef0 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
18f00 6e 64 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 28  ndResize(pOut, (
18f10 69 6e 74 29 6e 42 79 74 65 29 20 29 7b 0a 20 20  int)nByte) ){.  
18f20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
18f30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75  .    }.  }.  pOu
18f40 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74  t->n = (int)nByt
18f50 65 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  e;.  pOut->flags
18f60 20 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 69   = MEM_Blob;.  i
18f70 66 28 20 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20  f( nZero ){.    
18f80 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20  pOut->u.nZero = 
18f90 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4f 75 74 2d  nZero;.    pOut-
18fa0 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65  >flags |= MEM_Ze
18fb0 72 6f 3b 0a 20 20 7d 0a 20 20 55 50 44 41 54 45  ro;.  }.  UPDATE
18fc0 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
18fd0 75 74 29 3b 0a 20 20 7a 48 64 72 20 3d 20 28 75  ut);.  zHdr = (u
18fe0 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 20 20 7a  8 *)pOut->z;.  z
18ff0 50 61 79 6c 6f 61 64 20 3d 20 7a 48 64 72 20 2b  Payload = zHdr +
19000 20 6e 48 64 72 3b 0a 0a 20 20 2f 2a 20 57 72 69   nHdr;..  /* Wri
19010 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  te the record */
19020 0a 20 20 7a 48 64 72 20 2b 3d 20 70 75 74 56 61  .  zHdr += putVa
19030 72 69 6e 74 33 32 28 7a 48 64 72 2c 20 6e 48 64  rint32(zHdr, nHd
19040 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  r);.  assert( pD
19050 61 74 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20  ata0<=pLast );. 
19060 20 70 52 65 63 20 3d 20 70 44 61 74 61 30 3b 0a   pRec = pData0;.
19070 20 20 64 6f 7b 0a 20 20 20 20 73 65 72 69 61 6c    do{.    serial
19080 5f 74 79 70 65 20 3d 20 70 52 65 63 2d 3e 75 54  _type = pRec->uT
19090 65 6d 70 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  emp;.    /* EVID
190a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 35 32 39  ENCE-OF: R-06529
190b0 2d 34 37 33 36 32 20 46 6f 6c 6c 6f 77 69 6e 67  -47362 Following
190c0 20 74 68 65 20 73 69 7a 65 20 76 61 72 69 6e 74   the size varint
190d0 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
190e0 0a 20 20 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e  .    ** addition
190f0 61 6c 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20  al varints, one 
19100 70 65 72 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  per column. */. 
19110 20 20 20 7a 48 64 72 20 2b 3d 20 70 75 74 56 61     zHdr += putVa
19120 72 69 6e 74 33 32 28 7a 48 64 72 2c 20 73 65 72  rint32(zHdr, ser
19130 69 61 6c 5f 74 79 70 65 29 3b 20 20 20 20 20 20  ial_type);      
19140 20 20 20 20 20 20 2f 2a 20 73 65 72 69 61 6c 20        /* serial 
19150 74 79 70 65 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  type */.    /* E
19160 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34  VIDENCE-OF: R-64
19170 35 33 36 2d 35 31 37 32 38 20 54 68 65 20 76 61  536-51728 The va
19180 6c 75 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f  lues for each co
19190 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 63 6f  lumn in the reco
191a0 72 64 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  rd.    ** immedi
191b0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65  ately follow the
191c0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
191d0 7a 50 61 79 6c 6f 61 64 20 2b 3d 20 73 71 6c 69  zPayload += sqli
191e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
191f0 28 7a 50 61 79 6c 6f 61 64 2c 20 70 52 65 63 2c  (zPayload, pRec,
19200 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 20 2f   serial_type); /
19210 2a 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 7d  * content */.  }
19220 77 68 69 6c 65 28 20 28 2b 2b 70 52 65 63 29 3c  while( (++pRec)<
19230 3d 70 4c 61 73 74 20 29 3b 0a 20 20 61 73 73 65  =pLast );.  asse
19240 72 74 28 20 6e 48 64 72 3d 3d 28 69 6e 74 29 28  rt( nHdr==(int)(
19250 7a 48 64 72 20 2d 20 28 75 38 2a 29 70 4f 75 74  zHdr - (u8*)pOut
19260 2d 3e 7a 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ->z) );.  assert
19270 28 20 6e 42 79 74 65 3d 3d 28 69 6e 74 29 28 7a  ( nByte==(int)(z
19280 50 61 79 6c 6f 61 64 20 2d 20 28 75 38 2a 29 70  Payload - (u8*)p
19290 4f 75 74 2d 3e 7a 29 20 29 3b 0a 0a 20 20 61 73  Out->z) );..  as
192a0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
192b0 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  && pOp->p3<=(p->
192c0 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
192d0 73 6f 72 29 20 29 3b 0a 20 20 52 45 47 49 53 54  sor) );.  REGIST
192e0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
192f0 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  , pOut);.  break
19300 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
19310 43 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20  Count P1 P2 * * 
19320 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
19330 5b 50 32 5d 3d 63 6f 75 6e 74 28 29 0a 2a 2a 0a  [P2]=count().**.
19340 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d  ** Store the num
19350 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28  ber of entries (
19360 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
19370 29 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  ) in the table o
19380 72 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e  r index .** open
19390 65 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 20  ed by cursor P1 
193a0 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
193b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
193c0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
193d0 0a 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20  .case OP_Count: 
193e0 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74  {         /* out
193f0 32 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72  2 */.  i64 nEntr
19400 79 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  y;.  BtCursor *p
19410 43 72 73 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Crsr;..  assert(
19420 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
19430 31 5d 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  1]->eCurType==CU
19440 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
19450 20 70 43 72 73 72 20 3d 20 70 2d 3e 61 70 43 73   pCrsr = p->apCs
19460 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 75 63 2e 70  r[pOp->p1]->uc.p
19470 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
19480 28 20 70 43 72 73 72 20 29 3b 0a 20 20 6e 45 6e  ( pCrsr );.  nEn
19490 74 72 79 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  try = 0;  /* Not
194a0 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75   needed.  Only u
194b0 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61  sed to silence a
194c0 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72   warning. */.  r
194d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
194e0 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e 45  Count(pCrsr, &nE
194f0 6e 74 72 79 29 3b 0a 20 20 69 66 28 20 72 63 20  ntry);.  if( rc 
19500 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
19510 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75  _to_error;.  pOu
19520 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
19530 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f  se(p, pOp);.  pO
19540 75 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74 72 79  ut->u.i = nEntry
19550 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
19560 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
19570 53 61 76 65 70 6f 69 6e 74 20 50 31 20 2a 20 2a  Savepoint P1 * *
19580 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e   P4 *.**.** Open
19590 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
195a0 6c 62 61 63 6b 20 74 68 65 20 73 61 76 65 70 6f  lback the savepo
195b0 69 6e 74 20 6e 61 6d 65 64 20 62 79 20 70 61 72  int named by par
195c0 61 6d 65 74 65 72 20 50 34 2c 20 64 65 70 65 6e  ameter P4, depen
195d0 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 76  ding.** on the v
195e0 61 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f 20 6f  alue of P1. To o
195f0 70 65 6e 20 61 20 6e 65 77 20 73 61 76 65 70 6f  pen a new savepo
19600 69 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f 20 72  int, P1==0. To r
19610 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
19620 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 73  an.** existing s
19630 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 31 2c  avepoint, P1==1,
19640 20 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20   or to rollback 
19650 61 6e 20 65 78 69 73 74 69 6e 67 20 73 61 76 65  an existing save
19660 70 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a 2f 0a  point P1==2..*/.
19670 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
19680 74 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20  t: {.  int p1;  
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
196b0 6f 66 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  of P1 operand */
196c0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61     /* Name of sa
196f0 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  vepoint */.  int
19700 20 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65 70 6f   nName;.  Savepo
19710 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53 61 76  int *pNew;.  Sav
19720 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
19730 6e 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20  nt;.  Savepoint 
19740 2a 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69 53 61  *pTmp;.  int iSa
19750 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20 69  vepoint;.  int i
19760 69 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e  i;..  p1 = pOp->
19770 70 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4f  p1;.  zName = pO
19780 70 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a 20 41  p->p4.z;..  /* A
19790 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 70  ssert that the p
197a0 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 76  1 parameter is v
197b0 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61 74 20  alid. Also that 
197c0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  if there is no o
197d0 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  pen.  ** transac
197e0 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72 65  tion, then there
197f0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20 73   cannot be any s
19800 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f  avepoints. .  */
19810 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
19820 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20  Savepoint==0 || 
19830 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
19840 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19850 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  1==SAVEPOINT_BEG
19860 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e  IN||p1==SAVEPOIN
19870 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d 53  T_RELEASE||p1==S
19880 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
19890 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  K );.  assert( d
198a0 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c 7c  b->pSavepoint ||
198b0 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
198c0 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  onSavepoint==0 )
198d0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68 65 63  ;.  assert( chec
198e0 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28  kSavepointCount(
198f0 64 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  db) );.  assert(
19900 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b   p->bIsReader );
19910 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45  ..  if( p1==SAVE
19920 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20  POINT_BEGIN ){. 
19930 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
19940 57 72 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20  Write>0 ){.     
19950 20 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70 6f   /* A new savepo
19960 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 72  int cannot be cr
19970 65 61 74 65 64 20 69 66 20 74 68 65 72 65 20 61  eated if there a
19980 72 65 20 61 63 74 69 76 65 20 77 72 69 74 65 20  re active write 
19990 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
199a0 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20  ents (i.e. open 
199b0 72 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72 65  read/write incre
199c0 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64  mental blob hand
199d0 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  les)..      */. 
199e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
199f0 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74  Error(p, "cannot
19a00 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20   open savepoint 
19a10 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  - SQL statements
19a20 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a   in progress");.
19a30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19a40 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
19a50 65 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  e{.      nName =
19a60 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
19a70 28 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e 64 65  (zName);..#ifnde
19a80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
19a90 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
19aa0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
19ab0 20 4f 6b 20 65 76 65 6e 20 69 66 20 74 68 69 73   Ok even if this
19ac0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
19ad0 74 75 61 6c 6c 79 20 61 20 74 72 61 6e 73 61 63  tually a transac
19ae0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 73 61  tion.      ** sa
19af0 76 65 70 6f 69 6e 74 20 28 61 6e 64 20 74 68 65  vepoint (and the
19b00 72 65 66 6f 72 65 20 73 68 6f 75 6c 64 20 6e 6f  refore should no
19b10 74 20 70 72 6f 6d 70 74 20 78 53 61 76 65 70 6f  t prompt xSavepo
19b20 69 6e 74 28 29 29 20 63 61 6c 6c 62 61 63 6b 73  int()) callbacks
19b30 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  ..      ** If th
19b40 69 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  is is a transact
19b50 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 62 65  ion savepoint be
19b60 69 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74 20 69  ing opened, it i
19b70 73 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 20  s guaranteed.   
19b80 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64     ** that the d
19b90 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
19ba0 61 79 20 69 73 20 65 6d 70 74 79 2e 20 20 2a 2f  ay is empty.  */
19bb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
19bc0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
19bd0 20 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e 73 3d   || db->nVTrans=
19be0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
19bf0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
19c00 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
19c10 49 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20 20 20  INT_BEGIN,.     
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c30 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e             db->n
19c40 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
19c50 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
19c60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19c70 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
19c80 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65  due_to_error;.#e
19c90 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 43  ndif..      /* C
19ca0 72 65 61 74 65 20 61 20 6e 65 77 20 73 61 76 65  reate a new save
19cb0 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e  point structure.
19cc0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   */.      pNew =
19cd0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19ce0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
19cf0 28 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d  (Savepoint)+nNam
19d00 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e+1);.      if( 
19d10 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
19d20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
19d30 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  har *)&pNew[1];.
19d40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
19d50 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  New->zName, zNam
19d60 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20  e, nName+1);.   
19d70 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20   .        /* If 
19d80 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
19d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
19da0 65 6e 20 6d 61 72 6b 20 74 68 69 73 20 61 73 20  en mark this as 
19db0 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20  a special.      
19dc0 20 20 2a 2a 20 22 74 72 61 6e 73 61 63 74 69 6f    ** "transactio
19dd0 6e 20 73 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f  n savepoint". */
19de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
19df0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
19e00 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
19e10 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  oCommit = 0;.   
19e20 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61         db->isTra
19e30 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
19e40 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
19e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
19e60 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b  db->nSavepoint++
19e70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
19e80 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65       /* Link the
19e90 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69   new savepoint i
19ea0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
19eb0 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20   handle's list. 
19ec0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
19ed0 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61  >pNext = db->pSa
19ee0 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20  vepoint;.       
19ef0 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
19f00 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
19f10 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43  pNew->nDeferredC
19f20 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72  ons = db->nDefer
19f30 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20  redCons;.       
19f40 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64   pNew->nDeferred
19f50 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44  ImmCons = db->nD
19f60 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a  eferredImmCons;.
19f70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19f80 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 61 76 65  }else{.    iSave
19f90 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  point = 0;..    
19fa0 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  /* Find the name
19fb0 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20  d savepoint. If 
19fc0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
19fd0 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e   savepoint, then
19fe0 20 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   an.    ** an er
19ff0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1a000 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a 2f  to the user.  */
1a010 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20  .    for(.      
1a020 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d  pSavepoint = db-
1a030 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20 20  >pSavepoint; .  
1a040 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 26      pSavepoint &
1a050 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1a060 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e 61  (pSavepoint->zNa
1a070 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
1a080 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70    pSavepoint = p
1a090 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
1a0a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 53  .    ){.      iS
1a0b0 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20  avepoint++;.    
1a0c0 7d 0a 20 20 20 20 69 66 28 20 21 70 53 61 76 65  }.    if( !pSave
1a0d0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  point ){.      s
1a0e0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
1a0f0 70 2c 20 22 6e 6f 20 73 75 63 68 20 73 61 76 65  p, "no such save
1a100 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61 6d  point: %s", zNam
1a110 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  e);.      rc = S
1a120 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1a130 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6e   }else if( db->n
1a140 56 64 62 65 57 72 69 74 65 3e 30 20 26 26 20 70  VdbeWrite>0 && p
1a150 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
1a160 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EASE ){.      /*
1a170 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
1a180 62 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 28  ble to release (
1a190 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f  commit) a savepo
1a1a0 69 6e 74 20 69 66 20 74 68 65 72 65 20 61 72 65  int if there are
1a1b0 20 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 76   .      ** activ
1a1c0 65 20 77 72 69 74 65 20 73 74 61 74 65 6d 65 6e  e write statemen
1a1d0 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ts..      */.   
1a1e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
1a1f0 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20 72  ror(p, "cannot r
1a200 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e 74  elease savepoint
1a210 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a230 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
1a240 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
1a250 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a260 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
1a270 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72  ..      /* Deter
1a280 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
1a290 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20 74 72  not this is a tr
1a2a0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
1a2b0 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20  int. If so,.    
1a2c0 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69 73    ** and this is
1a2d0 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d 61   a RELEASE comma
1a2e0 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
1a2f0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1a300 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f   .      ** is co
1a310 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20 20  mmitted. .      
1a320 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54  */.      int isT
1a330 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53 61  ransaction = pSa
1a340 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d 3d  vepoint->pNext==
1a350 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e 73  0 && db->isTrans
1a360 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3b  actionSavepoint;
1a370 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72 61  .      if( isTra
1a380 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d  nsaction && p1==
1a390 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1a3a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  E ){.        if(
1a3b0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64   (rc = sqlite3Vd
1a3c0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29  beCheckFk(p, 1))
1a3d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a3e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64           goto vd
1a3f0 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  be_return;.     
1a400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d     }.        db-
1a410 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
1a420 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1a430 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d  ite3VdbeHalt(p)=
1a440 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
1a450 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20            p->pc 
1a460 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  = (int)(pOp - aO
1a470 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  p);.          db
1a480 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30  ->autoCommit = 0
1a490 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
1a4a0 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  c = rc = SQLITE_
1a4b0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
1a4c0 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
1a4d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a4e0 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61      db->isTransa
1a4f0 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
1a500 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
1a510 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65   p->rc;.      }e
1a520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1a530 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3b   isSchemaChange;
1a540 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70 6f  .        iSavepo
1a550 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70  int = db->nSavep
1a560 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e  oint - iSavepoin
1a570 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t - 1;.        i
1a580 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  f( p1==SAVEPOINT
1a590 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
1a5a0 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 43         isSchemaC
1a5b0 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44 62  hange = (db->mDb
1a5c0 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53  Flags & DBFLAG_S
1a5d0 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30 3b  chemaChange)!=0;
1a5e0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1a5f0 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
1a600 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
1a610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a620 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1a630 6f 72 73 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  ors(db->aDb[ii].
1a640 70 42 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pBt,.           
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a660 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1a670 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
1a680 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 20 20 20 20 20 20 20 20 20 20 69 73 53 63 68 65            isSche
1a6b0 6d 61 43 68 61 6e 67 65 3d 3d 30 29 3b 0a 20 20  maChange==0);.  
1a6c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1a6d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1a6e0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1a6f0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
1a700 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1a710 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 63  {.          isSc
1a720 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 30 3b 0a  hemaChange = 0;.
1a730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a740 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64    for(ii=0; ii<d
1a750 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20  b->nDb; ii++){. 
1a760 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1a770 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1a780 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  int(db->aDb[ii].
1a790 70 42 74 2c 20 70 31 2c 20 69 53 61 76 65 70 6f  pBt, p1, iSavepo
1a7a0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
1a7b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a7c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1a7d0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1a7e0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
1a7f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1a800 20 20 20 20 20 20 20 20 69 66 28 20 69 73 53 63          if( isSc
1a810 68 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20  hemaChange ){.  
1a820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a830 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
1a840 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a  tements(db, 0);.
1a850 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a860 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
1a870 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29  OfConnection(db)
1a880 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
1a890 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c  mDbFlags |= DBFL
1a8a0 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
1a8b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a8c0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 52   }.  .      /* R
1a8d0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
1a8e0 74 68 65 72 20 74 68 69 73 20 69 73 20 61 20 52  ther this is a R
1a8f0 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41  ELEASE or ROLLBA
1a900 43 4b 2c 20 64 65 73 74 72 6f 79 20 61 6c 6c 20  CK, destroy all 
1a910 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f  .      ** savepo
1a920 69 6e 74 73 20 6e 65 73 74 65 64 20 69 6e 73 69  ints nested insi
1a930 64 65 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  de of the savepo
1a940 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74  int being operat
1a950 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ed on. */.      
1a960 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65  while( db->pSave
1a970 70 6f 69 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e  point!=pSavepoin
1a980 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 6d  t ){.        pTm
1a990 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  p = db->pSavepoi
1a9a0 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  nt;.        db->
1a9b0 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d  pSavepoint = pTm
1a9c0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
1a9d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a9e0 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 20 20 20  db, pTmp);.     
1a9f0 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e     db->nSavepoin
1aa00 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t--;.      }..  
1aa10 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
1aa20 61 20 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  a RELEASE, then 
1aa30 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65  destroy the save
1aa40 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72  point being oper
1aa50 61 74 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a  ated on .      *
1aa60 2a 20 74 6f 6f 2e 20 49 66 20 69 74 20 69 73 20  * too. If it is 
1aa70 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74  a ROLLBACK TO, t
1aa80 68 65 6e 20 73 65 74 20 74 68 65 20 6e 75 6d 62  hen set the numb
1aa90 65 72 20 6f 66 20 64 65 66 65 72 72 65 64 20 0a  er of deferred .
1aaa0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
1aab0 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70  int violations p
1aac0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61  resent in the da
1aad0 74 61 62 61 73 65 20 74 6f 20 74 68 65 20 76 61  tabase to the va
1aae0 6c 75 65 20 73 74 6f 72 65 64 0a 20 20 20 20 20  lue stored.     
1aaf0 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 73 61 76   ** when the sav
1ab00 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
1ab10 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  ed.  */.      if
1ab20 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( p1==SAVEPOINT_
1ab30 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20  RELEASE ){.     
1ab40 20 20 20 61 73 73 65 72 74 28 20 70 53 61 76 65     assert( pSave
1ab50 70 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65  point==db->pSave
1ab60 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  point );.       
1ab70 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
1ab80 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e  = pSavepoint->pN
1ab90 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ext;.        sql
1aba0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1abb0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1abc0 20 20 20 20 69 66 28 20 21 69 73 54 72 61 6e 73      if( !isTrans
1abd0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1abe0 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69      db->nSavepoi
1abf0 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt--;.        }.
1ac00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ac10 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
1ac20 65 64 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f  edCons = pSavepo
1ac30 69 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  int->nDeferredCo
1ac40 6e 73 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ns;.        db->
1ac50 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
1ac60 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   = pSavepoint->n
1ac70 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b  DeferredImmCons;
1ac80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1ac90 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74 69  if( !isTransacti
1aca0 6f 6e 20 7c 7c 20 70 31 3d 3d 53 41 56 45 50 4f  on || p1==SAVEPO
1acb0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
1acc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1acd0 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
1ace0 74 28 64 62 2c 20 70 31 2c 20 69 53 61 76 65 70  t(db, p1, iSavep
1acf0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69  oint);.        i
1ad00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ad10 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
1ad20 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1ad30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1ad40 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
1ad50 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1ad60 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  ;..  break;.}../
1ad70 2a 20 4f 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f  * Opcode: AutoCo
1ad80 6d 6d 69 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  mmit P1 P2 * * *
1ad90 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  .**.** Set the d
1ada0 61 74 61 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d  atabase auto-com
1adb0 6d 69 74 20 66 6c 61 67 20 74 6f 20 50 31 20 28  mit flag to P1 (
1adc0 31 20 6f 72 20 30 29 2e 20 49 66 20 50 32 20 69  1 or 0). If P2 i
1add0 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20  s true, roll.** 
1ade0 62 61 63 6b 20 61 6e 79 20 63 75 72 72 65 6e 74  back any current
1adf0 6c 79 20 61 63 74 69 76 65 20 62 74 72 65 65 20  ly active btree 
1ae00 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66  transactions. If
1ae10 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 61   there are any a
1ae20 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70  ctive.** VMs (ap
1ae30 61 72 74 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e  art from this on
1ae40 65 29 2c 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42  e), then a ROLLB
1ae50 41 43 4b 20 66 61 69 6c 73 2e 20 20 41 20 43 4f  ACK fails.  A CO
1ae60 4d 4d 49 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a  MMIT fails if.**
1ae70 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
1ae80 65 20 77 72 69 74 69 6e 67 20 56 4d 73 20 6f 72  e writing VMs or
1ae90 20 61 63 74 69 76 65 20 56 4d 73 20 74 68 61 74   active VMs that
1aea0 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
1aeb0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  e..**.** This in
1aec0 73 74 72 75 63 74 69 6f 6e 20 63 61 75 73 65 73  struction causes
1aed0 20 74 68 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e   the VM to halt.
1aee0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f  .*/.case OP_Auto
1aef0 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20  Commit: {.  int 
1af00 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
1af10 74 3b 0a 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61  t;.  int iRollba
1af20 63 6b 3b 0a 0a 20 20 64 65 73 69 72 65 64 41 75  ck;..  desiredAu
1af30 74 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e  toCommit = pOp->
1af40 70 31 3b 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20  p1;.  iRollback 
1af50 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
1af60 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f  ert( desiredAuto
1af70 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73  Commit==1 || des
1af80 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d  iredAutoCommit==
1af90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  0 );.  assert( d
1afa0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
1afb0 3d 3d 31 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b  ==1 || iRollback
1afc0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1afd0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
1afe0 3e 30 20 29 3b 20 20 2f 2a 20 41 74 20 6c 65 61  >0 );  /* At lea
1aff0 73 74 20 74 68 69 73 20 6f 6e 65 20 56 4d 20 69  st this one VM i
1b000 73 20 61 63 74 69 76 65 20 2a 2f 0a 20 20 61 73  s active */.  as
1b010 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
1b020 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 64 65 73  er );..  if( des
1b030 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d  iredAutoCommit!=
1b040 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
1b050 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 6c 6c 62  {.    if( iRollb
1b060 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ack ){.      ass
1b070 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f  ert( desiredAuto
1b080 43 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20  Commit==1 );.   
1b090 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
1b0a0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
1b0b0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
1b0c0 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f  ;.      db->auto
1b0d0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
1b0e0 7d 65 6c 73 65 20 69 66 28 20 64 65 73 69 72 65  }else if( desire
1b0f0 64 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  dAutoCommit && d
1b100 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20  b->nVdbeWrite>0 
1b110 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1b120 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
1b130 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 43 4f 4d  implements a COM
1b140 4d 49 54 20 61 6e 64 20 6f 74 68 65 72 20 56 4d  MIT and other VM
1b150 73 20 61 72 65 20 77 72 69 74 69 6e 67 0a 20 20  s are writing.  
1b160 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e      ** return an
1b170 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 69 6e   error indicatin
1b180 67 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  g that the other
1b190 20 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65   VMs must comple
1b1a0 74 65 20 66 69 72 73 74 2e 20 0a 20 20 20 20 20  te first. .     
1b1b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b1c0 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63  3VdbeError(p, "c
1b1d0 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61  annot commit tra
1b1e0 6e 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20  nsaction - ".   
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b200 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74         "SQL stat
1b210 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
1b220 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ss");.      rc =
1b230 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1b240 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
1b250 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
1b260 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
1b270 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
1b280 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49  kFk(p, 1))!=SQLI
1b290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
1b2a0 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
1b2b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b2c0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
1b2d0 20 3d 20 28 75 38 29 64 65 73 69 72 65 64 41 75   = (u8)desiredAu
1b2e0 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a  toCommit;.    }.
1b2f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
1b300 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49  dbeHalt(p)==SQLI
1b310 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
1b320 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70   p->pc = (int)(p
1b330 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20  Op - aOp);.     
1b340 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
1b350 3d 20 28 75 38 29 28 31 2d 64 65 73 69 72 65 64  = (u8)(1-desired
1b360 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  AutoCommit);.   
1b370 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20     p->rc = rc = 
1b380 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1b390 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
1b3a0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
1b3b0 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
1b3c0 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ement==0 );.    
1b3d0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
1b3e0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
1b3f0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1b410 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1b420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1b440 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  OR;.    }.    go
1b450 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
1b460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1b470 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
1b480 0a 20 20 20 20 20 20 20 20 28 21 64 65 73 69 72  .        (!desir
1b490 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63  edAutoCommit)?"c
1b4a0 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72  annot start a tr
1b4b0 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e  ansaction within
1b4c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a   a transaction":
1b4d0 28 0a 20 20 20 20 20 20 20 20 28 69 52 6f 6c 6c  (.        (iRoll
1b4e0 62 61 63 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f  back)?"cannot ro
1b4f0 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e  llback - no tran
1b500 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
1b510 65 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e":.            
1b520 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
1b530 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73  ommit - no trans
1b540 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
1b550 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 0a 20  "));.         . 
1b560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1b570 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f 20 61  RROR;.    goto a
1b580 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1b590 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  r;.  }.  break;.
1b5a0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72  }../* Opcode: Tr
1b5b0 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50 32 20  ansaction P1 P2 
1b5c0 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42  P3 P4 P5.**.** B
1b5d0 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
1b5e0 6f 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 50  on on database P
1b5f0 31 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  1 if a transacti
1b600 6f 6e 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  on is not alread
1b610 79 0a 2a 2a 20 61 63 74 69 76 65 2e 0a 2a 2a 20  y.** active..** 
1b620 49 66 20 50 32 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P2 is non-zer
1b630 6f 2c 20 74 68 65 6e 20 61 20 77 72 69 74 65 2d  o, then a write-
1b640 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1b650 74 61 72 74 65 64 2c 20 6f 72 20 69 66 20 61 20  tarted, or if a 
1b660 0a 2a 2a 20 72 65 61 64 2d 74 72 61 6e 73 61 63  .** read-transac
1b670 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
1b680 61 63 74 69 76 65 2c 20 69 74 20 69 73 20 75 70  active, it is up
1b690 67 72 61 64 65 64 20 74 6f 20 61 20 77 72 69 74  graded to a writ
1b6a0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e-transaction..*
1b6b0 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c  * If P2 is zero,
1b6c0 20 74 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   then a read-tra
1b6d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1b6e0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  ted..**.** P1 is
1b6f0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1b700 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b710 6f 6e 20 77 68 69 63 68 20 74 68 65 20 74 72 61  on which the tra
1b720 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 73  nsaction is.** s
1b730 74 61 72 74 65 64 2e 20 20 49 6e 64 65 78 20 30  tarted.  Index 0
1b740 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74   is the main dat
1b750 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
1b760 6e 64 65 78 20 31 20 69 73 20 74 68 65 0a 2a 2a  ndex 1 is the.**
1b770 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 74   file used for t
1b780 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
1b790 20 20 49 6e 64 69 63 65 73 20 6f 66 20 32 20 6f    Indices of 2 o
1b7a0 72 20 6d 6f 72 65 20 61 72 65 20 75 73 65 64 20  r more are used 
1b7b0 66 6f 72 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  for.** attached 
1b7c0 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
1b7d0 20 49 66 20 61 20 77 72 69 74 65 2d 74 72 61 6e   If a write-tran
1b7e0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
1b7f0 65 64 20 61 6e 64 20 74 68 65 20 56 64 62 65 2e  ed and the Vdbe.
1b800 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
1b810 66 6c 61 67 20 69 73 0a 2a 2a 20 74 72 75 65 20  flag is.** true 
1b820 28 74 68 69 73 20 66 6c 61 67 20 69 73 20 73 65  (this flag is se
1b830 74 20 69 66 20 74 68 65 20 56 64 62 65 20 6d 61  t if the Vdbe ma
1b840 79 20 6d 6f 64 69 66 79 20 6d 6f 72 65 20 74 68  y modify more th
1b850 61 6e 20 6f 6e 65 20 72 6f 77 20 61 6e 64 20 6d  an one row and m
1b860 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41  ay.** throw an A
1b870 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 29 2c  BORT exception),
1b880 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1b890 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73  nsaction may als
1b8a0 6f 20 62 65 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20  o be opened..** 
1b8b0 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1b8c0 79 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  y, a statement t
1b8d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
1b8e0 65 6e 65 64 20 69 66 66 20 74 68 65 20 64 61 74  ened iff the dat
1b8f0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
1b900 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
1b910 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d 6d   not in autocomm
1b920 69 74 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20 74  it mode, or if t
1b930 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a 2a  here are other.*
1b940 2a 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  * active stateme
1b950 6e 74 73 2e 20 41 20 73 74 61 74 65 6d 65 6e 74  nts. A statement
1b960 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c   transaction all
1b970 6f 77 73 20 74 68 65 20 63 68 61 6e 67 65 73 20  ows the changes 
1b980 6d 61 64 65 20 62 79 20 74 68 69 73 0a 2a 2a 20  made by this.** 
1b990 56 44 42 45 20 74 6f 20 62 65 20 72 6f 6c 6c 65  VDBE to be rolle
1b9a0 64 20 62 61 63 6b 20 61 66 74 65 72 20 61 6e 20  d back after an 
1b9b0 65 72 72 6f 72 20 77 69 74 68 6f 75 74 20 68 61  error without ha
1b9c0 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62 61 63  ving to roll bac
1b9d0 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  k the.** entire 
1b9e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
1b9f0 6e 6f 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  no error is enco
1ba00 75 6e 74 65 72 65 64 2c 20 74 68 65 20 73 74 61  untered, the sta
1ba10 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1ba20 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74 6f 6d  on.** will autom
1ba30 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 20  atically commit 
1ba40 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 68 61  when the VDBE ha
1ba50 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35  lts..**.** If P5
1ba60 21 3d 30 20 74 68 65 6e 20 74 68 69 73 20 6f 70  !=0 then this op
1ba70 63 6f 64 65 20 61 6c 73 6f 20 63 68 65 63 6b 73  code also checks
1ba80 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
1ba90 69 65 20 61 67 61 69 6e 73 74 20 50 33 0a 2a 2a  ie against P3.**
1baa0 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20   and the schema 
1bab0 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74  generation count
1bac0 65 72 20 61 67 61 69 6e 73 74 20 50 34 2e 0a 2a  er against P4..*
1bad0 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 63 68 61  * The cookie cha
1bae0 6e 67 65 73 20 69 74 73 20 76 61 6c 75 65 20 77  nges its value w
1baf0 68 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61  henever the data
1bb00 62 61 73 65 20 73 63 68 65 6d 61 20 63 68 61 6e  base schema chan
1bb10 67 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 65  ges..** This ope
1bb20 72 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  ration is used t
1bb30 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  o detect when th
1bb40 61 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 68 61  at the cookie ha
1bb50 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 61 6e 64  s changed.** and
1bb60 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
1bb70 74 20 70 72 6f 63 65 73 73 20 6e 65 65 64 73 20  t process needs 
1bb80 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 73 63  to reread the sc
1bb90 68 65 6d 61 2e 20 20 49 66 20 74 68 65 20 73 63  hema.  If the sc
1bba0 68 65 6d 61 0a 2a 2a 20 63 6f 6f 6b 69 65 20 69  hema.** cookie i
1bbb0 6e 20 50 33 20 64 69 66 66 65 72 73 20 66 72 6f  n P3 differs fro
1bbc0 6d 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  m the schema coo
1bbd0 6b 69 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  kie in the datab
1bbe0 61 73 65 20 68 65 61 64 65 72 20 6f 72 0a 2a 2a  ase header or.**
1bbf0 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20 67   if the schema g
1bc00 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65  eneration counte
1bc10 72 20 69 6e 20 50 34 20 64 69 66 66 65 72 73 20  r in P4 differs 
1bc20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
1bc30 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6f 6e 20 63  .** generation c
1bc40 6f 75 6e 74 65 72 2c 20 74 68 65 6e 20 61 6e 20  ounter, then an 
1bc50 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 65 72  SQLITE_SCHEMA er
1bc60 72 6f 72 20 69 73 20 72 61 69 73 65 64 20 61 6e  ror is raised an
1bc70 64 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 68  d execution.** h
1bc80 61 6c 74 73 2e 20 20 54 68 65 20 73 71 6c 69 74  alts.  The sqlit
1bc90 65 33 5f 73 74 65 70 28 29 20 77 72 61 70 70 65  e3_step() wrappe
1bca0 72 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74  r function might
1bcb0 20 74 68 65 6e 20 72 65 70 72 65 70 61 72 65 20   then reprepare 
1bcc0 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
1bcd0 20 61 6e 64 20 72 65 72 75 6e 20 69 74 20 66 72   and rerun it fr
1bce0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
1bcf0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61  ..*/.case OP_Tra
1bd00 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74  nsaction: {.  Bt
1bd10 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  ree *pBt;.  int 
1bd20 69 4d 65 74 61 20 3d 20 30 3b 0a 0a 20 20 61 73  iMeta = 0;..  as
1bd30 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
1bd40 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
1bd50 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c  p->readOnly==0 |
1bd60 7c 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a  | pOp->p2==0 );.
1bd70 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1bd80 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1bd90 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
1bda0 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28  ert( DbMaskTest(
1bdb0 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f  p->btreeMask, pO
1bdc0 70 2d 3e 70 31 29 20 29 3b 0a 20 20 69 66 28 20  p->p1) );.  if( 
1bdd0 70 4f 70 2d 3e 70 32 20 26 26 20 28 64 62 2d 3e  pOp->p2 && (db->
1bde0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 51  flags & SQLITE_Q
1bdf0 75 65 72 79 4f 6e 6c 79 29 21 3d 30 20 29 7b 0a  ueryOnly)!=0 ){.
1be00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1be10 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
1be20 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1be30 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 42 74  error;.  }.  pBt
1be40 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
1be50 70 31 5d 2e 70 42 74 3b 0a 0a 20 20 69 66 28 20  p1].pBt;..  if( 
1be60 70 42 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pBt ){.    rc = 
1be70 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1be80 6e 54 72 61 6e 73 28 70 42 74 2c 20 70 4f 70 2d  nTrans(pBt, pOp-
1be90 3e 70 32 2c 20 26 69 4d 65 74 61 29 3b 0a 20 20  >p2, &iMeta);.  
1bea0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
1beb0 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
1bec0 53 48 4f 54 20 29 3b 0a 20 20 20 20 74 65 73 74  SHOT );.    test
1bed0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
1bee0 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 20 29  _BUSY_RECOVERY )
1bef0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1bf00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bf10 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d   if( (rc&0xff)==
1bf20 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
1bf30 20 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 28         p->pc = (
1bf40 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b  int)(pOp - aOp);
1bf50 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1bf60 20 72 63 3b 0a 20 20 20 20 20 20 20 20 67 6f 74   rc;.        got
1bf70 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
1bf80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1bf90 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1bfa0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rror;.    }..   
1bfb0 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 26 20   if( pOp->p2 && 
1bfc0 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
1bfd0 61 6c 20 0a 20 20 20 20 20 26 26 20 28 64 62 2d  al .     && (db-
1bfe0 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c  >autoCommit==0 |
1bff0 7c 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  | db->nVdbeRead>
1c000 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  1) .    ){.     
1c010 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1c020 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
1c030 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Bt) );.      if(
1c040 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
1c050 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1c060 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
1c070 65 6e 74 3e 3d 30 20 26 26 20 64 62 2d 3e 6e 53  ent>=0 && db->nS
1c080 61 76 65 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20  avepoint>=0 );. 
1c090 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74         db->nStat
1c0a0 65 6d 65 6e 74 2b 2b 3b 20 0a 20 20 20 20 20 20  ement++; .      
1c0b0 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
1c0c0 3d 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  = db->nSavepoint
1c0d0 20 2b 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e   + db->nStatemen
1c0e0 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
1c0f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
1c100 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
1c110 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c  SAVEPOINT_BEGIN,
1c120 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
1c130 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c150 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c160 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
1c170 28 70 42 74 2c 20 70 2d 3e 69 53 74 61 74 65 6d  (pBt, p->iStatem
1c180 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ent);.      }.. 
1c190 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
1c1a0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1c1b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c1c0 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
1c1d0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20   constraint.    
1c1e0 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 49 66    ** counter. If
1c1f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1c200 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
1c210 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1c220 63 6b 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ck,.      ** the
1c230 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 63   value of this c
1c240 6f 75 6e 74 65 72 20 6e 65 65 64 73 20 74 6f 20  ounter needs to 
1c250 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 6f 2e  be restored too.
1c260 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 53    */.      p->nS
1c270 74 6d 74 44 65 66 43 6f 6e 73 20 3d 20 64 62 2d  tmtDefCons = db-
1c280 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a  >nDeferredCons;.
1c290 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65        p->nStmtDe
1c2a0 66 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e  fImmCons = db->n
1c2b0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b  DeferredImmCons;
1c2c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1c2d0 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ert( pOp->p5==0 
1c2e0 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  || pOp->p4type==
1c2f0 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 69 66  P4_INT32 );.  if
1c300 28 20 70 4f 70 2d 3e 70 35 0a 20 20 20 26 26 20  ( pOp->p5.   && 
1c310 28 69 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 33 0a  (iMeta!=pOp->p3.
1c320 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 61 44 62        || db->aDb
1c330 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d  [pOp->p1].pSchem
1c340 61 2d 3e 69 47 65 6e 65 72 61 74 69 6f 6e 21 3d  a->iGeneration!=
1c350 70 4f 70 2d 3e 70 34 2e 69 29 0a 20 20 29 7b 0a  pOp->p4.i).  ){.
1c360 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 4d      /*.    ** IM
1c370 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1c380 20 52 2d 30 33 31 38 39 2d 35 31 31 33 35 20 41   R-03189-51135 A
1c390 73 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  s each SQL state
1c3a0 6d 65 6e 74 20 72 75 6e 73 2c 20 74 68 65 20 73  ment runs, the s
1c3b0 63 68 65 6d 61 0a 20 20 20 20 2a 2a 20 76 65 72  chema.    ** ver
1c3c0 73 69 6f 6e 20 69 73 20 63 68 65 63 6b 65 64 20  sion is checked 
1c3d0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1c3e0 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
1c3f0 74 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  t changed since 
1c400 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73  the.    ** SQL s
1c410 74 61 74 65 6d 65 6e 74 20 77 61 73 20 70 72 65  tatement was pre
1c420 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
1c430 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c440 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
1c450 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
1c460 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1c470 70 28 64 62 2c 20 22 64 61 74 61 62 61 73 65 20  p(db, "database 
1c480 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67  schema has chang
1c490 65 64 22 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ed");.    /* If 
1c4a0 74 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69  the schema-cooki
1c4b0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
1c4c0 61 73 65 20 66 69 6c 65 20 6d 61 74 63 68 65 73  ase file matches
1c4d0 20 74 68 65 20 63 6f 6f 6b 69 65 20 0a 20 20 20   the cookie .   
1c4e0 20 2a 2a 20 73 74 6f 72 65 64 20 77 69 74 68 20   ** stored with 
1c4f0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
1c500 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1c510 74 68 65 20 73 63 68 65 6d 61 2c 20 64 6f 0a 20  the schema, do. 
1c520 20 20 20 2a 2a 20 6e 6f 74 20 72 65 6c 6f 61 64     ** not reload
1c530 20 74 68 65 20 73 63 68 65 6d 61 20 66 72 6f 6d   the schema from
1c540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c550 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c560 2a 20 49 66 20 76 69 72 74 75 61 6c 2d 74 61 62  * If virtual-tab
1c570 6c 65 73 20 61 72 65 20 69 6e 20 75 73 65 2c 20  les are in use, 
1c580 74 68 69 73 20 69 73 20 6e 6f 74 20 6a 75 73 74  this is not just
1c590 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
1c5a0 2e 0a 20 20 20 20 2a 2a 20 4f 66 74 65 6e 2c 20  ..    ** Often, 
1c5b0 76 2d 74 61 62 6c 65 73 20 73 74 6f 72 65 20 74  v-tables store t
1c5c0 68 65 69 72 20 64 61 74 61 20 69 6e 20 6f 74 68  heir data in oth
1c5d0 65 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73  er SQLite tables
1c5e0 2c 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 61  , which.    ** a
1c5f0 72 65 20 71 75 65 72 69 65 64 20 66 72 6f 6d 20  re queried from 
1c600 77 69 74 68 69 6e 20 78 4e 65 78 74 28 29 20 61  within xNext() a
1c610 6e 64 20 6f 74 68 65 72 20 76 2d 74 61 62 6c 65  nd other v-table
1c620 20 6d 65 74 68 6f 64 73 20 75 73 69 6e 67 0a 20   methods using. 
1c630 20 20 20 2a 2a 20 70 72 65 70 61 72 65 64 20 71     ** prepared q
1c640 75 65 72 69 65 73 2e 20 49 66 20 73 75 63 68 20  ueries. If such 
1c650 61 20 71 75 65 72 79 20 69 73 20 6f 75 74 2d 6f  a query is out-o
1c660 66 2d 64 61 74 65 2c 20 77 65 20 64 6f 20 6e 6f  f-date, we do no
1c670 74 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  t want to.    **
1c680 20 64 69 73 63 61 72 64 20 74 68 65 20 64 61 74   discard the dat
1c690 61 62 61 73 65 20 73 63 68 65 6d 61 2c 20 61 73  abase schema, as
1c6a0 20 74 68 65 20 75 73 65 72 20 63 6f 64 65 20 69   the user code i
1c6b0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 0a  mplementing the.
1c6c0 20 20 20 20 2a 2a 20 76 2d 74 61 62 6c 65 20 77      ** v-table w
1c6d0 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 62 65 20  ould have to be 
1c6e0 72 65 61 64 79 20 66 6f 72 20 74 68 65 20 73 71  ready for the sq
1c6f0 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
1c700 74 75 72 65 20 69 74 73 65 6c 66 0a 20 20 20 20  ture itself.    
1c710 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
1c720 61 74 65 64 20 77 68 65 6e 65 76 65 72 20 73 71  ated whenever sq
1c730 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69 73 20  lite3_step() is 
1c740 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
1c750 69 6e 20 0a 20 20 20 20 2a 2a 20 61 20 76 2d 74  in .    ** a v-t
1c760 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 20 20 20  able method..   
1c770 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   */.    if( db->
1c780 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63  aDb[pOp->p1].pSc
1c790 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
1c7a0 6b 69 65 21 3d 69 4d 65 74 61 20 29 7b 0a 20 20  kie!=iMeta ){.  
1c7b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
1c7c0 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c 20 70 4f  OneSchema(db, pO
1c7d0 70 2d 3e 70 31 29 3b 0a 20 20 20 20 7d 0a 20 20  p->p1);.    }.  
1c7e0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
1c7f0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
1c800 45 5f 53 43 48 45 4d 41 3b 0a 20 20 7d 0a 20 20  E_SCHEMA;.  }.  
1c810 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
1c820 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1c830 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1c840 20 4f 70 63 6f 64 65 3a 20 52 65 61 64 43 6f 6f   Opcode: ReadCoo
1c850 6b 69 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a  kie P1 P2 P3 * *
1c860 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6f 6b  .**.** Read cook
1c870 69 65 20 6e 75 6d 62 65 72 20 50 33 20 66 72 6f  ie number P3 fro
1c880 6d 20 64 61 74 61 62 61 73 65 20 50 31 20 61 6e  m database P1 an
1c890 64 20 77 72 69 74 65 20 69 74 20 69 6e 74 6f 20  d write it into 
1c8a0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20  register P2..** 
1c8b0 50 33 3d 3d 31 20 69 73 20 74 68 65 20 73 63 68  P3==1 is the sch
1c8c0 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 50 33  ema version.  P3
1c8d0 3d 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62  ==2 is the datab
1c8e0 61 73 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50  ase format..** P
1c8f0 33 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63 6f  3==3 is the reco
1c900 6d 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63 61  mmended pager ca
1c910 63 68 65 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f  che size, and so
1c920 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69   forth.  P1==0 i
1c930 73 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61  s.** the main da
1c940 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1c950 50 31 3d 3d 31 20 69 73 20 74 68 65 20 64 61 74  P1==1 is the dat
1c960 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
1c970 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70  to store.** temp
1c980 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a  orary tables..**
1c990 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
1c9a0 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
1c9b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65   the database (e
1c9c0 69 74 68 65 72 20 61 20 74 72 61 6e 73 61 63 74  ither a transact
1c9d0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73  ion.** must be s
1c9e0 74 61 72 74 65 64 20 6f 72 20 74 68 65 72 65 20  tarted or there 
1c9f0 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
1ca00 63 75 72 73 6f 72 29 20 62 65 66 6f 72 65 0a 2a  cursor) before.*
1ca10 2a 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  * executing this
1ca20 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
1ca30 0a 63 61 73 65 20 4f 50 5f 52 65 61 64 43 6f 6f  .case OP_ReadCoo
1ca40 6b 69 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  kie: {          
1ca50 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
1ca60 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69    int iMeta;.  i
1ca70 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 43  nt iDb;.  int iC
1ca80 6f 6f 6b 69 65 3b 0a 0a 20 20 61 73 73 65 72 74  ookie;..  assert
1ca90 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
1caa0 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70  ;.  iDb = pOp->p
1cab0 31 3b 0a 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70  1;.  iCookie = p
1cac0 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74  Op->p3;.  assert
1cad0 28 20 70 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45  ( pOp->p3<SQLITE
1cae0 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b  _N_BTREE_META );
1caf0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
1cb00 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
1cb10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
1cb20 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
1cb30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44  0 );.  assert( D
1cb40 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
1cb50 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a  eeMask, iDb) );.
1cb60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  .  sqlite3BtreeG
1cb70 65 74 4d 65 74 61 28 64 62 2d 3e 61 44 62 5b 69  etMeta(db->aDb[i
1cb80 44 62 5d 2e 70 42 74 2c 20 69 43 6f 6f 6b 69 65  Db].pBt, iCookie
1cb90 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74 61 29  , (u32 *)&iMeta)
1cba0 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ;.  pOut = out2P
1cbb0 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
1cbc0 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
1cbd0 20 69 4d 65 74 61 3b 0a 20 20 62 72 65 61 6b 3b   iMeta;.  break;
1cbe0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
1cbf0 65 74 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50  etCookie P1 P2 P
1cc00 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  3 * *.**.** Writ
1cc10 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  e the integer va
1cc20 6c 75 65 20 50 33 20 69 6e 74 6f 20 63 6f 6f 6b  lue P3 into cook
1cc30 69 65 20 6e 75 6d 62 65 72 20 50 32 20 6f 66 20  ie number P2 of 
1cc40 64 61 74 61 62 61 73 65 20 50 31 2e 0a 2a 2a 20  database P1..** 
1cc50 50 32 3d 3d 31 20 69 73 20 74 68 65 20 73 63 68  P2==1 is the sch
1cc60 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 50 32  ema version.  P2
1cc70 3d 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62  ==2 is the datab
1cc80 61 73 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50  ase format..** P
1cc90 32 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63 6f  2==3 is the reco
1cca0 6d 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63 61  mmended pager ca
1ccb0 63 68 65 20 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e  che .** size, an
1ccc0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d  d so forth.  P1=
1ccd0 3d 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64  =0 is the main d
1cce0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1ccf0 20 50 31 3d 3d 31 20 69 73 20 74 68 65 20 0a 2a   P1==1 is the .*
1cd00 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1cd10 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 65  used to store te
1cd20 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
1cd30 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
1cd40 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
1cd50 74 65 64 20 62 65 66 6f 72 65 20 65 78 65 63 75  ted before execu
1cd60 74 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64 65  ting this opcode
1cd70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 74  ..*/.case OP_Set
1cd80 43 6f 6f 6b 69 65 3a 20 7b 0a 20 20 44 62 20 2a  Cookie: {.  Db *
1cd90 70 44 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  pDb;..  sqlite3V
1cda0 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e  dbeIncrWriteCoun
1cdb0 74 65 72 28 70 2c 20 30 29 3b 0a 20 20 61 73 73  ter(p, 0);.  ass
1cdc0 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c  ert( pOp->p2<SQL
1cdd0 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41  ITE_N_BTREE_META
1cde0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1cdf0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1ce00 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
1ce10 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
1ce20 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
1ce30 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20  , pOp->p1) );.  
1ce40 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
1ce50 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20  nly==0 );.  pDb 
1ce60 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  = &db->aDb[pOp->
1ce70 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
1ce80 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  Db->pBt!=0 );.  
1ce90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1cea0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1ceb0 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29  b, pOp->p1, 0) )
1cec0 3b 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20  ;.  /* See note 
1ced0 61 62 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66  about index shif
1cee0 74 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43  ting on OP_ReadC
1cef0 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20  ookie */.  rc = 
1cf00 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
1cf10 74 65 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c  teMeta(pDb->pBt,
1cf20 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70   pOp->p2, pOp->p
1cf30 33 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  3);.  if( pOp->p
1cf40 32 3d 3d 42 54 52 45 45 5f 53 43 48 45 4d 41 5f  2==BTREE_SCHEMA_
1cf50 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f  VERSION ){.    /
1cf60 2a 20 57 68 65 6e 20 74 68 65 20 73 63 68 65 6d  * When the schem
1cf70 61 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73  a cookie changes
1cf80 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e 65 77  , record the new
1cf90 20 63 6f 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c   cookie internal
1cfa0 6c 79 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70  ly */.    pDb->p
1cfb0 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
1cfc0 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b  ookie = pOp->p3;
1cfd0 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67  .    db->mDbFlag
1cfe0 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
1cff0 6d 61 43 68 61 6e 67 65 3b 0a 20 20 7d 65 6c 73  maChange;.  }els
1d000 65 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 42  e if( pOp->p2==B
1d010 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
1d020 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   ){.    /* Recor
1d030 64 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  d changes in the
1d040 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 2a 2f 0a   file format */.
1d050 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
1d060 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20  ->file_format = 
1d070 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 69  pOp->p3;.  }.  i
1d080 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b  f( pOp->p1==1 ){
1d090 0a 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61  .    /* Invalida
1d0a0 74 65 20 61 6c 6c 20 70 72 65 70 61 72 65 64 20  te all prepared 
1d0b0 73 74 61 74 65 6d 65 6e 74 73 20 77 68 65 6e 65  statements whene
1d0c0 76 65 72 20 74 68 65 20 54 45 4d 50 20 64 61 74  ver the TEMP dat
1d0d0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 73 63 68  abase.    ** sch
1d0e0 65 6d 61 20 69 73 20 63 68 61 6e 67 65 64 2e 20  ema is changed. 
1d0f0 20 54 69 63 6b 65 74 20 23 31 36 34 34 20 2a 2f   Ticket #1644 */
1d100 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
1d110 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
1d120 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  ents(db, 0);.   
1d130 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
1d140 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
1d150 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1d160 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
1d170 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1d180 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32 20 50  OpenRead P1 P2 P
1d190 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
1d1a0 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62  sis: root=P2 iDb
1d1b0 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61  =P3.**.** Open a
1d1c0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1d1d0 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  r for the databa
1d1e0 73 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72  se table whose r
1d1f0 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a 2a 20 50  oot page is.** P
1d200 32 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 20  2 in a database 
1d210 66 69 6c 65 2e 20 20 54 68 65 20 64 61 74 61 62  file.  The datab
1d220 61 73 65 20 66 69 6c 65 20 69 73 20 64 65 74 65  ase file is dete
1d230 72 6d 69 6e 65 64 20 62 79 20 50 33 2e 20 0a 2a  rmined by P3. .*
1d240 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73 20 74 68  * P3==0 means th
1d250 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2c  e main database,
1d260 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20 74 68 65   P3==1 means the
1d270 20 64 61 74 61 62 61 73 65 20 75 73 65 64 20 66   database used f
1d280 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  or .** temporary
1d290 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 50 33 3e   tables, and P3>
1d2a0 31 20 6d 65 61 6e 73 20 75 73 65 64 20 74 68 65  1 means used the
1d2b0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
1d2c0 74 74 61 63 68 65 64 0a 2a 2a 20 64 61 74 61 62  ttached.** datab
1d2d0 61 73 65 2e 20 20 47 69 76 65 20 74 68 65 20 6e  ase.  Give the n
1d2e0 65 77 20 63 75 72 73 6f 72 20 61 6e 20 69 64 65  ew cursor an ide
1d2f0 6e 74 69 66 69 65 72 20 6f 66 20 50 31 2e 20 20  ntifier of P1.  
1d300 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c 75 65 73  The P1.** values
1d310 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 63 6f 6e   need not be con
1d320 74 69 67 75 6f 75 73 20 62 75 74 20 61 6c 6c 20  tiguous but all 
1d330 50 31 20 76 61 6c 75 65 73 20 73 68 6f 75 6c 64  P1 values should
1d340 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65   be small intege
1d350 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  rs..** It is an 
1d360 65 72 72 6f 72 20 66 6f 72 20 50 31 20 74 6f 20  error for P1 to 
1d370 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  be negative..**.
1d380 2a 2a 20 41 6c 6c 6f 77 65 64 20 50 35 20 62 69  ** Allowed P5 bi
1d390 74 73 3a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c  ts:.** <ul>.** <
1d3a0 6c 69 3e 20 20 3c 62 3e 30 78 30 32 20 4f 50 46  li>  <b>0x02 OPF
1d3b0 4c 41 47 5f 53 45 45 4b 45 51 3c 2f 62 3e 3a 20  LAG_SEEKEQ</b>: 
1d3c0 54 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c  This cursor will
1d3d0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
1d3e0 72 0a 2a 2a 20 20 20 20 20 20 20 65 71 75 61 6c  r.**       equal
1d3f0 69 74 79 20 6c 6f 6f 6b 75 70 73 20 28 69 6d 70  ity lookups (imp
1d400 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 70 61  lemented as a pa
1d410 69 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 4f 50  ir of opcodes OP
1d420 5f 53 65 65 6b 47 45 2f 4f 50 5f 49 64 78 47 54  _SeekGE/OP_IdxGT
1d430 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 4f 50 5f  .**       of OP_
1d440 53 65 65 6b 4c 45 2f 4f 50 5f 49 64 78 47 54 29  SeekLE/OP_IdxGT)
1d450 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20  .** </ul>.**.** 
1d460 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61 79  The P4 value may
1d470 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 69 6e   be either an in
1d480 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32 29  teger (P4_INT32)
1d490 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
1d4a0 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  .** a KeyInfo st
1d4b0 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59 49  ructure (P4_KEYI
1d4c0 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20 61  NFO). If it is a
1d4d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
1d4e0 79 49 6e 66 6f 20 0a 2a 2a 20 6f 62 6a 65 63 74  yInfo .** object
1d4f0 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 62 65 69  , then table bei
1d500 6e 67 20 6f 70 65 6e 65 64 20 6d 75 73 74 20 62  ng opened must b
1d510 65 20 61 6e 20 5b 69 6e 64 65 78 20 62 2d 74 72  e an [index b-tr
1d520 65 65 5d 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ee] where the.**
1d530 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
1d540 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74  defines the cont
1d550 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ent and collatin
1d560 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  g .** sequence o
1d570 66 20 74 68 61 74 20 69 6e 64 65 78 20 62 2d 74  f that index b-t
1d580 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
1d590 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65  if P4 is an inte
1d5a0 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 74  ger .** value, t
1d5b0 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65  hen the table be
1d5c0 69 6e 67 20 6f 70 65 6e 65 64 20 6d 75 73 74 20  ing opened must 
1d5d0 62 65 20 61 20 5b 74 61 62 6c 65 20 62 2d 74 72  be a [table b-tr
1d5e0 65 65 5d 20 77 69 74 68 20 61 0a 2a 2a 20 6e 75  ee] with a.** nu
1d5f0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1d600 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  no less than the
1d610 20 76 61 6c 75 65 20 6f 66 20 50 34 2e 0a 2a 2a   value of P4..**
1d620 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4f 70  .** See also: Op
1d630 65 6e 57 72 69 74 65 2c 20 52 65 6f 70 65 6e 49  enWrite, ReopenI
1d640 64 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  dx.*/./* Opcode:
1d650 20 52 65 6f 70 65 6e 49 64 78 20 50 31 20 50 32   ReopenIdx P1 P2
1d660 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
1d670 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69  opsis: root=P2 i
1d680 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Db=P3.**.** The 
1d690 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f 64 65  ReopenIdx opcode
1d6a0 20 77 6f 72 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f   works like OP_O
1d6b0 70 65 6e 52 65 61 64 20 65 78 63 65 70 74 20 74  penRead except t
1d6c0 68 61 74 20 69 74 20 66 69 72 73 74 0a 2a 2a 20  hat it first.** 
1d6d0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
1d6e0 20 74 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 50   the cursor on P
1d6f0 31 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  1 is already ope
1d700 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  n on the same.**
1d710 20 62 2d 74 72 65 65 20 61 6e 64 20 69 66 20 69   b-tree and if i
1d720 74 20 69 73 20 74 68 69 73 20 6f 70 63 6f 64 65  t is this opcode
1d730 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70   becomes a no-op
1d740 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1d750 73 2c 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  s,.** if the cur
1d760 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f  sor is already o
1d770 70 65 6e 2c 20 64 6f 20 6e 6f 74 20 72 65 6f 70  pen, do not reop
1d780 65 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  en it..**.** The
1d790 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f 64   ReopenIdx opcod
1d7a0 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  e may only be us
1d7b0 65 64 20 77 69 74 68 20 50 35 3d 3d 30 20 6f 72  ed with P5==0 or
1d7c0 20 50 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b   P5==OPFLAG_SEEK
1d7d0 45 51 0a 2a 2a 20 61 6e 64 20 77 69 74 68 20 50  EQ.** and with P
1d7e0 34 20 62 65 69 6e 67 20 61 20 50 34 5f 4b 45 59  4 being a P4_KEY
1d7f0 49 4e 46 4f 20 6f 62 6a 65 63 74 2e 20 20 46 75  INFO object.  Fu
1d800 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 50  rthermore, the P
1d810 33 20 76 61 6c 75 65 20 6d 75 73 74 0a 2a 2a 20  3 value must.** 
1d820 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 65  be the same as e
1d830 76 65 72 79 20 6f 74 68 65 72 20 52 65 6f 70 65  very other Reope
1d840 6e 49 64 78 20 6f 72 20 4f 70 65 6e 52 65 61 64  nIdx or OpenRead
1d850 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 75   for the same cu
1d860 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 2e 0a  rsor.** number..
1d870 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 50 35  **.** Allowed P5
1d880 20 62 69 74 73 3a 0a 2a 2a 20 3c 75 6c 3e 0a 2a   bits:.** <ul>.*
1d890 2a 20 3c 6c 69 3e 20 20 3c 62 3e 30 78 30 32 20  * <li>  <b>0x02 
1d8a0 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 3c 2f 62  OPFLAG_SEEKEQ</b
1d8b0 3e 3a 20 54 68 69 73 20 63 75 72 73 6f 72 20 77  >: This cursor w
1d8c0 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  ill only be used
1d8d0 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 65 71   for.**       eq
1d8e0 75 61 6c 69 74 79 20 6c 6f 6f 6b 75 70 73 20 28  uality lookups (
1d8f0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1d900 20 70 61 69 72 20 6f 66 20 6f 70 63 6f 64 65 73   pair of opcodes
1d910 20 4f 50 5f 53 65 65 6b 47 45 2f 4f 50 5f 49 64   OP_SeekGE/OP_Id
1d920 78 47 54 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  xGT.**       of 
1d930 4f 50 5f 53 65 65 6b 4c 45 2f 4f 50 5f 49 64 78  OP_SeekLE/OP_Idx
1d940 47 54 29 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a  GT).** </ul>.**.
1d950 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4f 50 5f  ** See also: OP_
1d960 4f 70 65 6e 52 65 61 64 2c 20 4f 50 5f 4f 70 65  OpenRead, OP_Ope
1d970 6e 57 72 69 74 65 0a 2a 2f 0a 2f 2a 20 4f 70 63  nWrite.*/./* Opc
1d980 6f 64 65 3a 20 4f 70 65 6e 57 72 69 74 65 20 50  ode: OpenWrite P
1d990 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
1d9a0 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 6f 74 3d   Synopsis: root=
1d9b0 50 32 20 69 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20  P2 iDb=P3.**.** 
1d9c0 4f 70 65 6e 20 61 20 72 65 61 64 2f 77 72 69 74  Open a read/writ
1d9d0 65 20 63 75 72 73 6f 72 20 6e 61 6d 65 64 20 50  e cursor named P
1d9e0 31 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  1 on the table o
1d9f0 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f  r index whose ro
1da00 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 50 32  ot.** page is P2
1da10 20 28 6f 72 20 77 68 6f 73 65 20 72 6f 6f 74 20   (or whose root 
1da20 70 61 67 65 20 69 73 20 68 65 6c 64 20 69 6e 20  page is held in 
1da30 72 65 67 69 73 74 65 72 20 50 32 20 69 66 20 74  register P2 if t
1da40 68 65 0a 2a 2a 20 4f 50 46 4c 41 47 5f 50 32 49  he.** OPFLAG_P2I
1da50 53 52 45 47 20 62 69 74 20 69 73 20 73 65 74 20  SREG bit is set 
1da60 69 6e 20 50 35 20 2d 20 73 65 65 20 62 65 6c 6f  in P5 - see belo
1da70 77 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  w)..**.** The P4
1da80 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69   value may be ei
1da90 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20  ther an integer 
1daa0 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20  (P4_INT32) or a 
1dab0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20  pointer to.** a 
1dac0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1dad0 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20  e (P4_KEYINFO). 
1dae0 49 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74  If it is a point
1daf0 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
1db00 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e  .** object, then
1db10 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6f 70 65   table being ope
1db20 6e 65 64 20 6d 75 73 74 20 62 65 20 61 6e 20 5b  ned must be an [
1db30 69 6e 64 65 78 20 62 2d 74 72 65 65 5d 20 77 68  index b-tree] wh
1db40 65 72 65 20 74 68 65 0a 2a 2a 20 4b 65 79 49 6e  ere the.** KeyIn
1db50 66 6f 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65  fo object define
1db60 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  s the content an
1db70 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20  d collating .** 
1db80 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 61 74  sequence of that
1db90 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
1dba0 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 34 20  therwise, if P4 
1dbb0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a  is an integer .*
1dbc0 2a 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  * value, then th
1dbd0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6f 70  e table being op
1dbe0 65 6e 65 64 20 6d 75 73 74 20 62 65 20 61 20 5b  ened must be a [
1dbf0 74 61 62 6c 65 20 62 2d 74 72 65 65 5d 20 77 69  table b-tree] wi
1dc00 74 68 20 61 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  th a.** number o
1dc10 66 20 63 6f 6c 75 6d 6e 73 20 6e 6f 20 6c 65 73  f columns no les
1dc20 73 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  s than the value
1dc30 20 6f 66 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 41 6c   of P4..**.** Al
1dc40 6c 6f 77 65 64 20 50 35 20 62 69 74 73 3a 0a 2a  lowed P5 bits:.*
1dc50 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 20  * <ul>.** <li>  
1dc60 3c 62 3e 30 78 30 32 20 4f 50 46 4c 41 47 5f 53  <b>0x02 OPFLAG_S
1dc70 45 45 4b 45 51 3c 2f 62 3e 3a 20 54 68 69 73 20  EEKEQ</b>: This 
1dc80 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79  cursor will only
1dc90 20 62 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   be used for.** 
1dca0 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 6c        equality l
1dcb0 6f 6f 6b 75 70 73 20 28 69 6d 70 6c 65 6d 65 6e  ookups (implemen
1dcc0 74 65 64 20 61 73 20 61 20 70 61 69 72 20 6f 66  ted as a pair of
1dcd0 20 6f 70 63 6f 64 65 73 20 4f 50 5f 53 65 65 6b   opcodes OP_Seek
1dce0 47 45 2f 4f 50 5f 49 64 78 47 54 0a 2a 2a 20 20  GE/OP_IdxGT.**  
1dcf0 20 20 20 20 20 6f 66 20 4f 50 5f 53 65 65 6b 4c       of OP_SeekL
1dd00 45 2f 4f 50 5f 49 64 78 47 54 29 0a 2a 2a 20 3c  E/OP_IdxGT).** <
1dd10 6c 69 3e 20 20 3c 62 3e 30 78 30 38 20 4f 50 46  li>  <b>0x08 OPF
1dd20 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3c 2f 62  LAG_FORDELETE</b
1dd30 3e 3a 20 54 68 69 73 20 63 75 72 73 6f 72 20 69  >: This cursor i
1dd40 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 73  s used only to s
1dd50 65 65 6b 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  eek.**       and
1dd60 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 64 65   subsequently de
1dd70 6c 65 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  lete entries in 
1dd80 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20  an index btree. 
1dd90 20 54 68 69 73 20 69 73 20 61 0a 2a 2a 20 20 20   This is a.**   
1dda0 20 20 20 20 68 69 6e 74 20 74 6f 20 74 68 65 20      hint to the 
1ddb0 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 74  storage engine t
1ddc0 68 61 74 20 74 68 65 20 73 74 6f 72 61 67 65 20  hat the storage 
1ddd0 65 6e 67 69 6e 65 20 69 73 20 61 6c 6c 6f 77 65  engine is allowe
1dde0 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 69 67  d to.**       ig
1ddf0 6e 6f 72 65 2e 20 20 54 68 65 20 68 69 6e 74 20  nore.  The hint 
1de00 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74  is not used by t
1de10 68 65 20 6f 66 66 69 63 69 61 6c 20 53 51 4c 69  he official SQLi
1de20 74 65 20 62 2a 74 72 65 65 20 73 74 6f 72 61 67  te b*tree storag
1de30 65 0a 2a 2a 20 20 20 20 20 20 20 65 6e 67 69 6e  e.**       engin
1de40 65 2c 20 62 75 74 20 69 73 20 75 73 65 64 20 62  e, but is used b
1de50 79 20 43 4f 4d 44 42 32 2e 0a 2a 2a 20 3c 6c 69  y COMDB2..** <li
1de60 3e 20 20 3c 62 3e 30 78 31 30 20 4f 50 46 4c 41  >  <b>0x10 OPFLA
1de70 47 5f 50 32 49 53 52 45 47 3c 2f 62 3e 3a 20 55  G_P2ISREG</b>: U
1de80 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  se the content o
1de90 66 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  f register P2.**
1dea0 20 20 20 20 20 20 20 61 73 20 74 68 65 20 72 6f         as the ro
1deb0 6f 74 20 70 61 67 65 2c 20 6e 6f 74 20 74 68 65  ot page, not the
1dec0 20 76 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73   value of P2 its
1ded0 65 6c 66 2e 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  elf..** </ul>.**
1dee0 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63  .** This instruc
1def0 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tion works like 
1df00 4f 70 65 6e 52 65 61 64 20 65 78 63 65 70 74 20  OpenRead except 
1df10 74 68 61 74 20 69 74 20 6f 70 65 6e 73 20 74 68  that it opens th
1df20 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 6e 20 72  e cursor.** in r
1df30 65 61 64 2f 77 72 69 74 65 20 6d 6f 64 65 2e 0a  ead/write mode..
1df40 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1df50 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 4f 50 5f  OP_OpenRead, OP_
1df60 52 65 6f 70 65 6e 49 64 78 0a 2a 2f 0a 63 61 73  ReopenIdx.*/.cas
1df70 65 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3a 20  e OP_ReopenIdx: 
1df80 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  {.  int nField;.
1df90 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1dfa0 6e 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20  nfo;.  int p2;. 
1dfb0 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20   int iDb;.  int 
1dfc0 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65 20  wrFlag;.  Btree 
1dfd0 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  *pX;.  VdbeCurso
1dfe0 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a 70  r *pCur;.  Db *p
1dff0 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Db;..  assert( p
1e000 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70  Op->p5==0 || pOp
1e010 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45  ->p5==OPFLAG_SEE
1e020 4b 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KEQ );.  assert(
1e030 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1e040 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 70 43  _KEYINFO );.  pC
1e050 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ur = p->apCsr[pO
1e060 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 43  p->p1];.  if( pC
1e070 75 72 20 26 26 20 70 43 75 72 2d 3e 70 67 6e 6f  ur && pCur->pgno
1e080 52 6f 6f 74 3d 3d 28 75 33 32 29 70 4f 70 2d 3e  Root==(u32)pOp->
1e090 70 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p2 ){.    assert
1e0a0 28 20 70 43 75 72 2d 3e 69 44 62 3d 3d 70 4f 70  ( pCur->iDb==pOp
1e0b0 2d 3e 70 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  ->p3 );      /* 
1e0c0 47 75 61 72 61 6e 74 65 65 64 20 62 79 20 74 68  Guaranteed by th
1e0d0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
1e0e0 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   */.    goto ope
1e0f0 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68 69 6e  n_cursor_set_hin
1e100 74 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20  ts;.  }.  /* If 
1e110 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1e120 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
1e130 20 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61   or is open on a
1e140 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20   different.  ** 
1e150 69 6e 64 65 78 2c 20 74 68 65 6e 20 66 61 6c 6c  index, then fall
1e160 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50   through into OP
1e170 5f 4f 70 65 6e 52 65 61 64 20 74 6f 20 66 6f 72  _OpenRead to for
1e180 63 65 20 61 20 72 65 6f 70 65 6e 20 2a 2f 0a 63  ce a reopen */.c
1e190 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3a  ase OP_OpenRead:
1e1a0 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57 72 69  .case OP_OpenWri
1e1b0 74 65 3a 0a 0a 20 20 61 73 73 65 72 74 28 20 70  te:..  assert( p
1e1c0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  Op->opcode==OP_O
1e1d0 70 65 6e 57 72 69 74 65 20 7c 7c 20 70 4f 70 2d  penWrite || pOp-
1e1e0 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  >p5==0 || pOp->p
1e1f0 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  5==OPFLAG_SEEKEQ
1e200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1e210 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20  >bIsReader );.  
1e220 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
1e230 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 64  ode==OP_OpenRead
1e240 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
1e250 3d 4f 50 5f 52 65 6f 70 65 6e 49 64 78 0a 20 20  =OP_ReopenIdx.  
1e260 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 65          || p->re
1e270 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20  adOnly==0 );..  
1e280 69 66 28 20 70 2d 3e 65 78 70 69 72 65 64 3d 3d  if( p->expired==
1e290 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
1e2a0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
1e2b0 41 43 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  ACK;.    goto ab
1e2c0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1e2d0 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20  ;.  }..  nField 
1e2e0 3d 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20  = 0;.  pKeyInfo 
1e2f0 3d 20 30 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d  = 0;.  p2 = pOp-
1e300 3e 70 32 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70  >p2;.  iDb = pOp
1e310 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p3;.  assert( 
1e320 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
1e330 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
1e340 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
1e350 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29  >btreeMask, iDb)
1e360 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
1e370 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 58 20  >aDb[iDb];.  pX 
1e380 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 61 73  = pDb->pBt;.  as
1e390 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1e3a0 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
1e3b0 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29  ==OP_OpenWrite )
1e3c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4f 50  {.    assert( OP
1e3d0 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3d 3d  FLAG_FORDELETE==
1e3e0 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20  BTREE_FORDELETE 
1e3f0 29 3b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20  );.    wrFlag = 
1e400 42 54 52 45 45 5f 57 52 43 53 52 20 7c 20 28 70  BTREE_WRCSR | (p
1e410 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
1e420 46 4f 52 44 45 4c 45 54 45 29 3b 0a 20 20 20 20  FORDELETE);.    
1e430 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1e440 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1e450 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
1e460 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
1e470 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20  ma->file_format 
1e480 3c 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c  < p->minWriteFil
1e490 65 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20  eFormat ){.     
1e4a0 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
1e4b0 46 6f 72 6d 61 74 20 3d 20 70 44 62 2d 3e 70 53  Format = pDb->pS
1e4c0 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1e4d0 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  at;.    }.  }els
1e4e0 65 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20  e{.    wrFlag = 
1e4f0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  0;.  }.  if( pOp
1e500 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 32  ->p5 & OPFLAG_P2
1e510 49 53 52 45 47 20 29 7b 0a 20 20 20 20 61 73 73  ISREG ){.    ass
1e520 65 72 74 28 20 70 32 3e 30 20 29 3b 0a 20 20 20  ert( p2>0 );.   
1e530 20 61 73 73 65 72 74 28 20 70 32 3c 3d 28 70 2d   assert( p2<=(p-
1e540 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
1e550 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 61 73 73  rsor) );.    ass
1e560 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
1e570 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29  ==OP_OpenWrite )
1e580 3b 0a 20 20 20 20 70 49 6e 32 20 3d 20 26 61 4d  ;.    pIn2 = &aM
1e590 65 6d 5b 70 32 5d 3b 0a 20 20 20 20 61 73 73 65  em[p2];.    asse
1e5a0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
1e5b0 49 6e 32 29 20 29 3b 0a 20 20 20 20 61 73 73 65  In2) );.    asse
1e5c0 72 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73  rt( (pIn2->flags
1e5d0 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1e5e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e5f0 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70  eMemIntegerify(p
1e600 49 6e 32 29 3b 0a 20 20 20 20 70 32 20 3d 20 28  In2);.    p2 = (
1e610 69 6e 74 29 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20  int)pIn2->u.i;. 
1e620 20 20 20 2f 2a 20 54 68 65 20 70 32 20 76 61 6c     /* The p2 val
1e630 75 65 20 61 6c 77 61 79 73 20 63 6f 6d 65 73 20  ue always comes 
1e640 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 4f 50 5f  from a prior OP_
1e650 43 72 65 61 74 65 42 74 72 65 65 20 6f 70 63 6f  CreateBtree opco
1e660 64 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68  de and.    ** th
1e670 61 74 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61  at opcode will a
1e680 6c 77 61 79 73 20 73 65 74 20 74 68 65 20 70 32  lways set the p2
1e690 20 76 61 6c 75 65 20 74 6f 20 32 20 6f 72 20 6d   value to 2 or m
1e6a0 6f 72 65 20 6f 72 20 65 6c 73 65 20 66 61 69 6c  ore or else fail
1e6b0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  ..    ** If ther
1e6c0 65 20 77 65 72 65 20 61 20 66 61 69 6c 75 72 65  e were a failure
1e6d0 2c 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  , the prepared s
1e6e0 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 68  tatement would h
1e6f0 61 76 65 20 68 61 6c 74 65 64 0a 20 20 20 20 2a  ave halted.    *
1e700 2a 20 62 65 66 6f 72 65 20 72 65 61 63 68 69 6e  * before reachin
1e710 67 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  g this instructi
1e720 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  on. */.    asser
1e730 74 28 20 70 32 3e 3d 32 20 29 3b 0a 20 20 7d 0a  t( p2>=2 );.  }.
1e740 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
1e750 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  e==P4_KEYINFO ){
1e760 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
1e770 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
1e780 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b  ;.    assert( pK
1e790 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43  eyInfo->enc==ENC
1e7a0 28 64 62 29 20 29 3b 0a 20 20 20 20 61 73 73 65  (db) );.    asse
1e7b0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  rt( pKeyInfo->db
1e7c0 3d 3d 64 62 20 29 3b 0a 20 20 20 20 6e 46 69 65  ==db );.    nFie
1e7d0 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
1e7e0 41 6c 6c 46 69 65 6c 64 3b 0a 20 20 7d 65 6c 73  AllField;.  }els
1e7f0 65 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70  e if( pOp->p4typ
1e800 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  e==P4_INT32 ){. 
1e810 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d     nField = pOp-
1e820 3e 70 34 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73  >p4.i;.  }.  ass
1e830 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1e840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69  );.  assert( nFi
1e850 65 6c 64 3e 3d 30 20 29 3b 0a 20 20 74 65 73 74  eld>=0 );.  test
1e860 63 61 73 65 28 20 6e 46 69 65 6c 64 3d 3d 30 20  case( nField==0 
1e870 29 3b 20 20 2f 2a 20 54 61 62 6c 65 20 77 69 74  );  /* Table wit
1e880 68 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  h INTEGER PRIMAR
1e890 59 20 4b 45 59 20 61 6e 64 20 6e 6f 74 68 69 6e  Y KEY and nothin
1e8a0 67 20 65 6c 73 65 20 2a 2f 0a 20 20 70 43 75 72  g else */.  pCur
1e8b0 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f   = allocateCurso
1e8c0 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 6e 46  r(p, pOp->p1, nF
1e8d0 69 65 6c 64 2c 20 69 44 62 2c 20 43 55 52 54 59  ield, iDb, CURTY
1e8e0 50 45 5f 42 54 52 45 45 29 3b 0a 20 20 69 66 28  PE_BTREE);.  if(
1e8f0 20 70 43 75 72 3d 3d 30 20 29 20 67 6f 74 6f 20   pCur==0 ) goto 
1e900 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 75 72 2d 3e  no_mem;.  pCur->
1e910 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70  nullRow = 1;.  p
1e920 43 75 72 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  Cur->isOrdered =
1e930 20 31 3b 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   1;.  pCur->pgno
1e940 52 6f 6f 74 20 3d 20 70 32 3b 0a 23 69 66 64 65  Root = p2;.#ifde
1e950 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1e960 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20   pCur->wrFlag = 
1e970 77 72 46 6c 61 67 3b 0a 23 65 6e 64 69 66 0a 20  wrFlag;.#endif. 
1e980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e990 65 65 43 75 72 73 6f 72 28 70 58 2c 20 70 32 2c  eeCursor(pX, p2,
1e9a0 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
1e9b0 6f 2c 20 70 43 75 72 2d 3e 75 63 2e 70 43 75 72  o, pCur->uc.pCur
1e9c0 73 6f 72 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  sor);.  pCur->pK
1e9d0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1e9e0 6f 3b 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  o;.  /* Set the 
1e9f0 56 64 62 65 43 75 72 73 6f 72 2e 69 73 54 61 62  VdbeCursor.isTab
1ea00 6c 65 20 76 61 72 69 61 62 6c 65 2e 20 50 72 65  le variable. Pre
1ea10 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
1ea20 66 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 75 73  f.  ** SQLite us
1ea30 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
1ea40 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 66 6c 61  he root-page fla
1ea50 67 73 20 77 65 72 65 20 73 61 6e 65 20 61 74 20  gs were sane at 
1ea60 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 2a 2a 20  this point.  ** 
1ea70 61 6e 64 20 72 65 70 6f 72 74 20 64 61 74 61 62  and report datab
1ea80 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
1ea90 66 20 74 68 65 79 20 77 65 72 65 20 6e 6f 74 2c  f they were not,
1eaa0 20 62 75 74 20 74 68 69 73 20 63 68 65 63 6b 20   but this check 
1eab0 68 61 73 0a 20 20 2a 2a 20 73 69 6e 63 65 20 6d  has.  ** since m
1eac0 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 62 74  oved into the bt
1ead0 72 65 65 20 6c 61 79 65 72 2e 20 20 2a 2f 20 20  ree layer.  */  
1eae0 0a 20 20 70 43 75 72 2d 3e 69 73 54 61 62 6c 65  .  pCur->isTable
1eaf0 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65 21 3d   = pOp->p4type!=
1eb00 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 0a 6f 70 65  P4_KEYINFO;..ope
1eb10 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68 69 6e  n_cursor_set_hin
1eb20 74 73 3a 0a 20 20 61 73 73 65 72 74 28 20 4f 50  ts:.  assert( OP
1eb30 46 4c 41 47 5f 42 55 4c 4b 43 53 52 3d 3d 42 54  FLAG_BULKCSR==BT
1eb40 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 29 3b 0a  REE_BULKLOAD );.
1eb50 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47    assert( OPFLAG
1eb60 5f 53 45 45 4b 45 51 3d 3d 42 54 52 45 45 5f 53  _SEEKEQ==BTREE_S
1eb70 45 45 4b 5f 45 51 20 29 3b 0a 20 20 74 65 73 74  EEK_EQ );.  test
1eb80 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 20 26 20  case( pOp->p5 & 
1eb90 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 20 29  OPFLAG_BULKCSR )
1eba0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1ebb0 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
1ebc0 4e 54 53 0a 20 20 74 65 73 74 63 61 73 65 28 20  NTS.  testcase( 
1ebd0 70 4f 70 2d 3e 70 32 20 26 20 4f 50 46 4c 41 47  pOp->p2 & OPFLAG
1ebe0 5f 53 45 45 4b 45 51 20 29 3b 0a 23 65 6e 64 69  _SEEKEQ );.#endi
1ebf0 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  f.  sqlite3Btree
1ec00 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28  CursorHintFlags(
1ec10 70 43 75 72 2d 3e 75 63 2e 70 43 75 72 73 6f 72  pCur->uc.pCursor
1ec20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46   (pOp->p5 & (OPF
1ec50 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 4f 50 46 4c  LAG_BULKCSR|OPFL
1ec60 41 47 5f 53 45 45 4b 45 51 29 29 29 3b 0a 20 20  AG_SEEKEQ)));.  
1ec70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
1ec80 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1ec90 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1eca0 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 44 75 70   Opcode: OpenDup
1ecb0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
1ecc0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75  ** Open a new cu
1ecd0 72 73 6f 72 20 50 31 20 74 68 61 74 20 70 6f 69  rsor P1 that poi
1ece0 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  nts to the same 
1ecf0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
1ed00 61 73 0a 2a 2a 20 63 75 72 73 6f 72 20 50 32 2e  as.** cursor P2.
1ed10 20 20 54 68 65 20 50 32 20 63 75 72 73 6f 72 20    The P2 cursor 
1ed20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
1ed30 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72  pened by a prior
1ed40 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1ed50 6c 0a 2a 2a 20 6f 70 63 6f 64 65 2e 20 20 4f 6e  l.** opcode.  On
1ed60 6c 79 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72  ly ephemeral cur
1ed70 73 6f 72 73 20 6d 61 79 20 62 65 20 64 75 70 6c  sors may be dupl
1ed80 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 75  icated..**.** Du
1ed90 70 6c 69 63 61 74 65 20 65 70 68 65 6d 65 72 61  plicate ephemera
1eda0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 75 73  l cursors are us
1edb0 65 64 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e  ed for self-join
1edc0 73 20 6f 66 20 6d 61 74 65 72 69 61 6c 69 7a 65  s of materialize
1edd0 64 20 76 69 65 77 73 2e 0a 2a 2f 0a 63 61 73 65  d views..*/.case
1ede0 20 4f 50 5f 4f 70 65 6e 44 75 70 3a 20 7b 0a 20   OP_OpenDup: {. 
1edf0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 4f 72   VdbeCursor *pOr
1ee00 69 67 3b 20 20 20 20 2f 2a 20 54 68 65 20 6f 72  ig;    /* The or
1ee10 69 67 69 6e 61 6c 20 63 75 72 73 6f 72 20 74 6f  iginal cursor to
1ee20 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 20 2a   be duplicated *
1ee30 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
1ee40 70 43 78 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  pCx;      /* The
1ee50 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 0a   new cursor */..
1ee60 20 20 70 4f 72 69 67 20 3d 20 70 2d 3e 61 70 43    pOrig = p->apC
1ee70 73 72 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  sr[pOp->p2];.  a
1ee80 73 73 65 72 74 28 20 70 4f 72 69 67 2d 3e 70 42  ssert( pOrig->pB
1ee90 74 78 21 3d 30 20 29 3b 20 20 2f 2a 20 4f 6e 6c  tx!=0 );  /* Onl
1eea0 79 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  y ephemeral curs
1eeb0 6f 72 73 20 63 61 6e 20 62 65 20 64 75 70 6c 69  ors can be dupli
1eec0 63 61 74 65 64 20 2a 2f 0a 0a 20 20 70 43 78 20  cated */..  pCx 
1eed0 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
1eee0 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 72  (p, pOp->p1, pOr
1eef0 69 67 2d 3e 6e 46 69 65 6c 64 2c 20 2d 31 2c 20  ig->nField, -1, 
1ef00 43 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b 0a  CURTYPE_BTREE);.
1ef10 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67    if( pCx==0 ) g
1ef20 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
1ef30 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  x->nullRow = 1;.
1ef40 20 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72    pCx->isEphemer
1ef50 61 6c 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 70  al = 1;.  pCx->p
1ef60 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 72 69 67 2d  KeyInfo = pOrig-
1ef70 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 78  >pKeyInfo;.  pCx
1ef80 2d 3e 69 73 54 61 62 6c 65 20 3d 20 70 4f 72 69  ->isTable = pOri
1ef90 67 2d 3e 69 73 54 61 62 6c 65 3b 0a 20 20 70 43  g->isTable;.  pC
1efa0 78 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 70 4f  x->pgnoRoot = pO
1efb0 72 69 67 2d 3e 70 67 6e 6f 52 6f 6f 74 3b 0a 20  rig->pgnoRoot;. 
1efc0 20 70 43 78 2d 3e 69 73 4f 72 64 65 72 65 64 20   pCx->isOrdered 
1efd0 3d 20 70 4f 72 69 67 2d 3e 69 73 4f 72 64 65 72  = pOrig->isOrder
1efe0 65 64 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ed;.  rc = sqlit
1eff0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 4f  e3BtreeCursor(pO
1f000 72 69 67 2d 3e 70 42 74 78 2c 20 70 43 78 2d 3e  rig->pBtx, pCx->
1f010 70 67 6e 6f 52 6f 6f 74 2c 20 42 54 52 45 45 5f  pgnoRoot, BTREE_
1f020 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20 20  WRCSR,.         
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20   pCx->pKeyInfo, 
1f050 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  pCx->uc.pCursor)
1f060 3b 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  ;.  /* The sqlit
1f070 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29 20  e3BtreeCursor() 
1f080 72 6f 75 74 69 6e 65 20 63 61 6e 20 6f 6e 6c 79  routine can only
1f090 20 66 61 69 6c 20 66 6f 72 20 74 68 65 20 66 69   fail for the fi
1f0a0 72 73 74 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  rst cursor.  ** 
1f0b0 6f 70 65 6e 65 64 20 66 6f 72 20 61 20 64 61 74  opened for a dat
1f0c0 61 62 61 73 65 2e 20 20 53 69 6e 63 65 20 74 68  abase.  Since th
1f0d0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
1f0e0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 68  n open cursor wh
1f0f0 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 6f 70 63  en this.  ** opc
1f100 6f 64 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ode is run, the 
1f110 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1f120 6f 72 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  or() cannot fail
1f130 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
1f140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1f150 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
1f160 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d  pcode: OpenEphem
1f170 65 72 61 6c 20 50 31 20 50 32 20 2a 20 50 34 20  eral P1 P2 * P4 
1f180 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
1f190 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a  nColumn=P2.**.**
1f1a0 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73   Open a new curs
1f1b0 6f 72 20 50 31 20 74 6f 20 61 20 74 72 61 6e 73  or P1 to a trans
1f1c0 69 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  ient table..** T
1f1d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
1f1e0 61 79 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f  ays opened read/
1f1f0 77 72 69 74 65 20 65 76 65 6e 20 69 66 20 0a 2a  write even if .*
1f200 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  * the main datab
1f210 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ase is read-only
1f220 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
1f230 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 64 65 6c  .** table is del
1f240 65 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  eted automatical
1f250 6c 79 20 77 68 65 6e 20 74 68 65 20 63 75 72 73  ly when the curs
1f260 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  or is closed..**
1f270 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
1f280 72 20 50 31 20 69 73 20 61 6c 72 65 61 64 79 20  r P1 is already 
1f290 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 65 70 68  opened on an eph
1f2a0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2c 20 74 68  emeral table, th
1f2b0 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 63 6c  e table.** is cl
1f2c0 65 61 72 65 64 20 28 61 6c 6c 20 63 6f 6e 74 65  eared (all conte
1f2d0 6e 74 20 69 73 20 65 72 61 73 65 64 29 2e 0a 2a  nt is erased)..*
1f2e0 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e  *.** P2 is the n
1f2f0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1f300 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61   in the ephemera
1f310 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  l table..** The 
1f320 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
1f330 20 61 20 42 54 72 65 65 20 74 61 62 6c 65 20 69   a BTree table i
1f340 66 20 50 34 3d 3d 30 20 61 6e 64 20 74 6f 20 61  f P4==0 and to a
1f350 20 42 54 72 65 65 20 69 6e 64 65 78 0a 2a 2a 20   BTree index.** 
1f360 69 66 20 50 34 20 69 73 20 6e 6f 74 20 30 2e 20  if P4 is not 0. 
1f370 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55   If P4 is not NU
1f380 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
1f390 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
1f3a0 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 64 65 66  ture.** that def
1f3b0 69 6e 65 73 20 74 68 65 20 66 6f 72 6d 61 74 20  ines the format 
1f3c0 6f 66 20 6b 65 79 73 20 69 6e 20 74 68 65 20 69  of keys in the i
1f3d0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ndex..**.** The 
1f3e0 50 35 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e  P5 parameter can
1f3f0 20 62 65 20 61 20 6d 61 73 6b 20 6f 66 20 74 68   be a mask of th
1f400 65 20 42 54 52 45 45 5f 2a 20 66 6c 61 67 73 20  e BTREE_* flags 
1f410 64 65 66 69 6e 65 64 0a 2a 2a 20 69 6e 20 62 74  defined.** in bt
1f420 72 65 65 2e 68 2e 20 20 54 68 65 73 65 20 66 6c  ree.h.  These fl
1f430 61 67 73 20 63 6f 6e 74 72 6f 6c 20 61 73 70 65  ags control aspe
1f440 63 74 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61  cts of the opera
1f450 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62  tion of.** the b
1f460 74 72 65 65 2e 20 20 54 68 65 20 42 54 52 45 45  tree.  The BTREE
1f470 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
1f480 64 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 66  d BTREE_SINGLE f
1f490 6c 61 67 73 20 61 72 65 0a 2a 2a 20 61 64 64 65  lags are.** adde
1f4a0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
1f4b0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .*/./* Opcode: O
1f4c0 70 65 6e 41 75 74 6f 69 6e 64 65 78 20 50 31 20  penAutoindex P1 
1f4d0 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  P2 * P4 *.** Syn
1f4e0 6f 70 73 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50  opsis: nColumn=P
1f4f0 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  2.**.** This opc
1f500 6f 64 65 20 77 6f 72 6b 73 20 74 68 65 20 73 61  ode works the sa
1f510 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e 45 70 68  me as OP_OpenEph
1f520 65 6d 65 72 61 6c 2e 20 20 49 74 20 68 61 73 20  emeral.  It has 
1f530 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 6e  a.** different n
1f540 61 6d 65 20 74 6f 20 64 69 73 74 69 6e 67 75 69  ame to distingui
1f550 73 68 20 69 74 73 20 75 73 65 2e 20 20 54 61 62  sh its use.  Tab
1f560 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
1f570 67 0a 2a 2a 20 62 79 20 74 68 69 73 20 6f 70 63  g.** by this opc
1f580 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ode will be used
1f590 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63 61 6c   for automatical
1f5a0 6c 79 20 63 72 65 61 74 65 64 20 74 72 61 6e 73  ly created trans
1f5b0 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 65 73 20  ient.** indices 
1f5c0 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73  in joins..*/.cas
1f5d0 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  e OP_OpenAutoind
1f5e0 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ex: .case OP_Ope
1f5f0 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b 0a 20 20  nEphemeral: {.  
1f600 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b  VdbeCursor *pCx;
1f610 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1f620 49 6e 66 6f 3b 0a 0a 20 20 73 74 61 74 69 63 20  Info;..  static 
1f630 63 6f 6e 73 74 20 69 6e 74 20 76 66 73 46 6c 61  const int vfsFla
1f640 67 73 20 3d 20 0a 20 20 20 20 20 20 53 51 4c 49  gs = .      SQLI
1f650 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1f660 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
1f670 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1f680 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1f690 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
1f6a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1f6b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1f6c0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1f6d0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b 0a 20  _TRANSIENT_DB;. 
1f6e0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1f6f0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1f700 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   pOp->p2>=0 );. 
1f710 20 70 43 78 20 3d 20 70 2d 3e 61 70 43 73 72 5b   pCx = p->apCsr[
1f720 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
1f730 70 43 78 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  pCx ){.    /* If
1f740 20 74 68 65 20 65 70 68 65 72 6d 65 72 61 6c 20   the ephermeral 
1f750 74 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79  table is already
1f760 20 6f 70 65 6e 2c 20 65 72 61 73 65 20 61 6c 6c   open, erase all
1f770 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 74 65 6e   existing conten
1f780 74 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74  t.    ** so that
1f790 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1f7a0 70 74 79 20 61 67 61 69 6e 2c 20 72 61 74 68 65  pty again, rathe
1f7b0 72 20 74 68 61 6e 20 63 72 65 61 74 69 6e 67 20  r than creating 
1f7c0 61 20 6e 65 77 20 74 61 62 6c 65 2e 20 2a 2f 0a  a new table. */.
1f7d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d      assert( pCx-
1f7e0 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 3b 0a  >isEphemeral );.
1f7f0 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74      if( pCx->pBt
1f800 78 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  x ){.      rc = 
1f810 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1f820 72 54 61 62 6c 65 28 70 43 78 2d 3e 70 42 74 78  rTable(pCx->pBtx
1f830 2c 20 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74 2c  , pCx->pgnoRoot,
1f840 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
1f850 73 65 7b 0a 20 20 20 20 70 43 78 20 3d 20 61 6c  se{.    pCx = al
1f860 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
1f870 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
1f880 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 42 54  , -1, CURTYPE_BT
1f890 52 45 45 29 3b 0a 20 20 20 20 69 66 28 20 70 43  REE);.    if( pC
1f8a0 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  x==0 ) goto no_m
1f8b0 65 6d 3b 0a 20 20 20 20 70 43 78 2d 3e 6e 75 6c  em;.    pCx->nul
1f8c0 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 70 43  lRow = 1;.    pC
1f8d0 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 3d  x->isEphemeral =
1f8e0 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   1;.    rc = sql
1f8f0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
1f900 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26  ->pVfs, 0, db, &
1f910 70 43 78 2d 3e 70 42 74 78 2c 20 0a 20 20 20 20  pCx->pBtx, .    
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 20 20 20 20 42 54 52 45 45 5f 4f 4d 49 54        BTREE_OMIT
1f940 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42 54 52 45 45  _JOURNAL | BTREE
1f950 5f 53 49 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70  _SINGLE | pOp->p
1f960 35 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  5,.             
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 76 66 73               vfs
1f980 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
1f990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f9a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f9b0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
1f9c0 6e 73 28 70 43 78 2d 3e 70 42 74 78 2c 20 31 2c  ns(pCx->pBtx, 1,
1f9d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
1f9e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f9f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1fa00 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  a transient inde
1fa10 78 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 63  x is required, c
1fa20 72 65 61 74 65 20 69 74 20 62 79 20 63 61 6c 6c  reate it by call
1fa30 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  ing.      ** sql
1fa40 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
1fa50 61 62 6c 65 28 29 20 77 69 74 68 20 74 68 65 20  able() with the 
1fa60 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 66 6c  BTREE_BLOBKEY fl
1fa70 61 67 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  ag before.      
1fa80 2a 2a 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20 49  ** opening it. I
1fa90 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  f a transient ta
1faa0 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 2c  ble is required,
1fab0 20 6a 75 73 74 20 75 73 65 20 74 68 65 0a 20 20   just use the.  
1fac0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
1fad0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 61 62  ally created tab
1fae0 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1faf0 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49 4e 54  e 1 (an BLOB_INT
1fb00 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20 20 20 20  KEY table)..    
1fb10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28    */.      if( (
1fb20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  pCx->pKeyInfo = 
1fb30 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
1fb40 70 34 2e 70 4b 65 79 49 6e 66 6f 29 21 3d 30 20  p4.pKeyInfo)!=0 
1fb50 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1fb60 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
1fb70 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20  P4_KEYINFO );.  
1fb80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fb90 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
1fba0 6c 65 28 70 43 78 2d 3e 70 42 74 78 2c 20 28 69  le(pCx->pBtx, (i
1fbb0 6e 74 2a 29 26 70 43 78 2d 3e 70 67 6e 6f 52 6f  nt*)&pCx->pgnoRo
1fbc0 6f 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot,.            
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 42           BTREE_B
1fbf0 4c 4f 42 4b 45 59 20 7c 20 70 4f 70 2d 3e 70 35  LOBKEY | pOp->p5
1fc00 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  ); .        if( 
1fc10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fc20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1fc30 74 28 20 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74  t( pCx->pgnoRoot
1fc40 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 2b 31 20  ==MASTER_ROOT+1 
1fc50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1fc60 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  ert( pKeyInfo->d
1fc70 62 3d 3d 64 62 20 29 3b 0a 20 20 20 20 20 20 20  b==db );.       
1fc80 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
1fc90 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62  nfo->enc==ENC(db
1fca0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ) );.          r
1fcb0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1fcc0 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 78  Cursor(pCx->pBtx
1fcd0 2c 20 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74 2c  , pCx->pgnoRoot,
1fce0 20 42 54 52 45 45 5f 57 52 43 53 52 2c 0a 20 20   BTREE_WRCSR,.  
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 70 4b 65 79 49 6e 66 6f 2c 20 70 43 78 2d 3e 75  pKeyInfo, pCx->u
1fd20 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
1fd30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43      }.        pC
1fd40 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a  x->isTable = 0;.
1fd50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fd60 20 20 20 20 20 70 43 78 2d 3e 70 67 6e 6f 52 6f       pCx->pgnoRo
1fd70 6f 74 20 3d 20 4d 41 53 54 45 52 5f 52 4f 4f 54  ot = MASTER_ROOT
1fd80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1fd90 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1fda0 72 28 70 43 78 2d 3e 70 42 74 78 2c 20 4d 41 53  r(pCx->pBtx, MAS
1fdb0 54 45 52 5f 52 4f 4f 54 2c 20 42 54 52 45 45 5f  TER_ROOT, BTREE_
1fdc0 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20 20  WRCSR,.         
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 20 20 20 20 20 30 2c 20 70 43 78 2d 3e 75         0, pCx->u
1fdf0 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
1fe00 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65      pCx->isTable
1fe10 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1fe20 20 20 7d 0a 20 20 20 20 70 43 78 2d 3e 69 73 4f    }.    pCx->isO
1fe30 72 64 65 72 65 64 20 3d 20 28 70 4f 70 2d 3e 70  rdered = (pOp->p
1fe40 35 21 3d 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  5!=BTREE_UNORDER
1fe50 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ED);.  }.  if( r
1fe60 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
1fe70 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
1fe80 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1fe90 64 65 3a 20 53 6f 72 74 65 72 4f 70 65 6e 20 50  de: SorterOpen P
1fea0 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
1feb0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77  ** This opcode w
1fec0 6f 72 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f 70 65  orks like OP_Ope
1fed0 6e 45 70 68 65 6d 65 72 61 6c 20 65 78 63 65 70  nEphemeral excep
1fee0 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73 0a  t that it opens.
1fef0 2a 2a 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69  ** a transient i
1ff00 6e 64 65 78 20 74 68 61 74 20 69 73 20 73 70 65  ndex that is spe
1ff10 63 69 66 69 63 61 6c 6c 79 20 64 65 73 69 67 6e  cifically design
1ff20 65 64 20 74 6f 20 73 6f 72 74 20 6c 61 72 67 65  ed to sort large
1ff30 0a 2a 2a 20 74 61 62 6c 65 73 20 75 73 69 6e 67  .** tables using
1ff40 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 6d 65 72   an external mer
1ff50 67 65 2d 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  ge-sort algorith
1ff60 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  m..**.** If argu
1ff70 6d 65 6e 74 20 50 33 20 69 73 20 6e 6f 6e 2d 7a  ment P3 is non-z
1ff80 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 6e 64  ero, then it ind
1ff90 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1ffa0 73 6f 72 74 65 72 20 6d 61 79 0a 2a 2a 20 61 73  sorter may.** as
1ffb0 73 75 6d 65 20 74 68 61 74 20 61 20 73 74 61 62  sume that a stab
1ffc0 6c 65 20 73 6f 72 74 20 63 6f 6e 73 69 64 65 72  le sort consider
1ffd0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 50 33  ing the first P3
1ffe0 20 66 69 65 6c 64 73 20 6f 66 20 65 61 63 68 0a   fields of each.
1fff0 2a 2a 20 6b 65 79 20 69 73 20 73 75 66 66 69 63  ** key is suffic
20000 69 65 6e 74 20 74 6f 20 70 72 6f 64 75 63 65 20  ient to produce 
20010 74 68 65 20 72 65 71 75 69 72 65 64 20 72 65 73  the required res
20020 75 6c 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ults..*/.case OP
20030 5f 53 6f 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20  _SorterOpen: {. 
20040 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
20050 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
20060 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73  ->p1>=0 );.  ass
20070 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20  ert( pOp->p2>=0 
20080 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63  );.  pCx = alloc
20090 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70  ateCursor(p, pOp
200a0 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d  ->p1, pOp->p2, -
200b0 31 2c 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45  1, CURTYPE_SORTE
200c0 52 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  R);.  if( pCx==0
200d0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
200e0 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20    pCx->pKeyInfo 
200f0 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
20100 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  fo;.  assert( pC
20110 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d  x->pKeyInfo->db=
20120 3d 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =db );.  assert(
20130 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   pCx->pKeyInfo->
20140 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a  enc==ENC(db) );.
20150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
20160 62 65 53 6f 72 74 65 72 49 6e 69 74 28 64 62 2c  beSorterInit(db,
20170 20 70 4f 70 2d 3e 70 33 2c 20 70 43 78 29 3b 0a   pOp->p3, pCx);.
20180 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
20190 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
201a0 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  or;.  break;.}..
201b0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65  /* Opcode: Seque
201c0 6e 63 65 54 65 73 74 20 50 31 20 50 32 20 2a 20  nceTest P1 P2 * 
201d0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
201e0 20 69 66 28 20 63 75 72 73 6f 72 5b 50 31 5d 2e   if( cursor[P1].
201f0 63 74 72 2b 2b 20 29 20 70 63 20 3d 20 50 32 0a  ctr++ ) pc = P2.
20200 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 73 6f  **.** P1 is a so
20210 72 74 65 72 20 63 75 72 73 6f 72 2e 20 49 66 20  rter cursor. If 
20220 74 68 65 20 73 65 71 75 65 6e 63 65 20 63 6f 75  the sequence cou
20230 6e 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  nter is currentl
20240 79 20 7a 65 72 6f 2c 20 6a 75 6d 70 0a 2a 2a 20  y zero, jump.** 
20250 74 6f 20 50 32 2e 20 52 65 67 61 72 64 6c 65 73  to P2. Regardles
20260 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
20270 6e 6f 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  not the jump is 
20280 74 61 6b 65 6e 2c 20 69 6e 63 72 65 6d 65 6e 74  taken, increment
20290 20 74 68 65 0a 2a 2a 20 74 68 65 20 73 65 71 75   the.** the sequ
202a0 65 6e 63 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63  ence value..*/.c
202b0 61 73 65 20 4f 50 5f 53 65 71 75 65 6e 63 65 54  ase OP_SequenceT
202c0 65 73 74 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  est: {.  VdbeCur
202d0 73 6f 72 20 2a 70 43 3b 0a 20 20 61 73 73 65 72  sor *pC;.  asser
202e0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
202f0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
20300 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
20310 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
20320 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72  .  assert( isSor
20330 74 65 72 28 70 43 29 20 29 3b 0a 20 20 69 66 28  ter(pC) );.  if(
20340 20 28 70 43 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b   (pC->seqCount++
20350 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  )==0 ){.    goto
20360 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
20370 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
20380 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75  Opcode: OpenPseu
20390 64 6f 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  do P1 P2 P3 * *.
203a0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 50 33 20  ** Synopsis: P3 
203b0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 5b 50 32 5d  columns in r[P2]
203c0 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  .**.** Open a ne
203d0 77 20 63 75 72 73 6f 72 20 74 68 61 74 20 70 6f  w cursor that po
203e0 69 6e 74 73 20 74 6f 20 61 20 66 61 6b 65 20 74  ints to a fake t
203f0 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
20400 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  ns a single.** r
20410 6f 77 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ow of data.  The
20420 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 61 74   content of that
20430 20 6f 6e 65 20 72 6f 77 20 69 73 20 74 68 65 20   one row is the 
20440 63 6f 6e 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72  content of memor
20450 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32  y.** register P2
20460 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
20470 73 2c 20 63 75 72 73 6f 72 20 50 31 20 62 65 63  s, cursor P1 bec
20480 6f 6d 65 73 20 61 6e 20 61 6c 69 61 73 20 66 6f  omes an alias fo
20490 72 20 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c  r the .** MEM_Bl
204a0 6f 62 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61  ob content conta
204b0 69 6e 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ined in register
204c0 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65   P2..**.** A pse
204d0 75 64 6f 2d 74 61 62 6c 65 20 63 72 65 61 74 65  udo-table create
204e0 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65  d by this opcode
204f0 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c 64   is used to hold
20500 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77   a single.** row
20510 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65   output from the
20520 20 73 6f 72 74 65 72 20 73 6f 20 74 68 61 74 20   sorter so that 
20530 74 68 65 20 72 6f 77 20 63 61 6e 20 62 65 20 64  the row can be d
20540 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a  ecomposed into.*
20550 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c  * individual col
20560 75 6d 6e 73 20 75 73 69 6e 67 20 74 68 65 20 4f  umns using the O
20570 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e  P_Column opcode.
20580 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20    The OP_Column 
20590 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 74 68 65  opcode.** is the
205a0 20 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 70 63   only cursor opc
205b0 6f 64 65 20 74 68 61 74 20 77 6f 72 6b 73 20 77  ode that works w
205c0 69 74 68 20 61 20 70 73 65 75 64 6f 2d 74 61 62  ith a pseudo-tab
205d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20  le..**.** P3 is 
205e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
205f0 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f  elds in the reco
20600 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  rds that will be
20610 20 73 74 6f 72 65 64 20 62 79 0a 2a 2a 20 74 68   stored by.** th
20620 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  e pseudo-table..
20630 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 50  */.case OP_OpenP
20640 73 65 75 64 6f 3a 20 7b 0a 20 20 56 64 62 65 43  seudo: {.  VdbeC
20650 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61  ursor *pCx;..  a
20660 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
20670 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20680 4f 70 2d 3e 70 33 3e 3d 30 20 29 3b 0a 20 20 70  Op->p3>=0 );.  p
20690 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  Cx = allocateCur
206a0 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
206b0 70 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20 43 55 52  pOp->p3, -1, CUR
206c0 54 59 50 45 5f 50 53 45 55 44 4f 29 3b 0a 20 20  TYPE_PSEUDO);.  
206d0 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74  if( pCx==0 ) got
206e0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d  o no_mem;.  pCx-
206f0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
20700 70 43 78 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20  pCx->seekResult 
20710 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 78  = pOp->p2;.  pCx
20720 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20  ->isTable = 1;. 
20730 20 2f 2a 20 47 69 76 65 20 74 68 69 73 20 70 73   /* Give this ps
20740 65 75 64 6f 2d 63 75 72 73 6f 72 20 61 20 66 61  eudo-cursor a fa
20750 6b 65 20 42 74 43 75 72 73 6f 72 20 70 6f 69 6e  ke BtCursor poin
20760 74 65 72 20 73 6f 20 74 68 61 74 20 70 43 78 0a  ter so that pCx.
20770 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 61 66 65    ** can be safe
20780 6c 79 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ly passed to sql
20790 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
207a0 76 65 74 6f 28 29 2e 20 20 54 68 69 73 20 61 76  veto().  This av
207b0 6f 69 64 73 20 61 20 74 65 73 74 0a 20 20 2a 2a  oids a test.  **
207c0 20 66 6f 72 20 70 43 78 2d 3e 65 43 75 72 54 79   for pCx->eCurTy
207d0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
207e0 45 20 69 6e 73 69 64 65 20 6f 66 20 73 71 6c 69  E inside of sqli
207f0 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
20800 65 74 6f 28 29 0a 20 20 2a 2a 20 77 68 69 63 68  eto().  ** which
20810 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   is a performanc
20820 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a  e optimization *
20830 2f 0a 20 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  /.  pCx->uc.pCur
20840 73 6f 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  sor = sqlite3Btr
20850 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73 6f  eeFakeValidCurso
20860 72 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r();.  assert( p
20870 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 62  Op->p5==0 );.  b
20880 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
20890 64 65 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a  de: Close P1 * *
208a0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65   * *.**.** Close
208b0 20 61 20 63 75 72 73 6f 72 20 70 72 65 76 69 6f   a cursor previo
208c0 75 73 6c 79 20 6f 70 65 6e 65 64 20 61 73 20 50  usly opened as P
208d0 31 2e 20 20 49 66 20 50 31 20 69 73 20 6e 6f 74  1.  If P1 is not
208e0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  .** currently op
208f0 65 6e 2c 20 74 68 69 73 20 69 6e 73 74 72 75 63  en, this instruc
20900 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
20910 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 6f 73  .*/.case OP_Clos
20920 65 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  e: {.  assert( p
20930 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
20940 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
20950 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
20960 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d  FreeCursor(p, p-
20970 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 29  >apCsr[pOp->p1])
20980 3b 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  ;.  p->apCsr[pOp
20990 2d 3e 70 31 5d 20 3d 20 30 3b 0a 20 20 62 72 65  ->p1] = 0;.  bre
209a0 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ak;.}..#ifdef SQ
209b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
209c0 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 2f 2a 20  MN_USED_MASK./* 
209d0 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 73 55  Opcode: ColumnsU
209e0 73 65 64 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  sed P1 * * P4 *.
209f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
20a00 65 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 65 78  e (which only ex
20a10 69 73 74 73 20 69 66 20 53 51 4c 69 74 65 20 77  ists if SQLite w
20a20 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  as compiled with
20a30 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  .** SQLITE_ENABL
20a40 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
20a50 53 4b 29 20 69 64 65 6e 74 69 66 69 65 73 20 77  SK) identifies w
20a60 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  hich columns of 
20a70 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  the.** table or 
20a80 69 6e 64 65 78 20 66 6f 72 20 63 75 72 73 6f 72  index for cursor
20a90 20 50 31 20 61 72 65 20 75 73 65 64 2e 20 20 50   P1 are used.  P
20aa0 34 20 69 73 20 61 20 36 34 2d 62 69 74 20 69 6e  4 is a 64-bit in
20ab0 74 65 67 65 72 0a 2a 2a 20 28 50 34 5f 49 4e 54  teger.** (P4_INT
20ac0 36 34 29 20 69 6e 20 77 68 69 63 68 20 74 68 65  64) in which the
20ad0 20 66 69 72 73 74 20 36 33 20 62 69 74 73 20 61   first 63 bits a
20ae0 72 65 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  re one for each 
20af0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
20b00 36 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  63 columns of th
20b10 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
20b20 20 74 68 61 74 20 61 72 65 20 61 63 74 75 61 6c   that are actual
20b30 6c 79 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68  ly used.** by th
20b40 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 68  e cursor.  The h
20b50 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 69 73  igh-order bit is
20b60 20 73 65 74 20 69 66 20 61 6e 79 20 63 6f 6c 75   set if any colu
20b70 6d 6e 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  mn after.** the 
20b80 36 34 74 68 20 69 73 20 75 73 65 64 2e 0a 2a 2f  64th is used..*/
20b90 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 73  .case OP_Columns
20ba0 55 73 65 64 3a 20 7b 0a 20 20 56 64 62 65 43 75  Used: {.  VdbeCu
20bb0 72 73 6f 72 20 2a 70 43 3b 0a 20 20 70 43 20 3d  rsor *pC;.  pC =
20bc0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
20bd0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
20be0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
20bf0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70  YPE_BTREE );.  p
20c00 43 2d 3e 6d 61 73 6b 55 73 65 64 20 3d 20 2a 28  C->maskUsed = *(
20c10 75 36 34 2a 29 70 4f 70 2d 3e 70 34 2e 70 49 36  u64*)pOp->p4.pI6
20c20 34 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  4;.  break;.}.#e
20c30 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ndif../* Opcode:
20c40 20 53 65 65 6b 47 45 20 50 31 20 50 32 20 50 33   SeekGE P1 P2 P3
20c50 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
20c60 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a  s: key=r[P3@P4].
20c70 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20  **.** If cursor 
20c80 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20  P1 refers to an 
20c90 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65  SQL table (B-Tre
20ca0 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65  e that uses inte
20cb0 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75  ger keys), .** u
20cc0 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  se the value in 
20cd0 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 74  register P3 as t
20ce0 68 65 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73  he key.  If curs
20cf0 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
20d00 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
20d10 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
20d20 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
20d30 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
20d40 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
20d50 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
20d60 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
20d70 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
20d80 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
20d90 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
20da0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e   the smallest en
20db0 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
20dc0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
20dd0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
20de0 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
20df0 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
20e00 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
20e10 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
20e20 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
20e30 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
20e40 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
20e50 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 50 31  If the cursor P1
20e60 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e   was opened usin
20e70 67 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 45 45  g the OPFLAG_SEE
20e80 4b 45 51 20 66 6c 61 67 2c 20 74 68 65 6e 20 74  KEQ flag, then t
20e90 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69  his.** opcode wi
20ea0 6c 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f  ll always land o
20eb0 6e 20 61 20 72 65 63 6f 72 64 20 74 68 61 74 20  n a record that 
20ec0 65 71 75 61 6c 6c 79 20 65 71 75 61 6c 73 20 74  equally equals t
20ed0 68 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c  he key, or.** el
20ee0 73 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  se jump immediat
20ef0 65 6c 79 20 74 6f 20 50 32 2e 20 20 57 68 65 6e  ely to P2.  When
20f00 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 4f   the cursor is O
20f10 50 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74 68  PFLAG_SEEKEQ, th
20f20 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73  is.** opcode mus
20f30 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t be followed by
20f40 20 61 6e 20 49 64 78 4c 45 20 6f 70 63 6f 64 65   an IdxLE opcode
20f50 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 61   with the same a
20f60 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  rguments..** The
20f70 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69   IdxLE opcode wi
20f80 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 66  ll be skipped if
20f90 20 74 68 69 73 20 6f 70 63 6f 64 65 20 73 75 63   this opcode suc
20fa0 63 65 65 64 73 2c 20 62 75 74 20 74 68 65 0a 2a  ceeds, but the.*
20fb0 2a 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77  * IdxLE opcode w
20fc0 69 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e 20 73  ill be used on s
20fd0 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69  ubsequent loop i
20fe0 74 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  terations..**.**
20ff0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61   This opcode lea
21000 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63  ves the cursor c
21010 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76  onfigured to mov
21020 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64  e in forward ord
21030 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  er,.** from the 
21040 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64  beginning toward
21050 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74   the end.  In ot
21060 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
21070 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66  ursor is.** conf
21080 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65  igured to use Ne
21090 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a  xt, not Prev..**
210a0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
210b0 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53  und, NotFound, S
210c0 65 65 6b 4c 74 2c 20 53 65 65 6b 47 74 2c 20 53  eekLt, SeekGt, S
210d0 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  eekLe.*/./* Opco
210e0 64 65 3a 20 53 65 65 6b 47 54 20 50 31 20 50 32  de: SeekGT P1 P2
210f0 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
21100 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
21110 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73  4].**.** If curs
21120 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
21130 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
21140 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
21150 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
21160 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
21170 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
21180 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73  s a key. If curs
21190 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
211a0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
211b0 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
211c0 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
211d0 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
211e0 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
211f0 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
21200 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
21210 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
21220 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
21230 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
21240 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e   the smallest en
21250 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
21260 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
21270 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74   key value. If t
21280 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f  here are no reco
21290 72 64 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  rds greater than
212a0 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64   .** the key and
212b0 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   P2 is not zero,
212c0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
212d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
212e0 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
212f0 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64  ursor configured
21300 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77   to move in forw
21310 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72  ard order,.** fr
21320 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
21330 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e   toward the end.
21340 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
21350 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a  , the cursor is.
21360 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  ** configured to
21370 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50   use Next, not P
21380 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  rev..**.** See a
21390 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46  lso: Found, NotF
213a0 6f 75 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53 65  ound, SeekLt, Se
213b0 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a  ekGe, SeekLe.*/.
213c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c  /* Opcode: SeekL
213d0 54 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 20  T P1 P2 P3 P4 * 
213e0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
213f0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
21400 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
21410 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74  fers to an SQL t
21420 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61  able (B-Tree tha
21430 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b  t uses integer k
21440 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68  eys), .** use th
21450 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
21460 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e  ter P3 as a key.
21470 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
21480 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53  fers .** to an S
21490 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50  QL index, then P
214a0 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  3 is the first i
214b0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34  n an array of P4
214c0 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74   registers .** t
214d0 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
214e0 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
214f0 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65  x key. .**.** Re
21500 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20  position cursor 
21510 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70  P1 so that  it p
21520 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72  oints to the lar
21530 67 65 73 74 20 65 6e 74 72 79 20 74 68 61 74 20  gest entry that 
21540 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .** is less than
21550 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
21560 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
21570 72 65 63 6f 72 64 73 20 6c 65 73 73 20 74 68 61  records less tha
21580 6e 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e  n .** the key an
21590 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f  d P2 is not zero
215a0 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  , then jump to P
215b0 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  2..**.** This op
215c0 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
215d0 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65  cursor configure
215e0 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76  d to move in rev
215f0 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66  erse order,.** f
21600 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61  rom the end towa
21610 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  rd the beginning
21620 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
21630 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  s, the cursor is
21640 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74  .** configured t
21650 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20  o use Prev, not 
21660 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  Next..**.** See 
21670 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
21680 46 6f 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53  Found, SeekGt, S
21690 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f  eekGe, SeekLe.*/
216a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
216b0 4c 45 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  LE P1 P2 P3 P4 *
216c0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
216d0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
216e0 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
216f0 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74  fers to an SQL t
21700 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61  able (B-Tree tha
21710 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b  t uses integer k
21720 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68  eys), .** use th
21730 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
21740 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e  ter P3 as a key.
21750 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
21760 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53  fers .** to an S
21770 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50  QL index, then P
21780 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  3 is the first i
21790 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34  n an array of P4
217a0 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74   registers .** t
217b0 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
217c0 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
217d0 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65  x key. .**.** Re
217e0 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20  position cursor 
217f0 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  P1 so that it po
21800 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67  ints to the larg
21810 65 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a  est entry that .
21820 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
21830 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
21840 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68  key value. If th
21850 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72  ere are no recor
21860 64 73 20 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e  ds .** less than
21870 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
21880 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
21890 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
218a0 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
218b0 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76  This opcode leav
218c0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  es the cursor co
218d0 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65  nfigured to move
218e0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
218f0 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65  r,.** from the e
21900 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20 62 65  nd toward the be
21910 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68  ginning.  In oth
21920 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75  er words, the cu
21930 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69  rsor is.** confi
21940 67 75 72 65 64 20 74 6f 20 75 73 65 20 50 72 65  gured to use Pre
21950 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a  v, not Next..**.
21960 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
21970 20 50 31 20 77 61 73 20 6f 70 65 6e 65 64 20 75   P1 was opened u
21980 73 69 6e 67 20 74 68 65 20 4f 50 46 4c 41 47 5f  sing the OPFLAG_
21990 53 45 45 4b 45 51 20 66 6c 61 67 2c 20 74 68 65  SEEKEQ flag, the
219a0 6e 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65  n this.** opcode
219b0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 6c 61 6e   will always lan
219c0 64 20 6f 6e 20 61 20 72 65 63 6f 72 64 20 74 68  d on a record th
219d0 61 74 20 65 71 75 61 6c 6c 79 20 65 71 75 61 6c  at equally equal
219e0 73 20 74 68 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a  s the key, or.**
219f0 20 65 6c 73 65 20 6a 75 6d 70 20 69 6d 6d 65 64   else jump immed
21a00 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 57  iately to P2.  W
21a10 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
21a20 73 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 2c  s OPFLAG_SEEKEQ,
21a30 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20   this.** opcode 
21a40 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64  must be followed
21a50 20 62 79 20 61 6e 20 49 64 78 47 45 20 6f 70 63   by an IdxGE opc
21a60 6f 64 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ode with the sam
21a70 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20  e arguments..** 
21a80 54 68 65 20 49 64 78 47 45 20 6f 70 63 6f 64 65  The IdxGE opcode
21a90 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
21aa0 20 69 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20   if this opcode 
21ab0 73 75 63 63 65 65 64 73 2c 20 62 75 74 20 74 68  succeeds, but th
21ac0 65 0a 2a 2a 20 49 64 78 47 45 20 6f 70 63 6f 64  e.** IdxGE opcod
21ad0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 6f  e will be used o
21ae0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f  n subsequent loo
21af0 70 20 69 74 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  p iterations..**
21b00 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
21b10 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53  und, NotFound, S
21b20 65 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53  eekGt, SeekGe, S
21b30 65 65 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50  eekLt.*/.case OP
21b40 5f 53 65 65 6b 4c 54 3a 20 20 20 20 20 20 20 20  _SeekLT:        
21b50 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 2c 20 67   /* jump, in3, g
21b60 72 6f 75 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  roup */.case OP_
21b70 53 65 65 6b 4c 45 3a 20 20 20 20 20 20 20 20 20  SeekLE:         
21b80 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 2c 20 67 72  /* jump, in3, gr
21b90 6f 75 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  oup */.case OP_S
21ba0 65 65 6b 47 45 3a 20 20 20 20 20 20 20 20 20 2f  eekGE:         /
21bb0 2a 20 6a 75 6d 70 2c 20 69 6e 33 2c 20 67 72 6f  * jump, in3, gro
21bc0 75 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  up */.case OP_Se
21bd0 65 6b 47 54 3a 20 7b 20 20 20 20 20 20 20 2f 2a  ekGT: {       /*
21be0 20 6a 75 6d 70 2c 20 69 6e 33 2c 20 67 72 6f 75   jump, in3, grou
21bf0 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20  p */.  int res; 
21c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
21c10 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 2a  parison result *
21c20 2f 0a 20 20 69 6e 74 20 6f 63 3b 20 20 20 20 20  /.  int oc;     
21c30 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
21c40 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
21c50 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20   *pC;    /* The 
21c60 63 75 72 73 6f 72 20 74 6f 20 73 65 65 6b 20 2a  cursor to seek *
21c70 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
21c80 72 64 20 72 3b 20 20 2f 2a 20 54 68 65 20 6b 65  rd r;  /* The ke
21c90 79 20 74 6f 20 73 65 65 6b 20 66 6f 72 20 2a 2f  y to seek for */
21ca0 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20  .  int nField;  
21cb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21cc0 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 66 69  of columns or fi
21cd0 65 6c 64 73 20 69 6e 20 74 68 65 20 6b 65 79 20  elds in the key 
21ce0 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20  */.  i64 iKey;  
21cf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
21d00 6f 77 69 64 20 77 65 20 61 72 65 20 74 6f 20 73  owid we are to s
21d10 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
21d20 65 71 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 2f  eqOnly;        /
21d30 2a 20 4f 6e 6c 79 20 69 6e 74 65 72 65 73 74 65  * Only intereste
21d40 64 20 69 6e 20 3d 3d 20 72 65 73 75 6c 74 73 20  d in == results 
21d50 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
21d60 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
21d70 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
21d80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
21d90 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43 20 3d  >p2!=0 );.  pC =
21da0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
21db0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
21dc0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21dd0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
21de0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
21df0 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
21e00 6b 4c 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54  kLE == OP_SeekLT
21e10 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1 );.  assert( 
21e20 4f 50 5f 53 65 65 6b 47 45 20 3d 3d 20 4f 50 5f  OP_SeekGE == OP_
21e30 53 65 65 6b 4c 54 2b 32 20 29 3b 0a 20 20 61 73  SeekLT+2 );.  as
21e40 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 20  sert( OP_SeekGT 
21e50 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 33 20 29  == OP_SeekLT+3 )
21e60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
21e70 69 73 4f 72 64 65 72 65 64 20 29 3b 0a 20 20 61  isOrdered );.  a
21e80 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
21e90 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 6f 63  ursor!=0 );.  oc
21ea0 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
21eb0 20 20 65 71 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20    eqOnly = 0;.  
21ec0 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  pC->nullRow = 0;
21ed0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21ee0 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f  EBUG.  pC->seekO
21ef0 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  p = pOp->opcode;
21f00 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
21f10 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20  C->isTable ){.  
21f20 20 20 2f 2a 20 54 68 65 20 42 54 52 45 45 5f 53    /* The BTREE_S
21f30 45 45 4b 5f 45 51 20 66 6c 61 67 20 69 73 20 6f  EEK_EQ flag is o
21f40 6e 6c 79 20 73 65 74 20 6f 6e 20 69 6e 64 65 78  nly set on index
21f50 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 20 20   cursors */.    
21f60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
21f70 74 72 65 65 43 75 72 73 6f 72 48 61 73 48 69 6e  treeCursorHasHin
21f80 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t(pC->uc.pCursor
21f90 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 29  , BTREE_SEEK_EQ)
21fa0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
21fb0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
21fc0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 69  );..    /* The i
21fd0 6e 70 75 74 20 76 61 6c 75 65 20 69 6e 20 50 33  nput value in P3
21fe0 20 6d 69 67 68 74 20 62 65 20 6f 66 20 61 6e 79   might be of any
21ff0 20 74 79 70 65 3a 20 69 6e 74 65 67 65 72 2c 20   type: integer, 
22000 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 0a 20 20  real, string,.  
22010 20 20 2a 2a 20 62 6c 6f 62 2c 20 6f 72 20 4e 55    ** blob, or NU
22020 4c 4c 2e 20 20 42 75 74 20 69 74 20 6e 65 65 64  LL.  But it need
22030 73 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67  s to be an integ
22040 65 72 20 62 65 66 6f 72 65 20 77 65 20 63 61 6e  er before we can
22050 20 64 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   do.    ** the s
22060 65 65 6b 2c 20 73 6f 20 63 6f 6e 76 65 72 74 20  eek, so convert 
22070 69 74 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 33 20  it. */.    pIn3 
22080 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
22090 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d  ;.    if( (pIn3-
220a0 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e  >flags & (MEM_In
220b0 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49  t|MEM_Real|MEM_I
220c0 6e 74 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29  ntReal|MEM_Str))
220d0 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  ==MEM_Str ){.   
220e0 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41     applyNumericA
220f0 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 30 29  ffinity(pIn3, 0)
22100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4b 65 79  ;.    }.    iKey
22110 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
22120 74 56 61 6c 75 65 28 70 49 6e 33 29 3b 0a 0a 20  tValue(pIn3);.. 
22130 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20     /* If the P3 
22140 76 61 6c 75 65 20 63 6f 75 6c 64 20 6e 6f 74 20  value could not 
22150 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
22160 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 77 69 74  o an integer wit
22170 68 6f 75 74 0a 20 20 20 20 2a 2a 20 6c 6f 73 73  hout.    ** loss
22180 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c   of information,
22190 20 74 68 65 6e 20 73 70 65 63 69 61 6c 20 70 72   then special pr
221a0 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75  ocessing is requ
221b0 69 72 65 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69  ired... */.    i
221c0 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
221d0 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49  & (MEM_Int|MEM_I
221e0 6e 74 52 65 61 6c 29 29 3d 3d 30 20 29 7b 0a 20  ntReal))==0 ){. 
221f0 20 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e       if( (pIn3->
22200 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
22210 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22220 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  if( (pIn3->flags
22230 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 7c 7c 20   & MEM_Null) || 
22240 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47 45 20 29 7b  oc>=OP_SeekGE ){
22250 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 42  .          VdbeB
22260 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b  ranchTaken(1,2);
22270 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
22280 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
22290 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
222a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
222b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
222c0 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t(pC->uc.pCursor
222d0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
222e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
222f0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
22300 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
22310 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
22320 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20  eek_not_found;. 
22330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22340 65 6c 73 65 0a 0a 20 20 20 20 20 20 2f 2a 20 49  else..      /* I
22350 66 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  f the approximat
22360 69 6f 6e 20 69 4b 65 79 20 69 73 20 6c 61 72 67  ion iKey is larg
22370 65 72 20 74 68 61 6e 20 74 68 65 20 61 63 74 75  er than the actu
22380 61 6c 20 72 65 61 6c 20 73 65 61 72 63 68 0a 20  al real search. 
22390 20 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75       ** term, su
223a0 62 73 74 69 74 75 74 65 20 3e 3d 20 66 6f 72 20  bstitute >= for 
223b0 3e 20 61 6e 64 20 3c 20 66 6f 72 20 3c 3d 2e 20  > and < for <=. 
223c0 65 2e 67 2e 20 69 66 20 74 68 65 20 73 65 61 72  e.g. if the sear
223d0 63 68 20 74 65 72 6d 0a 20 20 20 20 20 20 2a 2a  ch term.      **
223e0 20 69 73 20 34 2e 39 20 61 6e 64 20 74 68 65 20   is 4.9 and the 
223f0 69 6e 74 65 67 65 72 20 61 70 70 72 6f 78 69 6d  integer approxim
22400 61 74 69 6f 6e 20 35 3a 0a 20 20 20 20 20 20 2a  ation 5:.      *
22410 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
22420 20 20 28 78 20 3e 20 20 34 2e 39 29 20 20 20 20    (x >  4.9)    
22430 2d 3e 20 20 20 20 20 28 78 20 3e 3d 20 35 29 0a  ->     (x >= 5).
22440 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
22450 28 78 20 3c 3d 20 34 2e 39 29 20 20 20 20 2d 3e  (x <= 4.9)    ->
22460 20 20 20 20 20 28 78 20 3c 20 20 35 29 0a 20 20       (x <  5).  
22470 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
22480 20 70 49 6e 33 2d 3e 75 2e 72 3c 28 64 6f 75 62   pIn3->u.r<(doub
22490 6c 65 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20  le)iKey ){.     
224a0 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65     assert( OP_Se
224b0 65 6b 47 45 3d 3d 28 4f 50 5f 53 65 65 6b 47 54  ekGE==(OP_SeekGT
224c0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  -1) );.        a
224d0 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 54  ssert( OP_SeekLT
224e0 3d 3d 28 4f 50 5f 53 65 65 6b 4c 45 2d 31 29 20  ==(OP_SeekLE-1) 
224f0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
22500 74 28 20 28 4f 50 5f 53 65 65 6b 4c 45 20 26 20  t( (OP_SeekLE & 
22510 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65  0x0001)==(OP_See
22520 6b 47 54 20 26 20 30 78 30 30 30 31 29 20 29 3b  kGT & 0x0001) );
22530 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 63  .        if( (oc
22540 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f   & 0x0001)==(OP_
22550 53 65 65 6b 47 54 20 26 20 30 78 30 30 30 31 29  SeekGT & 0x0001)
22560 20 29 20 6f 63 2d 2d 3b 0a 20 20 20 20 20 20 7d   ) oc--;.      }
22570 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
22580 65 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  e approximation 
22590 69 4b 65 79 20 69 73 20 73 6d 61 6c 6c 65 72 20  iKey is smaller 
225a0 74 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20  than the actual 
225b0 72 65 61 6c 20 73 65 61 72 63 68 0a 20 20 20 20  real search.    
225c0 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62 73 74    ** term, subst
225d0 69 74 75 74 65 20 3c 3d 20 66 6f 72 20 3c 20 61  itute <= for < a
225e0 6e 64 20 3e 20 66 6f 72 20 3e 3d 2e 20 20 2a 2f  nd > for >=.  */
225f0 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
22600 70 49 6e 33 2d 3e 75 2e 72 3e 28 64 6f 75 62 6c  pIn3->u.r>(doubl
22610 65 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  e)iKey ){.      
22620 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
22630 6b 4c 45 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54 2b  kLE==(OP_SeekLT+
22640 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  1) );.        as
22650 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 3d  sert( OP_SeekGT=
22660 3d 28 4f 50 5f 53 65 65 6b 47 45 2b 31 29 20 29  =(OP_SeekGE+1) )
22670 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
22680 28 20 28 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30  ( (OP_SeekLT & 0
22690 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b  x0001)==(OP_Seek
226a0 47 45 20 26 20 30 78 30 30 30 31 29 20 29 3b 0a  GE & 0x0001) );.
226b0 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 63 20          if( (oc 
226c0 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53  & 0x0001)==(OP_S
226d0 65 65 6b 4c 54 20 26 20 30 78 30 30 30 31 29 20  eekLT & 0x0001) 
226e0 29 20 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ) oc++;.      }.
226f0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
22700 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
22710 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63  oUnpacked(pC->uc
22720 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  .pCursor, 0, (u6
22730 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29  4)iKey, 0, &res)
22740 3b 0a 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f  ;.    pC->moveto
22750 54 61 72 67 65 74 20 3d 20 69 4b 65 79 3b 20 20  Target = iKey;  
22760 2f 2a 20 55 73 65 64 20 62 79 20 4f 50 5f 44 65  /* Used by OP_De
22770 6c 65 74 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  lete */.    if( 
22780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22790 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
227a0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
227b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
227c0 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 75 72 73     /* For a curs
227d0 6f 72 20 77 69 74 68 20 74 68 65 20 42 54 52 45  or with the BTRE
227e0 45 5f 53 45 45 4b 5f 45 51 20 68 69 6e 74 2c 20  E_SEEK_EQ hint, 
227f0 6f 6e 6c 79 20 74 68 65 20 4f 50 5f 53 65 65 6b  only the OP_Seek
22800 47 45 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4f 50  GE and.    ** OP
22810 5f 53 65 65 6b 4c 45 20 6f 70 63 6f 64 65 73 20  _SeekLE opcodes 
22820 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20 61 6e 64  are allowed, and
22830 20 74 68 65 73 65 20 6d 75 73 74 20 62 65 20 69   these must be i
22840 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
22850 77 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 61 6e  wed.    ** by an
22860 20 4f 50 5f 49 64 78 47 54 20 6f 72 20 4f 50 5f   OP_IdxGT or OP_
22870 49 64 78 4c 54 20 6f 70 63 6f 64 65 2c 20 72 65  IdxLT opcode, re
22880 73 70 65 63 74 69 76 65 6c 79 2c 20 77 69 74 68  spectively, with
22890 20 74 68 65 20 73 61 6d 65 20 6b 65 79 2e 0a 20   the same key.. 
228a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
228b0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
228c0 48 61 73 48 69 6e 74 28 70 43 2d 3e 75 63 2e 70  HasHint(pC->uc.p
228d0 43 75 72 73 6f 72 2c 20 42 54 52 45 45 5f 53 45  Cursor, BTREE_SE
228e0 45 4b 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  EK_EQ) ){.      
228f0 65 71 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  eqOnly = 1;.    
22900 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
22910 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 47 45  pcode==OP_SeekGE
22920 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
22930 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20  =OP_SeekLE );.  
22940 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
22950 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  1].opcode==OP_Id
22960 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70  xLT || pOp[1].op
22970 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29  code==OP_IdxGT )
22980 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22990 70 4f 70 5b 31 5d 2e 70 31 3d 3d 70 4f 70 5b 30  pOp[1].p1==pOp[0
229a0 5d 2e 70 31 20 29 3b 0a 20 20 20 20 20 20 61 73  ].p1 );.      as
229b0 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 32 3d  sert( pOp[1].p2=
229c0 3d 70 4f 70 5b 30 5d 2e 70 32 20 29 3b 0a 20 20  =pOp[0].p2 );.  
229d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
229e0 31 5d 2e 70 33 3d 3d 70 4f 70 5b 30 5d 2e 70 33  1].p3==pOp[0].p3
229f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22a00 28 20 70 4f 70 5b 31 5d 2e 70 34 2e 69 3d 3d 70  ( pOp[1].p4.i==p
22a10 4f 70 5b 30 5d 2e 70 34 2e 69 20 29 3b 0a 20 20  Op[0].p4.i );.  
22a20 20 20 7d 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20    }..    nField 
22a30 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20  = pOp->p4.i;.   
22a40 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
22a50 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
22a60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 46  ;.    assert( nF
22a70 69 65 6c 64 3e 30 20 29 3b 0a 20 20 20 20 72 2e  ield>0 );.    r.
22a80 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70  pKeyInfo = pC->p
22a90 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e  KeyInfo;.    r.n
22aa0 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 46 69  Field = (u16)nFi
22ab0 65 6c 64 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  eld;..    /* The
22ac0 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20 63 6f   next line of co
22ad0 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73 20 66  de computes as f
22ae0 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66 61 73  ollows, only fas
22af0 74 65 72 3a 0a 20 20 20 20 2a 2a 20 20 20 69 66  ter:.    **   if
22b00 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 20  ( oc==OP_SeekGT 
22b10 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45  || oc==OP_SeekLE
22b20 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72   ){.    **     r
22b30 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d 31  .default_rc = -1
22b40 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73 65  ;.    **   }else
22b50 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 64  {.    **     r.d
22b60 65 66 61 75 6c 74 5f 72 63 20 3d 20 2b 31 3b 0a  efault_rc = +1;.
22b70 20 20 20 20 2a 2a 20 20 20 7d 0a 20 20 20 20 2a      **   }.    *
22b80 2f 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f  /.    r.default_
22b90 72 63 20 3d 20 28 28 31 20 26 20 28 6f 63 20 2d  rc = ((1 & (oc -
22ba0 20 4f 50 5f 53 65 65 6b 4c 54 29 29 20 3f 20 2d   OP_SeekLT)) ? -
22bb0 31 20 3a 20 2b 31 29 3b 0a 20 20 20 20 61 73 73  1 : +1);.    ass
22bc0 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b  ert( oc!=OP_Seek
22bd0 47 54 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f  GT || r.default_
22be0 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73  rc==-1 );.    as
22bf0 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
22c00 6b 4c 45 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74  kLE || r.default
22c10 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61  _rc==-1 );.    a
22c20 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65  ssert( oc!=OP_Se
22c30 65 6b 47 45 20 7c 7c 20 72 2e 64 65 66 61 75 6c  ekGE || r.defaul
22c40 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 20 20 20 20  t_rc==+1 );.    
22c50 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53  assert( oc!=OP_S
22c60 65 65 6b 4c 54 20 7c 7c 20 72 2e 64 65 66 61 75  eekLT || r.defau
22c70 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 0a 20 20  lt_rc==+1 );..  
22c80 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d    r.aMem = &aMem
22c90 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65  [pOp->p3];.#ifde
22ca0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
22cb0 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28     { int i; for(
22cc0 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b  i=0; i<r.nField;
22cd0 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d 65   i++) assert( me
22ce0 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d  mIsValid(&r.aMem
22cf0 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66  [i]) ); }.#endif
22d00 0a 20 20 20 20 72 2e 65 71 53 65 65 6e 20 3d 20  .    r.eqSeen = 
22d10 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
22d20 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
22d30 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43  packed(pC->uc.pC
22d40 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c 20 30 2c  ursor, &r, 0, 0,
22d50 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
22d60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22d70 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
22d80 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
22d90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 71      }.    if( eq
22da0 4f 6e 6c 79 20 26 26 20 72 2e 65 71 53 65 65 6e  Only && r.eqSeen
22db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
22dc0 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20  ert( res!=0 );. 
22dd0 20 20 20 20 20 67 6f 74 6f 20 73 65 65 6b 5f 6e       goto seek_n
22de0 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a  ot_found;.    }.
22df0 20 20 7d 0a 20 20 70 43 2d 3e 64 65 66 65 72 72    }.  pC->deferr
22e00 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
22e10 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
22e20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 23  = CACHE_STALE;.#
22e30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22e40 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72  T.  sqlite3_sear
22e50 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
22e60 69 66 0a 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f  if.  if( oc>=OP_
22e70 53 65 65 6b 47 45 20 29 7b 20 20 61 73 73 65 72  SeekGE ){  asser
22e80 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 45  t( oc==OP_SeekGE
22e90 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
22ea0 54 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  T );.    if( res
22eb0 3c 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26  <0 || (res==0 &&
22ec0 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 20   oc==OP_SeekGT) 
22ed0 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30  ){.      res = 0
22ee0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
22ef0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
22f00 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 29  ->uc.pCursor, 0)
22f10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
22f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22f30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22f40 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
22f50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22f60 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
22f70 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  res = 1;.       
22f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22f90 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
22fa0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
22fb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
22fd0 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
22fe0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
22ff0 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20  ( oc==OP_SeekLT 
23000 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45  || oc==OP_SeekLE
23010 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3e   );.    if( res>
23020 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20  0 || (res==0 && 
23030 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 20 29  oc==OP_SeekLT) )
23040 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b  {.      res = 0;
23050 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23060 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
23070 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
23080 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
23090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
230a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
230b0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
230c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
230d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
230e0 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20     res = 1;.    
230f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23100 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
23110 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
23120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23140 20 2f 2a 20 72 65 73 20 6d 69 67 68 74 20 62 65   /* res might be
23150 20 6e 65 67 61 74 69 76 65 20 62 65 63 61 75 73   negative becaus
23160 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  e the table is e
23170 6d 70 74 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a  mpty.  Check to.
23180 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
23190 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
231a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
231b0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74   res = sqlite3Bt
231c0 72 65 65 45 6f 66 28 70 43 2d 3e 75 63 2e 70 43  reeEof(pC->uc.pC
231d0 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
231e0 7d 0a 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64  }.seek_not_found
231f0 3a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  :.  assert( pOp-
23200 3e 70 32 3e 30 20 29 3b 0a 20 20 56 64 62 65 42  >p2>0 );.  VdbeB
23210 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
23220 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20  0,2);.  if( res 
23230 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
23240 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 20  _to_p2;.  }else 
23250 69 66 28 20 65 71 4f 6e 6c 79 20 29 7b 0a 20 20  if( eqOnly ){.  
23260 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d    assert( pOp[1]
23270 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c  .opcode==OP_IdxL
23280 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f  T || pOp[1].opco
23290 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a  de==OP_IdxGT );.
232a0 20 20 20 20 70 4f 70 2b 2b 3b 20 2f 2a 20 53 6b      pOp++; /* Sk
232b0 69 70 20 74 68 65 20 4f 50 5f 49 64 78 4c 74 20  ip the OP_IdxLt 
232c0 6f 72 20 4f 50 5f 49 64 78 47 54 20 74 68 61 74  or OP_IdxGT that
232d0 20 66 6f 6c 6c 6f 77 73 20 2a 2f 0a 20 20 7d 0a   follows */.  }.
232e0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
232f0 70 63 6f 64 65 3a 20 53 65 65 6b 48 69 74 20 50  pcode: SeekHit P
23300 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
23310 6e 6f 70 73 69 73 3a 20 73 65 65 6b 48 69 74 3d  nopsis: seekHit=
23320 50 32 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  P2.**.** Set the
23330 20 73 65 65 6b 48 69 74 20 66 6c 61 67 20 6f 6e   seekHit flag on
23340 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20 74 68   cursor P1 to th
23350 65 20 76 61 6c 75 65 20 69 6e 20 50 32 2e 0a 2a  e value in P2..*
23360 2a 20 54 68 65 20 73 65 65 6b 48 69 74 20 66 6c  * The seekHit fl
23370 61 67 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ag is used by th
23380 65 20 49 66 4e 6f 48 6f 70 65 20 6f 70 63 6f 64  e IfNoHope opcod
23390 65 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74  e..**.** P1 must
233a0 20 62 65 20 61 20 76 61 6c 69 64 20 62 2d 74 72   be a valid b-tr
233b0 65 65 20 63 75 72 73 6f 72 2e 20 20 50 32 20 6d  ee cursor.  P2 m
233c0 75 73 74 20 62 65 20 61 20 62 6f 6f 6c 65 61 6e  ust be a boolean
233d0 20 76 61 6c 75 65 2c 0a 2a 2a 20 65 69 74 68 65   value,.** eithe
233e0 72 20 30 20 6f 72 20 31 2e 0a 2a 2f 0a 63 61 73  r 0 or 1..*/.cas
233f0 65 20 4f 50 5f 53 65 65 6b 48 69 74 3a 20 7b 0a  e OP_SeekHit: {.
23400 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
23410 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
23420 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
23430 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
23440 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
23450 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
23460 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
23470 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d  ssert( pOp->p2==
23480 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  0 || pOp->p2==1 
23490 29 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 48 69 74  );.  pC->seekHit
234a0 20 3d 20 70 4f 70 2d 3e 70 32 20 26 20 31 3b 0a   = pOp->p2 & 1;.
234b0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
234c0 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31 20  pcode: Found P1 
234d0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
234e0 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
234f0 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  @P4].**.** If P4
23500 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65  ==0 then registe
23510 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f  r P3 holds a blo
23520 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  b constructed by
23530 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66   MakeRecord.  If
23540 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65  .** P4>0 then re
23550 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
23560 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67   first of P4 reg
23570 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d  isters that form
23580 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20   an unpacked.** 
23590 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43 75  record..**.** Cu
235a0 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
235b0 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
235c0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
235d0 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
235e0 64 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72 65  d P4.** is a pre
235f0 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72 79  fix of any entry
23600 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a 75   in P1 then a ju
23610 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32  mp is made to P2
23620 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c 65   and.** P1 is le
23630 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  ft pointing at t
23640 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72  he matching entr
23650 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  y..**.** This op
23660 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 74  eration leaves t
23670 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73  he cursor in a s
23680 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63 61  tate where it ca
23690 6e 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64  n be.** advanced
236a0 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20   in the forward 
236b0 64 69 72 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  direction.  The 
236c0 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Next instruction
236d0 20 77 69 6c 6c 20 77 6f 72 6b 2c 0a 2a 2a 20 62   will work,.** b
236e0 75 74 20 6e 6f 74 20 74 68 65 20 50 72 65 76 20  ut not the Prev 
236f0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
23700 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74  ** See also: Not
23710 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63  Found, NoConflic
23720 74 2c 20 4e 6f 74 45 78 69 73 74 73 2e 20 53 65  t, NotExists. Se
23730 65 6b 47 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ekGe.*/./* Opcod
23740 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50  e: NotFound P1 P
23750 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
23760 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
23770 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d  P4].**.** If P4=
23780 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  =0 then register
23790 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
237a0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
237b0 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a  MakeRecord.  If.
237c0 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67  ** P4>0 then reg
237d0 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20  ister P3 is the 
237e0 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69  first of P4 regi
237f0 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20  sters that form 
23800 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72  an unpacked.** r
23810 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75  ecord..** .** Cu
23820 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
23830 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
23840 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
23850 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
23860 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  d P4.** is not t
23870 68 65 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79  he prefix of any
23880 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65   entry in P1 the
23890 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  n a jump is made
238a0 20 74 6f 20 50 32 2e 20 20 49 66 20 50 31 20 0a   to P2.  If P1 .
238b0 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20  ** does contain 
238c0 61 6e 20 65 6e 74 72 79 20 77 68 6f 73 65 20 70  an entry whose p
238d0 72 65 66 69 78 20 6d 61 74 63 68 65 73 20 74 68  refix matches th
238e0 65 20 50 33 2f 50 34 20 72 65 63 6f 72 64 20 74  e P3/P4 record t
238f0 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66  hen control.** f
23900 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20  alls through to 
23910 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
23920 74 69 6f 6e 20 61 6e 64 20 50 31 20 69 73 20 6c  tion and P1 is l
23930 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
23940 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20  the.** matching 
23950 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
23960 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76  s operation leav
23970 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  es the cursor in
23980 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69   a state where i
23990 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61  t cannot be.** a
239a0 64 76 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65  dvanced in eithe
239b0 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e  r direction.  In
239c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
239d0 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a  e Next and Prev.
239e0 2a 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f  ** opcodes do no
239f0 74 20 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69  t work after thi
23a00 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
23a10 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
23a20 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 4e  nd, NotExists, N
23a30 6f 43 6f 6e 66 6c 69 63 74 2c 20 49 66 4e 6f 48  oConflict, IfNoH
23a40 6f 70 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ope.*/./* Opcode
23a50 3a 20 49 66 4e 6f 48 6f 70 65 20 50 31 20 50 32  : IfNoHope P1 P2
23a60 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
23a70 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
23a80 34 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  4].**.** Registe
23a90 72 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  r P3 is the firs
23aa0 74 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  t of P4 register
23ab0 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75  s that form an u
23ac0 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72  npacked.** recor
23ad0 64 2e 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20  d..**.** Cursor 
23ae0 50 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65  P1 is on an inde
23af0 78 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65  x btree.  If the
23b00 20 73 65 65 6b 48 69 74 20 66 6c 61 67 20 69 73   seekHit flag is
23b10 20 73 65 74 20 6f 6e 20 50 31 2c 20 74 68 65 6e   set on P1, then
23b20 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f 64 65 20  .** this opcode 
23b30 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
23b40 20 69 66 20 74 68 65 20 73 65 65 6b 48 69 74 20   if the seekHit 
23b50 66 6c 61 67 20 6f 66 20 50 31 20 69 73 20 63 6c  flag of P1 is cl
23b60 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 63 68 65  ear, then.** che
23b70 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
23b80 72 65 20 69 73 20 61 6e 79 20 65 6e 74 72 79 20  re is any entry 
23b90 69 6e 20 50 31 20 74 68 61 74 20 6d 61 74 63 68  in P1 that match
23ba0 65 73 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  es the.** prefix
23bb0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50   identified by P
23bc0 33 20 61 6e 64 20 50 34 2e 20 20 49 66 20 6e 6f  3 and P4.  If no
23bd0 20 65 6e 74 72 79 20 6d 61 74 63 68 65 73 20 74   entry matches t
23be0 68 65 20 70 72 65 66 69 78 2c 0a 2a 2a 20 6a 75  he prefix,.** ju
23bf0 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72  mp to P2.  Other
23c00 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
23c10 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  h..**.** This op
23c20 63 6f 64 65 20 62 65 68 61 76 65 73 20 6c 69 6b  code behaves lik
23c30 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 69 66  e OP_NotFound if
23c40 20 74 68 65 20 73 65 65 6b 48 69 74 0a 2a 2a 20   the seekHit.** 
23c50 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 61 6e  flag is clear an
23c60 64 20 69 74 20 62 65 68 61 76 65 73 20 6c 69 6b  d it behaves lik
23c70 65 20 4f 50 5f 4e 6f 6f 70 20 69 66 20 74 68 65  e OP_Noop if the
23c80 20 73 65 65 6b 48 69 74 20 66 6c 61 67 20 69 73   seekHit flag is
23c90 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   set..**.** This
23ca0 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
23cb0 69 6e 20 49 4e 20 63 6c 61 75 73 65 20 70 72 6f  in IN clause pro
23cc0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 20 6d 75  cessing for a mu
23cd0 6c 74 69 2d 63 6f 6c 75 6d 6e 20 6b 65 79 2e 0a  lti-column key..
23ce0 2a 2a 20 49 66 20 61 6e 20 49 4e 20 63 6c 61 75  ** If an IN clau
23cf0 73 65 20 69 73 20 61 74 74 61 63 68 65 64 20 74  se is attached t
23d00 6f 20 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  o an element of 
23d10 74 68 65 20 6b 65 79 20 6f 74 68 65 72 20 74 68  the key other th
23d20 61 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  an the.** left-m
23d30 6f 73 74 20 65 6c 65 6d 65 6e 74 2c 20 61 6e 64  ost element, and
23d40 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
23d50 20 6d 61 74 63 68 65 73 20 6f 6e 20 74 68 65 20   matches on the 
23d60 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 73  most recent.** s
23d70 65 65 6b 20 6f 76 65 72 20 74 68 65 20 77 68 6f  eek over the who
23d80 6c 65 20 6b 65 79 2c 20 74 68 65 6e 20 69 74 20  le key, then it 
23d90 6d 69 67 68 74 20 62 65 20 74 68 61 74 20 6f 6e  might be that on
23da0 65 20 6f 66 20 74 68 65 20 6b 65 79 20 65 6c 65  e of the key ele
23db0 6d 65 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  ment.** to the l
23dc0 65 66 74 20 69 73 20 70 72 6f 68 69 62 69 74 69  eft is prohibiti
23dd0 6e 67 20 61 20 6d 61 74 63 68 2c 20 61 6e 64 20  ng a match, and 
23de0 68 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 22  hence there is "
23df0 6e 6f 20 68 6f 70 65 22 20 6f 66 0a 2a 2a 20 61  no hope" of.** a
23e00 6e 79 20 6d 61 74 63 68 20 72 65 67 61 72 64 6c  ny match regardl
23e10 65 73 73 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20  ess of how many 
23e20 49 4e 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  IN clause elemen
23e30 74 73 20 61 72 65 20 63 68 65 63 6b 65 64 2e 0a  ts are checked..
23e40 2a 2a 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  ** In such a cas
23e50 65 2c 20 77 65 20 61 62 61 6e 64 6f 6e 20 74 68  e, we abandon th
23e60 65 20 49 4e 20 63 6c 61 75 73 65 20 73 65 61 72  e IN clause sear
23e70 63 68 20 65 61 72 6c 79 2c 20 75 73 69 6e 67 20  ch early, using 
23e80 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 2e 20  this.** opcode. 
23e90 20 54 68 65 20 6f 70 63 6f 64 65 20 6e 61 6d 65   The opcode name
23ea0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   comes from the 
23eb0 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 2a 2a  fact that the.**
23ec0 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
23ed0 66 20 74 68 65 72 65 20 69 73 20 22 6e 6f 20 68  f there is "no h
23ee0 6f 70 65 22 20 6f 66 20 61 63 68 69 65 76 69 6e  ope" of achievin
23ef0 67 20 61 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a  g a match..**.**
23f00 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f   See also: NotFo
23f10 75 6e 64 2c 20 53 65 65 6b 48 69 74 0a 2a 2f 0a  und, SeekHit.*/.
23f20 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 43 6f 6e  /* Opcode: NoCon
23f30 66 6c 69 63 74 20 50 31 20 50 32 20 50 33 20 50  flict P1 P2 P3 P
23f40 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
23f50 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
23f60 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65  .** If P4==0 the
23f70 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 68 6f  n register P3 ho
23f80 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74  lds a blob const
23f90 72 75 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65  ructed by MakeRe
23fa0 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e  cord.  If.** P4>
23fb0 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  0 then register 
23fc0 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
23fd0 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
23fe0 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70  that form an unp
23ff0 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e  acked.** record.
24000 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50  .** .** Cursor P
24010 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78  1 is on an index
24020 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
24030 72 65 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65  record identifie
24040 64 20 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a  d by P3 and P4.*
24050 2a 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  * contains any N
24060 55 4c 4c 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20  ULL value, jump 
24070 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
24080 32 2e 20 20 49 66 20 61 6c 6c 20 74 65 72 6d 73  2.  If all terms
24090 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72   of the.** recor
240a0 64 20 61 72 65 20 6e 6f 74 2d 4e 55 4c 4c 20 74  d are not-NULL t
240b0 68 65 6e 20 61 20 63 68 65 63 6b 20 69 73 20 64  hen a check is d
240c0 6f 6e 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  one to determine
240d0 20 69 66 20 61 6e 79 20 72 6f 77 20 69 6e 20 74   if any row in t
240e0 68 65 0a 2a 2a 20 50 31 20 69 6e 64 65 78 20 62  he.** P1 index b
240f0 74 72 65 65 20 68 61 73 20 61 20 6d 61 74 63 68  tree has a match
24100 69 6e 67 20 6b 65 79 20 70 72 65 66 69 78 2e 20  ing key prefix. 
24110 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
24120 20 6d 61 74 63 68 65 73 2c 20 6a 75 6d 70 0a 2a   matches, jump.*
24130 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  * immediately to
24140 20 50 32 2e 20 20 49 66 20 74 68 65 72 65 20 69   P2.  If there i
24150 73 20 61 20 6d 61 74 63 68 2c 20 66 61 6c 6c 20  s a match, fall 
24160 74 68 72 6f 75 67 68 20 61 6e 64 20 6c 65 61 76  through and leav
24170 65 20 74 68 65 20 50 31 0a 2a 2a 20 63 75 72 73  e the P1.** curs
24180 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
24190 68 65 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e  he matching row.
241a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
241b0 64 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  de is similar to
241c0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 77 69 74   OP_NotFound wit
241d0 68 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 73  h the exceptions
241e0 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 62 72 61   that the.** bra
241f0 6e 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 61  nch is always ta
24200 6b 65 6e 20 69 66 20 61 6e 79 20 70 61 72 74 20  ken if any part 
24210 6f 66 20 74 68 65 20 73 65 61 72 63 68 20 6b 65  of the search ke
24220 79 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e  y input is NULL.
24230 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72  .**.** This oper
24240 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 74 68 65  ation leaves the
24250 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61   cursor in a sta
24260 74 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e  te where it cann
24270 6f 74 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65  ot be.** advance
24280 64 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  d in either dire
24290 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ction.  In other
242a0 20 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74   words, the Next
242b0 20 61 6e 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63   and Prev.** opc
242c0 6f 64 65 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b  odes do not work
242d0 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 65 72   after this oper
242e0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ation..**.** See
242f0 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c   also: NotFound,
24300 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74   Found, NotExist
24310 73 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e  s.*/.case OP_IfN
24320 6f 48 6f 70 65 3a 20 7b 20 20 20 20 20 2f 2a 20  oHope: {     /* 
24330 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 56  jump, in3 */.  V
24340 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
24350 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
24360 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
24370 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
24380 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
24390 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
243a0 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   pC!=0 );.  if( 
243b0 70 43 2d 3e 73 65 65 6b 48 69 74 20 29 20 62 72  pC->seekHit ) br
243c0 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  eak;.  /* Fall t
243d0 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 4e  hrough into OP_N
243e0 6f 74 46 6f 75 6e 64 20 2a 2f 0a 7d 0a 63 61 73  otFound */.}.cas
243f0 65 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 3a  e OP_NoConflict:
24400 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
24410 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74  3 */.case OP_Not
24420 46 6f 75 6e 64 3a 20 20 20 20 20 20 20 2f 2a 20  Found:       /* 
24430 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
24440 65 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b 20 20 20  e OP_Found: {   
24450 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
24460 33 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 72 65 61  3 */.  int alrea
24470 64 79 45 78 69 73 74 73 3b 0a 20 20 69 6e 74 20  dyExists;.  int 
24480 74 61 6b 65 4a 75 6d 70 3b 0a 20 20 69 6e 74 20  takeJump;.  int 
24490 69 69 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  ii;.  VdbeCursor
244a0 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b   *pC;.  int res;
244b0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
244c0 64 20 2a 70 46 72 65 65 3b 0a 20 20 55 6e 70 61  d *pFree;.  Unpa
244d0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
244e0 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  Key;.  UnpackedR
244f0 65 63 6f 72 64 20 72 3b 0a 0a 23 69 66 64 65 66  ecord r;..#ifdef
24500 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
24510 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  f( pOp->opcode!=
24520 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 20  OP_NoConflict ) 
24530 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f  sqlite3_found_co
24540 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
24550 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
24560 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
24570 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
24580 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
24590 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
245a0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
245b0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
245c0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 23 69 66  rt( pC!=0 );.#if
245d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
245e0 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20  .  pC->seekOp = 
245f0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e  pOp->opcode;.#en
24600 64 69 66 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d  dif.  pIn3 = &aM
24610 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
24620 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
24630 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
24640 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EE );.  assert( 
24650 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  pC->uc.pCursor!=
24660 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
24670 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b  C->isTable==0 );
24680 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69  .  if( pOp->p4.i
24690 3e 30 20 29 7b 0a 20 20 20 20 72 2e 70 4b 65 79  >0 ){.    r.pKey
246a0 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
246b0 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c  nfo;.    r.nFiel
246c0 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34  d = (u16)pOp->p4
246d0 2e 69 3b 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d  .i;.    r.aMem =
246e0 20 70 49 6e 33 3b 0a 23 69 66 64 65 66 20 53 51   pIn3;.#ifdef SQ
246f0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66  LITE_DEBUG.    f
24700 6f 72 28 69 69 3d 30 3b 20 69 69 3c 72 2e 6e 46  or(ii=0; ii<r.nF
24710 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  ield; ii++){.   
24720 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
24730 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 69  Valid(&r.aMem[ii
24740 5d 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ]) );.      asse
24750 72 74 28 20 28 72 2e 61 4d 65 6d 5b 69 69 5d 2e  rt( (r.aMem[ii].
24760 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
24770 29 3d 3d 30 20 7c 7c 20 72 2e 61 4d 65 6d 5b 69  )==0 || r.aMem[i
24780 69 5d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  i].n==0 );.     
24790 20 69 66 28 20 69 69 20 29 20 52 45 47 49 53 54   if( ii ) REGIST
247a0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
247b0 2b 69 69 2c 20 26 72 2e 61 4d 65 6d 5b 69 69 5d  +ii, &r.aMem[ii]
247c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
247d0 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 26 72      pIdxKey = &r
247e0 3b 0a 20 20 20 20 70 46 72 65 65 20 3d 20 30 3b  ;.    pFree = 0;
247f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
24800 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67  sert( pIn3->flag
24810 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
24820 20 20 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42      rc = ExpandB
24830 6c 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 61  lob(pIn3);.    a
24840 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
24850 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
24860 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
24870 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6e 6f  if( rc ) goto no
24880 5f 6d 65 6d 3b 0a 20 20 20 20 70 46 72 65 65 20  _mem;.    pFree 
24890 3d 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69  = pIdxKey = sqli
248a0 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
248b0 63 6b 65 64 52 65 63 6f 72 64 28 70 43 2d 3e 70  ckedRecord(pC->p
248c0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  KeyInfo);.    if
248d0 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 67  ( pIdxKey==0 ) g
248e0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
248f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
24900 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79  dUnpack(pC->pKey
24910 49 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70  Info, pIn3->n, p
24920 49 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b 65 79 29  In3->z, pIdxKey)
24930 3b 0a 20 20 7d 0a 20 20 70 49 64 78 4b 65 79 2d  ;.  }.  pIdxKey-
24940 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
24950 0a 20 20 74 61 6b 65 4a 75 6d 70 20 3d 20 30 3b  .  takeJump = 0;
24960 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
24970 64 65 3d 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63  de==OP_NoConflic
24980 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20  t ){.    /* For 
24990 74 68 65 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63  the OP_NoConflic
249a0 74 20 6f 70 63 6f 64 65 2c 20 74 61 6b 65 20 74  t opcode, take t
249b0 68 65 20 6a 75 6d 70 20 69 66 20 61 6e 79 20 6f  he jump if any o
249c0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 70  f the.    ** inp
249d0 75 74 20 66 69 65 6c 64 73 20 61 72 65 20 4e 55  ut fields are NU
249e0 4c 4c 2c 20 73 69 6e 63 65 20 61 6e 79 20 6b 65  LL, since any ke
249f0 79 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 77 69  y with a NULL wi
24a00 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 6f  ll not.    ** co
24a10 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 66 6f  nflict */.    fo
24a20 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78 4b  r(ii=0; ii<pIdxK
24a30 65 79 2d 3e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b  ey->nField; ii++
24a40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ){.      if( pId
24a50 78 4b 65 79 2d 3e 61 4d 65 6d 5b 69 69 5d 2e 66  xKey->aMem[ii].f
24a60 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
24a70 29 7b 0a 20 20 20 20 20 20 20 20 74 61 6b 65 4a  ){.        takeJ
24a80 75 6d 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ump = 1;.       
24a90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
24aa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
24ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
24ac0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e  etoUnpacked(pC->
24ad0 75 63 2e 70 43 75 72 73 6f 72 2c 20 70 49 64 78  uc.pCursor, pIdx
24ae0 4b 65 79 2c 20 30 2c 20 30 2c 20 26 72 65 73 29  Key, 0, 0, &res)
24af0 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 20  ;.  if( pFree ) 
24b00 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
24b10 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 69 66  db, pFree);.  if
24b20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24b30 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  ){.    goto abor
24b40 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
24b50 20 20 7d 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65    }.  pC->seekRe
24b60 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20 61 6c  sult = res;.  al
24b70 72 65 61 64 79 45 78 69 73 74 73 20 3d 20 28 72  readyExists = (r
24b80 65 73 3d 3d 30 29 3b 0a 20 20 70 43 2d 3e 6e 75  es==0);.  pC->nu
24b90 6c 6c 52 6f 77 20 3d 20 31 2d 61 6c 72 65 61 64  llRow = 1-alread
24ba0 79 45 78 69 73 74 73 3b 0a 20 20 70 43 2d 3e 64  yExists;.  pC->d
24bb0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
24bc0 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
24bd0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
24be0 4c 45 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  LE;.  if( pOp->o
24bf0 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20  pcode==OP_Found 
24c00 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  ){.    VdbeBranc
24c10 68 54 61 6b 65 6e 28 61 6c 72 65 61 64 79 45 78  hTaken(alreadyEx
24c20 69 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20  ists!=0,2);.    
24c30 69 66 28 20 61 6c 72 65 61 64 79 45 78 69 73 74  if( alreadyExist
24c40 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  s ) goto jump_to
24c50 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _p2;.  }else{.  
24c60 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
24c70 6e 28 74 61 6b 65 4a 75 6d 70 7c 7c 61 6c 72 65  n(takeJump||alre
24c80 61 64 79 45 78 69 73 74 73 3d 3d 30 2c 32 29 3b  adyExists==0,2);
24c90 0a 20 20 20 20 69 66 28 20 74 61 6b 65 4a 75 6d  .    if( takeJum
24ca0 70 20 7c 7c 20 21 61 6c 72 65 61 64 79 45 78 69  p || !alreadyExi
24cb0 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  sts ) goto jump_
24cc0 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  to_p2;.  }.  bre
24cd0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
24ce0 3a 20 53 65 65 6b 52 6f 77 69 64 20 50 31 20 50  : SeekRowid P1 P
24cf0 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
24d00 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50  psis: intkey=r[P
24d10 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74  3].**.** P1 is t
24d20 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 75  he index of a cu
24d30 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61 6e 20  rsor open on an 
24d40 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65 65 20  SQL table btree 
24d50 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a 2a 2a  (with integer.**
24d60 20 6b 65 79 73 29 2e 20 20 49 66 20 72 65 67 69   keys).  If regi
24d70 73 74 65 72 20 50 33 20 64 6f 65 73 20 6e 6f 74  ster P3 does not
24d80 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
24d90 67 65 72 20 6f 72 20 69 66 20 50 31 20 64 6f 65  ger or if P1 doe
24da0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  s not.** contain
24db0 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 72   a record with r
24dc0 6f 77 69 64 20 50 33 20 74 68 65 6e 20 6a 75 6d  owid P3 then jum
24dd0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
24de0 20 50 32 2e 20 20 0a 2a 2a 20 4f 72 2c 20 69 66   P2.  .** Or, if
24df0 20 50 32 20 69 73 20 30 2c 20 72 61 69 73 65 20   P2 is 0, raise 
24e00 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
24e10 54 20 65 72 72 6f 72 2e 20 49 66 20 50 31 20 64  T error. If P1 d
24e20 6f 65 73 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61  oes contain.** a
24e30 20 72 65 63 6f 72 64 20 77 69 74 68 20 72 6f 77   record with row
24e40 69 64 20 50 33 20 74 68 65 6e 20 0a 2a 2a 20 6c  id P3 then .** l
24e50 65 61 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  eave the cursor 
24e60 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 61 74  pointing at that
24e70 20 72 65 63 6f 72 64 20 61 6e 64 20 66 61 6c 6c   record and fall
24e80 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
24e90 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74  next.** instruct
24ea0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ion..**.** The O
24eb0 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70 63 6f  P_NotExists opco
24ec0 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  de performs the 
24ed0 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  same operation, 
24ee0 62 75 74 20 77 69 74 68 20 4f 50 5f 4e 6f 74 45  but with OP_NotE
24ef0 78 69 73 74 73 0a 2a 2a 20 74 68 65 20 50 33 20  xists.** the P3 
24f00 72 65 67 69 73 74 65 72 20 6d 75 73 74 20 62 65  register must be
24f10 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 63   guaranteed to c
24f20 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
24f30 72 20 76 61 6c 75 65 2e 20 20 57 69 74 68 20 74  r value.  With t
24f40 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 2c 20 72  his.** opcode, r
24f50 65 67 69 73 74 65 72 20 50 33 20 6d 69 67 68 74  egister P3 might
24f60 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
24f70 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  integer..**.** T
24f80 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f  he OP_NotFound o
24f90 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74  pcode performs t
24fa0 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f  he same operatio
24fb0 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65 65  n on index btree
24fc0 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69 74  s.** (with arbit
24fd0 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75 65  rary multi-value
24fe0 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68   keys)..**.** Th
24ff0 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
25000 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61   the cursor in a
25010 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
25020 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e 63  cannot be advanc
25030 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72 20  ed.** in either 
25040 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f  direction.  In o
25050 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
25060 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f 70  Next and Prev op
25070 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  codes will.** no
25080 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67  t work following
25090 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a   this opcode..**
250a0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
250b0 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e  und, NotFound, N
250c0 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b 52  oConflict, SeekR
250d0 6f 77 69 64 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  owid.*/./* Opcod
250e0 65 3a 20 4e 6f 74 45 78 69 73 74 73 20 50 31 20  e: NotExists P1 
250f0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
25100 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b  opsis: intkey=r[
25110 50 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  P3].**.** P1 is 
25120 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
25130 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61 6e  ursor open on an
25140 20 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65 65   SQL table btree
25150 20 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a 2a   (with integer.*
25160 2a 20 6b 65 79 73 29 2e 20 20 50 33 20 69 73 20  * keys).  P3 is 
25170 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64  an integer rowid
25180 2e 20 20 49 66 20 50 31 20 64 6f 65 73 20 6e 6f  .  If P1 does no
25190 74 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f  t contain a reco
251a0 72 64 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  rd with.** rowid
251b0 20 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d   P3 then jump im
251c0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
251d0 20 20 4f 72 2c 20 69 66 20 50 32 20 69 73 20 30    Or, if P2 is 0
251e0 2c 20 72 61 69 73 65 20 61 6e 0a 2a 2a 20 53 51  , raise an.** SQ
251f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
25200 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20 63  or. If P1 does c
25210 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20  ontain a record 
25220 77 69 74 68 20 72 6f 77 69 64 20 50 33 20 74 68  with rowid P3 th
25230 65 6e 20 0a 2a 2a 20 6c 65 61 76 65 20 74 68 65  en .** leave the
25240 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
25250 20 61 74 20 74 68 61 74 20 72 65 63 6f 72 64 20   at that record 
25260 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  and fall through
25270 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   to the next.** 
25280 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
25290 2a 2a 20 54 68 65 20 4f 50 5f 53 65 65 6b 52 6f  ** The OP_SeekRo
252a0 77 69 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  wid opcode perfo
252b0 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65  rms the same ope
252c0 72 61 74 69 6f 6e 20 62 75 74 20 61 6c 73 6f 20  ration but also 
252d0 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 50 33  allows the.** P3
252e0 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e   register to con
252f0 74 61 69 6e 20 61 20 6e 6f 6e 2d 69 6e 74 65 67  tain a non-integ
25300 65 72 20 76 61 6c 75 65 2c 20 69 6e 20 77 68 69  er value, in whi
25310 63 68 20 63 61 73 65 20 74 68 65 20 6a 75 6d 70  ch case the jump
25320 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74 61   is.** always ta
25330 6b 65 6e 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ken.  This opcod
25340 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
25350 50 33 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69  P3 always contai
25360 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  n an integer..**
25370 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 46 6f  .** The OP_NotFo
25380 75 6e 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  und opcode perfo
25390 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65  rms the same ope
253a0 72 61 74 69 6f 6e 20 6f 6e 20 69 6e 64 65 78 20  ration on index 
253b0 62 74 72 65 65 73 0a 2a 2a 20 28 77 69 74 68 20  btrees.** (with 
253c0 61 72 62 69 74 72 61 72 79 20 6d 75 6c 74 69 2d  arbitrary multi-
253d0 76 61 6c 75 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a  value keys)..**.
253e0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
253f0 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
25400 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
25410 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 61  e it cannot be a
25420 64 76 61 6e 63 65 64 0a 2a 2a 20 69 6e 20 65 69  dvanced.** in ei
25430 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20  ther direction. 
25440 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
25450 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72   the Next and Pr
25460 65 76 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c 0a  ev opcodes will.
25470 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c  ** not work foll
25480 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64  owing this opcod
25490 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
254a0 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
254b0 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20  nd, NoConflict, 
254c0 53 65 65 6b 52 6f 77 69 64 0a 2a 2f 0a 63 61 73  SeekRowid.*/.cas
254d0 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 3a 20  e OP_SeekRowid: 
254e0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
254f0 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64 62 65 43  , in3 */.  VdbeC
25500 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
25510 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
25520 69 6e 74 20 72 65 73 3b 0a 20 20 75 36 34 20 69  int res;.  u64 i
25530 4b 65 79 3b 0a 0a 20 20 70 49 6e 33 20 3d 20 26  Key;..  pIn3 = &
25540 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
25550 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 33 2d   testcase( pIn3-
25560 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
25570 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25580 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
25590 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 69  M_IntReal );.  i
255a0 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
255b0 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49  & (MEM_Int|MEM_I
255c0 6e 74 52 65 61 6c 29 29 3d 3d 30 20 29 7b 0a 20  ntReal))==0 ){. 
255d0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
255e0 70 49 6e 33 2d 3e 75 2e 69 20 63 6f 6e 74 61 69  pIn3->u.i contai
255f0 6e 73 20 61 20 76 61 6c 69 64 20 69 6e 74 65 67  ns a valid integ
25600 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
25610 6e 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n of.    ** the 
25620 6b 65 79 20 76 61 6c 75 65 2c 20 62 75 74 20 64  key value, but d
25630 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
25640 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68 65   datatype of the
25650 20 72 65 67 69 73 74 65 72 2c 20 61 73 0a 20 20   register, as.  
25660 20 20 2a 2a 20 6f 74 68 65 72 20 70 61 72 74 73    ** other parts
25670 20 6f 66 20 74 68 65 20 70 65 72 70 61 72 65 64   of the perpared
25680 20 73 74 61 74 65 6d 65 6e 74 20 6d 69 67 68 74   statement might
25690 20 62 65 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   be depending on
256a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
256b0 65 6e 74 20 64 61 74 61 74 79 70 65 2e 20 2a 2f  ent datatype. */
256c0 0a 20 20 20 20 75 31 36 20 6f 72 69 67 46 6c 61  .    u16 origFla
256d0 67 73 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73  gs = pIn3->flags
256e0 3b 0a 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 49  ;.    int isNotI
256f0 6e 74 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66  nt;.    applyAff
25700 69 6e 69 74 79 28 70 49 6e 33 2c 20 53 51 4c 49  inity(pIn3, SQLI
25710 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20  TE_AFF_NUMERIC, 
25720 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 69  encoding);.    i
25730 73 4e 6f 74 49 6e 74 20 3d 20 28 70 49 6e 33 2d  sNotInt = (pIn3-
25740 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
25750 29 3d 3d 30 3b 0a 20 20 20 20 70 49 6e 33 2d 3e  )==0;.    pIn3->
25760 66 6c 61 67 73 20 3d 20 6f 72 69 67 46 6c 61 67  flags = origFlag
25770 73 3b 0a 20 20 20 20 69 66 28 20 69 73 4e 6f 74  s;.    if( isNot
25780 49 6e 74 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  Int ) goto jump_
25790 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 2f 2a 20  to_p2;.  }.  /* 
257a0 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
257b0 6f 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 2a  o OP_NotExists *
257c0 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 45 78 69  /.case OP_NotExi
257d0 73 74 73 3a 20 20 20 20 20 20 20 20 20 20 2f 2a  sts:          /*
257e0 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20   jump, in3 */.  
257f0 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
25800 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
25810 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
25820 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 7c 7c 20 70  MEM_Int)!=0 || p
25830 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
25840 65 65 6b 52 6f 77 69 64 20 29 3b 0a 20 20 61 73  eekRowid );.  as
25850 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
25860 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
25870 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
25880 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
25890 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
258a0 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !=0 );.#ifdef SQ
258b0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
258c0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
258d0 5f 53 65 65 6b 52 6f 77 69 64 20 29 20 70 43 2d  _SeekRowid ) pC-
258e0 3e 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 53 65 65  >seekOp = OP_See
258f0 6b 52 6f 77 69 64 3b 0a 23 65 6e 64 69 66 0a 20  kRowid;.#endif. 
25900 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54   assert( pC->isT
25910 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
25920 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
25930 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
25940 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75  .  pCrsr = pC->u
25950 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73  c.pCursor;.  ass
25960 65 72 74 28 20 70 43 72 73 72 21 3d 30 20 29 3b  ert( pCrsr!=0 );
25970 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 4b  .  res = 0;.  iK
25980 65 79 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a  ey = pIn3->u.i;.
25990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
259a0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
259b0 64 28 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79  d(pCrsr, 0, iKey
259c0 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 61 73  , 0, &res);.  as
259d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
259e0 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 3b  _OK || res==0 );
259f0 0a 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72  .  pC->movetoTar
25a00 67 65 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20  get = iKey;  /* 
25a10 55 73 65 64 20 62 79 20 4f 50 5f 44 65 6c 65 74  Used by OP_Delet
25a20 65 20 2a 2f 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  e */.  pC->nullR
25a30 6f 77 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61  ow = 0;.  pC->ca
25a40 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
25a50 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 64  E_STALE;.  pC->d
25a60 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
25a70 30 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  0;.  VdbeBranchT
25a80 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a  aken(res!=0,2);.
25a90 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74    pC->seekResult
25aa0 20 3d 20 72 65 73 3b 0a 20 20 69 66 28 20 72 65   = res;.  if( re
25ab0 73 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  s!=0 ){.    asse
25ac0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
25ad0 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  K );.    if( pOp
25ae0 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->p2==0 ){.     
25af0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25b00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
25b10 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f  else{.      goto
25b20 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
25b30 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20   }.  }.  if( rc 
25b40 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
25b50 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
25b60 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
25b70 3a 20 53 65 71 75 65 6e 63 65 20 50 31 20 50 32  : Sequence P1 P2
25b80 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
25b90 69 73 3a 20 72 5b 50 32 5d 3d 63 75 72 73 6f 72  is: r[P2]=cursor
25ba0 5b 50 31 5d 2e 63 74 72 2b 2b 0a 2a 2a 0a 2a 2a  [P1].ctr++.**.**
25bb0 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 61   Find the next a
25bc0 76 61 69 6c 61 62 6c 65 20 73 65 71 75 65 6e 63  vailable sequenc
25bd0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72  e number for cur
25be0 73 6f 72 20 50 31 2e 0a 2a 2a 20 57 72 69 74 65  sor P1..** Write
25bf0 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75   the sequence nu
25c00 6d 62 65 72 20 69 6e 74 6f 20 72 65 67 69 73 74  mber into regist
25c10 65 72 20 50 32 2e 0a 2a 2a 20 54 68 65 20 73 65  er P2..** The se
25c20 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f 6e  quence number on
25c30 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
25c40 6e 63 72 65 6d 65 6e 74 65 64 20 61 66 74 65 72  ncremented after
25c50 20 74 68 69 73 0a 2a 2a 20 69 6e 73 74 72 75 63   this.** instruc
25c60 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 63 61 73 65 20  tion.  .*/.case 
25c70 4f 50 5f 53 65 71 75 65 6e 63 65 3a 20 7b 20 20  OP_Sequence: {  
25c80 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
25c90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
25ca0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
25cb0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
25cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
25cd0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d 30  pCsr[pOp->p1]!=0
25ce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
25cf0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d  >apCsr[pOp->p1]-
25d00 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
25d10 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 70 4f 75  PE_VTAB );.  pOu
25d20 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
25d30 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f  se(p, pOp);.  pO
25d40 75 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43  ut->u.i = p->apC
25d50 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71  sr[pOp->p1]->seq
25d60 43 6f 75 6e 74 2b 2b 3b 0a 20 20 62 72 65 61 6b  Count++;.  break
25d70 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.}.../* Opcode:
25d80 20 4e 65 77 52 6f 77 69 64 20 50 31 20 50 32 20   NewRowid P1 P2 
25d90 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
25da0 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a  is: r[P2]=rowid.
25db0 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77 20  **.** Get a new 
25dc0 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e  integer record n
25dd0 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22 72 6f  umber (a.k.a "ro
25de0 77 69 64 22 29 20 75 73 65 64 20 61 73 20 74 68  wid") used as th
25df0 65 20 6b 65 79 20 74 6f 20 61 20 74 61 62 6c 65  e key to a table
25e00 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20  ..** The record 
25e10 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 70 72  number is not pr
25e20 65 76 69 6f 75 73 6c 79 20 75 73 65 64 20 61 73  eviously used as
25e30 20 61 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61   a key in the da
25e40 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
25e50 74 68 61 74 20 63 75 72 73 6f 72 20 50 31 20 70  that cursor P1 p
25e60 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 65 20 6e  oints to.  The n
25e70 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  ew record number
25e80 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 77   is written.** w
25e90 72 69 74 74 65 6e 20 74 6f 20 72 65 67 69 73 74  ritten to regist
25ea0 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P2..**.** If 
25eb0 50 33 3e 30 20 74 68 65 6e 20 50 33 20 69 73 20  P3>0 then P3 is 
25ec0 61 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  a register in th
25ed0 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20  e root frame of 
25ee0 74 68 69 73 20 56 44 42 45 20 74 68 61 74 20 68  this VDBE that h
25ef0 6f 6c 64 73 20 0a 2a 2a 20 74 68 65 20 6c 61 72  olds .** the lar
25f00 67 65 73 74 20 70 72 65 76 69 6f 75 73 6c 79 20  gest previously 
25f10 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64  generated record
25f20 20 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e 65 77 20   number. No new 
25f30 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20 61  record numbers a
25f40 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f  re.** allowed to
25f50 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68   be less than th
25f60 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 20 74  is value. When t
25f70 68 69 73 20 76 61 6c 75 65 20 72 65 61 63 68 65  his value reache
25f80 73 20 69 74 73 20 6d 61 78 69 6d 75 6d 2c 20 0a  s its maximum, .
25f90 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c  ** an SQLITE_FUL
25fa0 4c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65 72  L error is gener
25fb0 61 74 65 64 2e 20 54 68 65 20 50 33 20 72 65 67  ated. The P3 reg
25fc0 69 73 74 65 72 20 69 73 20 75 70 64 61 74 65 64  ister is updated
25fd0 20 77 69 74 68 20 74 68 65 20 27 0a 2a 2a 20 67   with the '.** g
25fe0 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64 20  enerated record 
25ff0 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 50 33 20  number. This P3 
26000 6d 65 63 68 61 6e 69 73 6d 20 69 73 20 75 73 65  mechanism is use
26010 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d  d to help implem
26020 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54 4f 49  ent the.** AUTOI
26030 4e 43 52 45 4d 45 4e 54 20 66 65 61 74 75 72 65  NCREMENT feature
26040 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 77  ..*/.case OP_New
26050 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20  Rowid: {        
26060 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
26070 69 36 34 20 76 3b 20 20 20 20 20 20 20 20 20 20  i64 v;          
26080 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
26090 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62  w rowid */.  Vdb
260a0 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20  eCursor *pC;    
260b0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
260c0 20 74 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68   table to get th
260d0 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20  e new rowid */. 
260e0 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
260f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
26100 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 42  t of an sqlite3B
26110 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20  treeLast() */.  
26120 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
26130 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
26140 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  r to limit the n
26150 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 65  umber of searche
26160 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  s */.  Mem *pMem
26170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26180 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
26190 67 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20  g largest rowid 
261a0 66 6f 72 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  for AUTOINCREMEN
261b0 54 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65  T */.  VdbeFrame
261c0 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a   *pFrame;     /*
261d0 20 52 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 56   Root frame of V
261e0 44 42 45 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b  DBE */..  v = 0;
261f0 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 70 4f  .  res = 0;.  pO
26200 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
26210 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61  ase(p, pOp);.  a
26220 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
26230 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
26240 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
26250 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
26260 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
26270 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
26280 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b  ( pC->isTable );
26290 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
262a0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
262b0 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65  _BTREE );.  asse
262c0 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  rt( pC->uc.pCurs
262d0 6f 72 21 3d 30 20 29 3b 0a 20 20 7b 0a 20 20 20  or!=0 );.  {.   
262e0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77   /* The next row
262f0 69 64 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d  id or record num
26300 62 65 72 20 28 64 69 66 66 65 72 65 6e 74 20 74  ber (different t
26310 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d  erms for the sam
26320 65 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20  e.    ** thing) 
26330 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61  is obtained in a
26340 20 74 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69   two-step algori
26350 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  thm..    **.    
26360 2a 2a 20 46 69 72 73 74 20 77 65 20 61 74 74 65  ** First we atte
26370 6d 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20  mpt to find the 
26380 6c 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67  largest existing
26390 20 72 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f   rowid and add o
263a0 6e 65 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61  ne.    ** to tha
263b0 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6c  t.  But if the l
263c0 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20  argest existing 
263d0 72 6f 77 69 64 20 69 73 20 61 6c 72 65 61 64 79  rowid is already
263e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20   the maximum.   
263f0 20 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74   ** positive int
26400 65 67 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f  eger, we have to
26410 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
26420 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
26430 2a 2a 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63  ** probabilistic
26440 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a   algorithm.    *
26450 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
26460 6f 6e 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ond algorithm is
26470 20 74 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77   to select a row
26480 69 64 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64  id at random and
26490 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69   see if.    ** i
264a0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
264b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
264c0 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  If it does not e
264d0 78 69 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20  xist, we have.  
264e0 20 20 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20    ** succeeded. 
264f0 20 49 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72   If the random r
26500 6f 77 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c  owid does exist,
26510 20 77 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77   we select a new
26520 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20   one.    ** and 
26530 74 72 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f  try again, up to
26540 20 31 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20   100 times..    
26550 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
26560 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23  C->isTable );..#
26570 69 66 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42  ifdef SQLITE_32B
26580 49 54 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66  IT_ROWID.#   def
26590 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78  ine MAX_ROWID 0x
265a0 37 66 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20  7fffffff.#else. 
265b0 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69     /* Some compi
265c0 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62  lers complain ab
265d0 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66  out constants of
265e0 20 74 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66   the form 0x7fff
265f0 66 66 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20  ffffffffffff..  
26600 20 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70    ** Others comp
26610 6c 61 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66  lain about 0x7ff
26620 66 66 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c  ffffffffffffffLL
26630 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
26640 20 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20   macro seems.   
26650 20 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74   ** to provide t
26660 68 65 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c  he constant whil
26670 65 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d  e making all com
26680 70 69 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20  pilers happy..  
26690 20 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20    */.#   define 
266a0 4d 41 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29  MAX_ROWID  (i64)
266b0 28 20 28 28 28 75 36 34 29 30 78 37 66 66 66 66  ( (((u64)0x7ffff
266c0 66 66 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34  fff)<<32) | (u64
266d0 29 30 78 66 66 66 66 66 66 66 66 20 29 0a 23 65  )0xffffffff ).#e
266e0 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70  ndif..    if( !p
266f0 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69  C->useRandomRowi
26700 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
26710 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
26720 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
26730 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
26740 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26750 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
26760 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
26770 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
26780 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
26790 20 20 20 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a       v = 1;   /*
267a0 20 49 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34 38   IMP: R-61914-48
267b0 30 37 34 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  074 */.      }el
267c0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
267d0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
267e0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
267f0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b  ->uc.pCursor) );
26800 0a 20 20 20 20 20 20 20 20 76 20 3d 20 73 71 6c  .        v = sql
26810 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
26820 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  Key(pC->uc.pCurs
26830 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  or);.        if(
26840 20 76 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b   v>=MAX_ROWID ){
26850 0a 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75  .          pC->u
26860 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20  seRandomRowid = 
26870 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
26880 7b 0a 20 20 20 20 20 20 20 20 20 20 76 2b 2b 3b  {.          v++;
26890 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 39 35     /* IMP: R-295
268a0 33 38 2d 33 34 39 38 37 20 2a 2f 0a 20 20 20 20  38-34987 */.    
268b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
268c0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
268d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
268e0 52 45 4d 45 4e 54 0a 20 20 20 20 69 66 28 20 70  REMENT.    if( p
268f0 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20 20  Op->p3 ){.      
26900 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50  /* Assert that P
26910 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d  3 is a valid mem
26920 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  ory cell. */.   
26930 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
26940 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66  p3>0 );.      if
26950 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
26960 20 20 20 20 20 20 20 66 6f 72 28 70 46 72 61 6d         for(pFram
26970 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
26980 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
26990 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
269a0 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 2f  rent);.        /
269b0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33  * Assert that P3
269c0 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f   is a valid memo
269d0 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  ry cell. */.    
269e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
269f0 3e 70 33 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65  >p3<=pFrame->nMe
26a00 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  m );.        pMe
26a10 6d 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65  m = &pFrame->aMe
26a20 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20  m[pOp->p3];.    
26a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26a40 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
26a50 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65  P3 is a valid me
26a60 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20  mory cell. */.  
26a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
26a80 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p3<=(p->nMem+
26a90 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
26aa0 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  );.        pMem 
26ab0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
26ac0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f  ;.        memAbo
26ad0 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d  utToChange(p, pM
26ae0 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  em);.      }.   
26af0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
26b00 56 61 6c 69 64 28 70 4d 65 6d 29 20 29 3b 0a 0a  Valid(pMem) );..
26b10 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54        REGISTER_T
26b20 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d  RACE(pOp->p3, pM
26b30 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
26b40 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
26b50 69 66 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20  ify(pMem);.     
26b60 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e   assert( (pMem->
26b70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
26b80 21 3d 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50  !=0 );  /* mem(P
26b90 33 29 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65  3) holds an inte
26ba0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ger */.      if(
26bb0 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f   pMem->u.i==MAX_
26bc0 52 4f 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65  ROWID || pC->use
26bd0 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20  RandomRowid ){. 
26be0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26bf0 54 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d  TE_FULL;   /* IM
26c00 50 3a 20 52 2d 31 37 38 31 37 2d 30 30 36 33 30  P: R-17817-00630
26c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
26c20 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
26c30 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
26c40 20 20 20 69 66 28 20 76 3c 70 4d 65 6d 2d 3e 75     if( v<pMem->u
26c50 2e 69 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20  .i+1 ){.        
26c60 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20  v = pMem->u.i + 
26c70 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
26c80 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a   pMem->u.i = v;.
26c90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
26ca0 20 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64   if( pC->useRand
26cb0 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  omRowid ){.     
26cc0 20 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   /* IMPLEMENTATI
26cd0 4f 4e 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34  ON-OF: R-07677-4
26ce0 31 38 38 31 20 49 66 20 74 68 65 20 6c 61 72 67  1881 If the larg
26cf0 65 73 74 20 52 4f 57 49 44 20 69 73 20 65 71 75  est ROWID is equ
26d00 61 6c 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  al to the.      
26d10 2a 2a 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69  ** largest possi
26d20 62 6c 65 20 69 6e 74 65 67 65 72 20 28 39 32 32  ble integer (922
26d30 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
26d40 29 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  ) then the datab
26d50 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67  ase.      ** eng
26d60 69 6e 65 20 73 74 61 72 74 73 20 70 69 63 6b 69  ine starts picki
26d70 6e 67 20 70 6f 73 69 74 69 76 65 20 63 61 6e 64  ng positive cand
26d80 69 64 61 74 65 20 52 4f 57 49 44 73 20 61 74 20  idate ROWIDs at 
26d90 72 61 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20  random until.   
26da0 20 20 20 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f     ** it finds o
26db0 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70  ne that is not p
26dc0 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 2e 20  reviously used. 
26dd0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
26de0 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20   pOp->p3==0 );  
26df0 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 62 65 20  /* We cannot be 
26e00 69 6e 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20  in random rowid 
26e10 6d 6f 64 65 20 69 66 20 74 68 69 73 20 69 73 0a  mode if this is.
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
26e40 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  an AUTOINCREMENT
26e50 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20   table. */.     
26e60 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
26e70 64 6f 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  do{.        sqli
26e80 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
26e90 69 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20  izeof(v), &v);. 
26ea0 20 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58         v &= (MAX
26eb0 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b  _ROWID>>1); v++;
26ec0 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74    /* Ensure that
26ed0 20 76 20 69 73 20 67 72 65 61 74 65 72 20 74 68   v is greater th
26ee0 61 6e 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20  an zero */.     
26ef0 20 7d 77 68 69 6c 65 28 20 20 28 28 72 63 20 3d   }while(  ((rc =
26f00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
26f10 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e  etoUnpacked(pC->
26f20 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  uc.pCursor, 0, (
26f30 75 36 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20  u64)v,.         
26f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 20 20 20 20 20 20 20 20 30 2c 20 26 72 65 73 29          0, &res)
26f70 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20  )==SQLITE_OK).  
26f80 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 65            && (re
26f90 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  s==0).          
26fa0 20 20 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29    && (++cnt<100)
26fb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
26fc0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
26fd0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
26fe0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
26ff0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27000 54 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d  TE_FULL;   /* IM
27010 50 3a 20 52 2d 33 38 32 31 39 2d 35 33 30 30 32  P: R-38219-53002
27020 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
27030 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
27040 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
27050 20 20 20 61 73 73 65 72 74 28 20 76 3e 30 20 29     assert( v>0 )
27060 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31  ;  /* EV: R-4081
27070 32 2d 30 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d  2-03570 */.    }
27080 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
27090 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
270a0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
270b0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
270c0 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20    }.  pOut->u.i 
270d0 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = v;.  break;.}.
270e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65  ./* Opcode: Inse
270f0 72 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50  rt P1 P2 P3 P4 P
27100 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  5.** Synopsis: i
27110 6e 74 6b 65 79 3d 72 5b 50 33 5d 20 64 61 74 61  ntkey=r[P3] data
27120 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 57 72 69  =r[P2].**.** Wri
27130 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
27140 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75   the table of cu
27150 72 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20  rsor P1.  A new 
27160 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61  entry is.** crea
27170 74 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ted if it doesn'
27180 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20  t already exist 
27190 6f 72 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  or the data for 
271a0 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65  an existing.** e
271b0 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74  ntry is overwrit
271c0 74 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69  ten.  The data i
271d0 73 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f  s the value MEM_
271e0 42 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 72  Blob stored in r
271f0 65 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65  egister.** numbe
27200 72 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69 73  r P2. The key is
27210 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
27220 74 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79 20  ter P3. The key 
27230 6d 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d  must.** be a MEM
27240 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  _Int..**.** If t
27250 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  he OPFLAG_NCHANG
27260 45 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20  E flag of P5 is 
27270 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  set, then the ro
27280 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69  w change count i
27290 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64  s.** incremented
272a0 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29   (otherwise not)
272b0 2e 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  .  If the OPFLAG
272c0 5f 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67 20  _LASTROWID flag 
272d0 6f 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a  of P5 is set,.**
272e0 20 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20 73   then rowid is s
272f0 74 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65 71  tored for subseq
27300 75 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20 74  uent return by t
27310 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61  he.** sqlite3_la
27320 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
27330 29 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65  ) function (othe
27340 72 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d 6f  rwise it is unmo
27350 64 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49  dified)..**.** I
27360 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45  f the OPFLAG_USE
27370 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20  SEEKRESULT flag 
27380 6f 66 20 50 35 20 69 73 20 73 65 74 2c 20 74 68  of P5 is set, th
27390 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
273a0 20 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61   might.** run fa
273b0 73 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e 67  ster by avoiding
273c0 20 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20   an unnecessary 
273d0 73 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50  seek on cursor P
273e0 31 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  1.  However,.** 
273f0 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  the OPFLAG_USESE
27400 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d 75  EKRESULT flag mu
27410 73 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69  st only be set i
27420 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  f there have bee
27430 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65  n no prior.** se
27440 65 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73 6f  eks on the curso
27450 72 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73 74  r or if the most
27460 20 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73 65   recent seek use
27470 64 20 61 20 6b 65 79 20 65 71 75 61 6c 20 74 6f  d a key equal to
27480 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P3..**.** If th
27490 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  e OPFLAG_ISUPDAT
274a0 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
274b0 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20  hen this opcode 
274c0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a  is part of an.**
274d0 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
274e0 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 28 69  n.  Otherwise (i
274f0 66 20 74 68 65 20 66 6c 61 67 20 69 73 20 63 6c  f the flag is cl
27500 65 61 72 29 20 74 68 65 6e 20 74 68 69 73 20 6f  ear) then this o
27510 70 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72 74  pcode.** is part
27520 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 6f 70   of an INSERT op
27530 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 69  eration.  The di
27540 66 66 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79  fference is only
27550 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a   important to.**
27560 20 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b   the update hook
27570 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
27580 72 20 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74  r P4 may point t
27590 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
275a0 75 72 65 2c 20 6f 72 20 6d 61 79 20 62 65 20 4e  ure, or may be N
275b0 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 0a 2a  ULL. If it is .*
275c0 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  * not NULL, then
275d0 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
275e0 20 28 73 71 6c 69 74 65 33 2e 78 55 70 64 61 74   (sqlite3.xUpdat
275f0 65 43 61 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e  eCallback) is in
27600 76 6f 6b 65 64 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  voked .** follow
27610 69 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c  ing a successful
27620 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28   insert..**.** (
27630 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66  WARNING/TODO: If
27640 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d   P1 is a pseudo-
27650 63 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73  cursor and P2 is
27660 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
27670 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20  allocated, then 
27680 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20  ownership of P2 
27690 69 73 20 74 72 61 6e 73 66 65 72 72 65 64 20 74  is transferred t
276a0 6f 20 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72  o the pseudo-cur
276b0 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73  sor.** and regis
276c0 74 65 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65  ter P2 becomes e
276d0 70 68 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68  phemeral.  If th
276e0 65 20 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e  e cursor is chan
276f0 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ged, the.** valu
27700 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32  e of register P2
27710 20 77 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67   will then chang
27720 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
27730 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63  is does not.** c
27740 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
27750 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  s.).**.** This i
27760 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20  nstruction only 
27770 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e  works on tables.
27780 20 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74    The equivalent
27790 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
277a0 66 6f 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f  for indices is O
277b0 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a  P_IdxInsert..*/.
277c0 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a 20  case OP_Insert: 
277d0 7b 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 3b 20  {.  Mem *pData; 
277e0 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65 6c        /* MEM cel
277f0 6c 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 66  l holding data f
27800 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  or the record to
27810 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   be inserted */.
27820 20 20 4d 65 6d 20 2a 70 4b 65 79 3b 20 20 20 20    Mem *pKey;    
27830 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20      /* MEM cell 
27840 68 6f 6c 64 69 6e 67 20 6b 65 79 20 20 66 6f 72  holding key  for
27850 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
27860 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
27870 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
27880 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
27890 20 69 6e 73 65 72 74 20 69 73 20 77 72 69 74 74   insert is writt
278a0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b  en */.  int seek
278b0 52 65 73 75 6c 74 3b 20 20 20 2f 2a 20 52 65 73  Result;   /* Res
278c0 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 65 65  ult of prior see
278d0 6b 20 6f 72 20 30 20 69 66 20 6e 6f 20 55 53 45  k or 0 if no USE
278e0 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20  SEEKRESULT flag 
278f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
27900 2a 7a 44 62 3b 20 20 2f 2a 20 64 61 74 61 62 61  *zDb;  /* databa
27910 73 65 20 6e 61 6d 65 20 2d 20 75 73 65 64 20 62  se name - used b
27920 79 20 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f  y the update hoo
27930 6b 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  k */.  Table *pT
27940 61 62 3b 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ab;      /* Tabl
27950 65 20 73 74 72 75 63 74 75 72 65 20 2d 20 75 73  e structure - us
27960 65 64 20 62 79 20 75 70 64 61 74 65 20 61 6e 64  ed by update and
27970 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
27980 73 20 2a 2f 0a 20 20 42 74 72 65 65 50 61 79 6c  s */.  BtreePayl
27990 6f 61 64 20 78 3b 20 20 20 2f 2a 20 50 61 79 6c  oad x;   /* Payl
279a0 6f 61 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74  oad to be insert
279b0 65 64 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20 3d  ed */..  pData =
279c0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
279d0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
279e0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
279f0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
27a00 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
27a10 6c 69 64 28 70 44 61 74 61 29 20 29 3b 0a 20 20  lid(pData) );.  
27a20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
27a30 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
27a40 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
27a50 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
27a60 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
27a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27a80 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
27a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4f  );.  assert( (pO
27aa0 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49  p->p5 & OPFLAG_I
27ab0 53 4e 4f 4f 50 29 20 7c 7c 20 70 43 2d 3e 69 73  SNOOP) || pC->is
27ac0 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
27ad0 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
27ae0 50 34 5f 54 41 42 4c 45 20 7c 7c 20 70 4f 70 2d  P4_TABLE || pOp-
27af0 3e 70 34 74 79 70 65 3e 3d 50 34 5f 53 54 41 54  >p4type>=P4_STAT
27b00 49 43 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52  IC );.  REGISTER
27b10 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
27b20 70 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  pData);.  sqlite
27b30 33 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f  3VdbeIncrWriteCo
27b40 75 6e 74 65 72 28 70 2c 20 70 43 29 3b 0a 0a 20  unter(p, pC);.. 
27b50 20 70 4b 65 79 20 3d 20 26 61 4d 65 6d 5b 70 4f   pKey = &aMem[pO
27b60 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74  p->p3];.  assert
27b70 28 20 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26 20  ( pKey->flags & 
27b80 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73  MEM_Int );.  ass
27b90 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
27ba0 70 4b 65 79 29 20 29 3b 0a 20 20 52 45 47 49 53  pKey) );.  REGIS
27bb0 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
27bc0 33 2c 20 70 4b 65 79 29 3b 0a 20 20 78 2e 6e 4b  3, pKey);.  x.nK
27bd0 65 79 20 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a  ey = pKey->u.i;.
27be0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79  .  if( pOp->p4ty
27bf0 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26 26 20  pe==P4_TABLE && 
27c00 48 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 28  HAS_UPDATE_HOOK(
27c10 64 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  db) ){.    asser
27c20 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b  t( pC->iDb>=0 );
27c30 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  .    zDb = db->a
27c40 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53  Db[pC->iDb].zDbS
27c50 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61 62 20 3d  Name;.    pTab =
27c60 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20   pOp->p4.pTab;. 
27c70 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 2d     assert( (pOp-
27c80 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e  >p5 & OPFLAG_ISN
27c90 4f 4f 50 29 20 7c 7c 20 48 61 73 52 6f 77 69 64  OOP) || HasRowid
27ca0 28 70 54 61 62 29 20 29 3b 0a 20 20 7d 65 6c 73  (pTab) );.  }els
27cb0 65 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  e{.    pTab = 0;
27cc0 0a 20 20 20 20 7a 44 62 20 3d 20 30 3b 20 20 2f  .    zDb = 0;  /
27cd0 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53  * Not needed.  S
27ce0 69 6c 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65  ilence a compile
27cf0 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20  r warning. */.  
27d00 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
27d10 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
27d20 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20 49 6e 76 6f  E_HOOK.  /* Invo
27d30 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74  ke the pre-updat
27d40 65 20 68 6f 6f 6b 2c 20 69 66 20 61 6e 79 20 2a  e hook, if any *
27d50 2f 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  /.  if( pTab ){.
27d60 20 20 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65      if( db->xPre
27d70 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
27d80 26 20 21 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50  & !(pOp->p5 & OP
27d90 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 29  FLAG_ISUPDATE) )
27da0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
27db0 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  dbePreUpdateHook
27dc0 28 70 2c 20 70 43 2c 20 53 51 4c 49 54 45 5f 49  (p, pC, SQLITE_I
27dd0 4e 53 45 52 54 2c 20 7a 44 62 2c 20 70 54 61 62  NSERT, zDb, pTab
27de0 2c 20 78 2e 6e 4b 65 79 2c 70 4f 70 2d 3e 70 32  , x.nKey,pOp->p2
27df0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27e00 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
27e10 62 61 63 6b 3d 3d 30 20 7c 7c 20 70 54 61 62 2d  back==0 || pTab-
27e20 3e 61 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  >aCol==0 ){.    
27e30 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 70 6f 73    /* Prevent pos
27e40 74 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 66 72  t-update hook fr
27e50 6f 6d 20 72 75 6e 6e 69 6e 67 20 69 6e 20 63 61  om running in ca
27e60 73 65 73 20 77 68 65 6e 20 69 74 20 73 68 6f 75  ses when it shou
27e70 6c 64 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  ld not */.      
27e80 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pTab = 0;.    }.
27e90 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70    }.  if( pOp->p
27ea0 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f  5 & OPFLAG_ISNOO
27eb0 50 20 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  P ) break;.#endi
27ec0 66 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  f..  if( pOp->p5
27ed0 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47   & OPFLAG_NCHANG
27ee0 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b  E ) p->nChange++
27ef0 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  ;.  if( pOp->p5 
27f00 26 20 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57  & OPFLAG_LASTROW
27f10 49 44 20 29 20 64 62 2d 3e 6c 61 73 74 52 6f 77  ID ) db->lastRow
27f20 69 64 20 3d 20 78 2e 6e 4b 65 79 3b 0a 20 20 61  id = x.nKey;.  a
27f30 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e 66 6c  ssert( pData->fl
27f40 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c  ags & (MEM_Blob|
27f50 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 78 2e  MEM_Str) );.  x.
27f60 70 44 61 74 61 20 3d 20 70 44 61 74 61 2d 3e 7a  pData = pData->z
27f70 3b 0a 20 20 78 2e 6e 44 61 74 61 20 3d 20 70 44  ;.  x.nData = pD
27f80 61 74 61 2d 3e 6e 3b 0a 20 20 73 65 65 6b 52 65  ata->n;.  seekRe
27f90 73 75 6c 74 20 3d 20 28 28 70 4f 70 2d 3e 70 35  sult = ((pOp->p5
27fa0 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45   & OPFLAG_USESEE
27fb0 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73  KRESULT) ? pC->s
27fc0 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 3b 0a  eekResult : 0);.
27fd0 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61    if( pData->fla
27fe0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
27ff0 0a 20 20 20 20 78 2e 6e 5a 65 72 6f 20 3d 20 70  .    x.nZero = p
28000 44 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  Data->u.nZero;. 
28010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 6e 5a   }else{.    x.nZ
28020 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 78  ero = 0;.  }.  x
28030 2e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 72 63 20  .pKey = 0;.  rc 
28040 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
28050 73 65 72 74 28 70 43 2d 3e 75 63 2e 70 43 75 72  sert(pC->uc.pCur
28060 73 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20 20 28  sor, &x,.      (
28070 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41  pOp->p5 & (OPFLA
28080 47 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41 47 5f  G_APPEND|OPFLAG_
28090 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 29 2c 20  SAVEPOSITION)), 
280a0 73 65 65 6b 52 65 73 75 6c 74 0a 20 20 29 3b 0a  seekResult.  );.
280b0 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
280c0 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  veto = 0;.  pC->
280d0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
280e0 43 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a  CHE_STALE;..  /*
280f0 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61   Invoke the upda
28100 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69  te-hook if requi
28110 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  red. */.  if( rc
28120 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
28130 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
28140 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 61 73  ( pTab ){.    as
28150 73 65 72 74 28 20 64 62 2d 3e 78 55 70 64 61 74  sert( db->xUpdat
28160 65 43 61 6c 6c 62 61 63 6b 21 3d 30 20 29 3b 0a  eCallback!=0 );.
28170 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
28180 2d 3e 61 43 6f 6c 21 3d 30 20 29 3b 0a 20 20 20  ->aCol!=0 );.   
28190 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
281a0 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65  back(db->pUpdate
281b0 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Arg,.           
281c0 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
281d0 47 5f 49 53 55 50 44 41 54 45 29 20 3f 20 53 51  G_ISUPDATE) ? SQ
281e0 4c 49 54 45 5f 55 50 44 41 54 45 20 3a 20 53 51  LITE_UPDATE : SQ
281f0 4c 49 54 45 5f 49 4e 53 45 52 54 2c 0a 20 20 20  LITE_INSERT,.   
28200 20 20 20 20 20 20 20 20 7a 44 62 2c 20 70 54 61          zDb, pTa
28210 62 2d 3e 7a 4e 61 6d 65 2c 20 78 2e 6e 4b 65 79  b->zName, x.nKey
28220 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
28230 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65  }../* Opcode: De
28240 6c 65 74 65 20 50 31 20 50 32 20 50 33 20 50 34  lete P1 P2 P3 P4
28250 20 50 35 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65   P5.**.** Delete
28260 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 20 77   the record at w
28270 68 69 63 68 20 74 68 65 20 50 31 20 63 75 72 73  hich the P1 curs
28280 6f 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  or is currently 
28290 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
282a0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 41  If the OPFLAG_SA
282b0 56 45 50 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f  VEPOSITION bit o
282c0 66 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74  f the P5 paramet
282d0 65 72 20 69 73 20 73 65 74 2c 20 74 68 65 6e 0a  er is set, then.
282e0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 69  ** the cursor wi
282f0 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
28300 69 6e 67 20 61 74 20 20 65 69 74 68 65 72 20 74  ing at  either t
28310 68 65 20 6e 65 78 74 20 6f 72 20 74 68 65 20 70  he next or the p
28320 72 65 76 69 6f 75 73 0a 2a 2a 20 72 65 63 6f 72  revious.** recor
28330 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  d in the table. 
28340 49 66 20 69 74 20 69 73 20 6c 65 66 74 20 70 6f  If it is left po
28350 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6e 65  inting at the ne
28360 78 74 20 72 65 63 6f 72 64 2c 20 74 68 65 6e 0a  xt record, then.
28370 2a 2a 20 74 68 65 20 6e 65 78 74 20 4e 65 78 74  ** the next Next
28380 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
28390 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 41 73  l be a no-op. As
283a0 20 61 20 72 65 73 75 6c 74 2c 20 69 6e 20 74 68   a result, in th
283b0 69 73 20 63 61 73 65 0a 2a 2a 20 69 74 20 69 73  is case.** it is
283c0 20 6f 6b 20 74 6f 20 64 65 6c 65 74 65 20 61 20   ok to delete a 
283d0 72 65 63 6f 72 64 20 66 72 6f 6d 20 77 69 74 68  record from with
283e0 69 6e 20 61 20 4e 65 78 74 20 6c 6f 6f 70 2e 20  in a Next loop. 
283f0 49 66 20 0a 2a 2a 20 4f 50 46 4c 41 47 5f 53 41  If .** OPFLAG_SA
28400 56 45 50 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f  VEPOSITION bit o
28410 66 20 50 35 20 69 73 20 63 6c 65 61 72 2c 20 74  f P5 is clear, t
28420 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77  hen the cursor w
28430 69 6c 6c 20 62 65 0a 2a 2a 20 6c 65 66 74 20 69  ill be.** left i
28440 6e 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 73  n an undefined s
28450 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
28460 68 65 20 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c  he OPFLAG_AUXDEL
28470 45 54 45 20 62 69 74 20 69 73 20 73 65 74 20 6f  ETE bit is set o
28480 6e 20 50 35 2c 20 74 68 61 74 20 69 6e 64 69 63  n P5, that indic
28490 61 74 65 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ates that this.*
284a0 2a 20 64 65 6c 65 74 65 20 6f 6e 65 20 6f 66 20  * delete one of 
284b0 73 65 76 65 72 61 6c 20 61 73 73 6f 63 69 61 74  several associat
284c0 65 64 20 77 69 74 68 20 64 65 6c 65 74 69 6e 67  ed with deleting
284d0 20 61 20 74 61 62 6c 65 20 72 6f 77 20 61 6e 64   a table row and
284e0 20 61 6c 6c 20 69 74 73 0a 2a 2a 20 61 73 73 6f   all its.** asso
284f0 63 69 61 74 65 64 20 69 6e 64 65 78 20 65 6e 74  ciated index ent
28500 72 69 65 73 2e 20 20 45 78 61 63 74 6c 79 20 6f  ries.  Exactly o
28510 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65  ne of those dele
28520 74 65 73 20 69 73 20 74 68 65 20 22 70 72 69 6d  tes is the "prim
28530 61 72 79 22 0a 2a 2a 20 64 65 6c 65 74 65 2e 20  ary".** delete. 
28540 20 54 68 65 20 6f 74 68 65 72 73 20 61 72 65 20   The others are 
28550 61 6c 6c 20 6f 6e 20 4f 50 46 4c 41 47 5f 46 4f  all on OPFLAG_FO
28560 52 44 45 4c 45 54 45 20 63 75 72 73 6f 72 73 20  RDELETE cursors 
28570 6f 72 20 65 6c 73 65 20 61 72 65 0a 2a 2a 20 6d  or else are.** m
28580 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 41  arked with the A
28590 55 58 44 45 4c 45 54 45 20 66 6c 61 67 2e 0a 2a  UXDELETE flag..*
285a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
285b0 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20  AG_NCHANGE flag 
285c0 6f 66 20 50 32 20 28 4e 42 3a 20 50 32 20 6e 6f  of P2 (NB: P2 no
285d0 74 20 50 35 29 20 69 73 20 73 65 74 2c 20 74 68  t P5) is set, th
285e0 65 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 63 68  en the row.** ch
285f0 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 20 69 6e  ange count is in
28600 63 72 65 6d 65 6e 74 65 64 20 28 6f 74 68 65 72  cremented (other
28610 77 69 73 65 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a  wise not)..**.**
28620 20 50 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20   P1 must not be 
28630 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49  pseudo-table.  I
28640 74 20 68 61 73 20 74 6f 20 62 65 20 61 20 72 65  t has to be a re
28650 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a  al table with.**
28660 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e 0a   multiple rows..
28670 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e  **.** If P4 is n
28680 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20  ot NULL then it 
28690 70 6f 69 6e 74 73 20 74 6f 20 61 20 54 61 62 6c  points to a Tabl
286a0 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 74 68 69  e object. In thi
286b0 73 20 63 61 73 65 20 65 69 74 68 65 72 20 0a 2a  s case either .*
286c0 2a 20 74 68 65 20 75 70 64 61 74 65 20 6f 72 20  * the update or 
286d0 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c  pre-update hook,
286e0 20 6f 72 20 62 6f 74 68 2c 20 6d 61 79 20 62 65   or both, may be
286f0 20 69 6e 76 6f 6b 65 64 2e 20 54 68 65 20 50 31   invoked. The P1
28700 20 63 75 72 73 6f 72 20 6d 75 73 74 0a 2a 2a 20   cursor must.** 
28710 68 61 76 65 20 62 65 65 6e 20 70 6f 73 69 74 69  have been positi
28720 6f 6e 65 64 20 75 73 69 6e 67 20 4f 50 5f 4e 6f  oned using OP_No
28730 74 46 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f 20  tFound prior to 
28740 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70  invoking this op
28750 63 6f 64 65 20 69 6e 20 0a 2a 2a 20 74 68 69 73  code in .** this
28760 20 63 61 73 65 2e 20 53 70 65 63 69 66 69 63 61   case. Specifica
28770 6c 6c 79 2c 20 69 66 20 6f 6e 65 20 69 73 20 63  lly, if one is c
28780 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 65 20 70  onfigured, the p
28790 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69  re-update hook i
287a0 73 20 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 69 66  s .** invoked if
287b0 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   P4 is not NULL.
287c0 20 54 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   The update-hook
287d0 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 6f   is invoked if o
287e0 6e 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  ne is configured
287f0 2c 20 0a 2a 2a 20 50 34 20 69 73 20 6e 6f 74 20  , .** P4 is not 
28800 4e 55 4c 4c 2c 20 61 6e 64 20 74 68 65 20 4f 50  NULL, and the OP
28810 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61  FLAG_NCHANGE fla
28820 67 20 69 73 20 73 65 74 20 69 6e 20 50 32 2e 0a  g is set in P2..
28830 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
28840 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66 6c 61  LAG_ISUPDATE fla
28850 67 20 69 73 20 73 65 74 20 69 6e 20 50 32 2c 20  g is set in P2, 
28860 74 68 65 6e 20 50 33 20 63 6f 6e 74 61 69 6e 73  then P3 contains
28870 20 74 68 65 20 61 64 64 72 65 73 73 0a 2a 2a 20   the address.** 
28880 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
28890 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ll that contains
288a0 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20   the value that 
288b0 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
288c0 20 72 6f 77 20 77 69 6c 6c 0a 2a 2a 20 62 65 20   row will.** be 
288d0 73 65 74 20 74 6f 20 62 79 20 74 68 65 20 75 70  set to by the up
288e0 64 61 74 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  date..*/.case OP
288f0 5f 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62  _Delete: {.  Vdb
28900 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 63  eCursor *pC;.  c
28910 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
28920 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
28930 20 69 6e 74 20 6f 70 66 6c 61 67 73 3b 0a 0a 20   int opflags;.. 
28940 20 6f 70 66 6c 61 67 73 20 3d 20 70 4f 70 2d 3e   opflags = pOp->
28950 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p2;.  assert( pO
28960 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
28970 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
28980 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
28990 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
289a0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
289b0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
289c0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
289d0 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
289e0 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
289f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
28a00 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
28a10 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  eto==0 );.  sqli
28a20 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74 65  te3VdbeIncrWrite
28a30 43 6f 75 6e 74 65 72 28 70 2c 20 70 43 29 3b 0a  Counter(p, pC);.
28a40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
28a50 45 42 55 47 0a 20 20 69 66 28 20 70 4f 70 2d 3e  EBUG.  if( pOp->
28a60 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45  p4type==P4_TABLE
28a70 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 4f 70   && HasRowid(pOp
28a80 2d 3e 70 34 2e 70 54 61 62 29 20 26 26 20 70 4f  ->p4.pTab) && pO
28a90 70 2d 3e 70 35 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p5==0 ){.    
28aa0 2f 2a 20 49 66 20 70 35 20 69 73 20 7a 65 72 6f  /* If p5 is zero
28ab0 2c 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72 61  , the seek opera
28ac0 74 69 6f 6e 20 74 68 61 74 20 70 6f 73 69 74 69  tion that positi
28ad0 6f 6e 65 64 20 74 68 65 20 63 75 72 73 6f 72 20  oned the cursor 
28ae0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
28af0 4f 50 5f 44 65 6c 65 74 65 20 77 69 6c 6c 20 68  OP_Delete will h
28b00 61 76 65 20 61 6c 73 6f 20 73 65 74 20 74 68 65  ave also set the
28b10 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65   pC->movetoTarge
28b20 74 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 72  t field to the r
28b30 6f 77 69 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74  owid of.    ** t
28b40 68 65 20 72 6f 77 20 74 68 61 74 20 69 73 20 62  he row that is b
28b50 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
28b60 20 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20 73      i64 iKey = s
28b70 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
28b80 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75  erKey(pC->uc.pCu
28b90 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65 72  rsor);.    asser
28ba0 74 28 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72  t( pC->movetoTar
28bb0 67 65 74 3d 3d 69 4b 65 79 20 29 3b 0a 20 20 7d  get==iKey );.  }
28bc0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
28bd0 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
28be0 20 6f 72 20 70 72 65 2d 75 70 64 61 74 65 2d 68   or pre-update-h
28bf0 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f  ook will be invo
28c00 6b 65 64 2c 20 73 65 74 20 7a 44 62 20 74 6f 0a  ked, set zDb to.
28c10 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
28c20 20 74 68 65 20 64 62 20 74 6f 20 70 61 73 73 20   the db to pass 
28c30 61 73 20 74 6f 20 69 74 2e 20 41 6c 73 6f 20 73  as to it. Also s
28c40 65 74 20 6c 6f 63 61 6c 20 70 54 61 62 20 74 6f  et local pTab to
28c50 20 61 20 63 6f 70 79 0a 20 20 2a 2a 20 6f 66 20   a copy.  ** of 
28c60 70 34 2e 70 54 61 62 2e 20 46 69 6e 61 6c 6c 79  p4.pTab. Finally
28c70 2c 20 69 66 20 70 35 20 69 73 20 74 72 75 65 2c  , if p5 is true,
28c80 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
28c90 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61 73   this cursor was
28ca0 0a 20 20 2a 2a 20 6c 61 73 74 20 6d 6f 76 65 64  .  ** last moved
28cb0 20 77 69 74 68 20 4f 50 5f 4e 65 78 74 20 6f 72   with OP_Next or
28cc0 20 4f 50 5f 50 72 65 76 2c 20 6e 6f 74 20 53 65   OP_Prev, not Se
28cd0 65 6b 20 6f 72 20 4e 6f 74 46 6f 75 6e 64 2c 20  ek or NotFound, 
28ce0 73 65 74 20 0a 20 20 2a 2a 20 56 64 62 65 43 75  set .  ** VdbeCu
28cf0 72 73 6f 72 2e 6d 6f 76 65 74 6f 54 61 72 67 65  rsor.movetoTarge
28d00 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  t to the current
28d10 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 69 66   rowid.  */.  if
28d20 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
28d30 34 5f 54 41 42 4c 45 20 26 26 20 48 41 53 5f 55  4_TABLE && HAS_U
28d40 50 44 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20 29  PDATE_HOOK(db) )
28d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
28d60 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ->iDb>=0 );.    
28d70 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
28d80 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 7a  pTab!=0 );.    z
28d90 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d  Db = db->aDb[pC-
28da0 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  >iDb].zDbSName;.
28db0 20 20 20 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e      pTab = pOp->
28dc0 70 34 2e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  p4.pTab;.    if(
28dd0 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
28de0 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29  AG_SAVEPOSITION)
28df0 21 3d 30 20 26 26 20 70 43 2d 3e 69 73 54 61 62  !=0 && pC->isTab
28e00 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 43 2d 3e  le ){.      pC->
28e10 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 73  movetoTarget = s
28e20 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
28e30 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75  erKey(pC->uc.pCu
28e40 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rsor);.    }.  }
28e50 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
28e60 30 3b 20 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64  0;   /* Not need
28e70 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63  ed.  Silence a c
28e80 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e  ompiler warning.
28e90 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 30   */.    pTab = 0
28ea0 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
28eb0 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d  .  Silence a com
28ec0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a  piler warning. *
28ed0 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  /.  }..#ifdef SQ
28ee0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
28ef0 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20  PDATE_HOOK.  /* 
28f00 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
28f10 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65  pdate-hook if re
28f20 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
28f30 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
28f40 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e  allback && pOp->
28f50 70 34 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 61  p4.pTab ){.    a
28f60 73 73 65 72 74 28 20 21 28 6f 70 66 6c 61 67 73  ssert( !(opflags
28f70 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41   & OPFLAG_ISUPDA
28f80 54 45 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  TE) .         ||
28f90 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 3d   HasRowid(pTab)=
28fa0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
28fb0 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 66  (aMem[pOp->p3].f
28fc0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
28fd0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
28fe0 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
28ff0 48 6f 6f 6b 28 70 2c 20 70 43 2c 0a 20 20 20 20  Hook(p, pC,.    
29000 20 20 20 20 28 6f 70 66 6c 61 67 73 20 26 20 4f      (opflags & O
29010 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20  PFLAG_ISUPDATE) 
29020 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ? SQLITE_UPDATE 
29030 3a 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  : SQLITE_DELETE,
29040 20 0a 20 20 20 20 20 20 20 20 7a 44 62 2c 20 70   .        zDb, p
29050 54 61 62 2c 20 70 43 2d 3e 6d 6f 76 65 74 6f 54  Tab, pC->movetoT
29060 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 70  arget,.        p
29070 4f 70 2d 3e 70 33 0a 20 20 20 20 29 3b 0a 20 20  Op->p3.    );.  
29080 7d 0a 20 20 69 66 28 20 6f 70 66 6c 61 67 73 20  }.  if( opflags 
29090 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 20  & OPFLAG_ISNOOP 
290a0 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ) break;.#endif.
290b0 20 0a 20 20 2f 2a 20 4f 6e 6c 79 20 66 6c 61 67   .  /* Only flag
290c0 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
290d0 74 20 61 72 65 20 53 41 56 45 50 4f 49 53 54 49  t are SAVEPOISTI
290e0 4f 4e 20 61 6e 64 20 41 55 58 44 45 4c 45 54 45  ON and AUXDELETE
290f0 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 28   */ .  assert( (
29100 70 4f 70 2d 3e 70 35 20 26 20 7e 28 4f 50 46 4c  pOp->p5 & ~(OPFL
29110 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 7c  AG_SAVEPOSITION|
29120 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45  OPFLAG_AUXDELETE
29130 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
29140 74 28 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f  t( OPFLAG_SAVEPO
29150 53 49 54 49 4f 4e 3d 3d 42 54 52 45 45 5f 53 41  SITION==BTREE_SA
29160 56 45 50 4f 53 49 54 49 4f 4e 20 29 3b 0a 20 20  VEPOSITION );.  
29170 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 41  assert( OPFLAG_A
29180 55 58 44 45 4c 45 54 45 3d 3d 42 54 52 45 45 5f  UXDELETE==BTREE_
29190 41 55 58 44 45 4c 45 54 45 20 29 3b 0a 0a 23 69  AUXDELETE );..#i
291a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
291b0 47 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  G.  if( p->pFram
291c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
291d0 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 3d  pC->isEphemeral=
291e0 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 70  =0.        && (p
291f0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
29200 41 55 58 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20  AUXDELETE)==0.  
29210 20 20 20 20 20 20 26 26 20 28 70 43 2d 3e 77 72        && (pC->wr
29220 46 6c 61 67 20 26 20 4f 50 46 4c 41 47 5f 46 4f  Flag & OPFLAG_FO
29230 52 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20 20  RDELETE)==0.    
29240 20 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72    ){.      nExtr
29250 61 44 65 6c 65 74 65 2b 2b 3b 0a 20 20 20 20 7d  aDelete++;.    }
29260 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
29270 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47   & OPFLAG_NCHANG
29280 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  E ){.      nExtr
29290 61 44 65 6c 65 74 65 2d 2d 3b 0a 20 20 20 20 7d  aDelete--;.    }
292a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
292b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
292c0 44 65 6c 65 74 65 28 70 43 2d 3e 75 63 2e 70 43  Delete(pC->uc.pC
292d0 75 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 35 29 3b  ursor, pOp->p5);
292e0 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
292f0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
29300 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75  ;.  pC->seekResu
29310 6c 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  lt = 0;.  if( rc
29320 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
29330 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  e_to_error;..  /
29340 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64  * Invoke the upd
29350 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75  ate-hook if requ
29360 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  ired. */.  if( o
29370 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  pflags & OPFLAG_
29380 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20 70  NCHANGE ){.    p
29390 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20  ->nChange++;.   
293a0 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74 65   if( db->xUpdate
293b0 43 61 6c 6c 62 61 63 6b 20 26 26 20 48 61 73 52  Callback && HasR
293c0 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
293d0 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43      db->xUpdateC
293e0 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64  allback(db->pUpd
293f0 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f 44  ateArg, SQLITE_D
29400 45 4c 45 54 45 2c 20 7a 44 62 2c 20 70 54 61 62  ELETE, zDb, pTab
29410 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
29420 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72     pC->movetoTar
29430 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  get);.      asse
29440 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29  rt( pC->iDb>=0 )
29450 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62  ;.    }.  }..  b
29460 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f 64  reak;.}./* Opcod
29470 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a 20  e: ResetCount * 
29480 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  * * * *.**.** Th
29490 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
294a0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73  hange counter is
294b0 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 64   copied to the d
294c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
294d0 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * change counter
294e0 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73 75   (returned by su
294f0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
29500 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  o sqlite3_change
29510 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74 68  s())..** Then th
29520 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20 63  e VMs internal c
29530 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72 65  hange counter re
29540 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54 68  sets to 0..** Th
29550 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 72  is is used by tr
29560 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
29570 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74  */.case OP_Reset
29580 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69 74  Count: {.  sqlit
29590 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
295a0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
295b0 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
295c0 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
295d0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
295e0 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50  rCompare P1 P2 P
295f0 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  3 P4.** Synopsis
29600 3a 20 69 66 20 6b 65 79 28 50 31 29 21 3d 74 72  : if key(P1)!=tr
29610 69 6d 28 72 5b 50 33 5d 2c 50 34 29 20 67 6f 74  im(r[P3],P4) got
29620 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  o P2.**.** P1 is
29630 20 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72   a sorter cursor
29640 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  . This instructi
29650 6f 6e 20 63 6f 6d 70 61 72 65 73 20 61 20 70 72  on compares a pr
29660 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 72  efix of the.** r
29670 65 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20 72 65  ecord blob in re
29680 67 69 73 74 65 72 20 50 33 20 61 67 61 69 6e 73  gister P3 agains
29690 74 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  t a prefix of th
296a0 65 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  e entry that .**
296b0 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
296c0 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
296d0 6e 74 73 20 74 6f 2e 20 20 4f 6e 6c 79 20 74 68  nts to.  Only th
296e0 65 20 66 69 72 73 74 20 50 34 20 66 69 65 6c 64  e first P4 field
296f0 73 0a 2a 2a 20 6f 66 20 72 5b 50 33 5d 20 61 6e  s.** of r[P3] an
29700 64 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  d the sorter rec
29710 6f 72 64 20 61 72 65 20 63 6f 6d 70 61 72 65 64  ord are compared
29720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
29730 72 20 50 33 20 6f 72 20 74 68 65 20 73 6f 72 74  r P3 or the sort
29740 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  er contains a NU
29750 4c 4c 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  LL in one of the
29760 69 72 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 2a  ir significant.*
29770 2a 20 66 69 65 6c 64 73 20 28 6e 6f 74 20 63 6f  * fields (not co
29780 75 6e 74 69 6e 67 20 74 68 65 20 50 34 20 66 69  unting the P4 fi
29790 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64 20  elds at the end 
297a0 77 68 69 63 68 20 61 72 65 20 69 67 6e 6f 72 65  which are ignore
297b0 64 29 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d) then.** the c
297c0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73 73  omparison is ass
297d0 75 6d 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  umed to be equal
297e0 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68 72  ..**.** Fall thr
297f0 6f 75 67 68 20 74 6f 20 6e 65 78 74 20 69 6e 73  ough to next ins
29800 74 72 75 63 74 69 6f 6e 20 69 66 20 74 68 65 20  truction if the 
29810 74 77 6f 20 72 65 63 6f 72 64 73 20 63 6f 6d 70  two records comp
29820 61 72 65 20 65 71 75 61 6c 20 74 6f 0a 2a 2a 20  are equal to.** 
29830 65 61 63 68 20 6f 74 68 65 72 2e 20 20 4a 75 6d  each other.  Jum
29840 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 79 20  p to P2 if they 
29850 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a  are different..*
29860 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
29870 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64 62  Compare: {.  Vdb
29880 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
29890 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 4b  nt res;.  int nK
298a0 65 79 43 6f 6c 3b 0a 0a 20 20 70 43 20 3d 20 70  eyCol;..  pC = p
298b0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
298c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
298d0 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 61 73  rter(pC) );.  as
298e0 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
298f0 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20  e==P4_INT32 );. 
29900 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
29910 70 2d 3e 70 33 5d 3b 0a 20 20 6e 4b 65 79 43 6f  p->p3];.  nKeyCo
29920 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  l = pOp->p4.i;. 
29930 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d   res = 0;.  rc =
29940 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
29950 65 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70 49  erCompare(pC, pI
29960 6e 33 2c 20 6e 4b 65 79 43 6f 6c 2c 20 26 72 65  n3, nKeyCol, &re
29970 73 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68  s);.  VdbeBranch
29980 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b  Taken(res!=0,2);
29990 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
299a0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
299b0 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 20 29  ror;.  if( res )
299c0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
299d0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f  ;.  break;.};../
299e0 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72  * Opcode: Sorter
299f0 44 61 74 61 20 50 31 20 50 32 20 50 33 20 2a 20  Data P1 P2 P3 * 
29a00 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
29a10 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20  [P2]=data.**.** 
29a20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73  Write into regis
29a30 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72 65  ter P2 the curre
29a40 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20 66  nt sorter data f
29a50 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72  or sorter cursor
29a60 20 50 31 2e 0a 2a 2a 20 54 68 65 6e 20 63 6c 65   P1..** Then cle
29a70 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 65  ar the column he
29a80 61 64 65 72 20 63 61 63 68 65 20 6f 6e 20 63 75  ader cache on cu
29a90 72 73 6f 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 54  rsor P3..**.** T
29aa0 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f  his opcode is no
29ab0 72 6d 61 6c 6c 79 20 75 73 65 20 74 6f 20 6d 6f  rmally use to mo
29ac0 76 65 20 61 20 72 65 63 6f 72 64 20 6f 75 74 20  ve a record out 
29ad0 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  of the sorter an
29ae0 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 67 69  d into.** a regi
29af0 73 74 65 72 20 74 68 61 74 20 69 73 20 74 68 65  ster that is the
29b00 20 73 6f 75 72 63 65 20 66 6f 72 20 61 20 70 73   source for a ps
29b10 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f  eudo-table curso
29b20 72 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a  r created using.
29b30 2a 2a 20 4f 70 65 6e 50 73 65 75 64 6f 2e 20 20  ** OpenPseudo.  
29b40 54 68 61 74 20 70 73 65 75 64 6f 2d 74 61 62 6c  That pseudo-tabl
29b50 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 20  e cursor is the 
29b60 6f 6e 65 20 74 68 61 74 20 69 73 20 69 64 65 6e  one that is iden
29b70 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 72  tified by.** par
29b80 61 6d 65 74 65 72 20 50 33 2e 20 20 43 6c 65 61  ameter P3.  Clea
29b90 72 69 6e 67 20 74 68 65 20 50 33 20 63 6f 6c 75  ring the P3 colu
29ba0 6d 6e 20 63 61 63 68 65 20 61 73 20 70 61 72 74  mn cache as part
29bb0 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20   of this opcode 
29bc0 73 61 76 65 73 0a 2a 2a 20 75 73 20 66 72 6f 6d  saves.** us from
29bd0 20 68 61 76 69 6e 67 20 74 6f 20 69 73 73 75 65   having to issue
29be0 20 61 20 73 65 70 61 72 61 74 65 20 4e 75 6c 6c   a separate Null
29bf0 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  Row instruction 
29c00 74 6f 20 63 6c 65 61 72 20 74 68 61 74 20 63 61  to clear that ca
29c10 63 68 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  che..*/.case OP_
29c20 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20 20  SorterData: {.  
29c30 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
29c40 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
29c50 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20 3d  pOp->p2];.  pC =
29c60 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
29c70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  1];.  assert( is
29c80 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20  Sorter(pC) );.  
29c90 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
29ca0 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43 2c  SorterRowkey(pC,
29cb0 20 70 4f 75 74 29 3b 0a 20 20 61 73 73 65 72 74   pOut);.  assert
29cc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29cd0 7c 7c 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73 20  || (pOut->flags 
29ce0 26 20 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  & MEM_Blob) );. 
29cf0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
29d00 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
29d10 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69  ->nCursor );.  i
29d20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
29d30 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
29d40 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  .  p->apCsr[pOp-
29d50 3e 70 33 5d 2d 3e 63 61 63 68 65 53 74 61 74 75  >p3]->cacheStatu
29d60 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
29d70 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
29d80 4f 70 63 6f 64 65 3a 20 52 6f 77 44 61 74 61 20  Opcode: RowData 
29d90 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
29da0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
29db0 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  data.**.** Write
29dc0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
29dd0 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72  2 the complete r
29de0 6f 77 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74  ow content for t
29df0 68 65 20 72 6f 77 20 61 74 20 0a 2a 2a 20 77 68  he row at .** wh
29e00 69 63 68 20 63 75 72 73 6f 72 20 50 31 20 69 73  ich cursor P1 is
29e10 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
29e20 69 6e 67 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73  ing..** There is
29e30 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69   no interpretati
29e40 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20  on of the data. 
29e50 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74 20   .** It is just 
29e60 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20  copied onto the 
29e70 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61 63  P2 register exac
29e80 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73  tly as .** it is
29e90 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
29ea0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
29eb0 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
29ec0 69 73 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  is an index, the
29ed0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  n the content is
29ee0 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
29ef0 72 6f 77 2e 0a 2a 2a 20 49 66 20 63 75 72 73 6f  row..** If curso
29f00 72 20 50 32 20 69 73 20 61 20 74 61 62 6c 65 2c  r P2 is a table,
29f10 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
29f20 74 20 65 78 74 72 61 63 74 65 64 20 69 73 20 74  t extracted is t
29f30 68 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 49  he data..**.** I
29f40 66 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  f the P1 cursor 
29f50 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  must be pointing
29f60 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20   to a valid row 
29f70 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29  (not a NULL row)
29f80 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74 61  .** of a real ta
29f90 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64  ble, not a pseud
29fa0 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  o-table..**.** I
29fb0 66 20 50 33 21 3d 30 20 74 68 65 6e 20 74 68 69  f P3!=0 then thi
29fc0 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6c 6c 6f  s opcode is allo
29fd0 77 65 64 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  wed to make an e
29fe0 70 68 65 6d 65 72 61 6c 20 70 6f 69 6e 74 65 72  phemeral pointer
29ff0 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74  .** into the dat
2a000 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 61  abase page.  Tha
2a010 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
2a020 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2a030 6f 75 74 70 75 74 0a 2a 2a 20 72 65 67 69 73 74  output.** regist
2a040 65 72 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  er will be inval
2a050 69 64 61 74 65 64 20 61 73 20 73 6f 6f 6e 20 61  idated as soon a
2a060 73 20 74 68 65 20 63 75 72 73 6f 72 20 6d 6f 76  s the cursor mov
2a070 65 73 20 2d 20 69 6e 63 6c 75 64 69 6e 67 0a 2a  es - including.*
2a080 2a 20 6d 6f 76 65 73 20 63 61 75 73 65 64 20 62  * moves caused b
2a090 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2a0a0 74 68 61 74 20 22 73 61 76 65 22 20 74 68 65 20  that "save" the 
2a0b0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 73 0a  current cursors.
2a0c0 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6f  ** position in o
2a0d0 72 64 65 72 20 74 68 61 74 20 74 68 65 79 20 63  rder that they c
2a0e0 61 6e 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  an write to the 
2a0f0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 49 66 20  same table.  If 
2a100 50 33 3d 3d 30 0a 2a 2a 20 74 68 65 6e 20 61 20  P3==0.** then a 
2a110 63 6f 70 79 20 6f 66 20 74 68 65 20 64 61 74 61  copy of the data
2a120 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
2a130 6d 6f 72 79 2e 20 20 50 33 21 3d 30 20 69 73 20  mory.  P3!=0 is 
2a140 66 61 73 74 65 72 2c 20 62 75 74 0a 2a 2a 20 50  faster, but.** P
2a150 33 3d 3d 30 20 69 73 20 73 61 66 65 72 2e 0a 2a  3==0 is safer..*
2a160 2a 0a 2a 2a 20 49 66 20 50 33 21 3d 30 20 74 68  *.** If P3!=0 th
2a170 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
2a180 66 20 74 68 65 20 50 32 20 72 65 67 69 73 74 65  f the P2 registe
2a190 72 20 69 73 20 75 6e 73 75 69 74 61 62 6c 65 20  r is unsuitable 
2a1a0 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 4f 50  for use.** in OP
2a1b0 5f 52 65 73 75 6c 74 20 61 6e 64 20 61 6e 79 20  _Result and any 
2a1c0 4f 50 5f 52 65 73 75 6c 74 20 77 69 6c 6c 20 69  OP_Result will i
2a1d0 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 50 32  nvalidate the P2
2a1e0 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e   register conten
2a1f0 74 2e 0a 2a 2a 20 54 68 65 20 50 32 20 72 65 67  t..** The P2 reg
2a200 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 20 69 73  ister content is
2a210 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
2a220 6f 70 63 6f 64 65 73 20 6c 69 6b 65 20 4f 50 5f  opcodes like OP_
2a230 46 75 6e 63 74 69 6f 6e 20 6f 72 0a 2a 2a 20 62  Function or.** b
2a240 79 20 61 6e 79 20 75 73 65 20 6f 66 20 61 6e 6f  y any use of ano
2a250 74 68 65 72 20 63 75 72 73 6f 72 20 70 6f 69 6e  ther cursor poin
2a260 74 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ting to the same
2a270 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20   table..*/.case 
2a280 4f 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20 20  OP_RowData: {.  
2a290 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
2a2a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
2a2b0 72 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 70  r;.  u32 n;..  p
2a2c0 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
2a2d0 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 0a 20  ease(p, pOp);.. 
2a2e0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2a2f0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2a300 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
2a310 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2a320 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2a330 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
2a340 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2a350 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2a360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  );.  assert( isS
2a370 6f 72 74 65 72 28 70 43 29 3d 3d 30 20 29 3b 0a  orter(pC)==0 );.
2a380 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6e 75    assert( pC->nu
2a390 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  llRow==0 );.  as
2a3a0 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75  sert( pC->uc.pCu
2a3b0 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 70 43 72  rsor!=0 );.  pCr
2a3c0 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72  sr = pC->uc.pCur
2a3d0 73 6f 72 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f  sor;..  /* The O
2a3e0 50 5f 52 6f 77 44 61 74 61 20 6f 70 63 6f 64 65  P_RowData opcode
2a3f0 73 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 20  s always follow 
2a400 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 0a  OP_NotExists or.
2a410 20 20 2a 2a 20 4f 50 5f 53 65 65 6b 52 6f 77 69    ** OP_SeekRowi
2a420 64 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2f 4f  d or OP_Rewind/O
2a430 70 5f 4e 65 78 74 20 77 69 74 68 20 6e 6f 20 69  p_Next with no i
2a440 6e 74 65 72 76 65 6e 69 6e 67 20 69 6e 73 74 72  ntervening instr
2a450 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74 68 61  uctions.  ** tha
2a460 74 20 6d 69 67 68 74 20 69 6e 76 61 6c 69 64 61  t might invalida
2a470 74 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 20  te the cursor.. 
2a480 20 2a 2a 20 49 66 20 74 68 69 73 20 77 68 65 72   ** If this wher
2a490 65 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20  e not the case, 
2a4a0 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
2a4b0 69 6e 67 20 61 73 73 65 72 74 28 29 73 0a 20 20  ing assert()s.  
2a4c0 2a 2a 20 77 6f 75 6c 64 20 66 61 69 6c 2e 20 20  ** would fail.  
2a4d0 53 68 6f 75 6c 64 20 74 68 69 73 20 65 76 65 72  Should this ever
2a4e0 20 63 68 61 6e 67 65 20 28 62 65 63 61 75 73 65   change (because
2a4f0 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74   of changes in t
2a500 68 65 20 63 6f 64 65 0a 20 20 2a 2a 20 67 65 6e  he code.  ** gen
2a510 65 72 61 74 6f 72 29 20 74 68 65 6e 20 74 68 65  erator) then the
2a520 20 66 69 78 20 77 6f 75 6c 64 20 62 65 20 74 6f   fix would be to
2a530 20 69 6e 73 65 72 74 20 61 20 63 61 6c 6c 20 74   insert a call t
2a540 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64  o.  ** sqlite3Vd
2a550 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29  beCursorMoveto()
2a560 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2a570 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2a580 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eto==0 );.  asse
2a590 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2a5a0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
2a5b0 72 73 72 29 20 29 3b 0a 23 69 66 20 30 20 20 2f  rsr) );.#if 0  /
2a5c0 2a 20 4e 6f 74 20 72 65 71 75 69 72 65 64 20 64  * Not required d
2a5d0 75 65 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ue to the previo
2a5e0 75 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 73  us to assert() s
2a5f0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 72  tatements */.  r
2a600 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
2a610 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b  ursorMoveto(pC);
2a620 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2a630 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
2a640 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2a650 23 65 6e 64 69 66 0a 0a 20 20 6e 20 3d 20 73 71  #endif..  n = sq
2a660 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
2a670 64 53 69 7a 65 28 70 43 72 73 72 29 3b 0a 20 20  dSize(pCrsr);.  
2a680 69 66 28 20 6e 3e 28 75 33 32 29 64 62 2d 3e 61  if( n>(u32)db->a
2a690 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
2a6a0 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
2a6b0 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
2a6c0 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
2a6d0 6e 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  n==0 );.  rc = s
2a6e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
2a6f0 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 30 2c  mBtree(pCrsr, 0,
2a700 20 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 69 66 28   n, pOut);.  if(
2a710 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2a720 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2a730 20 69 66 28 20 21 70 4f 70 2d 3e 70 33 20 29 20   if( !pOp->p3 ) 
2a740 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70  Deephemeralize(p
2a750 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  Out);.  UPDATE_M
2a760 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
2a770 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
2a780 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
2a790 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
2a7a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 69 64  /* Opcode: Rowid
2a7b0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
2a7c0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
2a7d0 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  rowid.**.** Stor
2a7e0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
2a7f0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
2a800 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66 20  h is the key of 
2a810 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
2a820 74 68 61 74 0a 2a 2a 20 50 31 20 69 73 20 63 75  that.** P1 is cu
2a830 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
2a840 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61 6e 20 62  ..**.** P1 can b
2a850 65 20 65 69 74 68 65 72 20 61 6e 20 6f 72 64 69  e either an ordi
2a860 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 61 20  nary table or a 
2a870 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
2a880 54 68 65 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a  There used to.**
2a890 20 62 65 20 61 20 73 65 70 61 72 61 74 65 20 4f   be a separate O
2a8a0 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f 64 65 20  P_VRowid opcode 
2a8b0 66 6f 72 20 75 73 65 20 77 69 74 68 20 76 69 72  for use with vir
2a8c0 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 62 75 74  tual tables, but
2a8d0 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63   this.** one opc
2a8e0 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73 20 66 6f  ode now works fo
2a8f0 72 20 62 6f 74 68 20 74 61 62 6c 65 20 74 79 70  r both table typ
2a900 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  es..*/.case OP_R
2a910 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
2a920 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
2a930 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
2a940 2a 70 43 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  *pC;.  i64 v;.  
2a950 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
2a960 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  tab;.  const sql
2a970 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
2a980 64 75 6c 65 3b 0a 0a 20 20 70 4f 75 74 20 3d 20  dule;..  pOut = 
2a990 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
2a9a0 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73 65 72 74  , pOp);.  assert
2a9b0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
2a9c0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
2a9d0 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
2a9e0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
2a9f0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
2aa00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2aa10 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
2aa20 50 45 5f 50 53 45 55 44 4f 20 7c 7c 20 70 43 2d  PE_PSEUDO || pC-
2aa30 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 20 69 66  >nullRow );.  if
2aa40 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  ( pC->nullRow ){
2aa50 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
2aa60 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
2aa70 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 20   break;.  }else 
2aa80 69 66 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  if( pC->deferred
2aa90 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 76 20  Moveto ){.    v 
2aaa0 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  = pC->movetoTarg
2aab0 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  et;.#ifndef SQLI
2aac0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2aad0 41 42 4c 45 0a 20 20 7d 65 6c 73 65 20 69 66 28  ABLE.  }else if(
2aae0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
2aaf0 55 52 54 59 50 45 5f 56 54 41 42 20 29 7b 0a 20  URTYPE_VTAB ){. 
2ab00 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75     assert( pC->u
2ab10 63 2e 70 56 43 75 72 21 3d 30 20 29 3b 0a 20 20  c.pVCur!=0 );.  
2ab20 20 20 70 56 74 61 62 20 3d 20 70 43 2d 3e 75 63    pVtab = pC->uc
2ab30 2e 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20  .pVCur->pVtab;. 
2ab40 20 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74     pModule = pVt
2ab50 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
2ab60 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
2ab70 2d 3e 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->xRowid );.    
2ab80 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  rc = pModule->xR
2ab90 6f 77 69 64 28 70 43 2d 3e 75 63 2e 70 56 43 75  owid(pC->uc.pVCu
2aba0 72 2c 20 26 76 29 3b 0a 20 20 20 20 73 71 6c 69  r, &v);.    sqli
2abb0 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
2abc0 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20  msg(p, pVtab);. 
2abd0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2abe0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2abf0 72 6f 72 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ror;.#endif /* S
2ac00 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2ac10 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 7d 65 6c  ALTABLE */.  }el
2ac20 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2ac30 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
2ac40 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
2ac50 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75     assert( pC->u
2ac60 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
2ac70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ac80 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
2ac90 65 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20 72  e(pC);.    if( r
2aca0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2acb0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
2acc0 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77   if( pC->nullRow
2acd0 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
2ace0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
2acf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2ad00 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c     }.    v = sql
2ad10 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
2ad20 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  Key(pC->uc.pCurs
2ad30 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d  or);.  }.  pOut-
2ad40 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61  >u.i = v;.  brea
2ad50 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2ad60 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a 20 2a 20   NullRow P1 * * 
2ad70 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74  * *.**.** Move t
2ad80 68 65 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20  he cursor P1 to 
2ad90 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20 41 6e 79  a null row.  Any
2ada0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 65 72 61   OP_Column opera
2adb0 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 6f 63  tions.** that oc
2adc0 63 75 72 20 77 68 69 6c 65 20 74 68 65 20 63 75  cur while the cu
2add0 72 73 6f 72 20 69 73 20 6f 6e 20 74 68 65 20 6e  rsor is on the n
2ade0 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20 61 6c 77  ull row will alw
2adf0 61 79 73 0a 2a 2a 20 77 72 69 74 65 20 61 20 4e  ays.** write a N
2ae00 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
2ae10 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20 56 64 62  NullRow: {.  Vdb
2ae20 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20  eCursor *pC;..  
2ae30 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2ae40 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
2ae50 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
2ae60 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2ae70 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2ae80 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6e  pC!=0 );.  pC->n
2ae90 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43  ullRow = 1;.  pC
2aea0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
2aeb0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69  CACHE_STALE;.  i
2aec0 66 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  f( pC->eCurType=
2aed0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2aee0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2aef0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
2af00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
2af10 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
2af20 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a  C->uc.pCursor);.
2af30 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2af40 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 43  E_DEBUG.  if( pC
2af50 2d 3e 73 65 65 6b 4f 70 3d 3d 30 20 29 20 70 43  ->seekOp==0 ) pC
2af60 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4e 75  ->seekOp = OP_Nu
2af70 6c 6c 52 6f 77 3b 0a 23 65 6e 64 69 66 0a 20 20  llRow;.#endif.  
2af80 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2af90 6f 64 65 3a 20 53 65 65 6b 45 6e 64 20 50 31 20  ode: SeekEnd P1 
2afa0 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f  * * * *.**.** Po
2afb0 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31  sition cursor P1
2afc0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2afd0 68 65 20 62 74 72 65 65 20 66 6f 72 20 74 68 65  he btree for the
2afe0 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 61   purpose of.** a
2aff0 70 70 65 6e 64 69 6e 67 20 61 20 6e 65 77 20 65  ppending a new e
2b000 6e 74 72 79 20 6f 6e 74 6f 20 74 68 65 20 62 74  ntry onto the bt
2b010 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ree..**.** It is
2b020 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2b030 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
2b040 20 6f 6e 6c 79 20 66 6f 72 20 61 70 70 65 6e 64   only for append
2b050 69 6e 67 20 61 6e 64 20 73 6f 0a 2a 2a 20 69 66  ing and so.** if
2b060 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
2b070 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 63  alid, then the c
2b080 75 72 73 6f 72 20 6d 75 73 74 20 61 6c 72 65 61  ursor must alrea
2b090 64 79 20 62 65 20 70 6f 69 6e 74 69 6e 67 0a 2a  dy be pointing.*
2b0a0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2b0b0 74 68 65 20 62 74 72 65 65 20 61 6e 64 20 73 6f  the btree and so
2b0c0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
2b0d0 6d 61 64 65 20 74 6f 0a 2a 2a 20 74 68 65 20 63  made to.** the c
2b0e0 75 72 73 6f 72 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ursor..*/./* Opc
2b0f0 6f 64 65 3a 20 4c 61 73 74 20 50 31 20 50 32 20  ode: Last P1 P2 
2b100 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  * * *.**.** The 
2b110 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20  next use of the 
2b120 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20  Rowid or Column 
2b130 6f 72 20 50 72 65 76 20 69 6e 73 74 72 75 63 74  or Prev instruct
2b140 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77  ion for P1 .** w
2b150 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65  ill refer to the
2b160 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2b170 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
2b180 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49  e or index..** I
2b190 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
2b1a0 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e  ndex is empty an
2b1b0 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d  d P2>0, then jum
2b1c0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
2b1d0 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73   P2..** If P2 is
2b1e0 20 30 20 6f 72 20 69 66 20 74 68 65 20 74 61 62   0 or if the tab
2b1f0 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e  le or index is n
2b200 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74  ot empty, fall t
2b210 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65  hrough.** to the
2b220 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72   following instr
2b230 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  uction..**.** Th
2b240 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
2b250 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66   the cursor conf
2b260 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69  igured to move i
2b270 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2c  n reverse order,
2b280 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  .** from the end
2b290 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 67 69   toward the begi
2b2a0 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72  nning.  In other
2b2b0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73   words, the curs
2b2c0 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75  or is.** configu
2b2d0 72 65 64 20 74 6f 20 75 73 65 20 50 72 65 76 2c  red to use Prev,
2b2e0 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2f 0a 63 61   not Next..*/.ca
2b2f0 73 65 20 4f 50 5f 53 65 65 6b 45 6e 64 3a 0a 63  se OP_SeekEnd:.c
2b300 61 73 65 20 4f 50 5f 4c 61 73 74 3a 20 7b 20 20  ase OP_Last: {  
2b310 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2b320 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2b330 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
2b340 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
2b350 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
2b360 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2b370 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2b380 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2b390 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2b3a0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
2b3b0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
2b3c0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2b3d0 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  EE );.  pCrsr = 
2b3e0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
2b3f0 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 61 73 73    res = 0;.  ass
2b400 65 72 74 28 20 70 43 72 73 72 21 3d 30 20 29 3b  ert( pCrsr!=0 );
2b410 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2b420 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f  EBUG.  pC->seekO
2b430 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  p = pOp->opcode;
2b440 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f  .#endif.  if( pO
2b450 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65  p->opcode==OP_Se
2b460 65 6b 45 6e 64 20 29 7b 0a 20 20 20 20 61 73 73  ekEnd ){.    ass
2b470 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20  ert( pOp->p2==0 
2b480 29 3b 0a 20 20 20 20 70 43 2d 3e 73 65 65 6b 52  );.    pC->seekR
2b490 65 73 75 6c 74 20 3d 20 2d 31 3b 0a 20 20 20 20  esult = -1;.    
2b4a0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
2b4b0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28  CursorIsValidNN(
2b4c0 70 43 72 73 72 29 20 29 7b 0a 20 20 20 20 20 20  pCrsr) ){.      
2b4d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2b4e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2b4f0 74 72 65 65 4c 61 73 74 28 70 43 72 73 72 2c 20  treeLast(pCrsr, 
2b500 26 72 65 73 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c  &res);.  pC->nul
2b510 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a  lRow = (u8)res;.
2b520 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
2b530 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  veto = 0;.  pC->
2b540 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
2b550 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
2b560 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2b570 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2b580 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29   if( pOp->p2>0 )
2b590 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  {.    VdbeBranch
2b5a0 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b  Taken(res!=0,2);
2b5b0 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 20 67  .    if( res ) g
2b5c0 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
2b5d0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
2b5e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 53 6d 61  /* Opcode: IfSma
2b5f0 6c 6c 65 72 20 50 31 20 50 32 20 50 33 20 2a 20  ller P1 P2 P3 * 
2b600 2a 0a 2a 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  *.**.** Estimate
2b610 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2b620 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2b630 20 50 31 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32   P1.  Jump to P2
2b640 20 69 66 20 74 68 61 74 0a 2a 2a 20 65 73 74 69   if that.** esti
2b650 6d 61 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  mate is less tha
2b660 6e 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  n approximately 
2b670 32 2a 2a 28 30 2e 31 2a 50 33 29 2e 0a 2a 2f 0a  2**(0.1*P3)..*/.
2b680 63 61 73 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65  case OP_IfSmalle
2b690 72 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  r: {        /* j
2b6a0 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ump */.  VdbeCur
2b6b0 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
2b6c0 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e  sor *pCrsr;.  in
2b6d0 74 20 72 65 73 3b 0a 20 20 69 36 34 20 73 7a 3b  t res;.  i64 sz;
2b6e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
2b6f0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2b700 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2b710 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2b720 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2b730 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
2b740 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  Crsr = pC->uc.pC
2b750 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
2b760 20 70 43 72 73 72 20 29 3b 0a 20 20 72 63 20 3d   pCrsr );.  rc =
2b770 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
2b780 73 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  st(pCrsr, &res);
2b790 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2b7a0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2b7b0 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d  ror;.  if( res==
2b7c0 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 73 71  0 ){.    sz = sq
2b7d0 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75  lite3BtreeRowCou
2b7e0 6e 74 45 73 74 28 70 43 72 73 72 29 3b 0a 20 20  ntEst(pCrsr);.  
2b7f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 73 7a 3e    if( ALWAYS(sz>
2b800 3d 30 29 20 26 26 20 73 71 6c 69 74 65 33 4c 6f  =0) && sqlite3Lo
2b810 67 45 73 74 28 28 75 36 34 29 73 7a 29 3c 70 4f  gEst((u64)sz)<pO
2b820 70 2d 3e 70 33 20 29 20 72 65 73 20 3d 20 31 3b  p->p3 ) res = 1;
2b830 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63  .  }.  VdbeBranc
2b840 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29  hTaken(res!=0,2)
2b850 3b 0a 20 20 69 66 28 20 72 65 73 20 29 20 67 6f  ;.  if( res ) go
2b860 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
2b870 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
2b880 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 53 6f 72  pcode: SorterSor
2b890 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
2b8a0 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 72 65  .** After all re
2b8b0 63 6f 72 64 73 20 68 61 76 65 20 62 65 65 6e 20  cords have been 
2b8c0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
2b8d0 65 20 53 6f 72 74 65 72 20 6f 62 6a 65 63 74 0a  e Sorter object.
2b8e0 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
2b8f0 20 50 31 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73   P1, invoke this
2b900 20 6f 70 63 6f 64 65 20 74 6f 20 61 63 74 75 61   opcode to actua
2b910 6c 6c 79 20 64 6f 20 74 68 65 20 73 6f 72 74 69  lly do the sorti
2b920 6e 67 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  ng..** Jump to P
2b930 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  2 if there are n
2b940 6f 20 72 65 63 6f 72 64 73 20 74 6f 20 62 65 20  o records to be 
2b950 73 6f 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  sorted..**.** Th
2b960 69 73 20 6f 70 63 6f 64 65 20 69 73 20 61 6e 20  is opcode is an 
2b970 61 6c 69 61 73 20 66 6f 72 20 4f 50 5f 53 6f 72  alias for OP_Sor
2b980 74 20 61 6e 64 20 4f 50 5f 52 65 77 69 6e 64 20  t and OP_Rewind 
2b990 74 68 61 74 20 69 73 20 75 73 65 64 0a 2a 2a 20  that is used.** 
2b9a0 66 6f 72 20 53 6f 72 74 65 72 20 6f 62 6a 65 63  for Sorter objec
2b9b0 74 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ts..*/./* Opcode
2b9c0 3a 20 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a  : Sort P1 P2 * *
2b9d0 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70   *.**.** This op
2b9e0 63 6f 64 65 20 64 6f 65 73 20 65 78 61 63 74 6c  code does exactl
2b9f0 79 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  y the same thing
2ba00 20 61 73 20 4f 50 5f 52 65 77 69 6e 64 20 65 78   as OP_Rewind ex
2ba10 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 69 74 20  cept that.** it 
2ba20 69 6e 63 72 65 6d 65 6e 74 73 20 61 6e 20 75 6e  increments an un
2ba30 64 6f 63 75 6d 65 6e 74 65 64 20 67 6c 6f 62 61  documented globa
2ba40 6c 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20  l variable used 
2ba50 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a  for testing..**.
2ba60 2a 2a 20 53 6f 72 74 69 6e 67 20 69 73 20 61 63  ** Sorting is ac
2ba70 63 6f 6d 70 6c 69 73 68 65 64 20 62 79 20 77 72  complished by wr
2ba80 69 74 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e  iting records in
2ba90 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
2baa0 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 77 69  ex,.** then rewi
2bab0 6e 64 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  nding that index
2bac0 20 61 6e 64 20 70 6c 61 79 69 6e 67 20 69 74 20   and playing it 
2bad0 62 61 63 6b 20 66 72 6f 6d 20 62 65 67 69 6e 6e  back from beginn
2bae0 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20  ing to.** end.  
2baf0 57 65 20 75 73 65 20 74 68 65 20 4f 50 5f 53 6f  We use the OP_So
2bb00 72 74 20 6f 70 63 6f 64 65 20 69 6e 73 74 65 61  rt opcode instea
2bb10 64 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 74  d of OP_Rewind t
2bb20 6f 20 64 6f 20 74 68 65 0a 2a 2a 20 72 65 77 69  o do the.** rewi
2bb30 6e 64 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68  nding so that th
2bb40 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
2bb50 65 20 77 69 6c 6c 20 62 65 20 69 6e 63 72 65 6d  e will be increm
2bb60 65 6e 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 67  ented and.** reg
2bb70 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 63 61  ression tests ca
2bb80 6e 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  n determine whet
2bb90 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6f  her or not the o
2bba0 70 74 69 6d 69 7a 65 72 20 69 73 0a 2a 2a 20 63  ptimizer is.** c
2bbb0 6f 72 72 65 63 74 6c 79 20 6f 70 74 69 6d 69 7a  orrectly optimiz
2bbc0 69 6e 67 20 6f 75 74 20 73 6f 72 74 73 2e 0a 2a  ing out sorts..*
2bbd0 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
2bbe0 53 6f 72 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70  Sort:    /* jump
2bbf0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74   */.case OP_Sort
2bc00 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
2bc10 6d 70 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  mp */.#ifdef SQL
2bc20 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
2bc30 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b  e3_sort_count++;
2bc40 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
2bc50 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69  h_count--;.#endi
2bc60 66 0a 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b  f.  p->aCounter[
2bc70 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
2bc80 53 5f 53 4f 52 54 5d 2b 2b 3b 0a 20 20 2f 2a 20  S_SORT]++;.  /* 
2bc90 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
2bca0 6f 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d  o OP_Rewind */.}
2bcb0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 77 69  ./* Opcode: Rewi
2bcc0 6e 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nd P1 P2 * * *.*
2bcd0 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73  *.** The next us
2bce0 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f  e of the Rowid o
2bcf0 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74  r Column or Next
2bd00 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
2bd10 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66   P1 .** will ref
2bd20 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
2bd30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2bd40 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69  abase table or i
2bd50 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ndex..** If the 
2bd60 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
2bd70 73 20 65 6d 70 74 79 2c 20 6a 75 6d 70 20 69 6d  s empty, jump im
2bd80 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
2bd90 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
2bda0 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74   or index is not
2bdb0 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72   empty, fall thr
2bdc0 6f 75 67 68 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ough to the foll
2bdd0 6f 77 69 6e 67 20 0a 2a 2a 20 69 6e 73 74 72 75  owing .** instru
2bde0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ction..**.** Thi
2bdf0 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
2be00 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69  the cursor confi
2be10 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e  gured to move in
2be20 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a   forward order,.
2be30 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  ** from the begi
2be40 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65  nning toward the
2be50 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20   end.  In other 
2be60 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f  words, the curso
2be70 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  r is.** configur
2be80 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20  ed to use Next, 
2be90 6e 6f 74 20 50 72 65 76 2e 0a 2a 2f 0a 63 61 73  not Prev..*/.cas
2bea0 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20  e OP_Rewind: {  
2beb0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2bec0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2bed0 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
2bee0 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
2bef0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
2bf00 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2bf10 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2bf20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2bf30 35 3d 3d 30 20 29 3b 0a 20 20 70 43 20 3d 20 70  5==0 );.  pC = p
2bf40 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2bf50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
2bf60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
2bf70 73 53 6f 72 74 65 72 28 70 43 29 3d 3d 28 70 4f  sSorter(pC)==(pO
2bf80 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f  p->opcode==OP_So
2bf90 72 74 65 72 53 6f 72 74 29 20 29 3b 0a 20 20 72  rterSort) );.  r
2bfa0 65 73 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  es = 1;.#ifdef S
2bfb0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43  QLITE_DEBUG.  pC
2bfc0 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65  ->seekOp = OP_Re
2bfd0 77 69 6e 64 3b 0a 23 65 6e 64 69 66 0a 20 20 69  wind;.#endif.  i
2bfe0 66 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20  f( isSorter(pC) 
2bff0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2c000 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 65 77  te3VdbeSorterRew
2c010 69 6e 64 28 70 43 2c 20 26 72 65 73 29 3b 0a 20  ind(pC, &res);. 
2c020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2c030 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2c040 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2c050 29 3b 0a 20 20 20 20 70 43 72 73 72 20 3d 20 70  );.    pCrsr = p
2c060 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20  C->uc.pCursor;. 
2c070 20 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72     assert( pCrsr
2c080 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2c090 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 70  ite3BtreeFirst(p
2c0a0 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  Crsr, &res);.   
2c0b0 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2c0c0 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d  eto = 0;.    pC-
2c0d0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
2c0e0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a  ACHE_STALE;.  }.
2c0f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2c100 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2c110 6f 72 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f  or;.  pC->nullRo
2c120 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 61  w = (u8)res;.  a
2c130 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
2c140 20 26 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   && pOp->p2<p->n
2c150 4f 70 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e  Op );.  VdbeBran
2c160 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32  chTaken(res!=0,2
2c170 29 3b 0a 20 20 69 66 28 20 72 65 73 20 29 20 67  );.  if( res ) g
2c180 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
2c190 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2c1a0 70 63 6f 64 65 3a 20 4e 65 78 74 20 50 31 20 50  pcode: Next P1 P
2c1b0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
2c1c0 20 41 64 76 61 6e 63 65 20 63 75 72 73 6f 72 20   Advance cursor 
2c1d0 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  P1 so that it po
2c1e0 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74  ints to the next
2c1f0 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 69   key/data pair i
2c200 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f  n its.** table o
2c210 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  r index.  If the
2c220 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6b  re are no more k
2c230 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74  ey/value pairs t
2c240 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
2c250 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  .** to the follo
2c260 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  wing instruction
2c270 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 63 75  .  But if the cu
2c280 72 73 6f 72 20 61 64 76 61 6e 63 65 20 77 61 73  rsor advance was
2c290 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
2c2a0 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
2c2b0 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68   to P2..**.** Th
2c2c0 65 20 4e 65 78 74 20 6f 70 63 6f 64 65 20 69 73  e Next opcode is
2c2d0 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 6c 6c   only valid foll
2c2e0 6f 77 69 6e 67 20 61 6e 20 53 65 65 6b 47 54 2c  owing an SeekGT,
2c2f0 20 53 65 65 6b 47 45 2c 20 6f 72 0a 2a 2a 20 4f   SeekGE, or.** O
2c300 50 5f 52 65 77 69 6e 64 20 6f 70 63 6f 64 65 20  P_Rewind opcode 
2c310 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
2c320 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 4e 65   the cursor.  Ne
2c330 78 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  xt is not allowe
2c340 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53  d.** to follow S
2c350 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f  eekLT, SeekLE, o
2c360 72 20 4f 50 5f 4c 61 73 74 2e 0a 2a 2a 0a 2a 2a  r OP_Last..**.**
2c370 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
2c380 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61  ust be for a rea
2c390 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70  l table, not a p
2c3a0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 50 31  seudo-table.  P1
2c3b0 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 62 65   must have.** be
2c3c0 65 6e 20 6f 70 65 6e 65 64 20 70 72 69 6f 72 20  en opened prior 
2c3d0 74 6f 20 74 68 69 73 20 6f 70 63 6f 64 65 20 6f  to this opcode o
2c3e0 72 20 74 68 65 20 70 72 6f 67 72 61 6d 20 77 69  r the program wi
2c3f0 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 2a 2a 0a  ll segfault..**.
2c400 2a 2a 20 54 68 65 20 50 33 20 76 61 6c 75 65 20  ** The P3 value 
2c410 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
2c420 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2c430 61 74 69 6f 6e 2e 20 49 66 20 50 33 3d 3d 31 2c  ation. If P3==1,
2c440 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 50   that.** means P
2c450 31 20 69 73 20 61 6e 20 53 51 4c 20 69 6e 64 65  1 is an SQL inde
2c460 78 20 61 6e 64 20 74 68 61 74 20 74 68 69 73 20  x and that this 
2c470 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 75 6c  instruction coul
2c480 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6f  d have been.** o
2c490 6d 69 74 74 65 64 20 69 66 20 74 68 61 74 20 69  mitted if that i
2c4a0 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 75 6e  ndex had been un
2c4b0 69 71 75 65 2e 20 20 50 33 20 69 73 20 75 73 75  ique.  P3 is usu
2c4c0 61 6c 6c 79 20 30 2e 20 20 50 33 20 69 73 0a 2a  ally 0.  P3 is.*
2c4d0 2a 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  * always either 
2c4e0 30 20 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34  0 or 1..**.** P4
2c4f0 20 69 73 20 61 6c 77 61 79 73 20 6f 66 20 74 79   is always of ty
2c500 70 65 20 50 34 5f 41 44 56 41 4e 43 45 2e 20 54  pe P4_ADVANCE. T
2c510 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
2c520 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
2c530 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c540 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35  t()..**.** If P5
2c550 20 69 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64   is positive and
2c560 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
2c570 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63  en, then event c
2c580 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72  ounter.** number
2c590 20 50 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65   P5-1 in the pre
2c5a0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
2c5b0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
2c5c0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
2c5d0 50 72 65 76 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  Prev.*/./* Opcod
2c5e0 65 3a 20 50 72 65 76 20 50 31 20 50 32 20 50 33  e: Prev P1 P2 P3
2c5f0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61 63   P4 P5.**.** Bac
2c600 6b 20 75 70 20 63 75 72 73 6f 72 20 50 31 20 73  k up cursor P1 s
2c610 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
2c620 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2c630 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 69   key/data pair i
2c640 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f  n its.** table o
2c650 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  r index.  If the
2c660 72 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f 75  re is no previou
2c670 73 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72  s key/value pair
2c680 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  s then fall thro
2c690 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f  ugh.** to the fo
2c6a0 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74  llowing instruct
2c6b0 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65  ion.  But if the
2c6c0 20 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20 77   cursor backup w
2c6d0 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  as successful,.*
2c6e0 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  * jump immediate
2c6f0 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 0a  ly to P2..**.**.
2c700 2a 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63 6f  ** The Prev opco
2c710 64 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64  de is only valid
2c720 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65   following an Se
2c730 65 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72  ekLT, SeekLE, or
2c740 0a 2a 2a 20 4f 50 5f 4c 61 73 74 20 6f 70 63 6f  .** OP_Last opco
2c750 64 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  de used to posit
2c760 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ion the cursor. 
2c770 20 50 72 65 76 20 69 73 20 6e 6f 74 20 61 6c 6c   Prev is not all
2c780 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f  owed.** to follo
2c790 77 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45  w SeekGT, SeekGE
2c7a0 2c 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2e 0a  , or OP_Rewind..
2c7b0 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72  **.** The P1 cur
2c7c0 73 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20  sor must be for 
2c7d0 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f  a real table, no
2c7e0 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  t a pseudo-table
2c7f0 2e 20 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 6e  .  If P1 is.** n
2c800 6f 74 20 6f 70 65 6e 20 74 68 65 6e 20 74 68 65  ot open then the
2c810 20 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64   behavior is und
2c820 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
2c830 65 20 50 33 20 76 61 6c 75 65 20 69 73 20 61 20  e P3 value is a 
2c840 68 69 6e 74 20 74 6f 20 74 68 65 20 62 74 72 65  hint to the btre
2c850 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2c860 2e 20 49 66 20 50 33 3d 3d 31 2c 20 74 68 61 74  . If P3==1, that
2c870 0a 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69 73 20  .** means P1 is 
2c880 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2c890 20 74 68 61 74 20 74 68 69 73 20 69 6e 73 74 72   that this instr
2c8a0 75 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76  uction could hav
2c8b0 65 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65  e been.** omitte
2c8c0 64 20 69 66 20 74 68 61 74 20 69 6e 64 65 78 20  d if that index 
2c8d0 68 61 64 20 62 65 65 6e 20 75 6e 69 71 75 65 2e  had been unique.
2c8e0 20 20 50 33 20 69 73 20 75 73 75 61 6c 6c 79 20    P3 is usually 
2c8f0 30 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77  0.  P3 is.** alw
2c900 61 79 73 20 65 69 74 68 65 72 20 30 20 6f 72 20  ays either 0 or 
2c910 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  1..**.** P4 is a
2c920 6c 77 61 79 73 20 6f 66 20 74 79 70 65 20 50 34  lways of type P4
2c930 5f 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66 75  _ADVANCE. The fu
2c940 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70  nction pointer p
2c950 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  oints to.** sqli
2c960 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2c970 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  ()..**.** If P5 
2c980 69 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20  is positive and 
2c990 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
2c9a0 6e 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f  n, then event co
2c9b0 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  unter.** number 
2c9c0 50 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70  P5-1 in the prep
2c9d0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69  ared statement i
2c9e0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
2c9f0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  /./* Opcode: Sor
2ca00 74 65 72 4e 65 78 74 20 50 31 20 50 32 20 2a 20  terNext P1 P2 * 
2ca10 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  * P5.**.** This 
2ca20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73  opcode works jus
2ca30 74 20 6c 69 6b 65 20 4f 50 5f 4e 65 78 74 20 65  t like OP_Next e
2ca40 78 63 65 70 74 20 74 68 61 74 20 50 31 20 6d 75  xcept that P1 mu
2ca50 73 74 20 62 65 20 61 0a 2a 2a 20 73 6f 72 74 65  st be a.** sorte
2ca60 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 77 68 69  r object for whi
2ca70 63 68 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  ch the OP_Sorter
2ca80 53 6f 72 74 20 6f 70 63 6f 64 65 20 68 61 73 20  Sort opcode has 
2ca90 62 65 65 6e 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e  been.** invoked.
2caa0 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 61 64    This opcode ad
2cab0 76 61 6e 63 65 73 20 74 68 65 20 63 75 72 73 6f  vances the curso
2cac0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 6f  r to the next so
2cad0 72 74 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2c 20  rted.** record, 
2cae0 6f 72 20 6a 75 6d 70 73 20 74 6f 20 50 32 20 69  or jumps to P2 i
2caf0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
2cb00 6f 72 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72  ore sorted recor
2cb10 64 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ds..*/.case OP_S
2cb20 6f 72 74 65 72 4e 65 78 74 3a 20 7b 20 20 2f 2a  orterNext: {  /*
2cb30 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43   jump */.  VdbeC
2cb40 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 70 43  ursor *pC;..  pC
2cb50 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2cb60 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2cb70 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a  isSorter(pC) );.
2cb80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
2cb90 62 65 53 6f 72 74 65 72 4e 65 78 74 28 64 62 2c  beSorterNext(db,
2cba0 20 70 43 29 3b 0a 20 20 67 6f 74 6f 20 6e 65 78   pC);.  goto nex
2cbb0 74 5f 74 61 69 6c 3b 0a 63 61 73 65 20 4f 50 5f  t_tail;.case OP_
2cbc0 50 72 65 76 3a 20 20 20 20 20 20 20 20 20 20 2f  Prev:          /
2cbd0 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f  * jump */.case O
2cbe0 50 5f 4e 65 78 74 3a 20 20 20 20 20 20 20 20 20  P_Next:         
2cbf0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73   /* jump */.  as
2cc00 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2cc10 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2cc20 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
2cc30 72 74 28 20 70 4f 70 2d 3e 70 35 3c 41 72 72 61  rt( pOp->p5<Arra
2cc40 79 53 69 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65  ySize(p->aCounte
2cc50 72 29 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  r) );.  pC = p->
2cc60 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
2cc70 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
2cc80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2cc90 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
2cca0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2ccb0 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
2ccc0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
2ccd0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2cce0 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c  code!=OP_Next ||
2ccf0 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
2cd00 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 4e  e==sqlite3BtreeN
2cd10 65 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ext );.  assert(
2cd20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
2cd30 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d 3e 70 34  _Prev || pOp->p4
2cd40 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74  .xAdvance==sqlit
2cd50 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 20  e3BtreePrevious 
2cd60 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4e 65 78  );..  /* The Nex
2cd70 74 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79  t opcode is only
2cd80 20 75 73 65 64 20 61 66 74 65 72 20 53 65 65 6b   used after Seek
2cd90 47 54 2c 20 53 65 65 6b 47 45 2c 20 52 65 77 69  GT, SeekGE, Rewi
2cda0 6e 64 2c 20 61 6e 64 20 46 6f 75 6e 64 2e 0a 20  nd, and Found.. 
2cdb0 20 2a 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63   ** The Prev opc
2cdc0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ode is only used
2cdd0 20 61 66 74 65 72 20 53 65 65 6b 4c 54 2c 20 53   after SeekLT, S
2cde0 65 65 6b 4c 45 2c 20 61 6e 64 20 4c 61 73 74 2e  eekLE, and Last.
2cdf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
2ce00 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65  p->opcode!=OP_Ne
2ce10 78 74 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 2d  xt.       || pC-
2ce20 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b  >seekOp==OP_Seek
2ce30 47 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70  GT || pC->seekOp
2ce40 3d 3d 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20  ==OP_SeekGE.    
2ce50 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70     || pC->seekOp
2ce60 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 7c 7c 20 70  ==OP_Rewind || p
2ce70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 46 6f  C->seekOp==OP_Fo
2ce80 75 6e 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  und .       || p
2ce90 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4e 75  C->seekOp==OP_Nu
2cea0 6c 6c 52 6f 77 7c 7c 20 70 43 2d 3e 73 65 65 6b  llRow|| pC->seek
2ceb0 4f 70 3d 3d 4f 50 5f 53 65 65 6b 52 6f 77 69 64  Op==OP_SeekRowid
2cec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
2ced0 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65  ->opcode!=OP_Pre
2cee0 76 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e  v.       || pC->
2cef0 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  seekOp==OP_SeekL
2cf00 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d  T || pC->seekOp=
2cf10 3d 4f 50 5f 53 65 65 6b 4c 45 0a 20 20 20 20 20  =OP_SeekLE.     
2cf20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d    || pC->seekOp=
2cf30 3d 4f 50 5f 4c 61 73 74 20 0a 20 20 20 20 20 20  =OP_Last .      
2cf40 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d   || pC->seekOp==
2cf50 4f 50 5f 4e 75 6c 6c 52 6f 77 29 3b 0a 0a 20 20  OP_NullRow);..  
2cf60 72 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 78 41 64  rc = pOp->p4.xAd
2cf70 76 61 6e 63 65 28 70 43 2d 3e 75 63 2e 70 43 75  vance(pC->uc.pCu
2cf80 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a  rsor, pOp->p3);.
2cf90 6e 65 78 74 5f 74 61 69 6c 3a 0a 20 20 70 43 2d  next_tail:.  pC-
2cfa0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
2cfb0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 56 64  ACHE_STALE;.  Vd
2cfc0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 63  beBranchTaken(rc
2cfd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2c 32 29 3b 0a  ==SQLITE_OK,2);.
2cfe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 2d 3e 6e  _OK ){.    pC->n
2d000 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ullRow = 0;.    
2d010 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 70 4f 70 2d  p->aCounter[pOp-
2d020 3e 70 35 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53  >p5]++;.#ifdef S
2d030 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
2d040 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
2d050 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
2d060 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
2d070 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f  2_and_check_for_
2d080 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20  interrupt;.  }. 
2d090 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d0a0 44 4f 4e 45 20 29 20 67 6f 74 6f 20 61 62 6f 72  DONE ) goto abor
2d0b0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2d0c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d0d0 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
2d0e0 3d 20 31 3b 0a 20 20 67 6f 74 6f 20 63 68 65 63  = 1;.  goto chec
2d0f0 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b  k_for_interrupt;
2d100 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
2d110 64 78 49 6e 73 65 72 74 20 50 31 20 50 32 20 50  dxInsert P1 P2 P
2d120 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
2d130 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a  sis: key=r[P2].*
2d140 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 32  *.** Register P2
2d150 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e   holds an SQL in
2d160 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75 73 69  dex key made usi
2d170 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65  ng the.** MakeRe
2d180 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  cord instruction
2d190 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20  s.  This opcode 
2d1a0 77 72 69 74 65 73 20 74 68 61 74 20 6b 65 79 0a  writes that key.
2d1b0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 65  ** into the inde
2d1c0 78 20 50 31 2e 20 20 44 61 74 61 20 66 6f 72 20  x P1.  Data for 
2d1d0 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e 69 6c  the entry is nil
2d1e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73  ..**.** If P4 is
2d1f0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
2d200 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  it is the number
2d210 20 6f 66 20 76 61 6c 75 65 73 20 69 6e 20 74 68   of values in th
2d220 65 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 6b 65  e unpacked.** ke
2d230 79 20 6f 66 20 72 65 67 28 50 32 29 2e 20 20 49  y of reg(P2).  I
2d240 6e 20 74 68 61 74 20 63 61 73 65 2c 20 50 33 20  n that case, P3 
2d250 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
2d260 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
2d270 65 72 0a 2a 2a 20 66 6f 72 20 74 68 65 20 75 6e  er.** for the un
2d280 70 61 63 6b 65 64 20 6b 65 79 2e 20 20 54 68 65  packed key.  The
2d290 20 61 76 61 69 6c 61 62 69 6c 69 74 79 20 6f 66   availability of
2d2a0 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 6b 65   the unpacked ke
2d2b0 79 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 0a  y can sometimes.
2d2c0 2a 2a 20 62 65 20 61 6e 20 6f 70 74 69 6d 69 7a  ** be an optimiz
2d2d0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
2d2e0 50 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c 41  P5 has the OPFLA
2d2f0 47 5f 41 50 50 45 4e 44 20 62 69 74 20 73 65 74  G_APPEND bit set
2d300 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74  , that is a hint
2d310 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c   to the b-tree l
2d320 61 79 65 72 0a 2a 2a 20 74 68 61 74 20 74 68 69  ayer.** that thi
2d330 73 20 69 6e 73 65 72 74 20 69 73 20 6c 69 6b 65  s insert is like
2d340 6c 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65  ly to be an appe
2d350 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  nd..**.** If P5 
2d360 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e  has the OPFLAG_N
2d370 43 48 41 4e 47 45 20 62 69 74 20 73 65 74 2c 20  CHANGE bit set, 
2d380 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20  then the change 
2d390 63 6f 75 6e 74 65 72 20 69 73 0a 2a 2a 20 69 6e  counter is.** in
2d3a0 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 69  cremented by thi
2d3b0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  s instruction.  
2d3c0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43  If the OPFLAG_NC
2d3d0 48 41 4e 47 45 20 62 69 74 20 69 73 20 63 6c 65  HANGE bit is cle
2d3e0 61 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ar,.** then the 
2d3f0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69  change counter i
2d400 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  s unchanged..**.
2d410 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
2d420 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66  _USESEEKRESULT f
2d430 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74  lag of P5 is set
2d440 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
2d450 74 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a 20 72 75  tion might.** ru
2d460 6e 20 66 61 73 74 65 72 20 62 79 20 61 76 6f 69  n faster by avoi
2d470 64 69 6e 67 20 61 6e 20 75 6e 6e 65 63 65 73 73  ding an unnecess
2d480 61 72 79 20 73 65 65 6b 20 6f 6e 20 63 75 72 73  ary seek on curs
2d490 6f 72 20 50 31 2e 20 20 48 6f 77 65 76 65 72 2c  or P1.  However,
2d4a0 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f 55  .** the OPFLAG_U
2d4b0 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61  SESEEKRESULT fla
2d4c0 67 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 73  g must only be s
2d4d0 65 74 20 69 66 20 74 68 65 72 65 20 68 61 76 65  et if there have
2d4e0 20 62 65 65 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a   been no prior.*
2d4f0 2a 20 73 65 65 6b 73 20 6f 6e 20 74 68 65 20 63  * seeks on the c
2d500 75 72 73 6f 72 20 6f 72 20 69 66 20 74 68 65 20  ursor or if the 
2d510 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 65 65 6b  most recent seek
2d520 20 75 73 65 64 20 61 20 6b 65 79 20 65 71 75 69   used a key equi
2d530 76 61 6c 65 6e 74 0a 2a 2a 20 74 6f 20 50 32 2e  valent.** to P2.
2d540 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73   .**.** This ins
2d550 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f  truction only wo
2d560 72 6b 73 20 66 6f 72 20 69 6e 64 69 63 65 73 2e  rks for indices.
2d570 20 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74    The equivalent
2d580 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
2d590 66 6f 72 20 74 61 62 6c 65 73 20 69 73 20 4f 50  for tables is OP
2d5a0 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f  _Insert..*/./* O
2d5b0 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 49 6e 73  pcode: SorterIns
2d5c0 65 72 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ert P1 P2 * * *.
2d5d0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2d5e0 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67  =r[P2].**.** Reg
2d5f0 69 73 74 65 72 20 50 32 20 68 6f 6c 64 73 20 61  ister P2 holds a
2d600 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79 20  n SQL index key 
2d610 6d 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a 2a  made using the.*
2d620 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73  * MakeRecord ins
2d630 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  tructions.  This
2d640 20 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20 74   opcode writes t
2d650 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20  hat key.** into 
2d660 74 68 65 20 73 6f 72 74 65 72 20 50 31 2e 20 20  the sorter P1.  
2d670 44 61 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74  Data for the ent
2d680 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2f 0a 63 61  ry is nil..*/.ca
2d690 73 65 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  se OP_SorterInse
2d6a0 72 74 3a 20 20 20 20 20 20 20 2f 2a 20 69 6e 32  rt:       /* in2
2d6b0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 49   */.case OP_IdxI
2d6c0 6e 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20 20  nsert: {        
2d6d0 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65  /* in2 */.  Vdbe
2d6e0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
2d6f0 72 65 65 50 61 79 6c 6f 61 64 20 78 3b 0a 0a 20  reePayload x;.. 
2d700 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2d710 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2d720 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
2d730 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2d740 2d 3e 70 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ->p1];.  sqlite3
2d750 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75  VdbeIncrWriteCou
2d760 6e 74 65 72 28 70 2c 20 70 43 29 3b 0a 20 20 61  nter(p, pC);.  a
2d770 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
2d780 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74    assert( isSort
2d790 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70  er(pC)==(pOp->op
2d7a0 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49  code==OP_SorterI
2d7b0 6e 73 65 72 74 29 20 29 3b 0a 20 20 70 49 6e 32  nsert) );.  pIn2
2d7c0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
2d7d0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
2d7e0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  2->flags & MEM_B
2d7f0 6c 6f 62 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  lob );.  if( pOp
2d800 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43  ->p5 & OPFLAG_NC
2d810 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e  HANGE ) p->nChan
2d820 67 65 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  ge++;.  assert( 
2d830 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
2d840 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20 70  RTYPE_BTREE || p
2d850 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
2d860 6f 72 74 65 72 49 6e 73 65 72 74 20 29 3b 0a 20  orterInsert );. 
2d870 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54   assert( pC->isT
2d880 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 72 63 20  able==0 );.  rc 
2d890 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  = ExpandBlob(pIn
2d8a0 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  2);.  if( rc ) g
2d8b0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2d8c0 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 4f  _error;.  if( pO
2d8d0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f  p->opcode==OP_So
2d8e0 72 74 65 72 49 6e 73 65 72 74 20 29 7b 0a 20 20  rterInsert ){.  
2d8f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
2d900 62 65 53 6f 72 74 65 72 57 72 69 74 65 28 70 43  beSorterWrite(pC
2d910 2c 20 70 49 6e 32 29 3b 0a 20 20 7d 65 6c 73 65  , pIn2);.  }else
2d920 7b 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70  {.    x.nKey = p
2d930 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 78 2e 70 4b  In2->n;.    x.pK
2d940 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20 20  ey = pIn2->z;.  
2d950 20 20 78 2e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20    x.aMem = aMem 
2d960 2b 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 78  + pOp->p3;.    x
2d970 2e 6e 4d 65 6d 20 3d 20 28 75 31 36 29 70 4f 70  .nMem = (u16)pOp
2d980 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72 63 20 3d  ->p4.i;.    rc =
2d990 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
2d9a0 65 72 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ert(pC->uc.pCurs
2d9b0 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20 20 20 20  or, &x,.        
2d9c0 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46   (pOp->p5 & (OPF
2d9d0 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41  LAG_APPEND|OPFLA
2d9e0 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 29  G_SAVEPOSITION))
2d9f0 2c 20 0a 20 20 20 20 20 20 20 20 28 28 70 4f 70  , .        ((pOp
2da00 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53  ->p5 & OPFLAG_US
2da10 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70  ESEEKRESULT) ? p
2da20 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20  C->seekResult : 
2da30 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
2da40 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
2da50 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
2da60 29 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  );.    pC->cache
2da70 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
2da80 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TALE;.  }.  if( 
2da90 72 63 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  rc) goto abort_d
2daa0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
2dab0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2dac0 64 65 3a 20 49 64 78 44 65 6c 65 74 65 20 50 31  de: IdxDelete P1
2dad0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
2dae0 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32  nopsis: key=r[P2
2daf0 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  @P3].**.** The c
2db00 6f 6e 74 65 6e 74 20 6f 66 20 50 33 20 72 65 67  ontent of P3 reg
2db10 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
2db20 61 74 20 72 65 67 69 73 74 65 72 20 50 32 20 66  at register P2 f
2db30 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70 61 63 6b  orm.** an unpack
2db40 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 54 68  ed index key. Th
2db50 69 73 20 6f 70 63 6f 64 65 20 72 65 6d 6f 76 65  is opcode remove
2db60 73 20 74 68 61 74 20 65 6e 74 72 79 20 66 72 6f  s that entry fro
2db70 6d 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20  m the .** index 
2db80 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73 6f 72  opened by cursor
2db90 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P1..*/.case OP_
2dba0 49 64 78 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56  IdxDelete: {.  V
2dbb0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
2dbc0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
2dbd0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55  ;.  int res;.  U
2dbe0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b  npackedRecord r;
2dbf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
2dc00 3e 70 33 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  >p3>0 );.  asser
2dc10 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20  t( pOp->p2>0 && 
2dc20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 3c  pOp->p2+pOp->p3<
2dc30 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
2dc40 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20  >nCursor)+1 );. 
2dc50 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2dc60 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2dc70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
2dc80 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2dc90 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2dca0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
2dcb0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2dcc0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2dcd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2dce0 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72  IncrWriteCounter
2dcf0 28 70 2c 20 70 43 29 3b 0a 20 20 70 43 72 73 72  (p, pC);.  pCrsr
2dd00 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
2dd10 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72  r;.  assert( pCr
2dd20 73 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  sr!=0 );.  asser
2dd30 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b  t( pOp->p5==0 );
2dd40 0a 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20  .  r.pKeyInfo = 
2dd50 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  pC->pKeyInfo;.  
2dd60 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  r.nField = (u16)
2dd70 70 4f 70 2d 3e 70 33 3b 0a 20 20 72 2e 64 65 66  pOp->p3;.  r.def
2dd80 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 72  ault_rc = 0;.  r
2dd90 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f  .aMem = &aMem[pO
2dda0 70 2d 3e 70 32 5d 3b 0a 20 20 72 63 20 3d 20 73  p->p2];.  rc = s
2ddb0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2ddc0 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c  oUnpacked(pCrsr,
2ddd0 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29   &r, 0, 0, &res)
2dde0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2ddf0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
2de00 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 3d  rror;.  if( res=
2de10 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
2de20 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
2de30 65 28 70 43 72 73 72 2c 20 42 54 52 45 45 5f 41  e(pCrsr, BTREE_A
2de40 55 58 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 69  UXDELETE);.    i
2de50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
2de60 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2de70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2de80 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
2de90 6f 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 63 61  o==0 );.  pC->ca
2dea0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
2deb0 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 73  E_STALE;.  pC->s
2dec0 65 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20  eekResult = 0;. 
2ded0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2dee0 63 6f 64 65 3a 20 44 65 66 65 72 72 65 64 53 65  code: DeferredSe
2def0 65 6b 20 50 31 20 2a 20 50 33 20 50 34 20 2a 0a  ek P1 * P3 P4 *.
2df00 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 4d 6f 76  ** Synopsis: Mov
2df10 65 20 50 33 20 74 6f 20 50 31 2e 72 6f 77 69 64  e P3 to P1.rowid
2df20 20 69 66 20 6e 65 65 64 65 64 0a 2a 2a 0a 2a 2a   if needed.**.**
2df30 20 50 31 20 69 73 20 61 6e 20 6f 70 65 6e 20 69   P1 is an open i
2df40 6e 64 65 78 20 63 75 72 73 6f 72 20 61 6e 64 20  ndex cursor and 
2df50 50 33 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f  P3 is a cursor o
2df60 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
2df70 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54  ing.** table.  T
2df80 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
2df90 61 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 20  a deferred seek 
2dfa0 6f 66 20 74 68 65 20 50 33 20 74 61 62 6c 65 20  of the P3 table 
2dfb0 63 75 72 73 6f 72 0a 2a 2a 20 74 6f 20 74 68 65  cursor.** to the
2dfc0 20 72 6f 77 20 74 68 61 74 20 63 6f 72 72 65 73   row that corres
2dfd0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 63 75 72  ponds to the cur
2dfe0 72 65 6e 74 20 72 6f 77 20 6f 66 20 50 31 2e 0a  rent row of P1..
2dff0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
2e000 64 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20 20  deferred seek.  
2e010 4e 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c 79  Nothing actually
2e020 20 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a   happens until.*
2e030 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
2e040 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 72  used to read a r
2e050 65 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61 79  ecord.  That way
2e060 2c 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a  , if no reads.**
2e070 20 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63   occur, no unnec
2e080 65 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70 65  essary I/O happe
2e090 6e 73 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79  ns..**.** P4 may
2e0a0 20 62 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20   be an array of 
2e0b0 69 6e 74 65 67 65 72 73 20 28 74 79 70 65 20 50  integers (type P
2e0c0 34 5f 49 4e 54 41 52 52 41 59 29 20 63 6f 6e 74  4_INTARRAY) cont
2e0d0 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6e  aining.** one en
2e0e0 74 72 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  try for each col
2e0f0 75 6d 6e 20 69 6e 20 74 68 65 20 50 33 20 74 61  umn in the P3 ta
2e100 62 6c 65 2e 20 20 49 66 20 61 72 72 61 79 20 65  ble.  If array e
2e110 6e 74 72 79 20 61 28 69 29 0a 2a 2a 20 69 73 20  ntry a(i).** is 
2e120 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72  non-zero, then r
2e130 65 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 28  eading column a(
2e140 69 29 2d 31 20 66 72 6f 6d 20 63 75 72 73 6f 72  i)-1 from cursor
2e150 20 50 33 20 69 73 20 0a 2a 2a 20 65 71 75 69 76   P3 is .** equiv
2e160 61 6c 65 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  alent to perform
2e170 69 6e 67 20 74 68 65 20 64 65 66 65 72 72 65 64  ing the deferred
2e180 20 73 65 65 6b 20 61 6e 64 20 74 68 65 6e 20 72   seek and then r
2e190 65 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 20  eading column i 
2e1a0 0a 2a 2a 20 66 72 6f 6d 20 50 31 2e 20 20 54 68  .** from P1.  Th
2e1b0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2e1c0 73 20 73 74 6f 72 65 64 20 69 6e 20 50 33 20 61  s stored in P3 a
2e1d0 6e 64 20 75 73 65 64 20 74 6f 20 72 65 64 69 72  nd used to redir
2e1e0 65 63 74 0a 2a 2a 20 72 65 61 64 73 20 61 67 61  ect.** reads aga
2e1f0 69 6e 73 74 20 50 33 20 6f 76 65 72 20 74 6f 20  inst P3 over to 
2e200 50 31 2c 20 74 68 75 73 20 70 6f 73 73 69 62 6c  P1, thus possibl
2e210 79 20 61 76 6f 69 64 69 6e 67 20 74 68 65 20 6e  y avoiding the n
2e220 65 65 64 20 74 6f 0a 2a 2a 20 73 65 65 6b 20 61  eed to.** seek a
2e230 6e 64 20 72 65 61 64 20 63 75 72 73 6f 72 20 50  nd read cursor P
2e240 33 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  3..*/./* Opcode:
2e250 20 49 64 78 52 6f 77 69 64 20 50 31 20 50 32 20   IdxRowid P1 P2 
2e260 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
2e270 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a  s: r[P2]=rowid.*
2e280 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20  *.** Write into 
2e290 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69  register P2 an i
2e2a0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
2e2b0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2e2c0 6e 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 0a  n the record at.
2e2d0 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
2e2e0 65 20 69 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e  e index key poin
2e2f0 74 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72  ted to by cursor
2e300 20 50 31 2e 20 20 54 68 69 73 20 69 6e 74 65 67   P1.  This integ
2e310 65 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  er should be.** 
2e320 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
2e330 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74 6f 20   table entry to 
2e340 77 68 69 63 68 20 74 68 69 73 20 69 6e 64 65 78  which this index
2e350 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a   entry points..*
2e360 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52  *.** See also: R
2e370 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64  owid, MakeRecord
2e380 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 66  ..*/.case OP_Def
2e390 65 72 72 65 64 53 65 65 6b 3a 0a 63 61 73 65 20  erredSeek:.case 
2e3a0 4f 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b 20 20  OP_IdxRowid: {  
2e3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
2e3c0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
2e3d0 20 2a 70 43 3b 20 20 20 20 20 20 20 20 20 20 20   *pC;           
2e3e0 20 20 2f 2a 20 54 68 65 20 50 31 20 69 6e 64 65    /* The P1 inde
2e3f0 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64  x cursor */.  Vd
2e400 62 65 43 75 72 73 6f 72 20 2a 70 54 61 62 43 75  beCursor *pTabCu
2e410 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r;        /* The
2e420 20 50 32 20 74 61 62 6c 65 20 63 75 72 73 6f 72   P2 table cursor
2e430 20 28 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65   (OP_DeferredSee
2e440 6b 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 69 36 34  k only) */.  i64
2e450 20 72 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20   rowid;         
2e460 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2e470 64 20 74 68 61 74 20 50 31 20 63 75 72 72 65 6e  d that P1 curren
2e480 74 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 0a  t points to */..
2e490 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2e4a0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2e4b0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
2e4c0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
2e4d0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2e4e0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
2e4f0 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
2e500 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
2e510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2e520 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
2e530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2e540 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  >isTable==0 );. 
2e550 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
2e560 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
2e570 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 2d  ;.  assert( !pC-
2e580 3e 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70 4f 70 2d  >nullRow || pOp-
2e590 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52  >opcode==OP_IdxR
2e5a0 6f 77 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  owid );..  /* Th
2e5b0 65 20 49 64 78 52 6f 77 69 64 20 61 6e 64 20 53  e IdxRowid and S
2e5c0 65 65 6b 20 6f 70 63 6f 64 65 73 20 61 72 65 20  eek opcodes are 
2e5d0 63 6f 6d 62 69 6e 65 64 20 62 65 63 61 75 73 65  combined because
2e5e0 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 61 6c   of the commonal
2e5f0 69 74 79 0a 20 20 2a 2a 20 6f 66 20 73 71 6c 69  ity.  ** of sqli
2e600 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73  te3VdbeCursorRes
2e610 74 6f 72 65 28 29 20 61 6e 64 20 73 71 6c 69 74  tore() and sqlit
2e620 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 29  e3VdbeIdxRowid()
2e630 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
2e640 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73  te3VdbeCursorRes
2e650 74 6f 72 65 28 70 43 29 3b 0a 0a 20 20 2f 2a 20  tore(pC);..  /* 
2e660 73 71 6c 69 74 65 33 56 62 65 43 75 72 73 6f 72  sqlite3VbeCursor
2e670 52 65 73 74 6f 72 65 28 29 20 63 61 6e 20 6f 6e  Restore() can on
2e680 6c 79 20 66 61 69 6c 20 69 66 20 74 68 65 20 72  ly fail if the r
2e690 65 63 6f 72 64 20 68 61 73 20 62 65 65 6e 20 64  ecord has been d
2e6a0 65 6c 65 74 65 64 0a 20 20 2a 2a 20 6f 75 74 20  eleted.  ** out 
2e6b0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
2e6c0 75 72 73 6f 72 2e 20 20 54 68 61 74 20 77 69 6c  ursor.  That wil
2e6d0 6c 20 6e 65 76 65 72 20 68 61 70 70 65 6e 73 20  l never happens 
2e6e0 66 6f 72 20 61 6e 20 49 64 78 52 6f 77 69 64 0a  for an IdxRowid.
2e6f0 20 20 2a 2a 20 6f 72 20 53 65 65 6b 20 6f 70 63    ** or Seek opc
2e700 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ode */.  if( NEV
2e710 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  ER(rc!=SQLITE_OK
2e720 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
2e730 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20  ue_to_error;..  
2e740 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77  if( !pC->nullRow
2e750 20 29 7b 0a 20 20 20 20 72 6f 77 69 64 20 3d 20   ){.    rowid = 
2e760 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65  0;  /* Not neede
2e770 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f  d.  Only used to
2e780 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69   silence a warni
2e790 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
2e7a0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
2e7b0 77 69 64 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70  wid(db, pC->uc.p
2e7c0 43 75 72 73 6f 72 2c 20 26 72 6f 77 69 64 29 3b  Cursor, &rowid);
2e7d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2e7e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e7f0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2e800 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  o_error;.    }. 
2e810 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
2e820 64 65 3d 3d 4f 50 5f 44 65 66 65 72 72 65 64 53  de==OP_DeferredS
2e830 65 65 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eek ){.      ass
2e840 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20  ert( pOp->p3>=0 
2e850 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 43  && pOp->p3<p->nC
2e860 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 70  ursor );.      p
2e870 54 61 62 43 75 72 20 3d 20 70 2d 3e 61 70 43 73  TabCur = p->apCs
2e880 72 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20  r[pOp->p3];.    
2e890 20 20 61 73 73 65 72 74 28 20 70 54 61 62 43 75    assert( pTabCu
2e8a0 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  r!=0 );.      as
2e8b0 73 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e 65  sert( pTabCur->e
2e8c0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2e8d0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
2e8e0 61 73 73 65 72 74 28 20 70 54 61 62 43 75 72 2d  assert( pTabCur-
2e8f0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
2e900 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e910 70 54 61 62 43 75 72 2d 3e 69 73 54 61 62 6c 65  pTabCur->isTable
2e920 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75   );.      pTabCu
2e930 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  r->nullRow = 0;.
2e940 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 6d        pTabCur->m
2e950 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 72 6f  ovetoTarget = ro
2e960 77 69 64 3b 0a 20 20 20 20 20 20 70 54 61 62 43  wid;.      pTabC
2e970 75 72 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  ur->deferredMove
2e980 74 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  to = 1;.      as
2e990 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
2e9a0 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 7c  e==P4_INTARRAY |
2e9b0 7c 20 70 4f 70 2d 3e 70 34 2e 61 69 3d 3d 30 20  | pOp->p4.ai==0 
2e9c0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72  );.      pTabCur
2e9d0 2d 3e 61 41 6c 74 4d 61 70 20 3d 20 70 4f 70 2d  ->aAltMap = pOp-
2e9e0 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 70 54  >p4.ai;.      pT
2e9f0 61 62 43 75 72 2d 3e 70 41 6c 74 43 75 72 73 6f  abCur->pAltCurso
2ea00 72 20 3d 20 70 43 3b 0a 20 20 20 20 7d 65 6c 73  r = pC;.    }els
2ea10 65 7b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20  e{.      pOut = 
2ea20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
2ea30 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 70 4f  , pOp);.      pO
2ea40 75 74 2d 3e 75 2e 69 20 3d 20 72 6f 77 69 64 3b  ut->u.i = rowid;
2ea50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2ea60 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
2ea70 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52  >opcode==OP_IdxR
2ea80 6f 77 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  owid );.    sqli
2ea90 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
2eaa0 6c 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  l(&aMem[pOp->p2]
2eab0 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
2eac0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64  }../* Opcode: Id
2ead0 78 47 45 20 50 31 20 50 32 20 50 33 20 50 34 20  xGE P1 P2 P3 P4 
2eae0 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
2eaf0 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a  key=r[P3@P4].**.
2eb00 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74  ** The P4 regist
2eb10 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e  er values beginn
2eb20 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d  ing with P3 form
2eb30 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64   an unpacked ind
2eb40 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20  ex .** key that 
2eb50 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52  omits the PRIMAR
2eb60 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20  Y KEY.  Compare 
2eb70 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61  this key value a
2eb80 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78  gainst the index
2eb90 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20   .** that P1 is 
2eba0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2ebb0 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20  ng to, ignoring 
2ebc0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
2ebd0 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65  or ROWID .** fie
2ebe0 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  lds at the end..
2ebf0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
2ec00 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67  index entry is g
2ec10 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
2ec20 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
2ec30 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75  value.** then ju
2ec40 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72  mp to P2.  Other
2ec50 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
2ec60 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
2ec70 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  struction..*/./*
2ec80 20 4f 70 63 6f 64 65 3a 20 49 64 78 47 54 20 50   Opcode: IdxGT P
2ec90 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
2eca0 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
2ecb0 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68  [P3@P4].**.** Th
2ecc0 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61  e P4 register va
2ecd0 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  lues beginning w
2ece0 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75  ith P3 form an u
2ecf0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a  npacked index .*
2ed00 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73  * key that omits
2ed10 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2ed20 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20  .  Compare this 
2ed30 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73  key value agains
2ed40 74 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  t the index .** 
2ed50 74 68 61 74 20 50 31 20 69 73 20 63 75 72 72 65  that P1 is curre
2ed60 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
2ed70 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50  , ignoring the P
2ed80 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 52 4f  RIMARY KEY or RO
2ed90 57 49 44 20 0a 2a 2a 20 66 69 65 6c 64 73 20 61  WID .** fields a
2eda0 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a  t the end..**.**
2edb0 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65 78   If the P1 index
2edc0 20 65 6e 74 72 79 20 69 73 20 67 72 65 61 74 65   entry is greate
2edd0 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76  r than the key v
2ede0 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d  alue.** then jum
2edf0 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77  p to P2.  Otherw
2ee00 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ise fall through
2ee10 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
2ee20 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  truction..*/./* 
2ee30 4f 70 63 6f 64 65 3a 20 49 64 78 4c 54 20 50 31  Opcode: IdxLT P1
2ee40 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
2ee50 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2ee60 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  P3@P4].**.** The
2ee70 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c   P4 register val
2ee80 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ues beginning wi
2ee90 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e  th P3 form an un
2eea0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a  packed index .**
2eeb0 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20   key that omits 
2eec0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
2eed0 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61  or ROWID.  Compa
2eee0 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75  re this key valu
2eef0 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  e against.** the
2ef00 20 69 6e 64 65 78 20 74 68 61 74 20 50 31 20 69   index that P1 i
2ef10 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2ef20 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e  ting to, ignorin
2ef30 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
2ef40 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e  Y or.** ROWID on
2ef50 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a   the P1 index..*
2ef60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69  *.** If the P1 i
2ef70 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c 65  ndex entry is le
2ef80 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20  ss than the key 
2ef90 76 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 20  value then jump 
2efa0 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77  to P2..** Otherw
2efb0 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ise fall through
2efc0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
2efd0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  truction..*/./* 
2efe0 4f 70 63 6f 64 65 3a 20 49 64 78 4c 45 20 50 31  Opcode: IdxLE P1
2eff0 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
2f000 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2f010 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  P3@P4].**.** The
2f020 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c   P4 register val
2f030 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ues beginning wi
2f040 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e  th P3 form an un
2f050 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a  packed index .**
2f060 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20   key that omits 
2f070 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
2f080 6f 72 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61  or ROWID.  Compa
2f090 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75  re this key valu
2f0a0 65 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  e against.** the
2f0b0 20 69 6e 64 65 78 20 74 68 61 74 20 50 31 20 69   index that P1 i
2f0c0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2f0d0 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e  ting to, ignorin
2f0e0 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
2f0f0 59 20 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e  Y or.** ROWID on
2f100 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a   the P1 index..*
2f110 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69  *.** If the P1 i
2f120 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c 65  ndex entry is le
2f130 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
2f140 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75   to the key valu
2f150 65 20 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74  e then jump.** t
2f160 6f 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 20  o P2. Otherwise 
2f170 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
2f180 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
2f190 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
2f1a0 5f 49 64 78 4c 45 3a 20 20 20 20 20 20 20 20 20  _IdxLE:         
2f1b0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65   /* jump */.case
2f1c0 20 4f 50 5f 49 64 78 47 54 3a 20 20 20 20 20 20   OP_IdxGT:      
2f1d0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
2f1e0 61 73 65 20 4f 50 5f 49 64 78 4c 54 3a 20 20 20  ase OP_IdxLT:   
2f1f0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
2f200 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 47 45 3a  /.case OP_IdxGE:
2f210 20 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d    {       /* jum
2f220 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
2f230 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73  r *pC;.  int res
2f240 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
2f250 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rd r;..  assert(
2f260 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
2f270 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
2f280 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
2f290 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
2f2a0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
2f2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2f2c0 69 73 4f 72 64 65 72 65 64 20 29 3b 0a 20 20 61  isOrdered );.  a
2f2d0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
2f2e0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
2f2f0 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EE );.  assert( 
2f300 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  pC->uc.pCursor!=
2f310 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  0);.  assert( pC
2f320 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
2f330 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2f340 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70   pOp->p5==0 || p
2f350 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20 61  Op->p5==1 );.  a
2f360 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
2f370 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
2f380 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
2f390 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72  C->pKeyInfo;.  r
2f3a0 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70  .nField = (u16)p
2f3b0 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 69 66 28 20  Op->p4.i;.  if( 
2f3c0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 4f 50 5f 49  pOp->opcode<OP_I
2f3d0 64 78 4c 54 20 29 7b 0a 20 20 20 20 61 73 73 65  dxLT ){.    asse
2f3e0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
2f3f0 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20 70 4f 70  =OP_IdxLE || pOp
2f400 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
2f410 47 54 20 29 3b 0a 20 20 20 20 72 2e 64 65 66 61  GT );.    r.defa
2f420 75 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a 20 20 7d  ult_rc = -1;.  }
2f430 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2f440 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2f450 50 5f 49 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e  P_IdxGE || pOp->
2f460 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54  opcode==OP_IdxLT
2f470 20 29 3b 0a 20 20 20 20 72 2e 64 65 66 61 75 6c   );.    r.defaul
2f480 74 5f 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  t_rc = 0;.  }.  
2f490 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70  r.aMem = &aMem[p
2f4a0 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20  Op->p3];.#ifdef 
2f4b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
2f4c0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2f4d0 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69  for(i=0; i<r.nFi
2f4e0 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
2f4f0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
2f500 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20  lid(&r.aMem[i]) 
2f510 29 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45  );.      REGISTE
2f520 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2b  R_TRACE(pOp->p3+
2f530 69 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  i, &aMem[pOp->p3
2f540 2b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  +i]);.    }.  }.
2f550 23 65 6e 64 69 66 0a 20 20 72 65 73 20 3d 20 30  #endif.  res = 0
2f560 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
2f570 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20  .  Only used to 
2f580 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e  silence a warnin
2f590 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  g. */.  rc = sql
2f5a0 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
2f5b0 6d 70 61 72 65 28 64 62 2c 20 70 43 2c 20 26 72  mpare(db, pC, &r
2f5c0 2c 20 26 72 65 73 29 3b 0a 20 20 61 73 73 65 72  , &res);.  asser
2f5d0 74 28 20 28 4f 50 5f 49 64 78 4c 45 26 31 29 3d  t( (OP_IdxLE&1)=
2f5e0 3d 28 4f 50 5f 49 64 78 4c 54 26 31 29 20 26 26  =(OP_IdxLT&1) &&
2f5f0 20 28 4f 50 5f 49 64 78 47 45 26 31 29 3d 3d 28   (OP_IdxGE&1)==(
2f600 4f 50 5f 49 64 78 47 54 26 31 29 20 29 3b 0a 20  OP_IdxGT&1) );. 
2f610 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64   if( (pOp->opcod
2f620 65 26 31 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26  e&1)==(OP_IdxLT&
2f630 31 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  1) ){.    assert
2f640 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2f650 50 5f 49 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e  P_IdxLE || pOp->
2f660 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54  opcode==OP_IdxLT
2f670 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 2d 72   );.    res = -r
2f680 65 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  es;.  }else{.   
2f690 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2f6a0 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c  code==OP_IdxGE |
2f6b0 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
2f6c0 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 72  P_IdxGT );.    r
2f6d0 65 73 2b 2b 3b 0a 20 20 7d 0a 20 20 56 64 62 65  es++;.  }.  Vdbe
2f6e0 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 3e  BranchTaken(res>
2f6f0 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29  0,2);.  if( rc )
2f700 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2f710 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  to_error;.  if( 
2f720 72 65 73 3e 30 20 29 20 67 6f 74 6f 20 6a 75 6d  res>0 ) goto jum
2f730 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b  p_to_p2;.  break
2f740 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2f750 44 65 73 74 72 6f 79 20 50 31 20 50 32 20 50 33  Destroy P1 P2 P3
2f760 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74   * *.**.** Delet
2f770 65 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61  e an entire data
2f780 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  base table or in
2f790 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70  dex whose root p
2f7a0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2f7b0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67  ase.** file is g
2f7c0 69 76 65 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a  iven by P1..**.*
2f7d0 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
2f7e0 67 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 69  g destroyed is i
2f7f0 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
2f800 61 73 65 20 66 69 6c 65 20 69 66 20 50 33 3d 3d  ase file if P3==
2f810 30 2e 20 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20  0.  If.** P3==1 
2f820 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74  then the table t
2f830 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e  o be clear is in
2f840 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
2f850 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
2f860 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20  that is used to 
2f870 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65  store tables cre
2f880 61 74 65 20 75 73 69 6e 67 20 43 52 45 41 54 45  ate using CREATE
2f890 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45   TEMPORARY TABLE
2f8a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56  ..**.** If AUTOV
2f8b0 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64  ACUUM is enabled
2f8c0 20 74 68 65 6e 20 69 74 20 69 73 20 70 6f 73 73   then it is poss
2f8d0 69 62 6c 65 20 74 68 61 74 20 61 6e 6f 74 68 65  ible that anothe
2f8e0 72 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d  r root page.** m
2f8f0 69 67 68 74 20 62 65 20 6d 6f 76 65 64 20 69 6e  ight be moved in
2f900 74 6f 20 74 68 65 20 6e 65 77 6c 79 20 64 65 6c  to the newly del
2f910 65 74 65 64 20 72 6f 6f 74 20 70 61 67 65 20 69  eted root page i
2f920 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
2f930 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
2f940 73 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 74 20  s contiguous at 
2f950 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2f960 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2f970 54 68 65 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61  The former.** va
2f980 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  lue of the root 
2f990 70 61 67 65 20 74 68 61 74 20 6d 6f 76 65 64 20  page that moved 
2f9a0 2d 20 69 74 73 20 76 61 6c 75 65 20 62 65 66 6f  - its value befo
2f9b0 72 65 20 74 68 65 20 6d 6f 76 65 20 6f 63 63 75  re the move occu
2f9c0 72 72 65 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f  rred -.** is sto
2f9d0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
2f9e0 50 32 2e 20 49 66 20 6e 6f 20 70 61 67 65 20 6d  P2. If no page m
2f9f0 6f 76 65 6d 65 6e 74 20 77 61 73 20 72 65 71 75  ovement was requ
2fa00 69 72 65 64 20 28 62 65 63 61 75 73 65 20 74 68  ired (because th
2fa10 65 0a 2a 2a 20 74 61 62 6c 65 20 62 65 69 6e 67  e.** table being
2fa20 20 64 72 6f 70 70 65 64 20 77 61 73 20 61 6c 72   dropped was alr
2fa30 65 61 64 79 20 74 68 65 20 6c 61 73 74 20 6f 6e  eady the last on
2fa40 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2fa50 65 29 20 74 68 65 6e 20 61 20 0a 2a 2a 20 7a 65  e) then a .** ze
2fa60 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ro is stored in 
2fa70 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66  register P2.  If
2fa80 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 64   AUTOVACUUM is d
2fa90 69 73 61 62 6c 65 64 20 74 68 65 6e 20 61 20 7a  isabled then a z
2faa0 65 72 6f 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65  ero .** is store
2fab0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
2fac0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
2fad0 6f 64 65 20 74 68 72 6f 77 73 20 61 6e 20 65 72  ode throws an er
2fae0 72 6f 72 20 69 66 20 74 68 65 72 65 20 61 72 65  ror if there are
2faf0 20 61 6e 79 20 61 63 74 69 76 65 20 72 65 61 64   any active read
2fb00 65 72 20 56 4d 73 20 77 68 65 6e 0a 2a 2a 20 69  er VMs when.** i
2fb10 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 54 68  t is invoked. Th
2fb20 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76  is is done to av
2fb30 6f 69 64 20 74 68 65 20 64 69 66 66 69 63 75 6c  oid the difficul
2fb40 74 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ty associated wi
2fb50 74 68 20 0a 2a 2a 20 75 70 64 61 74 69 6e 67 20  th .** updating 
2fb60 65 78 69 73 74 69 6e 67 20 63 75 72 73 6f 72 73  existing cursors
2fb70 20 77 68 65 6e 20 61 20 72 6f 6f 74 20 70 61 67   when a root pag
2fb80 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 20 61 6e  e is moved in an
2fb90 20 41 55 54 4f 56 41 43 55 55 4d 20 0a 2a 2a 20   AUTOVACUUM .** 
2fba0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 65  database. This e
2fbb0 72 72 6f 72 20 69 73 20 74 68 72 6f 77 6e 20 65  rror is thrown e
2fbc0 76 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  ven if the datab
2fbd0 61 73 65 20 69 73 20 6e 6f 74 20 61 6e 20 41 55  ase is not an AU
2fbe0 54 4f 56 41 43 55 55 4d 20 0a 2a 2a 20 64 62 20  TOVACUUM .** db 
2fbf0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
2fc00 64 20 69 6e 74 72 6f 64 75 63 69 6e 67 20 61 6e  d introducing an
2fc10 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
2fc20 20 62 65 74 77 65 65 6e 20 61 75 74 6f 76 61 63   between autovac
2fc30 75 75 6d 20 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 2d  uum .** and non-
2fc40 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 73  autovacuum modes
2fc50 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2fc60 3a 20 43 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20  : Clear.*/.case 
2fc70 4f 50 5f 44 65 73 74 72 6f 79 3a 20 7b 20 20 20  OP_Destroy: {   
2fc80 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69    /* out2 */.  i
2fc90 6e 74 20 69 4d 6f 76 65 64 3b 0a 20 20 69 6e 74  nt iMoved;.  int
2fca0 20 69 44 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33   iDb;..  sqlite3
2fcb0 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75  VdbeIncrWriteCou
2fcc0 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20 20 61 73  nter(p, 0);.  as
2fcd0 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
2fce0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
2fcf0 28 20 70 4f 70 2d 3e 70 31 3e 31 20 29 3b 0a 20  ( pOp->p1>1 );. 
2fd00 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
2fd10 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
2fd20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
2fd30 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20  MEM_Null;.  if( 
2fd40 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 3e 20  db->nVdbeRead > 
2fd50 64 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 31 20  db->nVDestroy+1 
2fd60 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2fd70 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 70  TE_LOCKED;.    p
2fd80 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
2fd90 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 67 6f  OE_Abort;.    go
2fda0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2fdb0 65 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  error;.  }else{.
2fdc0 20 20 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70      iDb = pOp->p
2fdd0 33 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 44  3;.    assert( D
2fde0 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
2fdf0 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a  eeMask, iDb) );.
2fe00 20 20 20 20 69 4d 6f 76 65 64 20 3d 20 30 3b 20      iMoved = 0; 
2fe10 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20   /* Not needed. 
2fe20 20 4f 6e 6c 79 20 74 6f 20 73 69 6c 65 6e 63 65   Only to silence
2fe30 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20   a warning. */. 
2fe40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2fe50 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 64 62  treeDropTable(db
2fe60 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20  ->aDb[iDb].pBt, 
2fe70 70 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f 76 65 64  pOp->p1, &iMoved
2fe80 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  );.    pOut->fla
2fe90 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
2fea0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d    pOut->u.i = iM
2feb0 6f 76 65 64 3b 0a 20 20 20 20 69 66 28 20 72 63  oved;.    if( rc
2fec0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2fed0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 69 66 6e  e_to_error;.#ifn
2fee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2fef0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2ff00 66 28 20 69 4d 6f 76 65 64 21 3d 30 20 29 7b 0a  f( iMoved!=0 ){.
2ff10 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6f        sqlite3Roo
2ff20 74 50 61 67 65 4d 6f 76 65 64 28 64 62 2c 20 69  tPageMoved(db, i
2ff30 44 62 2c 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d  Db, iMoved, pOp-
2ff40 3e 70 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41  >p1);.      /* A
2ff50 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 70  ll OP_Destroy op
2ff60 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 6f  erations occur o
2ff70 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
2ff80 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2ff90 28 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46  ( resetSchemaOnF
2ffa0 61 75 6c 74 3d 3d 30 20 7c 7c 20 72 65 73 65 74  ault==0 || reset
2ffb0 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 69  SchemaOnFault==i
2ffc0 44 62 2b 31 20 29 3b 0a 20 20 20 20 20 20 72 65  Db+1 );.      re
2ffd0 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
2ffe0 20 3d 20 69 44 62 2b 31 3b 0a 20 20 20 20 7d 0a   = iDb+1;.    }.
2fff0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65  #endif.  }.  bre
30000 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
30010 3a 20 43 6c 65 61 72 20 50 31 20 50 32 20 50 33  : Clear P1 P2 P3
30020 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  .**.** Delete al
30030 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  l contents of th
30040 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
30050 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20   or index whose 
30060 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20  root page.** in 
30070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30080 65 20 69 73 20 67 69 76 65 6e 20 62 79 20 50 31  e is given by P1
30090 2e 20 20 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44  .  But, unlike D
300a0 65 73 74 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a  estroy, do not.*
300b0 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * remove the tab
300c0 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d  le or index from
300d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
300e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  le..**.** The ta
300f0 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 20  ble being clear 
30100 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  is in the main d
30110 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
30120 50 32 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32  P2==0.  If.** P2
30130 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61 62  ==1 then the tab
30140 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69  le to be clear i
30150 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  s in the auxilia
30160 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
30170 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65 64  .** that is used
30180 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73   to store tables
30190 20 63 72 65 61 74 65 20 75 73 69 6e 67 20 43 52   create using CR
301a0 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54  EATE TEMPORARY T
301b0 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ABLE..**.** If t
301c0 68 65 20 50 33 20 76 61 6c 75 65 20 69 73 20 6e  he P3 value is n
301d0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
301e0 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
301f0 20 74 6f 20 6d 75 73 74 20 62 65 20 61 6e 0a 2a   to must be an.*
30200 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 28  * intkey table (
30210 61 6e 20 53 51 4c 20 74 61 62 6c 65 2c 20 6e 6f  an SQL table, no
30220 74 20 61 6e 20 69 6e 64 65 78 29 2e 20 49 6e 20  t an index). In 
30230 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72 6f  this case the ro
30240 77 20 63 68 61 6e 67 65 20 0a 2a 2a 20 63 6f 75  w change .** cou
30250 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  nt is incremente
30260 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
30270 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
30280 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72  able being clear
30290 65 64 2e 20 0a 2a 2a 20 49 66 20 50 33 20 69 73  ed. .** If P3 is
302a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
302b0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ro, then the val
302c0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ue stored in reg
302d0 69 73 74 65 72 20 50 33 20 69 73 0a 2a 2a 20 61  ister P3 is.** a
302e0 6c 73 6f 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  lso incremented 
302f0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
30300 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
30310 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64  le being cleared
30320 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
30330 3a 20 44 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73  : Destroy.*/.cas
30340 65 20 4f 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20  e OP_Clear: {.  
30350 69 6e 74 20 6e 43 68 61 6e 67 65 3b 0a 20 0a 20  int nChange;. . 
30360 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72   sqlite3VdbeIncr
30370 57 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20  WriteCounter(p, 
30380 30 29 3b 0a 20 20 6e 43 68 61 6e 67 65 20 3d 20  0);.  nChange = 
30390 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  0;.  assert( p->
303a0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
303b0 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
303c0 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
303d0 2c 20 70 4f 70 2d 3e 70 32 29 20 29 3b 0a 20 20  , pOp->p2) );.  
303e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
303f0 65 43 6c 65 61 72 54 61 62 6c 65 28 0a 20 20 20  eClearTable(.   
30400 20 20 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e     db->aDb[pOp->
30410 70 32 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31  p2].pBt, pOp->p1
30420 2c 20 28 70 4f 70 2d 3e 70 33 20 3f 20 26 6e 43  , (pOp->p3 ? &nC
30430 68 61 6e 67 65 20 3a 20 30 29 0a 20 20 29 3b 0a  hange : 0).  );.
30440 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b    if( pOp->p3 ){
30450 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  .    p->nChange 
30460 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20  += nChange;.    
30470 69 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b  if( pOp->p3>0 ){
30480 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
30490 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b  emIsValid(&aMem[
304a0 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20  pOp->p3]) );.   
304b0 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
304c0 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70  nge(p, &aMem[pOp
304d0 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 61 4d  ->p3]);.      aM
304e0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20  em[pOp->p3].u.i 
304f0 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20  += nChange;.    
30500 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  }.  }.  if( rc )
30510 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
30520 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
30530 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
30540 20 52 65 73 65 74 53 6f 72 74 65 72 20 50 31 20   ResetSorter P1 
30550 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65  * * * *.**.** De
30560 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  lete all content
30570 73 20 66 72 6f 6d 20 74 68 65 20 65 70 68 65 6d  s from the ephem
30580 65 72 61 6c 20 74 61 62 6c 65 20 6f 72 20 73 6f  eral table or so
30590 72 74 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  rter.** that is 
305a0 6f 70 65 6e 20 6f 6e 20 63 75 72 73 6f 72 20 50  open on cursor P
305b0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  1..**.** This op
305c0 63 6f 64 65 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  code only works 
305d0 66 6f 72 20 63 75 72 73 6f 72 73 20 75 73 65 64  for cursors used
305e0 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 61 6e 64   for sorting and
305f0 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 74 68 20  .** opened with 
30600 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
30610 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65   or OP_SorterOpe
30620 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  n..*/.case OP_Re
30630 73 65 74 53 6f 72 74 65 72 3a 20 7b 0a 20 20 56  setSorter: {.  V
30640 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
30650 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
30660 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
30670 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
30680 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
30690 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
306a0 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66  t( pC!=0 );.  if
306b0 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29  ( isSorter(pC) )
306c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
306d0 65 53 6f 72 74 65 72 52 65 73 65 74 28 64 62 2c  eSorterReset(db,
306e0 20 70 43 2d 3e 75 63 2e 70 53 6f 72 74 65 72 29   pC->uc.pSorter)
306f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
30700 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
30710 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
30720 45 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EE );.    assert
30730 28 20 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61  ( pC->isEphemera
30740 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  l );.    rc = sq
30750 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
30760 61 62 6c 65 4f 66 43 75 72 73 6f 72 28 70 43 2d  ableOfCursor(pC-
30770 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
30780 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30790 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
307a0 6f 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  or;.  }.  break;
307b0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
307c0 72 65 61 74 65 42 74 72 65 65 20 50 31 20 50 32  reateBtree P1 P2
307d0 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
307e0 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 6f 74 20  sis: r[P2]=root 
307f0 69 44 62 3d 50 31 20 66 6c 61 67 73 3d 50 33 0a  iDb=P1 flags=P3.
30800 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  **.** Allocate a
30810 20 6e 65 77 20 62 2d 74 72 65 65 20 69 6e 20 74   new b-tree in t
30820 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
30830 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f   file if P1==0 o
30840 72 20 69 6e 20 74 68 65 0a 2a 2a 20 54 45 4d 50  r in the.** TEMP
30850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
30860 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e  f P1==1 or in an
30870 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
30880 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20  se if.** P1>1.  
30890 54 68 65 20 50 33 20 61 72 67 75 6d 65 6e 74 20  The P3 argument 
308a0 6d 75 73 74 20 62 65 20 31 20 28 42 54 52 45 45  must be 1 (BTREE
308b0 5f 49 4e 54 4b 45 59 29 20 66 6f 72 20 61 20 72  _INTKEY) for a r
308c0 6f 77 69 64 20 74 61 62 6c 65 0a 2a 2a 20 69 74  owid table.** it
308d0 20 6d 75 73 74 20 62 65 20 32 20 28 42 54 52 45   must be 2 (BTRE
308e0 45 5f 42 4c 4f 42 4b 45 59 29 20 66 6f 72 20 61  E_BLOBKEY) for a
308f0 6e 20 69 6e 64 65 78 20 6f 72 20 57 49 54 48 4f  n index or WITHO
30900 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
30910 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
30920 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
30930 65 77 20 62 2d 74 72 65 65 20 69 73 20 73 74 6f  ew b-tree is sto
30940 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
30950 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  P2..*/.case OP_C
30960 72 65 61 74 65 42 74 72 65 65 3a 20 7b 20 20 20  reateBtree: {   
30970 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
30980 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20  /.  int pgno;.  
30990 44 62 20 2a 70 44 62 3b 0a 0a 20 20 73 71 6c 69  Db *pDb;..  sqli
309a0 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74 65  te3VdbeIncrWrite
309b0 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20  Counter(p, 0);. 
309c0 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
309d0 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
309e0 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 61 73    pgno = 0;.  as
309f0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 42  sert( pOp->p3==B
30a00 54 52 45 45 5f 49 4e 54 4b 45 59 20 7c 7c 20 70  TREE_INTKEY || p
30a10 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 42 4c  Op->p3==BTREE_BL
30a20 4f 42 4b 45 59 20 29 3b 0a 20 20 61 73 73 65 72  OBKEY );.  asser
30a30 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
30a40 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
30a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62   );.  assert( Db
30a60 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65  MaskTest(p->btre
30a70 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20  eMask, pOp->p1) 
30a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
30a90 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
30aa0 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
30ab0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
30ac0 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20  rt( pDb->pBt!=0 
30ad0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
30ae0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
30af0 65 28 70 44 62 2d 3e 70 42 74 2c 20 26 70 67 6e  e(pDb->pBt, &pgn
30b00 6f 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 69  o, pOp->p3);.  i
30b10 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
30b20 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
30b30 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70  .  pOut->u.i = p
30b40 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  gno;.  break;.}.
30b50 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 71 6c 45  ./* Opcode: SqlE
30b60 78 65 63 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a  xec * * * P4 *.*
30b70 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 53 51 4c  *.** Run the SQL
30b80 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 74   statement or st
30b90 61 74 65 6d 65 6e 74 73 20 73 70 65 63 69 66 69  atements specifi
30ba0 65 64 20 69 6e 20 74 68 65 20 50 34 20 73 74 72  ed in the P4 str
30bb0 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ing..*/.case OP_
30bc0 53 71 6c 45 78 65 63 3a 20 7b 0a 20 20 73 71 6c  SqlExec: {.  sql
30bd0 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74  ite3VdbeIncrWrit
30be0 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a  eCounter(p, 0);.
30bf0 20 20 64 62 2d 3e 6e 53 71 6c 45 78 65 63 2b 2b    db->nSqlExec++
30c00 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
30c10 5f 65 78 65 63 28 64 62 2c 20 70 4f 70 2d 3e 70  _exec(db, pOp->p
30c20 34 2e 7a 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  4.z, 0, 0, 0);. 
30c30 20 64 62 2d 3e 6e 53 71 6c 45 78 65 63 2d 2d 3b   db->nSqlExec--;
30c40 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
30c50 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
30c60 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ror;.  break;.}.
30c70 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 73  ./* Opcode: Pars
30c80 65 53 63 68 65 6d 61 20 50 31 20 2a 20 2a 20 50  eSchema P1 * * P
30c90 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61  4 *.**.** Read a
30ca0 6e 64 20 70 61 72 73 65 20 61 6c 6c 20 65 6e 74  nd parse all ent
30cb0 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 53 51  ries from the SQ
30cc0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
30cd0 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31  e of database P1
30ce0 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68 20 74  .** that match t
30cf0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
30d00 50 34 2e 20 20 49 66 20 50 34 20 69 73 20 61 20  P4.  If P4 is a 
30d10 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
30d20 65 6e 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  en the.** entire
30d30 20 73 63 68 65 6d 61 20 66 6f 72 20 50 31 20 69   schema for P1 i
30d40 73 20 72 65 70 61 72 73 65 64 2e 0a 2a 2a 0a 2a  s reparsed..**.*
30d50 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e  * This opcode in
30d60 76 6f 6b 65 73 20 74 68 65 20 70 61 72 73 65 72  vokes the parser
30d70 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
30d80 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
30d90 2c 0a 2a 2a 20 74 68 65 6e 20 72 75 6e 73 20 74  ,.** then runs t
30da0 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d  he new virtual m
30db0 61 63 68 69 6e 65 2e 20 20 49 74 20 69 73 20 74  achine.  It is t
30dc0 68 75 73 20 61 20 72 65 2d 65 6e 74 72 61 6e 74  hus a re-entrant
30dd0 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65   opcode..*/.case
30de0 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 3a   OP_ParseSchema:
30df0 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20   {.  int iDb;.  
30e00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
30e10 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  ter;.  char *zSq
30e20 6c 3b 0a 20 20 49 6e 69 74 44 61 74 61 20 69 6e  l;.  InitData in
30e30 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a 20 41 6e  itData;..  /* An
30e40 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
30e50 6d 65 6e 74 20 74 68 61 74 20 69 6e 76 6f 6b 65  ment that invoke
30e60 73 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69  s this opcode wi
30e70 6c 6c 20 68 6f 6c 64 20 6d 75 74 65 78 65 73 0a  ll hold mutexes.
30e80 20 20 2a 2a 20 6f 6e 20 65 76 65 72 79 20 62 74    ** on every bt
30e90 72 65 65 2e 20 20 54 68 69 73 20 69 73 20 61 20  ree.  This is a 
30ea0 70 72 65 72 65 71 75 69 73 69 74 65 20 66 6f 72  prerequisite for
30eb0 20 69 6e 76 6f 6b 69 6e 67 20 0a 20 20 2a 2a 20   invoking .  ** 
30ec0 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62  sqlite3InitCallb
30ed0 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a 23 69 66 64  ack()..  */.#ifd
30ee0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
30ef0 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62    for(iDb=0; iDb
30f00 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29  <db->nDb; iDb++)
30f10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  {.    assert( iD
30f20 62 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33 42  b==1 || sqlite3B
30f30 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64  treeHoldsMutex(d
30f40 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29  b->aDb[iDb].pBt)
30f50 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
30f60 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b    iDb = pOp->p1;
30f70 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
30f80 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
30f90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62   );.  assert( Db
30fa0 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
30fb0 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  iDb, DB_SchemaLo
30fc0 61 64 65 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65  aded) );..#ifnde
30fd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
30fe0 54 45 52 54 41 42 4c 45 0a 20 20 69 66 28 20 70  TERTABLE.  if( p
30ff0 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20 29 7b 0a 20  Op->p4.z==0 ){. 
31000 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
31010 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 69 44  Clear(db->aDb[iD
31020 62 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b].pSchema);.   
31030 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d   db->mDbFlags &=
31040 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b   ~DBFLAG_SchemaK
31050 6e 6f 77 6e 4f 6b 3b 0a 20 20 20 20 72 63 20 3d  nownOk;.    rc =
31060 20 73 71 6c 69 74 65 33 49 6e 69 74 4f 6e 65 28   sqlite3InitOne(
31070 64 62 2c 20 69 44 62 2c 20 26 70 2d 3e 7a 45 72  db, iDb, &p->zEr
31080 72 4d 73 67 2c 20 49 4e 49 54 46 4c 41 47 5f 41  rMsg, INITFLAG_A
31090 6c 74 65 72 54 61 62 6c 65 29 3b 0a 20 20 20 20  lterTable);.    
310a0 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
310b0 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
310c0 6e 67 65 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69  nge;.    p->expi
310d0 72 65 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  red = 0;.  }else
310e0 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
310f0 7a 4d 61 73 74 65 72 20 3d 20 4d 41 53 54 45 52  zMaster = MASTER
31100 5f 4e 41 4d 45 3b 0a 20 20 20 20 69 6e 69 74 44  _NAME;.    initD
31110 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ata.db = db;.   
31120 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20 3d 20   initData.iDb = 
31130 69 44 62 3b 0a 20 20 20 20 69 6e 69 74 44 61 74  iDb;.    initDat
31140 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 70 2d  a.pzErrMsg = &p-
31150 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 69 6e  >zErrMsg;.    in
31160 69 74 44 61 74 61 2e 6d 49 6e 69 74 46 6c 61 67  itData.mInitFlag
31170 73 20 3d 20 30 3b 0a 20 20 20 20 7a 53 71 6c 20  s = 0;.    zSql 
31180 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
31190 28 64 62 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  (db,.       "SEL
311a0 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61  ECT name, rootpa
311b0 67 65 2c 20 73 71 6c 20 46 52 4f 4d 20 27 25 71  ge, sql FROM '%q
311c0 27 2e 25 73 20 57 48 45 52 45 20 25 73 20 4f 52  '.%s WHERE %s OR
311d0 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20  DER BY rowid",. 
311e0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
311f0 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61  b].zDbSName, zMa
31200 73 74 65 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ster, pOp->p4.z)
31210 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
31220 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
31230 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
31240 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
31250 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
31260 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
31270 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
31280 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  usy = 1;.      i
31290 6e 69 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c  nitData.rc = SQL
312a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e  ITE_OK;.      in
312b0 69 74 44 61 74 61 2e 6e 49 6e 69 74 52 6f 77 20  itData.nInitRow 
312c0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
312d0 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
312e0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 63  iled );.      rc
312f0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
31300 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65  db, zSql, sqlite
31310 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20 26  3InitCallback, &
31320 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a 20 20  initData, 0);.  
31330 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31340 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69  TE_OK ) rc = ini
31350 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 20 20  tData.rc;.      
31360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31370 4b 20 26 26 20 69 6e 69 74 44 61 74 61 2e 6e 49  K && initData.nI
31380 6e 69 74 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  nitRow==0 ){.   
31390 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 50       /* The OP_P
313a0 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64  arseSchema opcod
313b0 65 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c  e with a non-NUL
313c0 4c 20 50 34 20 61 72 67 75 6d 65 6e 74 20 73 68  L P4 argument sh
313d0 6f 75 6c 64 20 70 61 72 73 65 0a 20 20 20 20 20  ould parse.     
313e0 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
313f0 6e 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ne SQL statement
31400 2e 20 41 6e 79 20 6c 65 73 73 20 74 68 61 6e 20  . Any less than 
31410 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74  that indicates t
31420 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
31430 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
31440 20 74 61 62 6c 65 20 69 73 20 63 6f 72 72 75 70   table is corrup
31450 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  t. */.        rc
31460 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31470 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
31480 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
31490 72 65 65 4e 4e 28 64 62 2c 20 7a 53 71 6c 29 3b  reeNN(db, zSql);
314a0 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
314b0 62 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  busy = 0;.    }.
314c0 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a    }.  if( rc ){.
314d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
314e0 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
314f0 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
31500 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
31510 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 67 6f  OMEM ){.      go
31520 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
31530 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
31540 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
31550 7d 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 0a  }.  break;  .}..
31560 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
31570 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45  ITE_OMIT_ANALYZE
31580 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 6f 61  )./* Opcode: Loa
31590 64 41 6e 61 6c 79 73 69 73 20 50 31 20 2a 20 2a  dAnalysis P1 * *
315a0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20   * *.**.** Read 
315b0 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
315c0 20 74 61 62 6c 65 20 66 6f 72 20 64 61 74 61 62   table for datab
315d0 61 73 65 20 50 31 20 61 6e 64 20 6c 6f 61 64 20  ase P1 and load 
315e0 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  the content.** o
315f0 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 6e 74  f that table int
31600 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 69  o the internal i
31610 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2e  ndex hash table.
31620 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
31630 65 0a 2a 2a 20 74 68 65 20 61 6e 61 6c 79 73 69  e.** the analysi
31640 73 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  s to be used whe
31650 6e 20 70 72 65 70 61 72 69 6e 67 20 61 6c 6c 20  n preparing all 
31660 73 75 62 73 65 71 75 65 6e 74 20 71 75 65 72 69  subsequent queri
31670 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c  es..*/.case OP_L
31680 6f 61 64 41 6e 61 6c 79 73 69 73 3a 20 7b 0a 20  oadAnalysis: {. 
31690 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
316a0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
316b0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 72 63 20 3d  b->nDb );.  rc =
316c0 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73   sqlite3Analysis
316d0 4c 6f 61 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31  Load(db, pOp->p1
316e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
316f0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
31700 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 20  error;.  break; 
31710 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64   .}.#endif /* !d
31720 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
31730 49 54 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f 0a 0a  IT_ANALYZE) */..
31740 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54  /* Opcode: DropT
31750 61 62 6c 65 20 50 31 20 2a 20 2a 20 50 34 20 2a  able P1 * * P4 *
31760 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  .**.** Remove th
31770 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d  e internal (in-m
31780 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75  emory) data stru
31790 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63  ctures that desc
317a0 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ribe.** the tabl
317b0 65 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61  e named P4 in da
317c0 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73  tabase P1.  This
317d0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
317e0 20 61 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 64   a table.** is d
317f0 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b  ropped from disk
31800 20 28 75 73 69 6e 67 20 74 68 65 20 44 65 73 74   (using the Dest
31810 72 6f 79 20 6f 70 63 6f 64 65 29 20 69 6e 20 6f  roy opcode) in o
31820 72 64 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a 2a  rder to keep .**
31830 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65   the internal re
31840 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
31850 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f  the.** schema co
31860 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68  nsistent with wh
31870 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  at is on disk..*
31880 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 61  /.case OP_DropTa
31890 62 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  ble: {.  sqlite3
318a0 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75  VdbeIncrWriteCou
318b0 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20 20 73 71  nter(p, 0);.  sq
318c0 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
318d0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 4f  leteTable(db, pO
318e0 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a  p->p1, pOp->p4.z
318f0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
31900 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 49 6e  * Opcode: DropIn
31910 64 65 78 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  dex P1 * * P4 *.
31920 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
31930 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65   internal (in-me
31940 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63  mory) data struc
31950 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
31960 69 62 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  ibe.** the index
31970 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74   named P4 in dat
31980 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20  abase P1.  This 
31990 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
319a0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 64  an index.** is d
319b0 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b  ropped from disk
319c0 20 28 75 73 69 6e 67 20 74 68 65 20 44 65 73 74   (using the Dest
319d0 72 6f 79 20 6f 70 63 6f 64 65 29 0a 2a 2a 20 69  roy opcode).** i
319e0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
319f0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
31a00 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
31a10 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e  he.** schema con
31a20 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61  sistent with wha
31a30 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  t is on disk..*/
31a40 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 49 6e 64  .case OP_DropInd
31a50 65 78 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 56  ex: {.  sqlite3V
31a60 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e  dbeIncrWriteCoun
31a70 74 65 72 28 70 2c 20 30 29 3b 0a 20 20 73 71 6c  ter(p, 0);.  sql
31a80 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
31a90 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 4f 70  eteIndex(db, pOp
31aa0 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ->p1, pOp->p4.z)
31ab0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
31ac0 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 72 69   Opcode: DropTri
31ad0 67 67 65 72 20 50 31 20 2a 20 2a 20 50 34 20 2a  gger P1 * * P4 *
31ae0 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  .**.** Remove th
31af0 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d  e internal (in-m
31b00 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75  emory) data stru
31b10 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63  ctures that desc
31b20 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 72 69 67  ribe.** the trig
31b30 67 65 72 20 6e 61 6d 65 64 20 50 34 20 69 6e 20  ger named P4 in 
31b40 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68  database P1.  Th
31b50 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
31b60 65 72 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20  er a trigger.** 
31b70 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  is dropped from 
31b80 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20  disk (using the 
31b90 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 20  Destroy opcode) 
31ba0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
31bb0 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61   .** the interna
31bc0 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
31bd0 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d   of the.** schem
31be0 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  a consistent wit
31bf0 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
31c00 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72  k..*/.case OP_Dr
31c10 6f 70 54 72 69 67 67 65 72 3a 20 7b 0a 20 20 73  opTrigger: {.  s
31c20 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72  qlite3VdbeIncrWr
31c30 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29  iteCounter(p, 0)
31c40 3b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  ;.  sqlite3Unlin
31c50 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65  kAndDeleteTrigge
31c60 72 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  r(db, pOp->p1, p
31c70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65  Op->p4.z);.  bre
31c80 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  ak;.}...#ifndef 
31c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
31ca0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20 4f  GRITY_CHECK./* O
31cb0 70 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74 79  pcode: Integrity
31cc0 43 6b 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Ck P1 P2 P3 P4 P
31cd0 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e  5.**.** Do an an
31ce0 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 63 75  alysis of the cu
31cf0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
31d00 61 62 61 73 65 2e 20 20 53 74 6f 72 65 20 69 6e  abase.  Store in
31d10 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20  .** register P1 
31d20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
31d30 72 72 6f 72 20 6d 65 73 73 61 67 65 20 64 65 73  rror message des
31d40 63 72 69 62 69 6e 67 20 61 6e 79 20 70 72 6f 62  cribing any prob
31d50 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70  lems..** If no p
31d60 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
31d70 64 2c 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20  d, store a NULL 
31d80 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
31d90 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74  **.** The regist
31da0 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 6f  er P3 contains o
31db0 6e 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ne less than the
31dc0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
31dd0 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72 6f 72  of allowed error
31de0 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20 72 65  s..** At most re
31df0 67 28 50 33 29 20 65 72 72 6f 72 73 20 77 69 6c  g(P3) errors wil
31e00 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e 0a 2a  l be reported..*
31e10 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
31e20 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 73  , the analysis s
31e30 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61 73 20  tops as soon as 
31e40 72 65 67 28 50 31 29 20 65 72 72 6f 72 73 20 61  reg(P1) errors a
31e50 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20 52 65  re .** seen.  Re
31e60 67 28 50 31 29 20 69 73 20 75 70 64 61 74 65 64  g(P1) is updated
31e70 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72   with the number
31e80 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69   of errors remai
31e90 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ning..**.** The 
31ea0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
31eb0 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
31ec0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
31ed0 61 72 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  are integers.** 
31ee0 73 74 6f 72 65 64 20 69 6e 20 50 34 5f 49 4e 54  stored in P4_INT
31ef0 41 52 52 41 59 20 61 72 67 75 6d 65 6e 74 2e 0a  ARRAY argument..
31f00 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 6e  **.** If P5 is n
31f10 6f 74 20 7a 65 72 6f 2c 20 74 68 65 20 63 68 65  ot zero, the che
31f20 63 6b 20 69 73 20 64 6f 6e 65 20 6f 6e 20 74 68  ck is done on th
31f30 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
31f40 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f  base.** file, no
31f50 74 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  t the main datab
31f60 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
31f70 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75  This opcode is u
31f80 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
31f90 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63   the integrity_c
31fa0 68 65 63 6b 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a  heck pragma..*/.
31fb0 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 72 69 74  case OP_Integrit
31fc0 79 43 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e 52 6f  yCk: {.  int nRo
31fd0 6f 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ot;      /* Numb
31fe0 65 72 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  er of tables to 
31ff0 63 68 65 63 6b 2e 20 20 28 4e 75 6d 62 65 72 20  check.  (Number 
32000 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 2e 29 20  of root pages.) 
32010 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b  */.  int *aRoot;
32020 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
32030 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
32040 73 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  s for tables to 
32050 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  be checked */.  
32060 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20  int nErr;       
32070 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
32080 6f 72 73 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a  ors reported */.
32090 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
320a0 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
320b0 20 65 72 72 6f 72 20 72 65 70 6f 72 74 20 2a 2f   error report */
320c0 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72 3b 20 20  .  Mem *pnErr;  
320d0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6b     /* Register k
320e0 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
320f0 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67  errors remaining
32100 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
32110 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20  ->bIsReader );. 
32120 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70 32   nRoot = pOp->p2
32130 3b 0a 20 20 61 52 6f 6f 74 20 3d 20 70 4f 70 2d  ;.  aRoot = pOp-
32140 3e 70 34 2e 61 69 3b 0a 20 20 61 73 73 65 72 74  >p4.ai;.  assert
32150 28 20 6e 52 6f 6f 74 3e 30 20 29 3b 0a 20 20 61  ( nRoot>0 );.  a
32160 73 73 65 72 74 28 20 61 52 6f 6f 74 5b 30 5d 3d  ssert( aRoot[0]=
32170 3d 6e 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65  =nRoot );.  asse
32180 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
32190 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
321a0 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
321b0 72 29 20 29 3b 0a 20 20 70 6e 45 72 72 20 3d 20  r) );.  pnErr = 
321c0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
321d0 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72    assert( (pnErr
321e0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
321f0 74 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  t)!=0 );.  asser
32200 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73  t( (pnErr->flags
32210 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
32220 42 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 70  Blob))==0 );.  p
32230 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
32240 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
32250 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e 6e 44 62 20  pOp->p5<db->nDb 
32260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  );.  assert( DbM
32270 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
32280 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 35 29 20 29  Mask, pOp->p5) )
32290 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 42  ;.  z = sqlite3B
322a0 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65  treeIntegrityChe
322b0 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  ck(db->aDb[pOp->
322c0 70 35 5d 2e 70 42 74 2c 20 26 61 52 6f 6f 74 5b  p5].pBt, &aRoot[
322d0 31 5d 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20  1], nRoot,.     
322e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322f0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
32300 29 70 6e 45 72 72 2d 3e 75 2e 69 2b 31 2c 20 26  )pnErr->u.i+1, &
32310 6e 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  nErr);.  sqlite3
32320 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
32330 49 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72 72  In1);.  if( nErr
32340 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
32350 74 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  t( z==0 );.  }el
32360 73 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  se if( z==0 ){. 
32370 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
32380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 6e 45    }else{.    pnE
32390 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45 72 72 2d  rr->u.i -= nErr-
323a0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
323b0 62 65 4d 65 6d 53 65 74 53 74 72 28 70 49 6e 31  beMemSetStr(pIn1
323c0 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
323d0 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66 72  UTF8, sqlite3_fr
323e0 65 65 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41 54  ee);.  }.  UPDAT
323f0 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
32400 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  In1);.  sqlite3V
32410 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e  dbeChangeEncodin
32420 67 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67  g(pIn1, encoding
32430 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  );.  break;.}.#e
32440 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32450 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
32460 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  ECK */../* Opcod
32470 65 3a 20 52 6f 77 53 65 74 41 64 64 20 50 31 20  e: RowSetAdd P1 
32480 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
32490 70 73 69 73 3a 20 72 6f 77 73 65 74 28 50 31 29  psis: rowset(P1)
324a0 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 49 6e 73  =r[P2].**.** Ins
324b0 65 72 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  ert the integer 
324c0 76 61 6c 75 65 20 68 65 6c 64 20 62 79 20 72 65  value held by re
324d0 67 69 73 74 65 72 20 50 32 20 69 6e 74 6f 20 61  gister P2 into a
324e0 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 0a 2a   RowSet object.*
324f0 2a 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74  * held in regist
32500 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  er P1..**.** An 
32510 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
32520 69 66 20 50 32 20 69 73 20 6e 6f 74 20 61 6e 20  if P2 is not an 
32530 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65  integer..*/.case
32540 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 3a 20 7b   OP_RowSetAdd: {
32550 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 69         /* in1, i
32560 6e 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n2 */.  pIn1 = &
32570 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
32580 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
32590 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
325a0 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26  ( (pIn2->flags &
325b0 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
325c0 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
325d0 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d  gs & MEM_Blob)==
325e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
325f0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f  ite3VdbeMemSetRo
32600 77 53 65 74 28 70 49 6e 31 29 20 29 20 67 6f 74  wSet(pIn1) ) got
32610 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
32620 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
32630 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70  dbeMemIsRowSet(p
32640 49 6e 31 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  In1) );.  sqlite
32650 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 28 52  3RowSetInsert((R
32660 6f 77 53 65 74 2a 29 70 49 6e 31 2d 3e 7a 2c 20  owSet*)pIn1->z, 
32670 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72  pIn2->u.i);.  br
32680 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
32690 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50 31  e: RowSetRead P1
326a0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
326b0 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 6f  nopsis: r[P3]=ro
326c0 77 73 65 74 28 50 31 29 0a 2a 2a 0a 2a 2a 20 45  wset(P1).**.** E
326d0 78 74 72 61 63 74 20 74 68 65 20 73 6d 61 6c 6c  xtract the small
326e0 65 73 74 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  est value from t
326f0 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  he RowSet object
32700 20 69 6e 20 50 31 0a 2a 2a 20 61 6e 64 20 70 75   in P1.** and pu
32710 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 74  t that value int
32720 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
32730 2a 20 4f 72 2c 20 69 66 20 52 6f 77 53 65 74 20  * Or, if RowSet 
32740 6f 62 6a 65 63 74 20 50 31 20 69 73 20 69 6e 69  object P1 is ini
32750 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20 6c 65  tially empty, le
32760 61 76 65 20 50 33 0a 2a 2a 20 75 6e 63 68 61 6e  ave P3.** unchan
32770 67 65 64 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  ged and jump to 
32780 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a  instruction P2..
32790 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65  */.case OP_RowSe
327a0 74 52 65 61 64 3a 20 7b 20 20 20 20 20 20 20 2f  tRead: {       /
327b0 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 6f 75 74  * jump, in1, out
327c0 33 20 2a 2f 0a 20 20 69 36 34 20 76 61 6c 3b 0a  3 */.  i64 val;.
327d0 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
327e0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
327f0 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  rt( (pIn1->flags
32800 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20   & MEM_Blob)==0 
32810 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  || sqlite3VdbeMe
32820 6d 49 73 52 6f 77 53 65 74 28 70 49 6e 31 29 20  mIsRowSet(pIn1) 
32830 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
32840 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
32850 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69  )==0 .   || sqli
32860 74 65 33 52 6f 77 53 65 74 4e 65 78 74 28 28 52  te3RowSetNext((R
32870 6f 77 53 65 74 2a 29 70 49 6e 31 2d 3e 7a 2c 20  owSet*)pIn1->z, 
32880 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  &val)==0.  ){.  
32890 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65 61 6e    /* The boolean
328a0 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20   index is empty 
328b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
328c0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e  beMemSetNull(pIn
328d0 31 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  1);.    VdbeBran
328e0 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b 0a 20 20  chTaken(1,2);.  
328f0 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
32900 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f  2_and_check_for_
32910 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 65 6c  interrupt;.  }el
32920 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61 6c  se{.    /* A val
32930 75 65 20 77 61 73 20 70 75 6c 6c 65 64 20 66 72  ue was pulled fr
32940 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  om the index */.
32950 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
32960 6b 65 6e 28 30 2c 32 29 3b 0a 20 20 20 20 73 71  ken(0,2);.    sq
32970 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49  lite3VdbeMemSetI
32980 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  nt64(&aMem[pOp->
32990 70 33 5d 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20  p3], val);.  }. 
329a0 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f   goto check_for_
329b0 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a  interrupt;.}../*
329c0 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 54   Opcode: RowSetT
329d0 65 73 74 20 50 31 20 50 32 20 50 33 20 50 34 0a  est P1 P2 P3 P4.
329e0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20  ** Synopsis: if 
329f0 72 5b 50 33 5d 20 69 6e 20 72 6f 77 73 65 74 28  r[P3] in rowset(
32a00 50 31 29 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a  P1) goto P2.**.*
32a10 2a 20 52 65 67 69 73 74 65 72 20 50 33 20 69 73  * Register P3 is
32a20 20 61 73 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64   assumed to hold
32a30 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
32a40 72 20 76 61 6c 75 65 2e 20 49 66 20 72 65 67 69  r value. If regi
32a50 73 74 65 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61  ster P1.** conta
32a60 69 6e 73 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ins a RowSet obj
32a70 65 63 74 20 61 6e 64 20 74 68 61 74 20 52 6f 77  ect and that Row
32a80 53 65 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  Set object conta
32a90 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
32aa0 20 68 65 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d   held in P3, jum
32ab0 70 20 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  p to register P2
32ac0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 73  . Otherwise, ins
32ad0 65 72 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67  ert the.** integ
32ae0 65 72 20 69 6e 20 50 33 20 69 6e 74 6f 20 74 68  er in P3 into th
32af0 65 20 52 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e  e RowSet and con
32b00 74 69 6e 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a  tinue on to the.
32b10 2a 2a 20 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a  ** next opcode..
32b20 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f 77 53 65 74  **.** The RowSet
32b30 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 74 69 6d   object is optim
32b40 69 7a 65 64 20 66 6f 72 20 74 68 65 20 63 61 73  ized for the cas
32b50 65 20 77 68 65 72 65 20 73 65 74 73 20 6f 66 20  e where sets of 
32b60 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65 20  integers.** are 
32b70 69 6e 73 65 72 74 65 64 20 69 6e 20 64 69 73 74  inserted in dist
32b80 69 6e 63 74 20 70 68 61 73 65 73 2c 20 77 68 69  inct phases, whi
32b90 63 68 20 65 61 63 68 20 73 65 74 20 63 6f 6e 74  ch each set cont
32ba0 61 69 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61 74  ains no duplicat
32bb0 65 73 2e 0a 2a 2a 20 45 61 63 68 20 73 65 74 20  es..** Each set 
32bc0 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
32bd0 20 61 20 75 6e 69 71 75 65 20 50 34 20 76 61 6c   a unique P4 val
32be0 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 73 65  ue. The first se
32bf0 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50  t.** must have P
32c00 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61 6c 20  4==0, the final 
32c10 73 65 74 20 6d 75 73 74 20 68 61 76 65 20 50 34  set must have P4
32c20 3d 3d 2d 31 2c 20 61 6e 64 20 66 6f 72 20 61 6c  ==-1, and for al
32c30 6c 20 6f 74 68 65 72 20 73 65 74 73 0a 2a 2a 20  l other sets.** 
32c40 6d 75 73 74 20 68 61 76 65 20 50 34 3e 30 2e 0a  must have P4>0..
32c50 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77  **.** This allow
32c60 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a  s optimizations:
32c70 20 28 61 29 20 77 68 65 6e 20 50 34 3d 3d 30 20   (a) when P4==0 
32c80 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
32c90 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65 20   to test.** the 
32ca0 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 66 6f  RowSet object fo
32cb0 72 20 50 33 2c 20 61 73 20 69 74 20 69 73 20 67  r P3, as it is g
32cc0 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f  uaranteed not to
32cd0 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20   contain it,.** 
32ce0 28 62 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20  (b) when P4==-1 
32cf0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
32d00 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 76   to insert the v
32d10 61 6c 75 65 2c 20 61 73 20 69 74 20 77 69 6c 6c  alue, as it will
32d20 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20 74 65 73  .** never be tes
32d30 74 65 64 20 66 6f 72 2c 20 61 6e 64 20 28 63 29  ted for, and (c)
32d40 20 77 68 65 6e 20 61 20 76 61 6c 75 65 20 74 68   when a value th
32d50 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 73 65  at is part of se
32d60 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74  t X is.** insert
32d70 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
32d80 6e 65 65 64 20 74 6f 20 73 65 61 72 63 68 20 74  need to search t
32d90 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 61 6d  o see if the sam
32da0 65 20 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70  e value was.** p
32db0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 65 72 74  reviously insert
32dc0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 65  ed as part of se
32dd0 74 20 58 20 28 6f 6e 6c 79 20 69 66 20 69 74 20  t X (only if it 
32de0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  was previously.*
32df0 2a 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  * inserted as pa
32e00 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72  rt of some other
32e10 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f   set)..*/.case O
32e20 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 7b 20  P_RowSetTest: { 
32e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e40 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
32e50 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69  , in3 */.  int i
32e60 53 65 74 3b 0a 20 20 69 6e 74 20 65 78 69 73 74  Set;.  int exist
32e70 73 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  s;..  pIn1 = &aM
32e80 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
32e90 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
32ea0 3e 70 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70  >p3];.  iSet = p
32eb0 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65  Op->p4.i;.  asse
32ec0 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26  rt( pIn3->flags&
32ed0 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a  MEM_Int );..  /*
32ee0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
32ef0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
32f00 20 61 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74   a rowset object
32f10 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
32f20 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20  P1,.  ** delete 
32f30 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69  it now and initi
32f40 61 6c 69 7a 65 20 50 31 20 77 69 74 68 20 61 6e  alize P1 with an
32f50 20 65 6d 70 74 79 20 72 6f 77 73 65 74 0a 20 20   empty rowset.  
32f60 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  */.  if( (pIn1->
32f70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
32f80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
32f90 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
32fa0 74 52 6f 77 53 65 74 28 70 49 6e 31 29 20 29 20  tRowSet(pIn1) ) 
32fb0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
32fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32fd0 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65  e3VdbeMemIsRowSe
32fe0 74 28 70 49 6e 31 29 20 29 3b 0a 20 20 61 73 73  t(pIn1) );.  ass
32ff0 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
33000 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20  ==P4_INT32 );.  
33010 61 73 73 65 72 74 28 20 69 53 65 74 3d 3d 2d 31  assert( iSet==-1
33020 20 7c 7c 20 69 53 65 74 3e 3d 30 20 29 3b 0a 20   || iSet>=0 );. 
33030 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20 20   if( iSet ){.   
33040 20 65 78 69 73 74 73 20 3d 20 73 71 6c 69 74 65   exists = sqlite
33050 33 52 6f 77 53 65 74 54 65 73 74 28 28 52 6f 77  3RowSetTest((Row
33060 53 65 74 2a 29 70 49 6e 31 2d 3e 7a 2c 20 69 53  Set*)pIn1->z, iS
33070 65 74 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a  et, pIn3->u.i);.
33080 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
33090 6b 65 6e 28 65 78 69 73 74 73 21 3d 30 2c 32 29  ken(exists!=0,2)
330a0 3b 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  ;.    if( exists
330b0 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
330c0 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53  p2;.  }.  if( iS
330d0 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  et>=0 ){.    sql
330e0 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74  ite3RowSetInsert
330f0 28 28 52 6f 77 53 65 74 2a 29 70 49 6e 31 2d 3e  ((RowSet*)pIn1->
33100 7a 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20  z, pIn3->u.i);. 
33110 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a   }.  break;.}...
33120 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33130 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20  MIT_TRIGGER../* 
33140 4f 70 63 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20  Opcode: Program 
33150 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
33160 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65  *.** Execute the
33170 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
33180 20 70 61 73 73 65 64 20 61 73 20 50 34 20 28 74   passed as P4 (t
33190 79 70 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ype P4_SUBPROGRA
331a0 4d 29 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f  M). .**.** P1 co
331b0 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65  ntains the addre
331c0 73 73 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ss of the memory
331d0 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61   cell that conta
331e0 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 6d 65  ins the first me
331f0 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  mory .** cell in
33200 20 61 6e 20 61 72 72 61 79 20 6f 66 20 76 61 6c   an array of val
33210 75 65 73 20 75 73 65 64 20 61 73 20 61 72 67 75  ues used as argu
33220 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 73 75 62  ments to the sub
33230 2d 70 72 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a  -program. P2 .**
33240 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64   contains the ad
33250 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
33260 20 69 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   if the sub-prog
33270 72 61 6d 20 74 68 72 6f 77 73 20 61 6e 20 49 47  ram throws an IG
33280 4e 4f 52 45 20 0a 2a 2a 20 65 78 63 65 70 74 69  NORE .** excepti
33290 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 52 41 49  on using the RAI
332a0 53 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52  SE() function. R
332b0 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61  egister P3 conta
332c0 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ins the address 
332d0 0a 2a 2a 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  .** of a memory 
332e0 63 65 6c 6c 20 69 6e 20 74 68 69 73 20 28 74 68  cell in this (th
332f0 65 20 70 61 72 65 6e 74 29 20 56 4d 20 74 68 61  e parent) VM tha
33300 74 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  t is used to all
33310 6f 63 61 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65  ocate the .** me
33320 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 62 79  mory required by
33330 20 74 68 65 20 73 75 62 2d 76 64 62 65 20 61 74   the sub-vdbe at
33340 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20   runtime..**.** 
33350 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
33360 74 6f 20 74 68 65 20 56 4d 20 63 6f 6e 74 61 69  to the VM contai
33370 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72  ning the trigger
33380 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
33390 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P5 is non-zer
333a0 6f 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69 76  o, then recursiv
333b0 65 20 70 72 6f 67 72 61 6d 20 69 6e 76 6f 63 61  e program invoca
333c0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2e  tion is enabled.
333d0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67  .*/.case OP_Prog
333e0 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ram: {        /*
333f0 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e   jump */.  int n
33400 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
33410 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33420 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
33430 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d   for sub-program
33440 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
33450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33460 20 42 79 74 65 73 20 6f 66 20 72 75 6e 74 69 6d   Bytes of runtim
33470 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
33480 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d   for sub-program
33490 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20   */.  Mem *pRt; 
334a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
334b0 20 52 65 67 69 73 74 65 72 20 74 6f 20 61 6c 6c   Register to all
334c0 6f 63 61 74 65 20 72 75 6e 74 69 6d 65 20 73 70  ocate runtime sp
334d0 61 63 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ace */.  Mem *pM
334e0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
334f0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
33500 61 74 65 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f  ate through memo
33510 72 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65  ry cells */.  Me
33520 6d 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  m *pEnd;        
33530 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65        /* Last me
33540 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77  mory cell in new
33550 20 61 72 72 61 79 20 2a 2f 0a 20 20 56 64 62 65   array */.  Vdbe
33560 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20  Frame *pFrame;  
33570 20 20 20 20 2f 2a 20 4e 65 77 20 76 64 62 65 20      /* New vdbe 
33580 66 72 61 6d 65 20 74 6f 20 65 78 65 63 75 74 65  frame to execute
33590 20 69 6e 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   in */.  SubProg
335a0 72 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20  ram *pProgram;  
335b0 20 2f 2a 20 53 75 62 2d 70 72 6f 67 72 61 6d 20   /* Sub-program 
335c0 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20  to execute */.  
335d0 76 6f 69 64 20 2a 74 3b 20 20 20 20 20 20 20 20  void *t;        
335e0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e          /* Token
335f0 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74 72 69   identifying tri
33600 67 67 65 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67  gger */..  pProg
33610 72 61 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ram = pOp->p4.pP
33620 72 6f 67 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20  rogram;.  pRt = 
33630 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
33640 20 20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72    assert( pProgr
33650 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 0a  am->nOp>0 );.  .
33660 20 20 2f 2a 20 49 66 20 74 68 65 20 70 35 20 66    /* If the p5 f
33670 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
33680 65 6e 20 72 65 63 75 72 73 69 76 65 20 69 6e 76  en recursive inv
33690 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67  ocation of trigg
336a0 65 72 73 20 69 73 20 0a 20 20 2a 2a 20 64 69 73  ers is .  ** dis
336b0 61 62 6c 65 64 20 66 6f 72 20 62 61 63 6b 77 61  abled for backwa
336c0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
336d0 79 20 28 70 35 20 69 73 20 73 65 74 20 69 66 20  y (p5 is set if 
336e0 74 68 69 73 20 73 75 62 2d 70 72 6f 67 72 61 6d  this sub-program
336f0 0a 20 20 2a 2a 20 69 73 20 72 65 61 6c 6c 79 20  .  ** is really 
33700 61 20 74 72 69 67 67 65 72 2c 20 6e 6f 74 20 61  a trigger, not a
33710 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74   foreign key act
33720 69 6f 6e 2c 20 61 6e 64 20 74 68 65 20 66 6c 61  ion, and the fla
33730 67 20 73 65 74 0a 20 20 2a 2a 20 61 6e 64 20 63  g set.  ** and c
33740 6c 65 61 72 65 64 20 62 79 20 74 68 65 20 22 50  leared by the "P
33750 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f  RAGMA recursive_
33760 74 72 69 67 67 65 72 73 22 20 63 6f 6d 6d 61 6e  triggers" comman
33770 64 20 69 73 20 63 6c 65 61 72 29 2e 0a 20 20 2a  d is clear)..  *
33780 2a 20 0a 20 20 2a 2a 20 49 74 20 69 73 20 72 65  * .  ** It is re
33790 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61 74 69  cursive invocati
337a0 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73 2c 20  on of triggers, 
337b0 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65 6c  at the SQL level
337c0 2c 20 74 68 61 74 20 69 73 20 0a 20 20 2a 2a 20  , that is .  ** 
337d0 64 69 73 61 62 6c 65 64 2e 20 49 6e 20 73 6f 6d  disabled. In som
337e0 65 20 63 61 73 65 73 20 61 20 73 69 6e 67 6c 65  e cases a single
337f0 20 74 72 69 67 67 65 72 20 6d 61 79 20 67 65 6e   trigger may gen
33800 65 72 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20  erate more than 
33810 6f 6e 65 20 0a 20 20 2a 2a 20 53 75 62 50 72 6f  one .  ** SubPro
33820 67 72 61 6d 20 28 69 66 20 74 68 65 20 74 72 69  gram (if the tri
33830 67 67 65 72 20 6d 61 79 20 62 65 20 65 78 65 63  gger may be exec
33840 75 74 65 64 20 77 69 74 68 20 6d 6f 72 65 20 74  uted with more t
33850 68 61 6e 20 6f 6e 65 20 64 69 66 66 65 72 65 6e  han one differen
33860 74 20 0a 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c  t .  ** ON CONFL
33870 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 29 2e 20  ICT algorithm). 
33880 53 75 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63  SubProgram struc
33890 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
338a0 20 77 69 74 68 20 61 0a 20 20 2a 2a 20 73 69 6e   with a.  ** sin
338b0 67 6c 65 20 74 72 69 67 67 65 72 20 61 6c 6c 20  gle trigger all 
338c0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76 61  have the same va
338d0 6c 75 65 20 66 6f 72 20 74 68 65 20 53 75 62 50  lue for the SubP
338e0 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e 20 0a 20 20  rogram.token .  
338f0 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
33900 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29  .  if( pOp->p5 )
33910 7b 0a 20 20 20 20 74 20 3d 20 70 50 72 6f 67 72  {.    t = pProgr
33920 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 66  am->token;.    f
33930 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
33940 61 6d 65 3b 20 70 46 72 61 6d 65 20 26 26 20 70  ame; pFrame && p
33950 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 21 3d 74 3b  Frame->token!=t;
33960 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
33970 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66  pParent);.    if
33980 28 20 70 46 72 61 6d 65 20 29 20 62 72 65 61 6b  ( pFrame ) break
33990 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
339a0 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e 61 4c 69 6d  nFrame>=db->aLim
339b0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
339c0 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d 20 29  TRIGGER_DEPTH] )
339d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
339e0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
339f0 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
33a00 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c   "too many level
33a10 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63  s of trigger rec
33a20 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f  ursion");.    go
33a30 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
33a40 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  error;.  }..  /*
33a50 20 52 65 67 69 73 74 65 72 20 70 52 74 20 69 73   Register pRt is
33a60 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
33a70 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  he memory requir
33a80 65 64 20 74 6f 20 73 61 76 65 20 74 68 65 20 73  ed to save the s
33a90 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
33aa0 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d   current program
33ab0 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  , and the memory
33ac0 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75 6e   required at run
33ad0 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74 65 0a  time to execute.
33ae0 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72    ** the trigger
33af0 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74 68 69   program. If thi
33b00 73 20 74 72 69 67 67 65 72 20 68 61 73 20 62 65  s trigger has be
33b10 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72 65 2c  en fired before,
33b20 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20   then pRt .  ** 
33b30 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  is already alloc
33b40 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
33b50 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e 69 74   it must be init
33b60 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69  ialized.  */.  i
33b70 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d  f( (pRt->flags&M
33b80 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20 29 7b 0a 20  EM_Blob)==0 ){. 
33b90 20 20 20 2f 2a 20 53 75 62 50 72 6f 67 72 61 6d     /* SubProgram
33ba0 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20 74 6f 20  .nMem is set to 
33bb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 65  the number of me
33bc0 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73 65 64 20  mory cells used 
33bd0 62 79 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  by the .    ** p
33be0 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e  rogram stored in
33bf0 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70 2e   SubProgram.aOp.
33c00 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 73   As well as thes
33c10 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20 20  e, one memory.  
33c20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65 71    ** cell is req
33c30 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 63  uired for each c
33c40 75 72 73 6f 72 20 75 73 65 64 20 62 79 20 74 68  ursor used by th
33c50 65 20 70 72 6f 67 72 61 6d 2e 20 53 65 74 20 6c  e program. Set l
33c60 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
33c70 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20 6c  able nMem (and l
33c80 61 74 65 72 2c 20 56 64 62 65 46 72 61 6d 65 2e  ater, VdbeFrame.
33c90 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74 68  nChildMem) to th
33ca0 69 73 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f  is value..    */
33cb0 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72 6f  .    nMem = pPro
33cc0 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72  gram->nMem + pPr
33cd0 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20  ogram->nCsr;.   
33ce0 20 61 73 73 65 72 74 28 20 6e 4d 65 6d 3e 30 20   assert( nMem>0 
33cf0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 67  );.    if( pProg
33d00 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30 20 29 20 6e  ram->nCsr==0 ) n
33d10 4d 65 6d 2b 2b 3b 0a 20 20 20 20 6e 42 79 74 65  Mem++;.    nByte
33d20 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
33d30 28 56 64 62 65 46 72 61 6d 65 29 29 0a 20 20 20  (VdbeFrame)).   
33d40 20 20 20 20 20 20 20 20 20 20 20 2b 20 6e 4d 65             + nMe
33d50 6d 20 2a 20 73 69 7a 65 6f 66 28 4d 65 6d 29 0a  m * sizeof(Mem).
33d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
33d70 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 20 2a  pProgram->nCsr *
33d80 20 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73   sizeof(VdbeCurs
33d90 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20  or*).           
33da0 20 20 20 2b 20 28 70 50 72 6f 67 72 61 6d 2d 3e     + (pProgram->
33db0 6e 4f 70 20 2b 20 37 29 2f 38 3b 0a 20 20 20 20  nOp + 7)/8;.    
33dc0 70 46 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  pFrame = sqlite3
33dd0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
33de0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
33df0 20 21 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20   !pFrame ){.    
33e00 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
33e10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
33e20 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
33e30 52 74 29 3b 0a 20 20 20 20 70 52 74 2d 3e 66 6c  Rt);.    pRt->fl
33e40 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ags = MEM_Blob|M
33e50 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 70 52 74 2d  EM_Dyn;.    pRt-
33e60 3e 7a 20 3d 20 28 63 68 61 72 2a 29 70 46 72 61  >z = (char*)pFra
33e70 6d 65 3b 0a 20 20 20 20 70 52 74 2d 3e 6e 20 3d  me;.    pRt->n =
33e80 20 6e 42 79 74 65 3b 0a 20 20 20 20 70 52 74 2d   nByte;.    pRt-
33e90 3e 78 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  >xDel = sqlite3V
33ea0 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 3b 0a  dbeFrameMemDel;.
33eb0 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d  .    pFrame->v =
33ec0 20 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e   p;.    pFrame->
33ed0 6e 43 68 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d  nChildMem = nMem
33ee0 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43  ;.    pFrame->nC
33ef0 68 69 6c 64 43 73 72 20 3d 20 70 50 72 6f 67 72  hildCsr = pProgr
33f00 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46  am->nCsr;.    pF
33f10 72 61 6d 65 2d 3e 70 63 20 3d 20 28 69 6e 74 29  rame->pc = (int)
33f20 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20  (pOp - aOp);.   
33f30 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20   pFrame->aMem = 
33f40 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72  p->aMem;.    pFr
33f50 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e  ame->nMem = p->n
33f60 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  Mem;.    pFrame-
33f70 3e 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43 73  >apCsr = p->apCs
33f80 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  r;.    pFrame->n
33f90 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72  Cursor = p->nCur
33fa0 73 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  sor;.    pFrame-
33fb0 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  >aOp = p->aOp;. 
33fc0 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d     pFrame->nOp =
33fd0 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72   p->nOp;.    pFr
33fe0 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72  ame->token = pPr
33ff0 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 23 69  ogram->token;.#i
34000 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
34010 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
34020 55 53 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  US.    pFrame->a
34030 6e 45 78 65 63 20 3d 20 70 2d 3e 61 6e 45 78 65  nExec = p->anExe
34040 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  c;.#endif.#ifdef
34050 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
34060 20 20 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d 65    pFrame->iFrame
34070 4d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 46  Magic = SQLITE_F
34080 52 41 4d 45 5f 4d 41 47 49 43 3b 0a 23 65 6e 64  RAME_MAGIC;.#end
34090 69 66 0a 0a 20 20 20 20 70 45 6e 64 20 3d 20 26  if..    pEnd = &
340a0 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72  VdbeFrameMem(pFr
340b0 61 6d 65 29 5b 70 46 72 61 6d 65 2d 3e 6e 43 68  ame)[pFrame->nCh
340c0 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20 20 66 6f 72  ildMem];.    for
340d0 28 70 4d 65 6d 3d 56 64 62 65 46 72 61 6d 65 4d  (pMem=VdbeFrameM
340e0 65 6d 28 70 46 72 61 6d 65 29 3b 20 70 4d 65 6d  em(pFrame); pMem
340f0 21 3d 70 45 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b  !=pEnd; pMem++){
34100 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
34110 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
34120 65 64 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ed;.      pMem->
34130 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
34140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 72 61   }else{.    pFra
34150 6d 65 20 3d 20 28 56 64 62 65 46 72 61 6d 65 2a  me = (VdbeFrame*
34160 29 70 52 74 2d 3e 7a 3b 0a 20 20 20 20 61 73 73  )pRt->z;.    ass
34170 65 72 74 28 20 70 52 74 2d 3e 78 44 65 6c 3d 3d  ert( pRt->xDel==
34180 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
34190 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 61 73  MemDel );.    as
341a0 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e  sert( pProgram->
341b0 6e 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e  nMem+pProgram->n
341c0 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68  Csr==pFrame->nCh
341d0 69 6c 64 4d 65 6d 20 0a 20 20 20 20 20 20 20 20  ildMem .        
341e0 7c 7c 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 43  || (pProgram->nC
341f0 73 72 3d 3d 30 20 26 26 20 70 50 72 6f 67 72 61  sr==0 && pProgra
34200 6d 2d 3e 6e 4d 65 6d 2b 31 3d 3d 70 46 72 61 6d  m->nMem+1==pFram
34210 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 20 29 3b  e->nChildMem) );
34220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
34230 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72  ogram->nCsr==pFr
34240 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20 29  ame->nChildCsr )
34250 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  ;.    assert( (i
34260 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3d 3d  nt)(pOp - aOp)==
34270 70 46 72 61 6d 65 2d 3e 70 63 20 29 3b 0a 20 20  pFrame->pc );.  
34280 7d 0a 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 2b 2b  }..  p->nFrame++
34290 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  ;.  pFrame->pPar
342a0 65 6e 74 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b  ent = p->pFrame;
342b0 0a 20 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52  .  pFrame->lastR
342c0 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52  owid = db->lastR
342d0 6f 77 69 64 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  owid;.  pFrame->
342e0 6e 43 68 61 6e 67 65 20 3d 20 70 2d 3e 6e 43 68  nChange = p->nCh
342f0 61 6e 67 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  ange;.  pFrame->
34300 6e 44 62 43 68 61 6e 67 65 20 3d 20 70 2d 3e 64  nDbChange = p->d
34310 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 61 73  b->nChange;.  as
34320 73 65 72 74 28 20 70 46 72 61 6d 65 2d 3e 70 41  sert( pFrame->pA
34330 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 70  uxData==0 );.  p
34340 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20  Frame->pAuxData 
34350 3d 20 70 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20  = p->pAuxData;. 
34360 20 70 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30   p->pAuxData = 0
34370 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
34380 20 30 3b 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20   0;.  p->pFrame 
34390 3d 20 70 46 72 61 6d 65 3b 0a 20 20 70 2d 3e 61  = pFrame;.  p->a
343a0 4d 65 6d 20 3d 20 61 4d 65 6d 20 3d 20 56 64 62  Mem = aMem = Vdb
343b0 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65  eFrameMem(pFrame
343c0 29 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70  );.  p->nMem = p
343d0 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Frame->nChildMem
343e0 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  p->nCursor =
343f0 20 28 75 31 36 29 70 46 72 61 6d 65 2d 3e 6e 43   (u16)pFrame->nC
34400 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d 3e 61 70  hildCsr;.  p->ap
34410 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f  Csr = (VdbeCurso
34420 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d  r **)&aMem[p->nM
34430 65 6d 5d 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 61  em];.  pFrame->a
34440 4f 6e 63 65 20 3d 20 28 75 38 2a 29 26 70 2d 3e  Once = (u8*)&p->
34450 61 70 43 73 72 5b 70 50 72 6f 67 72 61 6d 2d 3e  apCsr[pProgram->
34460 6e 43 73 72 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCsr];.  memset(
34470 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 2c 20 30  pFrame->aOnce, 0
34480 2c 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70  , (pProgram->nOp
34490 20 2b 20 37 29 2f 38 29 3b 0a 20 20 70 2d 3e 61   + 7)/8);.  p->a
344a0 4f 70 20 3d 20 61 4f 70 20 3d 20 70 50 72 6f 67  Op = aOp = pProg
344b0 72 61 6d 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e  ram->aOp;.  p->n
344c0 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  Op = pProgram->n
344d0 4f 70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Op;.#ifdef SQLIT
344e0 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
344f0 41 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e  ANSTATUS.  p->an
34500 45 78 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Exec = 0;.#endif
34510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
34520 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
34530 20 74 68 61 74 20 73 65 63 6f 6e 64 20 61 6e 64   that second and
34540 20 73 75 62 73 65 71 75 65 6e 74 20 65 78 65 63   subsequent exec
34550 75 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61  utions of the sa
34560 6d 65 20 74 72 69 67 67 65 72 20 64 6f 20 6e 6f  me trigger do no
34570 74 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 72 65  t.  ** try to re
34580 75 73 65 20 72 65 67 69 73 74 65 72 20 76 61 6c  use register val
34590 75 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72  ues from the fir
345a0 73 74 20 75 73 65 2e 20 2a 2f 0a 20 20 7b 0a 20  st use. */.  {. 
345b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
345c0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=0; i<p->nMem
345d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 4d  ; i++){.      aM
345e0 65 6d 5b 69 5d 2e 70 53 63 6f 70 79 46 72 6f 6d  em[i].pScopyFrom
345f0 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
34600 74 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  t false-positive
34610 20 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 29   AboutToChange()
34620 20 65 72 72 73 20 2a 2f 0a 20 20 20 20 20 20 61   errs */.      a
34630 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 7c 3d 20  Mem[i].flags |= 
34640 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 20 2f  MEM_Undefined; /
34650 2a 20 43 61 75 73 65 20 61 20 66 61 75 6c 74 20  * Cause a fault 
34660 69 66 20 74 68 69 73 20 72 65 67 20 69 73 20 72  if this reg is r
34670 65 75 73 65 64 20 2a 2f 0a 20 20 20 20 7d 0a 20  eused */.    }. 
34680 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4f 70 20   }.#endif.  pOp 
34690 3d 20 26 61 4f 70 5b 2d 31 5d 3b 0a 20 20 67 6f  = &aOp[-1];.  go
346a0 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  to check_for_int
346b0 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70  errupt;.}../* Op
346c0 63 6f 64 65 3a 20 50 61 72 61 6d 20 50 31 20 50  code: Param P1 P
346d0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  2 * * *.**.** Th
346e0 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c  is opcode is onl
346f0 79 20 65 76 65 72 20 70 72 65 73 65 6e 74 20 69  y ever present i
34700 6e 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  n sub-programs c
34710 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 0a 2a  alled via the .*
34720 2a 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73  * OP_Program ins
34730 74 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79 20 61  truction. Copy a
34740 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79   value currently
34750 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6d 65 6d   stored in a mem
34760 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66 20  ory .** cell of 
34770 74 68 65 20 63 61 6c 6c 69 6e 67 20 28 70 61 72  the calling (par
34780 65 6e 74 29 20 66 72 61 6d 65 20 74 6f 20 63 65  ent) frame to ce
34790 6c 6c 20 50 32 20 69 6e 20 74 68 65 20 63 75 72  ll P2 in the cur
347a0 72 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a 2a 20  rent frames .** 
347b0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 54  address space. T
347c0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
347d0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20  rigger programs 
347e0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6e 65  to access the ne
347f0 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64 2e  w.* .** and old.
34800 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  * values..**.** 
34810 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  The address of t
34820 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70  he cell in the p
34830 61 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20 64  arent frame is d
34840 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 64 64  etermined by add
34850 69 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ing.** the value
34860 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d   of the P1 argum
34870 65 6e 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ent to the value
34880 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d   of the P1 argum
34890 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61  ent to the.** ca
348a0 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d  lling OP_Program
348b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
348c0 0a 63 61 73 65 20 4f 50 5f 50 61 72 61 6d 3a 20  .case OP_Param: 
348d0 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  {           /* o
348e0 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ut2 */.  VdbeFra
348f0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d 65  me *pFrame;.  Me
34900 6d 20 2a 70 49 6e 3b 0a 20 20 70 4f 75 74 20 3d  m *pIn;.  pOut =
34910 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
34920 70 2c 20 70 4f 70 29 3b 0a 20 20 70 46 72 61 6d  p, pOp);.  pFram
34930 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20  e = p->pFrame;. 
34940 20 70 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d 3e   pIn = &pFrame->
34950 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20 70  aMem[pOp->p1 + p
34960 46 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61 6d  Frame->aOp[pFram
34970 65 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a 20  e->pc].p1];   . 
34980 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
34990 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
349a0 20 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d 29   pIn, MEM_Ephem)
349b0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65  ;.  break;.}..#e
349c0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
349d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
349e0 47 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  GER */..#ifndef 
349f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
34a00 49 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64  IGN_KEY./* Opcod
34a10 65 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50 31 20  e: FkCounter P1 
34a20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
34a30 70 73 69 73 3a 20 66 6b 63 74 72 5b 50 31 5d 2b  psis: fkctr[P1]+
34a40 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d  =P2.**.** Increm
34a50 65 6e 74 20 61 20 22 63 6f 6e 73 74 72 61 69 6e  ent a "constrain
34a60 74 20 63 6f 75 6e 74 65 72 22 20 62 79 20 50 32  t counter" by P2
34a70 20 28 50 32 20 6d 61 79 20 62 65 20 6e 65 67 61   (P2 may be nega
34a80 74 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76 65  tive or positive
34a90 29 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e  )..** If P1 is n
34aa0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 64 61 74  on-zero, the dat
34ab0 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  abase constraint
34ac0 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72   counter is incr
34ad0 65 6d 65 6e 74 65 64 20 0a 2a 2a 20 28 64 65 66  emented .** (def
34ae0 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
34af0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20  y constraints). 
34b00 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 31  Otherwise, if P1
34b10 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 0a 2a   is zero, the .*
34b20 2a 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 75 6e  * statement coun
34b30 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ter is increment
34b40 65 64 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f  ed (immediate fo
34b50 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
34b60 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73 65 20  aints)..*/.case 
34b70 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 3a 20 7b 0a  OP_FkCounter: {.
34b80 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
34b90 26 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  & SQLITE_DeferFK
34ba0 73 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  s ){.    db->nDe
34bb0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 2b 3d  ferredImmCons +=
34bc0 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73   pOp->p2;.  }els
34bd0 65 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b  e if( pOp->p1 ){
34be0 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
34bf0 65 64 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70  edCons += pOp->p
34c00 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
34c10 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
34c20 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d   += pOp->p2;.  }
34c30 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
34c40 4f 70 63 6f 64 65 3a 20 46 6b 49 66 5a 65 72 6f  Opcode: FkIfZero
34c50 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
34c60 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 66 6b 63  Synopsis: if fkc
34c70 74 72 5b 50 31 5d 3d 3d 30 20 67 6f 74 6f 20 50  tr[P1]==0 goto P
34c80 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  2.**.** This opc
34c90 6f 64 65 20 74 65 73 74 73 20 69 66 20 61 20 66  ode tests if a f
34ca0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
34cb0 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73  raint-counter is
34cc0 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2e   currently zero.
34cd0 0a 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20  .** If so, jump 
34ce0 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50  to instruction P
34cf0 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  2. Otherwise, fa
34d00 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
34d10 65 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74 72  e next .** instr
34d20 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  uction..**.** If
34d30 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   P1 is non-zero,
34d40 20 74 68 65 6e 20 74 68 65 20 6a 75 6d 70 20 69   then the jump i
34d50 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20 64  s taken if the d
34d60 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69  atabase constrai
34d70 6e 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69 73  nt-counter.** is
34d80 20 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65 20 74   zero (the one t
34d90 68 61 74 20 63 6f 75 6e 74 73 20 64 65 66 65 72  hat counts defer
34da0 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
34db0 69 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20 50  iolations). If P
34dc0 31 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68  1 is.** zero, th
34dd0 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
34de0 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
34df0 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e   constraint-coun
34e00 74 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28  ter is zero.** (
34e10 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
34e20 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
34e30 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f   violations)..*/
34e40 0a 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65 72  .case OP_FkIfZer
34e50 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20  o: {         /* 
34e60 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 4f  jump */.  if( pO
34e70 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 56 64 62  p->p1 ){.    Vdb
34e80 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 64 62 2d  eBranchTaken(db-
34e90 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d  >nDeferredCons==
34ea0 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72  0 && db->nDeferr
34eb0 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29  edImmCons==0, 2)
34ec0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 44  ;.    if( db->nD
34ed0 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20 26  eferredCons==0 &
34ee0 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  & db->nDeferredI
34ef0 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74 6f  mmCons==0 ) goto
34f00 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
34f10 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42 72  else{.    VdbeBr
34f20 61 6e 63 68 54 61 6b 65 6e 28 70 2d 3e 6e 46 6b  anchTaken(p->nFk
34f30 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26 26  Constraint==0 &&
34f40 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
34f50 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20 20  mCons==0, 2);.  
34f60 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73    if( p->nFkCons
34f70 74 72 61 69 6e 74 3d 3d 30 20 26 26 20 64 62 2d  traint==0 && db-
34f80 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
34f90 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70  s==0 ) goto jump
34fa0 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
34fb0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
34fc0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
34fd0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
34fe0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
34ff0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
35000 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65  REMENT./* Opcode
35010 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32 20 2a  : MemMax P1 P2 *
35020 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
35030 3a 20 72 5b 50 31 5d 3d 6d 61 78 28 72 5b 50 31  : r[P1]=max(r[P1
35040 5d 2c 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 50  ],r[P2]).**.** P
35050 31 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  1 is a register 
35060 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d  in the root fram
35070 65 20 6f 66 20 74 68 69 73 20 56 4d 20 28 74 68  e of this VM (th
35080 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 69 73 0a  e root frame is.
35090 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
350a0 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  m the current fr
350b0 61 6d 65 20 69 66 20 74 68 69 73 20 69 6e 73 74  ame if this inst
350c0 72 75 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ruction is being
350d0 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 77 69 74   executed.** wit
350e0 68 69 6e 20 61 20 73 75 62 2d 70 72 6f 67 72 61  hin a sub-progra
350f0 6d 29 2e 20 53 65 74 20 74 68 65 20 76 61 6c 75  m). Set the valu
35100 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  e of register P1
35110 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
35120 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75 72 72 65  of .** its curre
35130 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  nt value and the
35140 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
35150 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
35160 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  s instruction th
35170 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69 66  rows an error if
35180 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
35190 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c   is not initiall
351a0 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e  y.** an integer.
351b0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d 4d  .*/.case OP_MemM
351c0 61 78 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ax: {        /* 
351d0 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  in2 */.  VdbeFra
351e0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69 66  me *pFrame;.  if
351f0 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
35200 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
35210 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
35220 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
35230 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
35240 29 3b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 70  );.    pIn1 = &p
35250 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d  Frame->aMem[pOp-
35260 3e 70 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  >p1];.  }else{. 
35270 20 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b     pIn1 = &aMem[
35280 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20 20  pOp->p1];.  }.  
35290 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
352a0 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 73 71  id(pIn1) );.  sq
352b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
352c0 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  gerify(pIn1);.  
352d0 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
352e0 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ->p2];.  sqlite3
352f0 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
35300 79 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 70  y(pIn2);.  if( p
35310 49 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75  In1->u.i<pIn2->u
35320 2e 69 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75  .i){.    pIn1->u
35330 2e 69 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a  .i = pIn2->u.i;.
35340 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
35350 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
35360 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
35370 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65  NT */../* Opcode
35380 3a 20 49 66 50 6f 73 20 50 31 20 50 32 20 50 33  : IfPos P1 P2 P3
35390 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
353a0 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20 74 68 65  : if r[P1]>0 the
353b0 6e 20 72 5b 50 31 5d 2d 3d 50 33 2c 20 67 6f 74  n r[P1]-=P3, got
353c0 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73  o P2.**.** Regis
353d0 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e 74  ter P1 must cont
353e0 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  ain an integer..
353f0 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
35400 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
35410 73 20 31 20 6f 72 20 67 72 65 61 74 65 72 2c 20  s 1 or greater, 
35420 73 75 62 74 72 61 63 74 20 50 33 20 66 72 6f 6d  subtract P3 from
35430 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e   the.** value in
35440 20 50 31 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20   P1 and jump to 
35450 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P2..**.** If the
35460 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
35470 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  f register P1 is
35480 20 6c 65 73 73 20 74 68 61 6e 20 31 2c 20 74 68   less than 1, th
35490 65 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  en the.** value 
354a0 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
354b0 20 63 6f 6e 74 72 6f 6c 20 70 61 73 73 65 73 20   control passes 
354c0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
354d0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
354e0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 50 6f  .*/.case OP_IfPo
354f0 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  s: {        /* j
35500 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  ump, in1 */.  pI
35510 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
35520 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
35530 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49  In1->flags&MEM_I
35540 6e 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e  nt );.  VdbeBran
35550 63 68 54 61 6b 65 6e 28 20 70 49 6e 31 2d 3e 75  chTaken( pIn1->u
35560 2e 69 3e 30 2c 20 32 29 3b 0a 20 20 69 66 28 20  .i>0, 2);.  if( 
35570 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a 20  pIn1->u.i>0 ){. 
35580 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2d 3d 20     pIn1->u.i -= 
35590 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 67 6f 74  pOp->p3;.    got
355a0 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
355b0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
355c0 20 4f 70 63 6f 64 65 3a 20 4f 66 66 73 65 74 4c   Opcode: OffsetL
355d0 69 6d 69 74 20 50 31 20 50 32 20 50 33 20 2a 20  imit P1 P2 P3 * 
355e0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
355f0 66 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e 20 72  f r[P1]>0 then r
35600 5b 50 32 5d 3d 72 5b 50 31 5d 2b 6d 61 78 28 30  [P2]=r[P1]+max(0
35610 2c 72 5b 50 33 5d 29 20 65 6c 73 65 20 72 5b 50  ,r[P3]) else r[P
35620 32 5d 3d 28 2d 31 29 0a 2a 2a 0a 2a 2a 20 54 68  2]=(-1).**.** Th
35630 69 73 20 6f 70 63 6f 64 65 20 70 65 72 66 6f 72  is opcode perfor
35640 6d 73 20 61 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73  ms a commonly us
35650 65 64 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 61  ed computation a
35660 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
35670 2a 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  * LIMIT and OFFS
35680 45 54 20 70 72 6f 63 65 73 73 2e 20 20 72 5b 50  ET process.  r[P
35690 31 5d 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 6d  1] holds the lim
356a0 69 74 20 63 6f 75 6e 74 65 72 2e 20 20 72 5b 50  it counter.  r[P
356b0 33 5d 0a 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20  3].** holds the 
356c0 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 2e 20  offset counter. 
356d0 20 54 68 65 20 6f 70 63 6f 64 65 20 63 6f 6d 70   The opcode comp
356e0 75 74 65 73 20 74 68 65 20 63 6f 6d 62 69 6e 65  utes the combine
356f0 64 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  d value.** of th
35700 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
35710 45 54 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68  ET and stores th
35720 61 74 20 76 61 6c 75 65 20 69 6e 20 72 5b 50 32  at value in r[P2
35730 5d 2e 20 20 54 68 65 20 72 5b 50 32 5d 0a 2a 2a  ].  The r[P2].**
35740 20 76 61 6c 75 65 20 63 6f 6d 70 75 74 65 64 20   value computed 
35750 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
35760 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
35770 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
35780 0a 2a 2a 20 76 69 73 69 74 65 64 20 69 6e 20 6f  .** visited in o
35790 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
357a0 20 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a   the query..**.*
357b0 2a 20 49 66 20 72 5b 50 33 5d 20 69 73 20 7a 65  * If r[P3] is ze
357c0 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c 20  ro or negative, 
357d0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72 65  that means there
357e0 20 69 73 20 6e 6f 20 4f 46 46 53 45 54 0a 2a 2a   is no OFFSET.**
357f0 20 61 6e 64 20 72 5b 50 32 5d 20 69 73 20 73 65   and r[P2] is se
35800 74 20 74 6f 20 62 65 20 74 68 65 20 76 61 6c 75  t to be the valu
35810 65 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 2c 20  e of the LIMIT, 
35820 72 5b 50 31 5d 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  r[P1]..**.** if 
35830 72 5b 50 31 5d 20 69 73 20 7a 65 72 6f 20 6f 72  r[P1] is zero or
35840 20 6e 65 67 61 74 69 76 65 2c 20 74 68 61 74 20   negative, that 
35850 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e  means there is n
35860 6f 20 4c 49 4d 49 54 0a 2a 2a 20 61 6e 64 20 72  o LIMIT.** and r
35870 5b 50 32 5d 20 69 73 20 73 65 74 20 74 6f 20 2d  [P2] is set to -
35880 31 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  1. .**.** Otherw
35890 69 73 65 2c 20 72 5b 50 32 5d 20 69 73 20 73 65  ise, r[P2] is se
358a0 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20  t to the sum of 
358b0 72 5b 50 31 5d 20 61 6e 64 20 72 5b 50 33 5d 2e  r[P1] and r[P3].
358c0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 66 66 73  .*/.case OP_Offs
358d0 65 74 4c 69 6d 69 74 3a 20 7b 20 20 20 20 2f 2a  etLimit: {    /*
358e0 20 69 6e 31 2c 20 6f 75 74 32 2c 20 69 6e 33 20   in1, out2, in3 
358f0 2a 2f 0a 20 20 69 36 34 20 78 3b 0a 20 20 70 49  */.  i64 x;.  pI
35900 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
35910 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61  p1];.  pIn3 = &a
35920 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
35930 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
35940 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
35950 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
35960 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
35970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 33  ;.  assert( pIn3
35980 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
35990 74 20 29 3b 0a 20 20 78 20 3d 20 70 49 6e 31 2d  t );.  x = pIn1-
359a0 3e 75 2e 69 3b 0a 20 20 69 66 28 20 78 3c 3d 30  >u.i;.  if( x<=0
359b0 20 7c 7c 20 73 71 6c 69 74 65 33 41 64 64 49 6e   || sqlite3AddIn
359c0 74 36 34 28 26 78 2c 20 70 49 6e 33 2d 3e 75 2e  t64(&x, pIn3->u.
359d0 69 3e 30 3f 70 49 6e 33 2d 3e 75 2e 69 3a 30 29  i>0?pIn3->u.i:0)
359e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
359f0 65 20 4c 49 4d 49 54 20 69 73 20 6c 65 73 73 20  e LIMIT is less 
35a00 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
35a10 20 7a 65 72 6f 2c 20 6c 6f 6f 70 20 66 6f 72 65   zero, loop fore
35a20 76 65 72 2e 20 20 54 68 69 73 0a 20 20 20 20 2a  ver.  This.    *
35a30 2a 20 69 73 20 64 6f 63 75 6d 65 6e 74 65 64 2e  * is documented.
35a40 20 20 42 75 74 20 61 6c 73 6f 2c 20 69 66 20 74    But also, if t
35a50 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  he LIMIT+OFFSET 
35a60 65 78 63 65 65 64 73 20 32 5e 36 33 20 74 68 65  exceeds 2^63 the
35a70 6e 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6c 6f  n.    ** also lo
35a80 6f 70 20 66 6f 72 65 76 65 72 2e 20 20 54 68 69  op forever.  Thi
35a90 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65  s is undocumente
35aa0 64 2e 20 20 49 6e 20 66 61 63 74 2c 20 6f 6e 65  d.  In fact, one
35ab0 20 63 6f 75 6c 64 20 61 72 67 75 65 0a 20 20 20   could argue.   
35ac0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 6f 6f   ** that the loo
35ad0 70 20 73 68 6f 75 6c 64 20 74 65 72 6d 69 6e 61  p should termina
35ae0 74 65 2e 20 20 42 75 74 20 61 73 73 75 6d 69 6e  te.  But assumin
35af0 67 20 31 20 62 69 6c 6c 69 6f 6e 20 69 74 65 72  g 1 billion iter
35b00 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 70 65  ations.    ** pe
35b10 72 20 73 65 63 6f 6e 64 20 28 66 61 72 20 65 78  r second (far ex
35b20 63 65 65 64 69 6e 67 20 74 68 65 20 63 61 70 61  ceeding the capa
35b30 62 69 6c 69 74 69 65 73 20 6f 66 20 61 6e 79 20  bilities of any 
35b40 63 75 72 72 65 6e 74 20 68 61 72 64 77 61 72 65  current hardware
35b50 29 0a 20 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c  ).    ** it woul
35b60 64 20 74 61 6b 65 20 6e 65 61 72 6c 79 20 33 30  d take nearly 30
35b70 30 20 79 65 61 72 73 20 74 6f 20 61 63 74 75 61  0 years to actua
35b80 6c 6c 79 20 72 65 61 63 68 20 74 68 65 20 6c 69  lly reach the li
35b90 6d 69 74 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  mit.  So.    ** 
35ba0 6c 6f 6f 70 69 6e 67 20 66 6f 72 65 76 65 72 20  looping forever 
35bb0 69 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20  is a reasonable 
35bc0 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 2e 20 2a  approximation. *
35bd0 2f 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  /.    pOut->u.i 
35be0 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
35bf0 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 78     pOut->u.i = x
35c00 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
35c10 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e  ../* Opcode: IfN
35c20 6f 74 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a  otZero P1 P2 * *
35c30 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
35c40 69 66 20 72 5b 50 31 5d 21 3d 30 20 74 68 65 6e  if r[P1]!=0 then
35c50 20 72 5b 50 31 5d 2d 2d 2c 20 67 6f 74 6f 20 50   r[P1]--, goto P
35c60 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  2.**.** Register
35c70 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e   P1 must contain
35c80 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66   an integer.  If
35c90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
35ca0 72 65 67 69 73 74 65 72 20 50 31 20 69 73 0a 2a  register P1 is.*
35cb0 2a 20 69 6e 69 74 69 61 6c 6c 79 20 67 72 65 61  * initially grea
35cc0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
35cd0 68 65 6e 20 64 65 63 72 65 6d 65 6e 74 20 74 68  hen decrement th
35ce0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
35cf0 74 65 72 20 50 31 2e 0a 2a 2a 20 49 66 20 69 74  ter P1..** If it
35d00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 65   is non-zero (ne
35d10 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74 69  gative or positi
35d20 76 65 29 20 61 6e 64 20 74 68 65 6e 20 61 6c 73  ve) and then als
35d30 6f 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 0a  o jump to P2.  .
35d40 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20 50  ** If register P
35d50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 7a  1 is initially z
35d60 65 72 6f 2c 20 6c 65 61 76 65 20 69 74 20 75 6e  ero, leave it un
35d70 63 68 61 6e 67 65 64 20 61 6e 64 20 66 61 6c 6c  changed and fall
35d80 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73   through..*/.cas
35d90 65 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 3a 20  e OP_IfNotZero: 
35da0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
35db0 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
35dc0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
35dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
35de0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
35df0 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
35e00 61 6b 65 6e 28 70 49 6e 31 2d 3e 75 2e 69 3c 30  aken(pIn1->u.i<0
35e10 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31  , 2);.  if( pIn1
35e20 2d 3e 75 2e 69 20 29 7b 0a 20 20 20 20 20 69 66  ->u.i ){.     if
35e30 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 20  ( pIn1->u.i>0 ) 
35e40 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 20  pIn1->u.i--;.   
35e50 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
35e60 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
35e70 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65  }../* Opcode: De
35e80 63 72 4a 75 6d 70 5a 65 72 6f 20 50 31 20 50 32  crJumpZero P1 P2
35e90 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
35ea0 69 73 3a 20 69 66 20 28 2d 2d 72 5b 50 31 5d 29  is: if (--r[P1])
35eb0 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a  ==0 goto P2.**.*
35ec0 2a 20 52 65 67 69 73 74 65 72 20 50 31 20 6d 75  * Register P1 mu
35ed0 73 74 20 68 6f 6c 64 20 61 6e 20 69 6e 74 65 67  st hold an integ
35ee0 65 72 2e 20 20 44 65 63 72 65 6d 65 6e 74 20 74  er.  Decrement t
35ef0 68 65 20 76 61 6c 75 65 20 69 6e 20 50 31 0a 2a  he value in P1.*
35f00 2a 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 50 32  * and jump to P2
35f10 20 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75   if the new valu
35f20 65 20 69 73 20 65 78 61 63 74 6c 79 20 7a 65 72  e is exactly zer
35f30 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65  o..*/.case OP_De
35f40 63 72 4a 75 6d 70 5a 65 72 6f 3a 20 7b 20 20 20  crJumpZero: {   
35f50 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
35f60 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
35f70 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
35f80 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67  sert( pIn1->flag
35f90 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69  s&MEM_Int );.  i
35fa0 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 53 4d 41  f( pIn1->u.i>SMA
35fb0 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 70 49  LLEST_INT64 ) pI
35fc0 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 56 64 62  n1->u.i--;.  Vdb
35fd0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 49 6e  eBranchTaken(pIn
35fe0 31 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a 20  1->u.i==0, 2);. 
35ff0 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3d 3d   if( pIn1->u.i==
36000 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  0 ) goto jump_to
36010 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
36020 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67  ../* Opcode: Agg
36030 53 74 65 70 20 2a 20 50 32 20 50 33 20 50 34 20  Step * P2 P3 P4 
36040 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
36050 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70  accum=r[P3] step
36060 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a  (r[P2@P5]).**.**
36070 20 45 78 65 63 75 74 65 20 74 68 65 20 78 53 74   Execute the xSt
36080 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ep function for 
36090 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  an aggregate..**
360a0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61   The function ha
360b0 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20  s P5 arguments. 
360c0 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
360d0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 46 75 6e 63   to the .** Func
360e0 44 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68  Def structure th
360f0 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65  at specifies the
36100 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69   function.  Regi
36110 73 74 65 72 20 50 33 20 69 73 20 74 68 65 0a 2a  ster P3 is the.*
36120 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  * accumulator..*
36130 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67 75  *.** The P5 argu
36140 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e 20  ments are taken 
36150 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32  from register P2
36160 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63 63   and its.** succ
36170 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70  essors..*/./* Op
36180 63 6f 64 65 3a 20 41 67 67 49 6e 76 65 72 73 65  code: AggInverse
36190 20 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a   * P2 P3 P4 P5.*
361a0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75  * Synopsis: accu
361b0 6d 3d 72 5b 50 33 5d 20 69 6e 76 65 72 73 65 28  m=r[P3] inverse(
361c0 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20  r[P2@P5]).**.** 
361d0 45 78 65 63 75 74 65 20 74 68 65 20 78 49 6e 76  Execute the xInv
361e0 65 72 73 65 20 66 75 6e 63 74 69 6f 6e 20 66 6f  erse function fo
361f0 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a  r an aggregate..
36200 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  ** The function 
36210 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73  has P5 arguments
36220 2e 20 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  .  P4 is a point
36230 65 72 20 74 6f 20 74 68 65 20 0a 2a 2a 20 46 75  er to the .** Fu
36240 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20  ncDef structure 
36250 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74  that specifies t
36260 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  he function.  Re
36270 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
36280 0a 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  .** accumulator.
36290 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72  .**.** The P5 ar
362a0 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65  guments are take
362b0 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20  n from register 
362c0 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75  P2 and its.** su
362d0 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20  ccessors..*/./* 
362e0 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70 31  Opcode: AggStep1
362f0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
36300 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63  ** Synopsis: acc
36310 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b  um=r[P3] step(r[
36320 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78  P2@P5]).**.** Ex
36330 65 63 75 74 65 20 74 68 65 20 78 53 74 65 70 20  ecute the xStep 
36340 28 69 66 20 50 31 3d 3d 30 29 20 6f 72 20 78 49  (if P1==0) or xI
36350 6e 76 65 72 73 65 20 28 69 66 20 50 31 21 3d 30  nverse (if P1!=0
36360 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
36370 6e 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 2e 20  n.** aggregate. 
36380 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61   The function ha
36390 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20  s P5 arguments. 
363a0 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
363b0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 46 75 6e 63   to the .** Func
363c0 44 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68  Def structure th
363d0 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65  at specifies the
363e0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69   function.  Regi
363f0 73 74 65 72 20 50 33 20 69 73 20 74 68 65 0a 2a  ster P3 is the.*
36400 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  * accumulator..*
36410 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67 75  *.** The P5 argu
36420 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e 20  ments are taken 
36430 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32  from register P2
36440 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63 63   and its.** succ
36450 65 73 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  essors..**.** Th
36460 69 73 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 69  is opcode is ini
36470 74 69 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  tially coded as 
36480 4f 50 5f 41 67 67 53 74 65 70 30 2e 20 20 4f 6e  OP_AggStep0.  On
36490 20 66 69 72 73 74 20 65 76 61 6c 75 61 74 69 6f   first evaluatio
364a0 6e 2c 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  n,.** the FuncDe
364b0 66 20 73 74 6f 72 65 64 20 69 6e 20 50 34 20 69  f stored in P4 i
364c0 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
364d0 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74   an sqlite3_cont
364e0 65 78 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 6f  ext and.** the o
364f0 70 63 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64  pcode is changed
36500 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
36510 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
36520 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c  on of the.** sql
36530 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 6e 6c  ite3_context onl
36540 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2c 20  y happens once, 
36550 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 20 65 61  instead of on ea
36560 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 65 0a 2a  ch call to the.*
36570 2a 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  * step function.
36580 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 49  .*/.case OP_AggI
36590 6e 76 65 72 73 65 3a 0a 63 61 73 65 20 4f 50 5f  nverse:.case OP_
365a0 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74  AggStep: {.  int
365b0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f   n;.  sqlite3_co
365c0 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 0a 20 20  ntext *pCtx;..  
365d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
365e0 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45 46 20  ype==P4_FUNCDEF 
365f0 29 3b 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35  );.  n = pOp->p5
36600 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
36610 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
36620 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
36630 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
36640 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 7c 7c 20  assert( n==0 || 
36650 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f  (pOp->p2>0 && pO
36660 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65  p->p2+n<=(p->nMe
36670 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
36680 29 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  )+1) );.  assert
36690 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70  ( pOp->p3<pOp->p
366a0 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f  2 || pOp->p3>=pO
366b0 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20 70 43 74  p->p2+n );.  pCt
366c0 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
366d0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 2a 73  locRawNN(db, n*s
366e0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 61  izeof(sqlite3_va
366f0 6c 75 65 2a 29 20 2b 0a 20 20 20 20 20 20 20 20  lue*) +.        
36700 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 70         (sizeof(p
36710 43 74 78 5b 30 5d 29 20 2b 20 73 69 7a 65 6f 66  Ctx[0]) + sizeof
36720 28 4d 65 6d 29 20 2d 20 73 69 7a 65 6f 66 28 73  (Mem) - sizeof(s
36730 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 29  qlite3_value*)))
36740 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20  ;.  if( pCtx==0 
36750 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
36760 20 70 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b   pCtx->pMem = 0;
36770 0a 20 20 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20  .  pCtx->pOut = 
36780 28 4d 65 6d 2a 29 26 28 70 43 74 78 2d 3e 61 72  (Mem*)&(pCtx->ar
36790 67 76 5b 6e 5d 29 3b 0a 20 20 73 71 6c 69 74 65  gv[n]);.  sqlite
367a0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 70 43 74  3VdbeMemInit(pCt
367b0 78 2d 3e 70 4f 75 74 2c 20 64 62 2c 20 4d 45 4d  x->pOut, db, MEM
367c0 5f 4e 75 6c 6c 29 3b 0a 20 20 70 43 74 78 2d 3e  _Null);.  pCtx->
367d0 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e  pFunc = pOp->p4.
367e0 70 46 75 6e 63 3b 0a 20 20 70 43 74 78 2d 3e 69  pFunc;.  pCtx->i
367f0 4f 70 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d  Op = (int)(pOp -
36800 20 61 4f 70 29 3b 0a 20 20 70 43 74 78 2d 3e 70   aOp);.  pCtx->p
36810 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 43 74 78  Vdbe = p;.  pCtx
36820 2d 3e 73 6b 69 70 46 6c 61 67 20 3d 20 30 3b 0a  ->skipFlag = 0;.
36830 20 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 20    pCtx->isError 
36840 3d 20 30 3b 0a 20 20 70 43 74 78 2d 3e 61 72 67  = 0;.  pCtx->arg
36850 63 20 3d 20 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34  c = n;.  pOp->p4
36860 74 79 70 65 20 3d 20 50 34 5f 46 55 4e 43 43 54  type = P4_FUNCCT
36870 58 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 43 74  X;.  pOp->p4.pCt
36880 78 20 3d 20 70 43 74 78 3b 0a 0a 20 20 2f 2a 20  x = pCtx;..  /* 
36890 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 20 6d 75  OP_AggInverse mu
368a0 73 74 20 68 61 76 65 20 50 31 3d 3d 31 20 61 6e  st have P1==1 an
368b0 64 20 4f 50 5f 41 67 67 53 74 65 70 20 6d 75 73  d OP_AggStep mus
368c0 74 20 68 61 76 65 20 50 31 3d 3d 30 20 2a 2f 0a  t have P1==0 */.
368d0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
368e0 31 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  1==(pOp->opcode=
368f0 3d 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 29 20  =OP_AggInverse) 
36900 29 3b 0a 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  );..  pOp->opcod
36910 65 20 3d 20 4f 50 5f 41 67 67 53 74 65 70 31 3b  e = OP_AggStep1;
36920 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
36930 67 68 20 69 6e 74 6f 20 4f 50 5f 41 67 67 53 74  gh into OP_AggSt
36940 65 70 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f 50 5f  ep */.}.case OP_
36950 41 67 67 53 74 65 70 31 3a 20 7b 0a 20 20 69 6e  AggStep1: {.  in
36960 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  t i;.  sqlite3_c
36970 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20  ontext *pCtx;.  
36980 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73  Mem *pMem;..  as
36990 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
369a0 65 3d 3d 50 34 5f 46 55 4e 43 43 54 58 20 29 3b  e==P4_FUNCCTX );
369b0 0a 20 20 70 43 74 78 20 3d 20 70 4f 70 2d 3e 70  .  pCtx = pOp->p
369c0 34 2e 70 43 74 78 3b 0a 20 20 70 4d 65 6d 20 3d  4.pCtx;.  pMem =
369d0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
369e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
369f0 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f 70 2d  DEBUG.  if( pOp-
36a00 3e 70 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  >p1 ){.    /* Th
36a10 69 73 20 69 73 20 61 6e 20 4f 50 5f 41 67 67 49  is is an OP_AggI
36a20 6e 76 65 72 73 65 20 63 61 6c 6c 2e 20 20 56 65  nverse call.  Ve
36a30 72 69 66 79 20 74 68 61 74 20 78 53 74 65 70 20  rify that xStep 
36a40 68 61 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a  has always.    *
36a50 2a 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 74  * been called at
36a60 20 6c 65 61 73 74 20 6f 6e 63 65 20 70 72 69 6f   least once prio
36a70 72 20 74 6f 20 61 6e 79 20 78 49 6e 76 65 72 73  r to any xInvers
36a80 65 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20 61  e call. */.    a
36a90 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 75 54 65  ssert( pMem->uTe
36aa0 6d 70 3d 3d 30 78 31 31 32 32 65 30 65 33 20 29  mp==0x1122e0e3 )
36ab0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
36ac0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 4f 50 5f  * This is an OP_
36ad0 41 67 67 53 74 65 70 20 63 61 6c 6c 2e 20 20 4d  AggStep call.  M
36ae0 61 72 6b 20 69 74 20 61 73 20 73 75 63 68 2e 20  ark it as such. 
36af0 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 54 65  */.    pMem->uTe
36b00 6d 70 20 3d 20 30 78 31 31 32 32 65 30 65 33 3b  mp = 0x1122e0e3;
36b10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
36b20 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
36b30 6f 6e 20 69 73 20 69 6e 73 69 64 65 20 6f 66 20  on is inside of 
36b40 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 20 72  a trigger, the r
36b50 65 67 69 73 74 65 72 20 61 72 72 61 79 20 69 6e  egister array in
36b60 20 61 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67   aMem[].  ** mig
36b70 68 74 20 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f  ht change from o
36b80 6e 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f  ne evaluation to
36b90 20 74 68 65 20 6e 65 78 74 2e 20 20 54 68 65 20   the next.  The 
36ba0 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
36bb0 64 65 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20 74  de.  ** checks t
36bc0 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 67  o see if the reg
36bd0 69 73 74 65 72 20 61 72 72 61 79 20 68 61 73 20  ister array has 
36be0 63 68 61 6e 67 65 64 2c 20 61 6e 64 20 69 66 20  changed, and if 
36bf0 73 6f 20 69 74 0a 20 20 2a 2a 20 72 65 69 6e 69  so it.  ** reini
36c00 74 69 61 6c 69 7a 65 73 20 74 68 65 20 72 65 6c  tializes the rel
36c10 61 76 61 6e 74 20 70 61 72 74 73 20 6f 66 20 74  avant parts of t
36c20 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  he sqlite3_conte
36c30 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  xt object */.  i
36c40 66 28 20 70 43 74 78 2d 3e 70 4d 65 6d 20 21 3d  f( pCtx->pMem !=
36c50 20 70 4d 65 6d 20 29 7b 0a 20 20 20 20 70 43 74   pMem ){.    pCt
36c60 78 2d 3e 70 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a  x->pMem = pMem;.
36c70 20 20 20 20 66 6f 72 28 69 3d 70 43 74 78 2d 3e      for(i=pCtx->
36c80 61 72 67 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  argc-1; i>=0; i-
36c90 2d 29 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d  -) pCtx->argv[i]
36ca0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
36cb0 2b 69 5d 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  +i];.  }..#ifdef
36cc0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
36cd0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d  for(i=0; i<pCtx-
36ce0 3e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >argc; i++){.   
36cf0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
36d00 6c 69 64 28 70 43 74 78 2d 3e 61 72 67 76 5b 69  lid(pCtx->argv[i
36d10 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54  ]) );.    REGIST
36d20 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
36d30 2b 69 2c 20 70 43 74 78 2d 3e 61 72 67 76 5b 69  +i, pCtx->argv[i
36d40 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ]);.  }.#endif..
36d50 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 61    pMem->n++;.  a
36d60 73 73 65 72 74 28 20 70 43 74 78 2d 3e 70 4f 75  ssert( pCtx->pOu
36d70 74 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75  t->flags==MEM_Nu
36d80 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
36d90 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 3d 3d 30  pCtx->isError==0
36da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
36db0 74 78 2d 3e 73 6b 69 70 46 6c 61 67 3d 3d 30 20  tx->skipFlag==0 
36dc0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
36dd0 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
36de0 43 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20  C.  if( pOp->p1 
36df0 29 7b 0a 20 20 20 20 28 70 43 74 78 2d 3e 70 46  ){.    (pCtx->pF
36e00 75 6e 63 2d 3e 78 49 6e 76 65 72 73 65 29 28 70  unc->xInverse)(p
36e10 43 74 78 2c 70 43 74 78 2d 3e 61 72 67 63 2c 70  Ctx,pCtx->argc,p
36e20 43 74 78 2d 3e 61 72 67 76 29 3b 0a 20 20 7d 65  Ctx->argv);.  }e
36e30 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 28 70 43  lse.#endif.  (pC
36e40 74 78 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  tx->pFunc->xSFun
36e50 63 29 28 70 43 74 78 2c 70 43 74 78 2d 3e 61 72  c)(pCtx,pCtx->ar
36e60 67 63 2c 70 43 74 78 2d 3e 61 72 67 76 29 3b 20  gc,pCtx->argv); 
36e70 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d  /* IMP: R-24505-
36e80 32 33 32 33 30 20 2a 2f 0a 0a 20 20 69 66 28 20  23230 */..  if( 
36e90 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 20 29 7b  pCtx->isError ){
36ea0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 69  .    if( pCtx->i
36eb0 73 45 72 72 6f 72 3e 30 20 29 7b 0a 20 20 20 20  sError>0 ){.    
36ec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
36ed0 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69  or(p, "%s", sqli
36ee0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
36ef0 43 74 78 2d 3e 70 4f 75 74 29 29 3b 0a 20 20 20  Ctx->pOut));.   
36f00 20 20 20 72 63 20 3d 20 70 43 74 78 2d 3e 69 73     rc = pCtx->is
36f10 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Error;.    }.   
36f20 20 69 66 28 20 70 43 74 78 2d 3e 73 6b 69 70 46   if( pCtx->skipF
36f30 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  lag ){.      ass
36f40 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
36f50 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20  ode==OP_CollSeq 
36f60 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 4f 70  );.      i = pOp
36f70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69  [-1].p1;.      i
36f80 66 28 20 69 20 29 20 73 71 6c 69 74 65 33 56 64  f( i ) sqlite3Vd
36f90 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61  beMemSetInt64(&a
36fa0 4d 65 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20  Mem[i], 1);.    
36fb0 20 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67    pCtx->skipFlag
36fc0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
36fd0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
36fe0 6c 65 61 73 65 28 70 43 74 78 2d 3e 70 4f 75 74  lease(pCtx->pOut
36ff0 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 75  );.    pCtx->pOu
37000 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  t->flags = MEM_N
37010 75 6c 6c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 69  ull;.    pCtx->i
37020 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  sError = 0;.    
37030 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
37040 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
37050 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
37060 70 43 74 78 2d 3e 70 4f 75 74 2d 3e 66 6c 61 67  pCtx->pOut->flag
37070 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20  s==MEM_Null );. 
37080 20 61 73 73 65 72 74 28 20 70 43 74 78 2d 3e 73   assert( pCtx->s
37090 6b 69 70 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  kipFlag==0 );.  
370a0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
370b0 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c 20 50 31  ode: AggFinal P1
370c0 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
370d0 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b  nopsis: accum=r[
370e0 50 31 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 50  P1] N=P2.**.** P
370f0 31 20 69 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  1 is the memory 
37100 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74 20 69 73  location that is
37110 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
37120 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
37130 65 0a 2a 2a 20 6f 72 20 77 69 6e 64 6f 77 20 66  e.** or window f
37140 75 6e 63 74 69 6f 6e 2e 20 20 45 78 65 63 75 74  unction.  Execut
37150 65 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20  e the finalizer 
37160 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 66 6f 72  function .** for
37170 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 61 6e   an aggregate an
37180 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
37190 6c 74 20 69 6e 20 50 31 2e 0a 2a 2a 0a 2a 2a 20  lt in P1..**.** 
371a0 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  P2 is the number
371b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 68   of arguments th
371c0 61 74 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  at the step func
371d0 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a  tion takes and.*
371e0 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
371f0 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66  r to the FuncDef
37200 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
37210 6f 6e 2e 20 20 54 68 65 20 50 32 0a 2a 2a 20 61  on.  The P2.** a
37220 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75  rgument is not u
37230 73 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f  sed by this opco
37240 64 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  de.  It is only 
37250 74 68 65 72 65 20 74 6f 20 64 69 73 61 6d 62 69  there to disambi
37260 67 75 61 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f  guate.** functio
37270 6e 73 20 74 68 61 74 20 63 61 6e 20 74 61 6b 65  ns that can take
37280 20 76 61 72 79 69 6e 67 20 6e 75 6d 62 65 72 73   varying numbers
37290 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
372a0 54 68 65 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65  The.** P4 argume
372b0 6e 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  nt is only neede
372c0 64 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  d for the case w
372d0 68 65 72 65 0a 2a 2a 20 74 68 65 20 73 74 65 70  here.** the step
372e0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f   function was no
372f0 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  t previously cal
37300 6c 65 64 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  led..*/./* Opcod
37310 65 3a 20 41 67 67 56 61 6c 75 65 20 2a 20 50 32  e: AggValue * P2
37320 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
37330 70 73 69 73 3a 20 72 5b 50 33 5d 3d 76 61 6c 75  psis: r[P3]=valu
37340 65 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 6e 76  e N=P2.**.** Inv
37350 6f 6b 65 20 74 68 65 20 78 56 61 6c 75 65 28 29  oke the xValue()
37360 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 74   function and st
37370 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
37380 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
37390 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e  *.** P2 is the n
373a0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
373b0 74 73 20 74 68 61 74 20 74 68 65 20 73 74 65 70  ts that the step
373c0 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
373d0 61 6e 64 0a 2a 2a 20 50 34 20 69 73 20 61 20 70  and.** P4 is a p
373e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75  ointer to the Fu
373f0 6e 63 44 65 66 20 66 6f 72 20 74 68 69 73 20 66  ncDef for this f
37400 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 50 32  unction.  The P2
37410 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
37420 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 69 73  not used by this
37430 20 6f 70 63 6f 64 65 2e 20 20 49 74 20 69 73 20   opcode.  It is 
37440 6f 6e 6c 79 20 74 68 65 72 65 20 74 6f 20 64 69  only there to di
37450 73 61 6d 62 69 67 75 61 74 65 0a 2a 2a 20 66 75  sambiguate.** fu
37460 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 63 61 6e  nctions that can
37470 20 74 61 6b 65 20 76 61 72 79 69 6e 67 20 6e 75   take varying nu
37480 6d 62 65 72 73 20 6f 66 20 61 72 67 75 6d 65 6e  mbers of argumen
37490 74 73 2e 20 20 54 68 65 0a 2a 2a 20 50 34 20 61  ts.  The.** P4 a
374a0 72 67 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20  rgument is only 
374b0 6e 65 65 64 65 64 20 66 6f 72 20 74 68 65 20 63  needed for the c
374c0 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 74 68 65  ase where.** the
374d0 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 77   step function w
374e0 61 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  as not previousl
374f0 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 63 61 73  y called..*/.cas
37500 65 20 4f 50 5f 41 67 67 56 61 6c 75 65 3a 0a 63  e OP_AggValue:.c
37510 61 73 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 3a  ase OP_AggFinal:
37520 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a   {.  Mem *pMem;.
37530 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
37540 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d  1>0 && pOp->p1<=
37550 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
37560 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 61 73  nCursor) );.  as
37570 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 30  sert( pOp->p3==0
37580 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
37590 3d 4f 50 5f 41 67 67 56 61 6c 75 65 20 29 3b 0a  =OP_AggValue );.
375a0 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70    pMem = &aMem[p
375b0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
375c0 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
375d0 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  & ~(MEM_Null|MEM
375e0 5f 41 67 67 29 29 3d 3d 30 20 29 3b 0a 23 69 66  _Agg))==0 );.#if
375f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37600 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66  _WINDOWFUNC.  if
37610 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20  ( pOp->p3 ){.   
37620 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
37630 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  e(p, &aMem[pOp->
37640 70 33 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  p3]);.    rc = s
37650 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 67 67  qlite3VdbeMemAgg
37660 56 61 6c 75 65 28 70 4d 65 6d 2c 20 26 61 4d 65  Value(pMem, &aMe
37670 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20 70 4f 70 2d  m[pOp->p3], pOp-
37680 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20 20 20 20  >p4.pFunc);.    
37690 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pMem = &aMem[pOp
376a0 2d 3e 70 33 5d 3b 0a 20 20 7d 65 6c 73 65 0a 23  ->p3];.  }else.#
376b0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 72 63  endif.  {.    rc
376c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
376d0 6d 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20  mFinalize(pMem, 
376e0 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a  pOp->p4.pFunc);.
376f0 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 20    }.  .  if( rc 
37700 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
37710 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73 22 2c  beError(p, "%s",
37720 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
37730 65 78 74 28 70 4d 65 6d 29 29 3b 0a 20 20 20 20  ext(pMem));.    
37740 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
37750 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 73  o_error;.  }.  s
37760 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
37770 45 6e 63 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 65  Encoding(pMem, e
37780 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 55 50 44 41  ncoding);.  UPDA
37790 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
377a0 70 4d 65 6d 29 3b 0a 20 20 69 66 28 20 73 71 6c  pMem);.  if( sql
377b0 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69  ite3VdbeMemTooBi
377c0 67 28 70 4d 65 6d 29 20 29 7b 0a 20 20 20 20 67  g(pMem) ){.    g
377d0 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
377e0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66  .  break;.}..#if
377f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37800 5f 57 41 4c 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  _WAL./* Opcode: 
37810 43 68 65 63 6b 70 6f 69 6e 74 20 50 31 20 50 32  Checkpoint P1 P2
37820 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68   P3 * *.**.** Ch
37830 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
37840 65 20 50 31 2e 20 54 68 69 73 20 69 73 20 61 20  e P1. This is a 
37850 6e 6f 2d 6f 70 20 69 66 20 50 31 20 69 73 20 6e  no-op if P1 is n
37860 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  ot currently in.
37870 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 20 50 61 72  ** WAL mode. Par
37880 61 6d 65 74 65 72 20 50 32 20 69 73 20 6f 6e 65  ameter P2 is one
37890 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   of SQLITE_CHECK
378a0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46  POINT_PASSIVE, F
378b0 55 4c 4c 2c 0a 2a 2a 20 52 45 53 54 41 52 54 2c  ULL,.** RESTART,
378c0 20 6f 72 20 54 52 55 4e 43 41 54 45 2e 20 20 57   or TRUNCATE.  W
378d0 72 69 74 65 20 31 20 6f 72 20 30 20 69 6e 74 6f  rite 1 or 0 into
378e0 20 6d 65 6d 5b 50 33 5d 20 69 66 20 74 68 65 20   mem[P3] if the 
378f0 63 68 65 63 6b 70 6f 69 6e 74 20 72 65 74 75 72  checkpoint retur
37900 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  ns.** SQLITE_BUS
37910 59 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63  Y or not, respec
37920 74 69 76 65 6c 79 2e 20 20 57 72 69 74 65 20 74  tively.  Write t
37930 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
37940 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 57 41 4c  es in the.** WAL
37950 20 61 66 74 65 72 20 74 68 65 20 63 68 65 63 6b   after the check
37960 70 6f 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 5b 50  point into mem[P
37970 33 2b 31 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d  3+1] and the num
37980 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
37990 69 6e 20 74 68 65 20 57 41 4c 20 74 68 61 74 20  in the WAL that 
379a0 68 61 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70  have been checkp
379b0 6f 69 6e 74 65 64 20 61 66 74 65 72 20 74 68 65  ointed after the
379c0 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 63   checkpoint.** c
379d0 6f 6d 70 6c 65 74 65 73 20 69 6e 74 6f 20 6d 65  ompletes into me
379e0 6d 5b 50 33 2b 32 5d 2e 20 20 48 6f 77 65 76 65  m[P3+2].  Howeve
379f0 72 20 6f 6e 20 61 6e 20 65 72 72 6f 72 2c 20 6d  r on an error, m
37a00 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 0a 2a 2a 20  em[P3+1] and.** 
37a10 6d 65 6d 5b 50 33 2b 32 5d 20 61 72 65 20 69 6e  mem[P3+2] are in
37a20 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 2d 31 2e  itialized to -1.
37a30 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 68 65 63  .*/.case OP_Chec
37a40 6b 70 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20  kpoint: {.  int 
37a50 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
37a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
37a70 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
37a80 20 69 6e 74 20 61 52 65 73 5b 33 5d 3b 20 20 20   int aRes[3];   
37a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37aa0 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20   /* Results */. 
37ab0 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20   Mem *pMem;     
37ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ad0 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
37ae0 73 20 68 65 72 65 20 2a 2f 0a 0a 20 20 61 73 73  s here */..  ass
37af0 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  ert( p->readOnly
37b00 3d 3d 30 20 29 3b 0a 20 20 61 52 65 73 5b 30 5d  ==0 );.  aRes[0]
37b10 20 3d 20 30 3b 0a 20 20 61 52 65 73 5b 31 5d 20   = 0;.  aRes[1] 
37b20 3d 20 61 52 65 73 5b 32 5d 20 3d 20 2d 31 3b 0a  = aRes[2] = -1;.
37b30 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
37b40 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  2==SQLITE_CHECKP
37b50 4f 49 4e 54 5f 50 41 53 53 49 56 45 0a 20 20 20  OINT_PASSIVE.   
37b60 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d      || pOp->p2==
37b70 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
37b80 54 5f 46 55 4c 4c 0a 20 20 20 20 20 20 20 7c 7c  T_FULL.       ||
37b90 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45   pOp->p2==SQLITE
37ba0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
37bb0 41 52 54 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  ART.       || pO
37bc0 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48  p->p2==SQLITE_CH
37bd0 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
37be0 45 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  E.  );.  rc = sq
37bf0 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
37c00 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  db, pOp->p1, pOp
37c10 2d 3e 70 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20  ->p2, &aRes[1], 
37c20 26 61 52 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28  &aRes[2]);.  if(
37c30 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
37c40 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
37c50 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
37c60 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 72 63  to_error;.    rc
37c70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37c80 20 20 61 52 65 73 5b 30 5d 20 3d 20 31 3b 0a 20    aRes[0] = 1;. 
37c90 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d   }.  for(i=0, pM
37ca0 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
37cb0 70 33 5d 3b 20 69 3c 33 3b 20 69 2b 2b 2c 20 70  p3]; i<3; i++, p
37cc0 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  Mem++){.    sqli
37cd0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74  te3VdbeMemSetInt
37ce0 36 34 28 70 4d 65 6d 2c 20 28 69 36 34 29 61 52  64(pMem, (i64)aR
37cf0 65 73 5b 69 5d 29 3b 0a 20 20 7d 20 20 20 20 0a  es[i]);.  }    .
37d00 20 20 62 72 65 61 6b 3b 0a 7d 3b 20 20 0a 23 65    break;.};  .#e
37d10 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
37d20 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41  LITE_OMIT_PRAGMA
37d30 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 6f 75 72  ./* Opcode: Jour
37d40 6e 61 6c 4d 6f 64 65 20 50 31 20 50 32 20 50 33  nalMode P1 P2 P3
37d50 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67   * *.**.** Chang
37d60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  e the journal mo
37d70 64 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 50  de of database P
37d80 31 20 74 6f 20 50 33 2e 20 50 33 20 6d 75 73 74  1 to P3. P3 must
37d90 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   be one of the.*
37da0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
37db0 4f 44 45 5f 58 58 58 20 76 61 6c 75 65 73 2e 20  ODE_XXX values. 
37dc0 49 66 20 63 68 61 6e 67 69 6e 67 20 62 65 74 77  If changing betw
37dd0 65 65 6e 20 74 68 65 20 76 61 72 69 6f 75 73 20  een the various 
37de0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6d 6f 64 65  rollback.** mode
37df0 73 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63  s (delete, trunc
37e00 61 74 65 2c 20 70 65 72 73 69 73 74 2c 20 6f 66  ate, persist, of
37e10 66 20 61 6e 64 20 6d 65 6d 6f 72 79 29 2c 20 74  f and memory), t
37e20 68 69 73 20 69 73 20 61 20 73 69 6d 70 6c 65 0a  his is a simple.
37e30 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4e 6f  ** operation. No
37e40 20 49 4f 20 69 73 20 72 65 71 75 69 72 65 64 2e   IO is required.
37e50 0a 2a 2a 0a 2a 2a 20 49 66 20 63 68 61 6e 67 69  .**.** If changi
37e60 6e 67 20 69 6e 74 6f 20 6f 72 20 6f 75 74 20 6f  ng into or out o
37e70 66 20 57 41 4c 20 6d 6f 64 65 20 74 68 65 20 70  f WAL mode the p
37e80 72 6f 63 65 64 75 72 65 20 69 73 20 6d 6f 72 65  rocedure is more
37e90 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a   complicated..**
37ea0 0a 2a 2a 20 57 72 69 74 65 20 61 20 73 74 72 69  .** Write a stri
37eb0 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
37ec0 65 20 66 69 6e 61 6c 20 6a 6f 75 72 6e 61 6c 2d  e final journal-
37ed0 6d 6f 64 65 20 74 6f 20 72 65 67 69 73 74 65 72  mode to register
37ee0 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
37ef0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 20 20  JournalMode: {  
37f00 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 42    /* out2 */.  B
37f10 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20 20 20  tree *pBt;      
37f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37f30 2a 20 42 74 72 65 65 20 74 6f 20 63 68 61 6e 67  * Btree to chang
37f40 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f  e journal mode o
37f50 66 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  f */.  Pager *pP
37f60 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
37f70 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
37f80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37f90 70 42 74 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65  pBt */.  int eNe
37fa0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
37fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
37fc0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a  journal mode */.
37fd0 20 20 69 6e 74 20 65 4f 6c 64 3b 20 20 20 20 20    int eOld;     
37fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ff0 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 6a 6f 75    /* The old jou
38000 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66  rnal mode */.#if
38010 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
38020 5f 57 41 4c 0a 20 20 63 6f 6e 73 74 20 63 68 61  _WAL.  const cha
38030 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
38040 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
38050 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
38060 66 6f 72 20 70 50 61 67 65 72 20 2a 2f 0a 23 65  for pPager */.#e
38070 6e 64 69 66 0a 0a 20 20 70 4f 75 74 20 3d 20 6f  ndif..  pOut = o
38080 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
38090 20 70 4f 70 29 3b 0a 20 20 65 4e 65 77 20 3d 20   pOp);.  eNew = 
380a0 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72  pOp->p3;.  asser
380b0 74 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  t( eNew==PAGER_J
380c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
380d0 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  E .       || eNe
380e0 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
380f0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 0a 20  MODE_TRUNCATE . 
38100 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50        || eNew==P
38110 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
38120 5f 50 45 52 53 49 53 54 20 0a 20 20 20 20 20 20  _PERSIST .      
38130 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
38140 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a  JOURNALMODE_OFF.
38150 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d         || eNew==
38160 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
38170 45 5f 4d 45 4d 4f 52 59 0a 20 20 20 20 20 20 20  E_MEMORY.       
38180 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  || eNew==PAGER_J
38190 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20  OURNALMODE_WAL. 
381a0 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50        || eNew==P
381b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
381c0 5f 51 55 45 52 59 0a 20 20 29 3b 0a 20 20 61 73  _QUERY.  );.  as
381d0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
381e0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e   && pOp->p1<db->
381f0 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
38200 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
38210 29 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e  );..  pBt = db->
38220 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74  aDb[pOp->p1].pBt
38230 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  ;.  pPager = sql
38240 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
38250 42 74 29 3b 0a 20 20 65 4f 6c 64 20 3d 20 73 71  Bt);.  eOld = sq
38260 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75  lite3PagerGetJou
38270 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29  rnalMode(pPager)
38280 3b 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41  ;.  if( eNew==PA
38290 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
382a0 51 55 45 52 59 20 29 20 65 4e 65 77 20 3d 20 65  QUERY ) eNew = e
382b0 4f 6c 64 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  Old;.  if( !sqli
382c0 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e  te3PagerOkToChan
382d0 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  geJournalMode(pP
382e0 61 67 65 72 29 20 29 20 65 4e 65 77 20 3d 20 65  ager) ) eNew = e
382f0 4f 6c 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Old;..#ifndef SQ
38300 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
38310 7a 46 69 6c 65 6e 61 6d 65