/ Hex Artifact Content
Login

Artifact aaa36d1ac7d55baf007e9c03ee7c826834a51dfe7a56ba4c386318695dd87c99:


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: 68 65 20 73 74 72 69 6e 67 20 69 6e 20 70 52 65  he string in pRe
2c00: 63 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 6c 6f  c is known to lo
2c10: 6f 6b 20 6c 69 6b 65 20 61 6e 20 69 6e 74 65 67  ok like an integ
2c20: 65 72 20 61 6e 64 20 74 6f 20 68 61 76 65 20 61  er and to have a
2c30: 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
2c40: 6e 74 20 76 61 6c 75 65 20 6f 66 20 72 56 61 6c  nt value of rVal
2c50: 75 65 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ue.  Return true
2c60: 20 61 6e 64 20 73 65 74 20 2a 70 69 56 61 6c 75   and set *piValu
2c70: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 74 65  e to the.** inte
2c80: 67 65 72 20 76 61 6c 75 65 20 69 66 20 74 68 65  ger value if the
2c90: 20 73 74 72 69 6e 67 20 69 73 20 69 6e 20 72 61   string is in ra
2ca0: 6e 67 65 20 74 6f 20 62 65 20 61 6e 20 69 6e 74  nge to be an int
2cb0: 65 67 65 72 2e 20 20 4f 74 68 65 72 77 69 73 65  eger.  Otherwise
2cc0: 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 66 61 6c 73  ,.** return fals
2cd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2ce0: 20 61 6c 73 6f 41 6e 49 6e 74 28 4d 65 6d 20 2a   alsoAnInt(Mem *
2cf0: 70 52 65 63 2c 20 64 6f 75 62 6c 65 20 72 56 61  pRec, double rVa
2d00: 6c 75 65 2c 20 69 36 34 20 2a 70 69 56 61 6c 75  lue, i64 *piValu
2d10: 65 29 7b 0a 20 20 69 36 34 20 69 56 61 6c 75 65  e){.  i64 iValue
2d20: 20 3d 20 28 64 6f 75 62 6c 65 29 72 56 61 6c 75   = (double)rValu
2d30: 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
2d40: 52 65 61 6c 53 61 6d 65 41 73 49 6e 74 28 72 56  RealSameAsInt(rV
2d50: 61 6c 75 65 2c 69 56 61 6c 75 65 29 20 29 7b 0a  alue,iValue) ){.
2d60: 20 20 20 20 2a 70 69 56 61 6c 75 65 20 3d 20 69      *piValue = i
2d70: 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
2d80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2d90: 6e 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  n 0==sqlite3Atoi
2da0: 36 34 28 70 52 65 63 2d 3e 7a 2c 20 70 69 56 61  64(pRec->z, piVa
2db0: 6c 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 70 52  lue, pRec->n, pR
2dc0: 65 63 2d 3e 65 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ec->enc);.}../*.
2dd0: 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72  ** Try to conver
2de0: 74 20 61 20 76 61 6c 75 65 20 69 6e 74 6f 20 61  t a value into a
2df0: 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73 65   numeric represe
2e00: 6e 74 61 74 69 6f 6e 20 69 66 20 77 65 20 63 61  ntation if we ca
2e10: 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77 69 74 68 6f  n.** do so witho
2e20: 75 74 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72  ut loss of infor
2e30: 6d 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  mation.  In othe
2e40: 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
2e50: 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f 6f 6b 73 20  string.** looks 
2e60: 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20 63  like a number, c
2e70: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
2e80: 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74 20   number.  If it 
2e90: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6c 6f 6f 6b  does not.** look
2ea0: 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20   like a number, 
2eb0: 6c 65 61 76 65 20 69 74 20 61 6c 6f 6e 65 2e 0a  leave it alone..
2ec0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 54 72  **.** If the bTr
2ed0: 79 46 6f 72 49 6e 74 20 66 6c 61 67 20 69 73 20  yForInt flag is 
2ee0: 74 72 75 65 2c 20 74 68 65 6e 20 65 78 74 72 61  true, then extra
2ef0: 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
2f00: 74 6f 20 67 69 76 65 0a 2a 2a 20 61 6e 20 69 6e  to give.** an in
2f10: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
2f20: 74 69 6f 6e 2e 20 20 53 74 72 69 6e 67 73 20 74  tion.  Strings t
2f30: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 66 6c  hat look like fl
2f40: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
2f50: 76 61 6c 75 65 73 20 62 75 74 20 77 68 69 63 68  values but which
2f60: 20 68 61 76 65 20 6e 6f 20 66 72 61 63 74 69 6f   have no fractio
2f70: 6e 61 6c 20 63 6f 6d 70 6f 6e 65 6e 74 20 28 65  nal component (e
2f80: 78 61 6d 70 6c 65 3a 20 27 34 38 2e 30 30 27 29  xample: '48.00')
2f90: 0a 2a 2a 20 77 69 6c 6c 20 68 61 76 65 20 61 20  .** will have a 
2fa0: 4d 45 4d 5f 49 6e 74 20 72 65 70 72 65 73 65 6e  MEM_Int represen
2fb0: 74 61 74 69 6f 6e 20 77 68 65 6e 20 62 54 72 79  tation when bTry
2fc0: 46 6f 72 49 6e 74 20 69 73 20 74 72 75 65 2e 0a  ForInt is true..
2fd0: 2a 2a 0a 2a 2a 20 49 66 20 62 54 72 79 46 6f 72  **.** If bTryFor
2fe0: 49 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  Int is false, th
2ff0: 65 6e 20 69 66 20 74 68 65 20 69 6e 70 75 74 20  en if the input 
3000: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20  string contains 
3010: 61 20 64 65 63 69 6d 61 6c 0a 2a 2a 20 70 6f 69  a decimal.** poi
3020: 6e 74 20 6f 72 20 65 78 70 6f 6e 65 6e 74 69 61  nt or exponentia
3030: 6c 20 6e 6f 74 61 74 69 6f 6e 2c 20 74 68 65 20  l notation, the 
3040: 72 65 73 75 6c 74 20 69 73 20 6f 6e 6c 79 20 4d  result is only M
3050: 45 4d 5f 52 65 61 6c 2c 20 65 76 65 6e 0a 2a 2a  EM_Real, even.**
3060: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
3070: 65 78 61 63 74 20 69 6e 74 65 67 65 72 20 72 65  exact integer re
3080: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
3090: 74 68 65 20 71 75 61 6e 74 69 74 79 2e 0a 2a 2f  the quantity..*/
30a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
30b0: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
30c0: 79 28 4d 65 6d 20 2a 70 52 65 63 2c 20 69 6e 74  y(Mem *pRec, int
30d0: 20 62 54 72 79 46 6f 72 49 6e 74 29 7b 0a 20 20   bTryForInt){.  
30e0: 64 6f 75 62 6c 65 20 72 56 61 6c 75 65 3b 0a 20  double rValue;. 
30f0: 20 75 38 20 65 6e 63 20 3d 20 70 52 65 63 2d 3e   u8 enc = pRec->
3100: 65 6e 63 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  enc;.  int rc;. 
3110: 20 61 73 73 65 72 74 28 20 28 70 52 65 63 2d 3e   assert( (pRec->
3120: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
3130: 7c 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  |MEM_Int|MEM_Rea
3140: 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 3d  l|MEM_IntReal))=
3150: 3d 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 72 63  =MEM_Str );.  rc
3160: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70   = sqlite3AtoF(p
3170: 52 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c  Rec->z, &rValue,
3180: 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3b 0a   pRec->n, enc);.
3190: 20 20 69 66 28 20 72 63 3c 3d 30 20 29 20 72 65    if( rc<=0 ) re
31a0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 72 63 3d 3d  turn;.  if( rc==
31b0: 31 20 26 26 20 61 6c 73 6f 41 6e 49 6e 74 28 70  1 && alsoAnInt(p
31c0: 52 65 63 2c 20 72 56 61 6c 75 65 2c 20 26 70 52  Rec, rValue, &pR
31d0: 65 63 2d 3e 75 2e 69 29 20 29 7b 0a 20 20 20 20  ec->u.i) ){.    
31e0: 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pRec->flags |= M
31f0: 45 4d 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65 7b  EM_Int;.  }else{
3200: 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 72 20 3d  .    pRec->u.r =
3210: 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 70 52 65   rValue;.    pRe
3220: 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  c->flags |= MEM_
3230: 52 65 61 6c 3b 0a 20 20 20 20 69 66 28 20 62 54  Real;.    if( bT
3240: 72 79 46 6f 72 49 6e 74 20 29 20 73 71 6c 69 74  ryForInt ) sqlit
3250: 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66 66  e3VdbeIntegerAff
3260: 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20 7d  inity(pRec);.  }
3270: 0a 20 20 2f 2a 20 54 45 58 54 2d 3e 4e 55 4d 45  .  /* TEXT->NUME
3280: 52 49 43 20 69 73 20 6d 61 6e 79 2d 3e 6f 6e 65  RIC is many->one
3290: 2e 20 20 48 65 6e 63 65 2c 20 69 74 20 69 73 20  .  Hence, it is 
32a0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 69 6e 76  important to inv
32b0: 61 6c 69 64 61 74 65 20 74 68 65 0a 20 20 2a 2a  alidate the.  **
32c0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
32d0: 74 61 74 69 6f 6e 20 61 66 74 65 72 20 63 6f 6d  tation after com
32e0: 70 75 74 69 6e 67 20 61 20 6e 75 6d 65 72 69 63  puting a numeric
32f0: 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 62 65 63   equivalent, bec
3300: 61 75 73 65 20 74 68 65 0a 20 20 2a 2a 20 73 74  ause the.  ** st
3310: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
3320: 69 6f 6e 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ion might not be
3330: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 72   the canonical r
3340: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f  epresentation fo
3350: 72 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 65 72  r the.  ** numer
3360: 69 63 20 76 61 6c 75 65 2e 20 20 54 69 63 6b 65  ic value.  Ticke
3370: 74 20 5b 33 34 33 36 33 34 39 34 32 64 64 35 34  t [343634942dd54
3380: 61 62 35 37 62 37 30 32 34 5d 20 32 30 31 38 2d  ab57b7024] 2018-
3390: 30 31 2d 33 31 2e 20 2a 2f 0a 20 20 70 52 65 63  01-31. */.  pRec
33a0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f  ->flags &= ~MEM_
33b0: 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Str;.}../*.** Pr
33c0: 6f 63 65 73 73 69 6e 67 20 69 73 20 64 65 74 65  ocessing is dete
33d0: 72 6d 69 6e 65 20 62 79 20 74 68 65 20 61 66 66  rmine by the aff
33e0: 69 6e 69 74 79 20 70 61 72 61 6d 65 74 65 72 3a  inity parameter:
33f0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  .**.** SQLITE_AF
3400: 46 5f 49 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51  F_INTEGER:.** SQ
3410: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a  LITE_AFF_REAL:.*
3420: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
3430: 45 52 49 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20  ERIC:.**    Try 
3440: 74 6f 20 63 6f 6e 76 65 72 74 20 70 52 65 63 20  to convert pRec 
3450: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  to an integer re
3460: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20  presentation or 
3470: 61 20 0a 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e  a .**    floatin
3480: 67 2d 70 6f 69 6e 74 20 72 65 70 72 65 73 65 6e  g-point represen
3490: 74 61 74 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74  tation if an int
34a0: 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74  eger representat
34b0: 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74  ion.**    is not
34c0: 20 70 6f 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65   possible.  Note
34d0: 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 67 65   that the intege
34e0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
34f0: 20 69 73 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73   is.**    always
3500: 20 70 72 65 66 65 72 72 65 64 2c 20 65 76 65 6e   preferred, even
3510: 20 69 66 20 74 68 65 20 61 66 66 69 6e 69 74 79   if the affinity
3520: 20 69 73 20 52 45 41 4c 2c 20 62 65 63 61 75 73   is REAL, becaus
3530: 65 0a 2a 2a 20 20 20 20 61 6e 20 69 6e 74 65 67  e.**    an integ
3540: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
3550: 6e 20 69 73 20 6d 6f 72 65 20 73 70 61 63 65 20  n is more space 
3560: 65 66 66 69 63 69 65 6e 74 20 6f 6e 20 64 69 73  efficient on dis
3570: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  k..**.** SQLITE_
3580: 41 46 46 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20  AFF_TEXT:.**    
3590: 43 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20  Convert pRec to 
35a0: 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  a text represent
35b0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ation..**.** SQL
35c0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a 2a  ITE_AFF_BLOB:.**
35d0: 20 20 20 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63      No-op.  pRec
35e0: 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
35f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70  /.static void ap
3600: 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20 4d  plyAffinity(.  M
3610: 65 6d 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20  em *pRec,       
3620: 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
3630: 74 6f 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74  to apply affinit
3640: 79 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61  y to */.  char a
3650: 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a  ffinity,      /*
3660: 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   The affinity to
3670: 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20   be applied */. 
3680: 20 75 38 20 65 6e 63 20 20 20 20 20 20 20 20 20   u8 enc         
3690: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73       /* Use this
36a0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a   text encoding *
36b0: 2f 0a 29 7b 0a 20 20 69 66 28 20 61 66 66 69 6e  /.){.  if( affin
36c0: 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity>=SQLITE_AFF_
36d0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 61  NUMERIC ){.    a
36e0: 73 73 65 72 74 28 20 61 66 66 69 6e 69 74 79 3d  ssert( affinity=
36f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
3700: 47 45 52 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d  GER || affinity=
3710: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
3720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
3730: 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54   affinity==SQLIT
3740: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
3750: 0a 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e  .    if( (pRec->
3760: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
3770: 3d 3d 30 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  ==0 ){ /*OPTIMIZ
3780: 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
3790: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65 63  .      if( (pRec
37a0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
37b0: 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)==0 ){.      
37c0: 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67    if( pRec->flag
37d0: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 20 61 70  s & MEM_Str ) ap
37e0: 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
37f0: 74 79 28 70 52 65 63 2c 31 29 3b 0a 20 20 20 20  ty(pRec,1);.    
3800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3810: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65   sqlite3VdbeInte
3820: 67 65 72 41 66 66 69 6e 69 74 79 28 70 52 65 63  gerAffinity(pRec
3830: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3840: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66  .  }else if( aff
3850: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
3860: 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a  F_TEXT ){.    /*
3870: 20 4f 6e 6c 79 20 61 74 74 65 6d 70 74 20 74 68   Only attempt th
3880: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20  e conversion to 
3890: 54 45 58 54 20 69 66 20 74 68 65 72 65 20 69 73  TEXT if there is
38a0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 72   an integer or r
38b0: 65 61 6c 0a 20 20 20 20 2a 2a 20 72 65 70 72 65  eal.    ** repre
38c0: 73 65 6e 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20  sentation (blob 
38d0: 61 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20  and NULL do not 
38e0: 67 65 74 20 63 6f 6e 76 65 72 74 65 64 29 20 62  get converted) b
38f0: 75 74 20 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20  ut no string.   
3900: 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69   ** representati
3910: 6f 6e 2e 20 20 49 74 20 77 6f 75 6c 64 20 62 65  on.  It would be
3920: 20 68 61 72 6d 6c 65 73 73 20 74 6f 20 72 65 70   harmless to rep
3930: 65 61 74 20 74 68 65 20 63 6f 6e 76 65 72 73 69  eat the conversi
3940: 6f 6e 20 69 66 20 0a 20 20 20 20 2a 2a 20 74 68  on if .    ** th
3950: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
3960: 20 73 74 72 69 6e 67 20 72 65 70 2c 20 62 75 74   string rep, but
3970: 20 69 74 20 69 73 20 70 6f 69 6e 74 6c 65 73 73   it is pointless
3980: 20 74 6f 20 77 61 73 74 65 20 74 68 6f 73 65 0a   to waste those.
3990: 20 20 20 20 2a 2a 20 43 50 55 20 63 79 63 6c 65      ** CPU cycle
39a0: 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d  s. */.    if( 0=
39b0: 3d 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45  =(pRec->flags&ME
39c0: 4d 5f 53 74 72 29 20 29 7b 20 2f 2a 4f 50 54 49  M_Str) ){ /*OPTI
39d0: 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53  MIZATION-IF-FALS
39e0: 45 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70  E*/.      if( (p
39f0: 52 65 63 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  Rec->flags&(MEM_
3a00: 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  Real|MEM_Int|MEM
3a10: 5f 49 6e 74 52 65 61 6c 29 29 20 29 7b 0a 20 20  _IntReal)) ){.  
3a20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
3a30: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRec->flags & ME
3a40: 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  M_Int );.       
3a50: 20 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d   testcase( pRec-
3a60: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
3a70: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  l );.        tes
3a80: 74 63 61 73 65 28 20 70 52 65 63 2d 3e 66 6c 61  tcase( pRec->fla
3a90: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c  gs & MEM_IntReal
3aa0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
3ab0: 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67  te3VdbeMemString
3ac0: 69 66 79 28 70 52 65 63 2c 20 65 6e 63 2c 20 31  ify(pRec, enc, 1
3ad0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3ae0: 0a 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73  .    pRec->flags
3af0: 20 26 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c 4d   &= ~(MEM_Real|M
3b00: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65  EM_Int|MEM_IntRe
3b10: 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  al);.  }.}../*.*
3b20: 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74  * Try to convert
3b30: 20 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66   the type of a f
3b40: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
3b50: 20 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c   or a result col
3b60: 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75  umn.** into a nu
3b70: 6d 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61  meric representa
3b80: 74 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65  tion.  Use eithe
3b90: 72 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41  r INTEGER or REA
3ba0: 4c 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69  L whichever.** i
3bb0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20  s appropriate.  
3bc0: 42 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20  But only do the 
3bd0: 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74  conversion if it
3be0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74   is possible wit
3bf0: 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20  hout.** loss of 
3c00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  information and 
3c10: 72 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73  return the revis
3c20: 65 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61  ed type of the a
3c30: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
3c40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75  sqlite3_value_nu
3c50: 6d 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69 74  meric_type(sqlit
3c60: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b  e3_value *pVal){
3c70: 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73  .  int eType = s
3c80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
3c90: 65 28 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 65  e(pVal);.  if( e
3ca0: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
3cb0: 54 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  T ){.    Mem *pM
3cc0: 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b  em = (Mem*)pVal;
3cd0: 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69  .    applyNumeri
3ce0: 63 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20  cAffinity(pMem, 
3cf0: 30 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  0);.    eType = 
3d00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
3d10: 70 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  pe(pVal);.  }.  
3d20: 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a  return eType;.}.
3d30: 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20  ./*.** Exported 
3d40: 76 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79  version of apply
3d50: 41 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73  Affinity(). This
3d60: 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71   one works on sq
3d70: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a  lite3_value*, .*
3d80: 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e  * not the intern
3d90: 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f  al Mem* type..*/
3da0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c  .void sqlite3Val
3db0: 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
3dc0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3dd0: 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66   *pVal, .  u8 af
3de0: 66 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e  finity, .  u8 en
3df0: 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69  c.){.  applyAffi
3e00: 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c  nity((Mem *)pVal
3e10: 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29  , affinity, enc)
3e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d 65 6d 20  ;.}../*.** pMem 
3e30: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 68  currently only h
3e40: 6f 6c 64 73 20 61 20 73 74 72 69 6e 67 20 74 79  olds a string ty
3e50: 70 65 20 28 6f 72 20 6d 61 79 62 65 20 61 20 42  pe (or maybe a B
3e60: 4c 4f 42 20 74 68 61 74 20 77 65 20 63 61 6e 0a  LOB that we can.
3e70: 2a 2a 20 69 6e 74 65 72 70 72 65 74 20 61 73 20  ** interpret as 
3e80: 61 20 73 74 72 69 6e 67 20 69 66 20 77 65 20 77  a string if we w
3e90: 61 6e 74 20 74 6f 29 2e 20 20 43 6f 6d 70 75 74  ant to).  Comput
3ea0: 65 20 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64  e its correspond
3eb0: 69 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 63 20 74  ing.** numeric t
3ec0: 79 70 65 2c 20 69 66 20 68 61 73 20 6f 6e 65 2e  ype, if has one.
3ed0: 20 20 53 65 74 20 74 68 65 20 70 4d 65 6d 2d 3e    Set the pMem->
3ee0: 75 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e  u.r and pMem->u.
3ef0: 69 20 66 69 65 6c 64 73 0a 2a 2a 20 61 63 63 6f  i fields.** acco
3f00: 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rdingly..*/.stat
3f10: 69 63 20 75 31 36 20 53 51 4c 49 54 45 5f 4e 4f  ic u16 SQLITE_NO
3f20: 49 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 65 4e 75  INLINE computeNu
3f30: 6d 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a 70  mericType(Mem *p
3f40: 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Mem){.  int rc;.
3f50: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
3f60: 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  ix;.  assert( (p
3f70: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  Mem->flags & (ME
3f80: 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d  M_Int|MEM_Real|M
3f90: 45 4d 5f 49 6e 74 52 65 61 6c 29 29 3d 3d 30 20  EM_IntReal))==0 
3fa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  );.  assert( (pM
3fb0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  em->flags & (MEM
3fc0: 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 21  _Str|MEM_Blob))!
3fd0: 3d 30 20 29 3b 0a 20 20 45 78 70 61 6e 64 42 6c  =0 );.  ExpandBl
3fe0: 6f 62 28 70 4d 65 6d 29 3b 0a 20 20 72 63 20 3d  ob(pMem);.  rc =
3ff0: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 4d 65   sqlite3AtoF(pMe
4000: 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  m->z, &pMem->u.r
4010: 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d  , pMem->n, pMem-
4020: 3e 65 6e 63 29 3b 0a 20 20 69 66 28 20 72 63 3c  >enc);.  if( rc<
4030: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  =0 ){.    if( rc
4040: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 41 74  ==0 && sqlite3At
4050: 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 69  oi64(pMem->z, &i
4060: 78 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d  x, pMem->n, pMem
4070: 2d 3e 65 6e 63 29 3c 3d 31 20 29 7b 0a 20 20 20  ->enc)<=1 ){.   
4080: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
4090: 78 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  x;.      return 
40a0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 65 6c  MEM_Int;.    }el
40b0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
40c0: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 7d   MEM_Real;.    }
40d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
40e0: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f  =1 && sqlite3Ato
40f0: 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 69 78  i64(pMem->z, &ix
4100: 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d  , pMem->n, pMem-
4110: 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >enc)==0 ){.    
4120: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 78 3b 0a  pMem->u.i = ix;.
4130: 20 20 20 20 72 65 74 75 72 6e 20 4d 45 4d 5f 49      return MEM_I
4140: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
4150: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 7d 0a 0a 2f 2a   MEM_Real;.}../*
4160: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
4170: 75 6d 65 72 69 63 20 74 79 70 65 20 66 6f 72 20  umeric type for 
4180: 70 4d 65 6d 2c 20 65 69 74 68 65 72 20 4d 45 4d  pMem, either MEM
4190: 5f 49 6e 74 20 6f 72 20 4d 45 4d 5f 52 65 61 6c  _Int or MEM_Real
41a0: 20 6f 72 20 62 6f 74 68 20 6f 72 0a 2a 2a 20 6e   or both or.** n
41b0: 6f 6e 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 55 6e 6c  one.  .**.** Unl
41c0: 69 6b 65 20 61 70 70 6c 79 4e 75 6d 65 72 69 63  ike applyNumeric
41d0: 41 66 66 69 6e 69 74 79 28 29 2c 20 74 68 69 73  Affinity(), this
41e0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
41f0: 74 20 6d 6f 64 69 66 79 20 70 4d 65 6d 2d 3e 66  t modify pMem->f
4200: 6c 61 67 73 2e 0a 2a 2a 20 42 75 74 20 69 74 20  lags..** But it 
4210: 64 6f 65 73 20 73 65 74 20 70 4d 65 6d 2d 3e 75  does set pMem->u
4220: 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e 69  .r and pMem->u.i
4230: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a   appropriately..
4240: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6e 75  */.static u16 nu
4250: 6d 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a 70  mericType(Mem *p
4260: 4d 65 6d 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  Mem){.  if( pMem
4270: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49  ->flags & (MEM_I
4280: 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
4290: 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  IntReal) ){.    
42a0: 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
42b0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
42c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
42d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
42e0: 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74  EM_Real );.    t
42f0: 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 66  estcase( pMem->f
4300: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65  lags & MEM_IntRe
4310: 61 6c 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  al );.    return
4320: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28   pMem->flags & (
4330: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
4340: 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 3b 0a 20  |MEM_IntReal);. 
4350: 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66   }.  if( pMem->f
4360: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c  lags & (MEM_Str|
4370: 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20  MEM_Blob) ){.   
4380: 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
4390: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
43a0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
43b0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
43c0: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
43d0: 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 4e 75  return computeNu
43e0: 6d 65 72 69 63 54 79 70 65 28 70 4d 65 6d 29 3b  mericType(pMem);
43f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4400: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4410: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 57 72  E_DEBUG./*.** Wr
4420: 69 74 65 20 61 20 6e 69 63 65 20 73 74 72 69 6e  ite a nice strin
4430: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
4440: 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   of the contents
4450: 20 6f 66 20 63 65 6c 6c 20 70 4d 65 6d 0a 2a 2a   of cell pMem.**
4460: 20 69 6e 74 6f 20 62 75 66 66 65 72 20 7a 42 75   into buffer zBu
4470: 66 2c 20 6c 65 6e 67 74 68 20 6e 42 75 66 2e 0a  f, length nBuf..
4480: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4490: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
44a0: 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 63 68 61  t(Mem *pMem, cha
44b0: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 68 61 72  r *zBuf){.  char
44c0: 20 2a 7a 43 73 72 20 3d 20 7a 42 75 66 3b 0a 20   *zCsr = zBuf;. 
44d0: 20 69 6e 74 20 66 20 3d 20 70 4d 65 6d 2d 3e 66   int f = pMem->f
44e0: 6c 61 67 73 3b 0a 0a 20 20 73 74 61 74 69 63 20  lags;..  static 
44f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
4500: 74 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b  t encnames[] = {
4510: 22 28 58 29 22 2c 20 22 28 38 29 22 2c 20 22 28  "(X)", "(8)", "(
4520: 31 36 4c 45 29 22 2c 20 22 28 31 36 42 45 29 22  16LE)", "(16BE)"
4530: 7d 3b 0a 0a 20 20 69 66 28 20 66 26 4d 45 4d 5f  };..  if( f&MEM_
4540: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 69 6e 74 20  Blob ){.    int 
4550: 69 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  i;.    char c;. 
4560: 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44     if( f & MEM_D
4570: 79 6e 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  yn ){.      c = 
4580: 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'z';.      asser
4590: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
45a0: 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  tic|MEM_Ephem))=
45b0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
45c0: 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74  if( f & MEM_Stat
45d0: 69 63 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  ic ){.      c = 
45e0: 27 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  't';.      asser
45f0: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e  t( (f & (MEM_Dyn
4600: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20  |MEM_Ephem))==0 
4610: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
4620: 20 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29   f & MEM_Ephem )
4630: 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 65 27 3b  {.      c = 'e';
4640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
4650: 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c  f & (MEM_Static|
4660: 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a  MEM_Dyn))==0 );.
4670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4680: 20 63 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a   c = 's';.    }.
4690: 20 20 20 20 2a 28 7a 43 73 72 2b 2b 29 20 3d 20      *(zCsr++) = 
46a0: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  c;.    sqlite3_s
46b0: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
46c0: 72 2c 20 22 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e  r, "%d[", pMem->
46d0: 6e 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20  n);.    zCsr += 
46e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
46f0: 7a 43 73 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  zCsr);.    for(i
4700: 3d 30 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d  =0; i<16 && i<pM
4710: 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  em->n; i++){.   
4720: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4730: 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22  ntf(100, zCsr, "
4740: 25 30 32 58 22 2c 20 28 28 69 6e 74 29 70 4d 65  %02X", ((int)pMe
4750: 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78 46 46 29 29  m->z[i] & 0xFF))
4760: 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  ;.      zCsr += 
4770: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4780: 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCsr);.    }.   
4790: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26   for(i=0; i<16 &
47a0: 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b  & i<pMem->n; i++
47b0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 20  ){.      char z 
47c0: 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20  = pMem->z[i];.  
47d0: 20 20 20 20 69 66 28 20 7a 3c 33 32 20 7c 7c 20      if( z<32 || 
47e0: 7a 3e 31 32 36 20 29 20 2a 7a 43 73 72 2b 2b 20  z>126 ) *zCsr++ 
47f0: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 65 6c 73  = '.';.      els
4800: 65 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20  e *zCsr++ = z;. 
4810: 20 20 20 7d 0a 20 20 20 20 2a 28 7a 43 73 72 2b     }.    *(zCsr+
4820: 2b 29 20 3d 20 27 5d 27 3b 0a 20 20 20 20 69 66  +) = ']';.    if
4830: 28 20 66 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ( f & MEM_Zero )
4840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4850: 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43  snprintf(100, zC
4860: 73 72 2c 22 2b 25 64 7a 22 2c 70 4d 65 6d 2d 3e  sr,"+%dz",pMem->
4870: 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20 20 20 20 20  u.nZero);.      
4880: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
4890: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
48a0: 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 20 3d     }.    *zCsr =
48b0: 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69   '\0';.  }else i
48c0: 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 72 20 29  f( f & MEM_Str )
48d0: 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a  {.    int j, k;.
48e0: 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27 20      zBuf[0] = ' 
48f0: 27 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d  ';.    if( f & M
4900: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
4910: 7a 42 75 66 5b 31 5d 20 3d 20 27 7a 27 3b 0a 20  zBuf[1] = 'z';. 
4920: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
4930: 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  & (MEM_Static|ME
4940: 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a  M_Ephem))==0 );.
4950: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20      }else if( f 
4960: 26 20 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a  & MEM_Static ){.
4970: 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
4980: 27 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  't';.      asser
4990: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e  t( (f & (MEM_Dyn
49a0: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20  |MEM_Ephem))==0 
49b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
49c0: 20 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29   f & MEM_Ephem )
49d0: 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20  {.      zBuf[1] 
49e0: 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73  = 'e';.      ass
49f0: 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53  ert( (f & (MEM_S
4a00: 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d  tatic|MEM_Dyn))=
4a10: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  =0 );.    }else{
4a20: 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d  .      zBuf[1] =
4a30: 20 27 73 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   's';.    }.    
4a40: 6b 20 3d 20 32 3b 0a 20 20 20 20 73 71 6c 69 74  k = 2;.    sqlit
4a50: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
4a60: 20 26 7a 42 75 66 5b 6b 5d 2c 20 22 25 64 22 2c   &zBuf[k], "%d",
4a70: 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 6b   pMem->n);.    k
4a80: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
4a90: 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20  n30(&zBuf[k]);. 
4aa0: 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27     zBuf[k++] = '
4ab0: 5b 27 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  [';.    for(j=0;
4ac0: 20 6a 3c 31 35 20 26 26 20 6a 3c 70 4d 65 6d 2d   j<15 && j<pMem-
4ad0: 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  >n; j++){.      
4ae0: 75 38 20 63 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 6a  u8 c = pMem->z[j
4af0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d  ];.      if( c>=
4b00: 30 78 32 30 20 26 26 20 63 3c 30 78 37 66 20 29  0x20 && c<0x7f )
4b10: 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b  {.        zBuf[k
4b20: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
4b30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 42  else{.        zB
4b40: 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20  uf[k++] = '.';. 
4b50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4b60: 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5d 27   zBuf[k++] = ']'
4b70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
4b80: 70 72 69 6e 74 66 28 31 30 30 2c 26 7a 42 75 66  printf(100,&zBuf
4b90: 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65 73 5b 70 4d  [k], encnames[pM
4ba0: 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20 20 6b  em->enc]);.    k
4bb0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
4bc0: 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20  n30(&zBuf[k]);. 
4bd0: 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 30     zBuf[k++] = 0
4be0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
4bf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4c00: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
4c10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 72  the value of a r
4c20: 65 67 69 73 74 65 72 20 66 6f 72 20 74 72 61 63  egister for trac
4c30: 69 6e 67 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2f  ing purposes:.*/
4c40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
4c50: 54 72 61 63 65 50 72 69 6e 74 28 4d 65 6d 20 2a  TracePrint(Mem *
4c60: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  p){.  if( p->fla
4c70: 67 73 20 26 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs & MEM_Undefin
4c80: 65 64 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ed ){.    printf
4c90: 28 22 20 75 6e 64 65 66 69 6e 65 64 22 29 3b 0a  (" undefined");.
4ca0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66    }else if( p->f
4cb0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
4cc0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 70 2d  ){.    printf(p-
4cd0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
4ce0: 6f 20 3f 20 22 20 4e 55 4c 4c 2d 6e 6f 63 68 6e  o ? " NULL-nochn
4cf0: 67 22 20 3a 20 22 20 4e 55 4c 4c 22 29 3b 0a 20  g" : " NULL");. 
4d00: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 66   }else if( (p->f
4d10: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  lags & (MEM_Int|
4d20: 4d 45 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d 5f  MEM_Str))==(MEM_
4d30: 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 20 29 7b 0a  Int|MEM_Str) ){.
4d40: 20 20 20 20 70 72 69 6e 74 66 28 22 20 73 69 3a      printf(" si:
4d50: 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a  %lld", p->u.i);.
4d60: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
4d70: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74  flags & (MEM_Int
4d80: 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20  Real))!=0 ){.   
4d90: 20 70 72 69 6e 74 66 28 22 20 69 72 3a 25 6c 6c   printf(" ir:%ll
4da0: 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d  d", p->u.i);.  }
4db0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67  else if( p->flag
4dc0: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
4dd0: 20 20 20 70 72 69 6e 74 66 28 22 20 69 3a 25 6c     printf(" i:%l
4de0: 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 23 69  ld", p->u.i);.#i
4df0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4e00: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
4e10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
4e20: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
4e30: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
4e40: 20 72 3a 25 67 22 2c 20 70 2d 3e 75 2e 72 29 3b   r:%g", p->u.r);
4e50: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
4e60: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
4e70: 65 6d 49 73 52 6f 77 53 65 74 28 70 29 20 29 7b  emIsRowSet(p) ){
4e80: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 28 72  .    printf(" (r
4e90: 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d 65 6c 73  owset)");.  }els
4ea0: 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  e{.    char zBuf
4eb0: 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [200];.    sqlit
4ec0: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
4ed0: 72 69 6e 74 28 70 2c 20 7a 42 75 66 29 3b 0a 20  rint(p, zBuf);. 
4ee0: 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
4ef0: 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 69 66   zBuf);.  }.  if
4f00: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
4f10: 5f 53 75 62 74 79 70 65 20 29 20 70 72 69 6e 74  _Subtype ) print
4f20: 66 28 22 20 73 75 62 74 79 70 65 3d 30 78 25 30  f(" subtype=0x%0
4f30: 32 78 22 2c 20 70 2d 3e 65 53 75 62 74 79 70 65  2x", p->eSubtype
4f40: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
4f50: 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28 69   registerTrace(i
4f60: 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20 2a 70 29  nt iReg, Mem *p)
4f70: 7b 0a 20 20 70 72 69 6e 74 66 28 22 52 45 47 5b  {.  printf("REG[
4f80: 25 64 5d 20 3d 20 22 2c 20 69 52 65 67 29 3b 0a  %d] = ", iReg);.
4f90: 20 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28    memTracePrint(
4fa0: 70 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e  p);.  printf("\n
4fb0: 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ");.  sqlite3Vdb
4fc0: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
4fd0: 6e 74 73 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nts(p);.}.#endif
4fe0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4ff0: 44 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20  DEBUG.#  define 
5000: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 52  REGISTER_TRACE(R
5010: 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c 61 67 73  ,M) if(db->flags
5020: 26 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63  &SQLITE_VdbeTrac
5030: 65 29 72 65 67 69 73 74 65 72 54 72 61 63 65 28  e)registerTrace(
5040: 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 20 64 65  R,M).#else.#  de
5050: 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52  fine REGISTER_TR
5060: 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64 69 66 0a  ACE(R,M).#endif.
5070: 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ..#ifdef VDBE_PR
5080: 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77  OFILE../* .** hw
5090: 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73 20  time.h contains 
50a0: 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65 72  inline assembler
50b0: 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65 6d   code for implem
50c0: 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69 67 68 2d  enting .** high-
50d0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 6d 69  performance timi
50e0: 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a  ng routines..*/.
50f0: 23 69 6e 63 6c 75 64 65 20 22 68 77 74 69 6d 65  #include "hwtime
5100: 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .h"..#endif..#if
5110: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
5120: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5130: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
5140: 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 61 73  rom within an as
5150: 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
5160: 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63 6b 73 20  n. It.** checks 
5170: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
5180: 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 76 61  .nTransaction va
5190: 72 69 61 62 6c 65 20 69 73 20 63 6f 72 72 65 63  riable is correc
51a0: 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68  tly set to.** th
51b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  e number of non-
51c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
51d0: 70 6f 69 6e 74 73 20 63 75 72 72 65 6e 74 6c 79  points currently
51e0: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
51f0: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
5200: 20 61 74 20 73 71 6c 69 74 65 33 2e 70 53 61 76   at sqlite3.pSav
5210: 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55  epoint..** .** U
5220: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sage:.**.**     
5230: 61 73 73 65 72 74 28 20 63 68 65 63 6b 53 61 76  assert( checkSav
5240: 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62 29 20  epointCount(db) 
5250: 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  );.*/.static int
5260: 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43   checkSavepointC
5270: 6f 75 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ount(sqlite3 *db
5280: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
5290: 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a    Savepoint *p;.
52a0: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70 53 61 76    for(p=db->pSav
52b0: 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e  epoint; p; p=p->
52c0: 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20 20 61 73  pNext) n++;.  as
52d0: 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53  sert( n==(db->nS
52e0: 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 69  avepoint + db->i
52f0: 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
5300: 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72 65 74 75  point) );.  retu
5310: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
5320: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5330: 20 72 65 67 69 73 74 65 72 20 6f 66 20 70 4f 70   register of pOp
5340: 2d 3e 70 32 20 61 66 74 65 72 20 66 69 72 73 74  ->p2 after first
5350: 20 70 72 65 70 61 72 69 6e 67 20 69 74 20 74 6f   preparing it to
5360: 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74   be.** overwritt
5370: 65 6e 20 77 69 74 68 20 61 6e 20 69 6e 74 65 67  en with an integ
5380: 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  er value..*/.sta
5390: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
53a0: 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32 50 72 65  INE Mem *out2Pre
53b0: 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61 72  releaseWithClear
53c0: 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a 20 20 73  (Mem *pOut){.  s
53d0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
53e0: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 70 4f  Null(pOut);.  pO
53f0: 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
5400: 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  Int;.  return pO
5410: 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20 4d 65 6d  ut;.}.static Mem
5420: 20 2a 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65   *out2Prerelease
5430: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 4f 70  (Vdbe *p, VdbeOp
5440: 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d 20 2a 70   *pOp){.  Mem *p
5450: 4f 75 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Out;.  assert( p
5460: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61 73  Op->p2>0 );.  as
5470: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28  sert( pOp->p2<=(
5480: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
5490: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75  Cursor) );.  pOu
54a0: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  t = &p->aMem[pOp
54b0: 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75  ->p2];.  memAbou
54c0: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
54d0: 74 29 3b 0a 20 20 69 66 28 20 56 64 62 65 4d 65  t);.  if( VdbeMe
54e0: 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29 20 29  mDynamic(pOut) )
54f0: 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  { /*OPTIMIZATION
5500: 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20  -IF-FALSE*/.    
5510: 72 65 74 75 72 6e 20 6f 75 74 32 50 72 65 72 65  return out2Prere
5520: 6c 65 61 73 65 57 69 74 68 43 6c 65 61 72 28 70  leaseWithClear(p
5530: 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
5540: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d     pOut->flags =
5550: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 72 65   MEM_Int;.    re
5560: 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20 7d 0a 7d  turn pOut;.  }.}
5570: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  .../*.** Execute
5580: 20 61 73 20 6d 75 63 68 20 6f 66 20 61 20 56 44   as much of a VD
5590: 42 45 20 70 72 6f 67 72 61 6d 20 61 73 20 77 65  BE program as we
55a0: 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73 20 69 73   can..** This is
55b0: 20 74 68 65 20 63 6f 72 65 20 6f 66 20 73 71 6c   the core of sql
55c0: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 20 0a 2a  ite3_step().  .*
55d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
55e0: 65 45 78 65 63 28 0a 20 20 56 64 62 65 20 2a 70  eExec(.  Vdbe *p
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
5610: 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61 4f 70 20  */.){.  Op *aOp 
5620: 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20 20 20 20  = p->aOp;       
5630: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d     /* Copy of p-
5640: 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f  >aOp */.  Op *pO
5650: 70 20 3d 20 61 4f 70 3b 20 20 20 20 20 20 20 20  p = aOp;        
5660: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
5670: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 69 66  operation */.#if
5680: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5690: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
56a0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
56b0: 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70 3b 20 20    Op *pOrigOp;  
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56d0: 56 61 6c 75 65 20 6f 66 20 70 4f 70 20 61 74 20  Value of pOp at 
56e0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
56f0: 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  oop */.#endif.#i
5700: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5710: 47 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 44 65  G.  int nExtraDe
5720: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  lete = 0;      /
5730: 2a 20 56 65 72 69 66 69 65 73 20 46 4f 52 44 45  * Verifies FORDE
5740: 4c 45 54 45 20 61 6e 64 20 41 55 58 44 45 4c 45  LETE and AUXDELE
5750: 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23 65 6e 64  TE flags */.#end
5760: 69 66 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  if.  int rc = SQ
5770: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
5780: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
5790: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rn */.  sqlite3 
57a0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
57b0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
57c0: 73 65 20 2a 2f 0a 20 20 75 38 20 72 65 73 65 74  se */.  u8 reset
57d0: 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20  SchemaOnFault = 
57e0: 30 3b 20 2f 2a 20 52 65 73 65 74 20 73 63 68 65  0; /* Reset sche
57f0: 6d 61 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ma after an erro
5800: 72 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  r if positive */
5810: 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e 67 20 3d  .  u8 encoding =
5820: 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 2f 2a   ENC(db);     /*
5830: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e   The database en
5840: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
5850: 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 20 20  iCompare = 0;   
5860: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
5870: 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70 61 72 69   of last compari
5880: 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  son */.  unsigne
5890: 64 20 6e 56 6d 53 74 65 70 20 3d 20 30 3b 20 20  d nVmStep = 0;  
58a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
58b0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
58c0: 20 73 74 65 70 73 20 2a 2f 0a 23 69 66 6e 64 65   steps */.#ifnde
58d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
58e0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
58f0: 20 20 75 6e 73 69 67 6e 65 64 20 6e 50 72 6f 67    unsigned nProg
5900: 72 65 73 73 4c 69 6d 69 74 3b 20 20 20 2f 2a 20  ressLimit;   /* 
5910: 49 6e 76 6f 6b 65 20 78 50 72 6f 67 72 65 73 73  Invoke xProgress
5920: 28 29 20 77 68 65 6e 20 6e 56 6d 53 74 65 70 20  () when nVmStep 
5930: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
5940: 23 65 6e 64 69 66 0a 20 20 4d 65 6d 20 2a 61 4d  #endif.  Mem *aM
5950: 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 20 20 20  em = p->aMem;   
5960: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
5970: 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20 4d 65 6d 20  ->aMem */.  Mem 
5980: 2a 70 49 6e 31 20 3d 20 30 3b 20 20 20 20 20 20  *pIn1 = 0;      
5990: 20 20 20 20 20 20 20 2f 2a 20 31 73 74 20 69 6e         /* 1st in
59a0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
59b0: 20 4d 65 6d 20 2a 70 49 6e 32 20 3d 20 30 3b 20   Mem *pIn2 = 0; 
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
59d0: 6e 64 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64  nd input operand
59e0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 33 20   */.  Mem *pIn3 
59f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5a00: 20 2f 2a 20 33 72 64 20 69 6e 70 75 74 20 6f 70   /* 3rd input op
5a10: 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  erand */.  Mem *
5a20: 70 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pOut = 0;       
5a30: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
5a40: 6f 70 65 72 61 6e 64 20 2a 2f 0a 23 69 66 64 65  operand */.#ifde
5a50: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
5a60: 20 75 36 34 20 73 74 61 72 74 3b 20 20 20 20 20   u64 start;     
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5a80: 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61  PU clock count a
5a90: 74 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64  t start of opcod
5aa0: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  e */.#endif.  /*
5ab0: 2a 2a 20 49 4e 53 45 52 54 20 53 54 41 43 4b 20  ** INSERT STACK 
5ac0: 55 4e 49 4f 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a  UNION HERE ***/.
5ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
5ae0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
5af0: 52 55 4e 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74  RUN );  /* sqlit
5b00: 65 33 5f 73 74 65 70 28 29 20 76 65 72 69 66 69  e3_step() verifi
5b10: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 73 71 6c  es this */.  sql
5b20: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
5b30: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
5b40: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
5b50: 41 4c 4c 42 41 43 4b 0a 20 20 69 66 28 20 64 62  ALLBACK.  if( db
5b60: 2d 3e 78 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->xProgress ){. 
5b70: 20 20 20 75 33 32 20 69 50 72 69 6f 72 20 3d 20     u32 iPrior = 
5b80: 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49  p->aCounter[SQLI
5b90: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d  TE_STMTSTATUS_VM
5ba0: 5f 53 54 45 50 5d 3b 0a 20 20 20 20 61 73 73 65  _STEP];.    asse
5bb0: 72 74 28 20 30 20 3c 20 64 62 2d 3e 6e 50 72 6f  rt( 0 < db->nPro
5bc0: 67 72 65 73 73 4f 70 73 20 29 3b 0a 20 20 20 20  gressOps );.    
5bd0: 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d  nProgressLimit =
5be0: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
5bf0: 73 20 2d 20 28 69 50 72 69 6f 72 20 25 20 64 62  s - (iPrior % db
5c00: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 29 3b  ->nProgressOps);
5c10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
5c20: 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 30  rogressLimit = 0
5c30: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 0a 23  xffffffff;.  }.#
5c40: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 72  endif.  if( p->r
5c50: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
5c60: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
5c70: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
5c80: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
5c90: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
5ca0: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
5cb0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
5cc0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
5cd0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 67 6f  iled.  */.    go
5ce0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20  to no_mem;.  }. 
5cf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
5d00: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
5d10: 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
5d20: 45 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65  E_BUSY );.  asse
5d30: 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
5d40: 20 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 21   || p->readOnly!
5d50: 3d 30 20 29 3b 0a 20 20 70 2d 3e 69 43 75 72 72  =0 );.  p->iCurr
5d60: 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 61  entTime = 0;.  a
5d70: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
5d80: 6e 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 52 65  n==0 );.  p->pRe
5d90: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 64  sultSet = 0;.  d
5da0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
5db0: 42 75 73 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  Busy = 0;.  if( 
5dc0: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
5dd0: 70 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72  pted ) goto abor
5de0: 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75  t_due_to_interru
5df0: 70 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  pt;.  sqlite3Vdb
5e00: 65 49 4f 54 72 61 63 65 53 71 6c 28 70 29 3b 0a  eIOTraceSql(p);.
5e10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5e20: 42 55 47 0a 20 20 73 71 6c 69 74 65 33 42 65 67  BUG.  sqlite3Beg
5e30: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
5e40: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63 3d 3d 30  ;.  if( p->pc==0
5e50: 0a 20 20 20 26 26 20 28 70 2d 3e 64 62 2d 3e 66  .   && (p->db->f
5e60: 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 56  lags & (SQLITE_V
5e70: 64 62 65 4c 69 73 74 69 6e 67 7c 53 51 4c 49 54  dbeListing|SQLIT
5e80: 45 5f 56 64 62 65 45 51 50 7c 53 51 4c 49 54 45  E_VdbeEQP|SQLITE
5e90: 5f 56 64 62 65 54 72 61 63 65 29 29 21 3d 30 0a  _VdbeTrace))!=0.
5ea0: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
5eb0: 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
5ec0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ed0: 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20  ePrintSql(p);.  
5ee0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
5ef0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
5f00: 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20 20 20 20  Listing ){.     
5f10: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50 72   printf("VDBE Pr
5f20: 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e  ogram Listing:\n
5f30: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
5f40: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
5f50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5f60: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74  e3VdbePrintOp(st
5f70: 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70 5b 69 5d  dout, i, &aOp[i]
5f80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5f90: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
5fa0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
5fb0: 64 62 65 45 51 50 20 29 7b 0a 20 20 20 20 20 20  dbeEQP ){.      
5fc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
5fd0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
5fe0: 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f 70 63 6f   if( aOp[i].opco
5ff0: 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de==OP_Explain )
6000: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6010: 6f 6e 63 65 20 29 20 70 72 69 6e 74 66 28 22 56  once ) printf("V
6020: 44 42 45 20 51 75 65 72 79 20 50 6c 61 6e 3a 5c  DBE Query Plan:\
6030: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n");.          p
6040: 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61 4f  rintf("%s\n", aO
6050: 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20 20 20 20  p[i].p4.z);.    
6060: 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
6070: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6080: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6090: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
60a0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 20  QLITE_VdbeTrace 
60b0: 29 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20  )  printf("VDBE 
60c0: 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20 20 7d 0a  Trace:\n");.  }.
60d0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
60e0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64  gnMalloc();.#end
60f0: 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f  if.  for(pOp=&aO
6100: 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20 70 4f 70  p[p->pc]; 1; pOp
6110: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45 72 72 6f  ++){.    /* Erro
6120: 72 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20  rs are detected 
6130: 62 79 20 69 6e 64 69 76 69 64 75 61 6c 20 6f 70  by individual op
6140: 63 6f 64 65 73 2c 20 77 69 74 68 20 61 6e 20 69  codes, with an i
6150: 6d 6d 65 64 69 61 74 65 0a 20 20 20 20 2a 2a 20  mmediate.    ** 
6160: 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72 74 5f 64  jumps to abort_d
6170: 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20 2a 2f 0a  ue_to_error. */.
6180: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
6190: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
61a0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e 3d 61    assert( pOp>=a
61b0: 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f 70 5b 70  Op && pOp<&aOp[p
61c0: 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64 65 66 20  ->nOp]);.#ifdef 
61d0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20  VDBE_PROFILE.   
61e0: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
61f0: 4e 50 72 6f 66 69 6c 65 43 6e 74 20 3f 20 73 71  NProfileCnt ? sq
6200: 6c 69 74 65 33 4e 50 72 6f 66 69 6c 65 43 6e 74  lite3NProfileCnt
6210: 20 3a 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65   : sqlite3Hwtime
6220: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e  ();.#endif.    n
6230: 56 6d 53 74 65 70 2b 2b 3b 0a 23 69 66 64 65 66  VmStep++;.#ifdef
6240: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
6250: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
6260: 20 20 20 69 66 28 20 70 2d 3e 61 6e 45 78 65 63     if( p->anExec
6270: 20 29 20 70 2d 3e 61 6e 45 78 65 63 5b 28 69 6e   ) p->anExec[(in
6280: 74 29 28 70 4f 70 2d 61 4f 70 29 5d 2b 2b 3b 0a  t)(pOp-aOp)]++;.
6290: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 4f  #endif..    /* O
62a0: 6e 6c 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e  nly allow tracin
62b0: 67 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  g if SQLITE_DEBU
62c0: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20  G is defined..  
62d0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
62e0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28  TE_DEBUG.    if(
62f0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
6300: 49 54 45 5f 56 64 62 65 54 72 61 63 65 20 29 7b  ITE_VdbeTrace ){
6310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6320: 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74  bePrintOp(stdout
6330: 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  , (int)(pOp - aO
6340: 70 29 2c 20 70 4f 70 29 3b 0a 20 20 20 20 7d 0a  p), pOp);.    }.
6350: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 0a 20  #endif.      .. 
6360: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
6370: 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
6380: 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74   simulate an int
6390: 65 72 72 75 70 74 2e 20 20 54 68 69 73 20 6f 6e  errupt.  This on
63a0: 6c 79 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a  ly happens.    *
63b0: 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20 73  * if we have a s
63c0: 70 65 63 69 61 6c 20 74 65 73 74 20 62 75 69 6c  pecial test buil
63d0: 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  d..    */.#ifdef
63e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
63f0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74   if( sqlite3_int
6400: 65 72 72 75 70 74 5f 63 6f 75 6e 74 3e 30 20 29  errupt_count>0 )
6410: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6420: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2d  interrupt_count-
6430: 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  -;.      if( sql
6440: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
6450: 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ount==0 ){.     
6460: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72     sqlite3_inter
6470: 72 75 70 74 28 64 62 29 3b 0a 20 20 20 20 20 20  rupt(db);.      
6480: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
6490: 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68      /* Sanity ch
64a0: 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68 65 72 20  ecking on other 
64b0: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23 69 66 64  operands */.#ifd
64c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
64d0: 20 20 20 20 7b 0a 20 20 20 20 20 20 75 38 20 6f      {.      u8 o
64e0: 70 50 72 6f 70 65 72 74 79 20 3d 20 73 71 6c 69  pProperty = sqli
64f0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
6500: 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 0a  y[pOp->opcode];.
6510: 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f        if( (opPro
6520: 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e  perty & OPFLG_IN
6530: 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)!=0 ){.       
6540: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
6550: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
6560: 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3c 3d 28  sert( pOp->p1<=(
6570: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
6580: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
6590: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
65a0: 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d  Valid(&aMem[pOp-
65b0: 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  >p1]) );.       
65c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
65d0: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
65e0: 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70  riants(&aMem[pOp
65f0: 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20 20 20  ->p1]) );.      
6600: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
6610: 28 70 4f 70 2d 3e 70 31 2c 20 26 61 4d 65 6d 5b  (pOp->p1, &aMem[
6620: 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 20 20 20  pOp->p1]);.     
6630: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70   }.      if( (op
6640: 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47  Property & OPFLG
6650: 5f 49 4e 32 29 21 3d 30 20 29 7b 0a 20 20 20 20  _IN2)!=0 ){.    
6660: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
6670: 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p2>0 );.       
6680: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
6690: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
66a0: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
66b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
66c0: 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
66d0: 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20  Op->p2]) );.    
66e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
66f0: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49  te3VdbeCheckMemI
6700: 6e 76 61 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b  nvariants(&aMem[
6710: 70 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20  pOp->p2]) );.   
6720: 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
6730: 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 26 61 4d  ACE(pOp->p2, &aM
6740: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20  em[pOp->p2]);.  
6750: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6760: 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50  (opProperty & OP
6770: 46 4c 47 5f 49 4e 33 29 21 3d 30 20 29 7b 0a 20  FLG_IN3)!=0 ){. 
6780: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6790: 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20  Op->p3>0 );.    
67a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
67b0: 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
67c0: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
67d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
67e0: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65   memIsValid(&aMe
67f0: 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20  m[pOp->p3]) );. 
6800: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
6810: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
6820: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d  emInvariants(&aM
6830: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a  em[pOp->p3]) );.
6840: 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
6850: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
6860: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b  &aMem[pOp->p3]);
6870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6880: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
6890: 20 4f 50 46 4c 47 5f 4f 55 54 32 29 21 3d 30 20   OPFLG_OUT2)!=0 
68a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
68b0: 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
68c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
68d0: 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p2<=(p->nMe
68e0: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
68f0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ) );.        mem
6900: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
6910: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29   &aMem[pOp->p2])
6920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6930: 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20  if( (opProperty 
6940: 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29 21 3d 30  & OPFLG_OUT3)!=0
6950: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
6960: 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b  rt( pOp->p3>0 );
6970: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6980: 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
6990: 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
69a0: 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  r) );.        me
69b0: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
69c0: 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  , &aMem[pOp->p3]
69d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
69e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
69f0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
6a00: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
6a10: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 20 20 70  E_PROFILE).    p
6a20: 4f 72 69 67 4f 70 20 3d 20 70 4f 70 3b 0a 23 65  OrigOp = pOp;.#e
6a30: 6e 64 69 66 0a 20 20 0a 20 20 20 20 73 77 69 74  ndif.  .    swit
6a40: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
6a50: 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ){../***********
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 0a 2a 2a 20 57 68 61 74 20 66 6f 6c 6c 6f  **.** What follo
6ab0: 77 73 20 69 73 20 61 20 6d 61 73 73 69 76 65 20  ws is a massive 
6ac0: 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74  switch statement
6ad0: 20 77 68 65 72 65 20 65 61 63 68 20 63 61 73 65   where each case
6ae0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a   implements a.**
6af0: 20 73 65 70 61 72 61 74 65 20 69 6e 73 74 72 75   separate instru
6b00: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 69 72  ction in the vir
6b10: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49  tual machine.  I
6b20: 66 20 77 65 20 66 6f 6c 6c 6f 77 20 74 68 65 20  f we follow the 
6b30: 75 73 75 61 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61  usual.** indenta
6b40: 74 69 6f 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  tion conventions
6b50: 2c 20 65 61 63 68 20 63 61 73 65 20 73 68 6f 75  , each case shou
6b60: 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62  ld be indented b
6b70: 79 20 36 20 73 70 61 63 65 73 2e 20 20 42 75 74  y 6 spaces.  But
6b80: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 20 6c 6f  .** that is a lo
6b90: 74 20 6f 66 20 77 61 73 74 65 64 20 73 70 61 63  t of wasted spac
6ba0: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 6d 61  e on the left ma
6bb0: 72 67 69 6e 2e 20 20 53 6f 20 74 68 65 20 63 6f  rgin.  So the co
6bc0: 64 65 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  de within.** the
6bd0: 20 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e   switch statemen
6be0: 74 20 77 69 6c 6c 20 62 72 65 61 6b 20 77 69 74  t will break wit
6bf0: 68 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 61 6e 64  h convention and
6c00: 20 62 65 20 66 6c 75 73 68 2d 6c 65 66 74 2e 20   be flush-left. 
6c10: 41 6e 6f 74 68 65 72 0a 2a 2a 20 62 69 67 20 63  Another.** big c
6c20: 6f 6d 6d 65 6e 74 20 28 73 69 6d 69 6c 61 72 20  omment (similar 
6c30: 74 6f 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c  to this one) wil
6c40: 6c 20 6d 61 72 6b 20 74 68 65 20 70 6f 69 6e 74  l mark the point
6c50: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 77 68 65   in the code whe
6c60: 72 65 0a 2a 2a 20 77 65 20 74 72 61 6e 73 69 74  re.** we transit
6c70: 69 6f 6e 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d  ion back to norm
6c80: 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a  al indentation..
6c90: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
6ca0: 74 69 6e 67 20 6f 66 20 65 61 63 68 20 63 61 73  ting of each cas
6cb0: 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  e is important. 
6cc0: 20 54 68 65 20 6d 61 6b 65 66 69 6c 65 20 66 6f   The makefile fo
6cd0: 72 20 53 51 4c 69 74 65 0a 2a 2a 20 67 65 6e 65  r SQLite.** gene
6ce0: 72 61 74 65 73 20 74 77 6f 20 43 20 66 69 6c 65  rates two C file
6cf0: 73 20 22 6f 70 63 6f 64 65 73 2e 68 22 20 61 6e  s "opcodes.h" an
6d00: 64 20 22 6f 70 63 6f 64 65 73 2e 63 22 20 62 79  d "opcodes.c" by
6d10: 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 0a 2a   scanning this.*
6d20: 2a 20 66 69 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66  * file looking f
6d30: 6f 72 20 6c 69 6e 65 73 20 74 68 61 74 20 62 65  or lines that be
6d40: 67 69 6e 20 77 69 74 68 20 22 63 61 73 65 20 4f  gin with "case O
6d50: 50 5f 22 2e 20 20 54 68 65 20 6f 70 63 6f 64 65  P_".  The opcode
6d60: 73 2e 68 20 66 69 6c 65 73 0a 2a 2a 20 77 69 6c  s.h files.** wil
6d70: 6c 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  l be filled with
6d80: 20 23 64 65 66 69 6e 65 73 20 74 68 61 74 20 67   #defines that g
6d90: 69 76 65 20 75 6e 69 71 75 65 20 69 6e 74 65 67  ive unique integ
6da0: 65 72 20 76 61 6c 75 65 73 20 74 6f 20 65 61 63  er values to eac
6db0: 68 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20  h.** opcode and 
6dc0: 74 68 65 20 6f 70 63 6f 64 65 73 2e 63 20 66 69  the opcodes.c fi
6dd0: 6c 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  le is filled wit
6de0: 68 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74  h an array of st
6df0: 72 69 6e 67 73 20 77 68 65 72 65 0a 2a 2a 20 65  rings where.** e
6e00: 61 63 68 20 73 74 72 69 6e 67 20 69 73 20 74 68  ach string is th
6e10: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  e symbolic name 
6e20: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
6e30: 6e 64 69 6e 67 20 6f 70 63 6f 64 65 2e 20 20 49  nding opcode.  I
6e40: 66 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 73 74  f the.** case st
6e50: 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 6c 6c 6f  atement is follo
6e60: 77 65 64 20 62 79 20 61 20 63 6f 6d 6d 65 6e 74  wed by a comment
6e70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2f 23   of the form "/#
6e80: 20 73 61 6d 65 20 61 73 20 2e 2e 2e 20 23 2f 22   same as ... #/"
6e90: 0a 2a 2a 20 74 68 61 74 20 63 6f 6d 6d 65 6e 74  .** that comment
6ea0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
6eb0: 72 6d 69 6e 65 20 74 68 65 20 70 61 72 74 69 63  rmine the partic
6ec0: 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
6ed0: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  e opcode..**.** 
6ee0: 4f 74 68 65 72 20 6b 65 79 77 6f 72 64 73 20 69  Other keywords i
6ef0: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 68  n the comment th
6f00: 61 74 20 66 6f 6c 6c 6f 77 73 20 65 61 63 68 20  at follows each 
6f10: 63 61 73 65 20 61 72 65 20 75 73 65 64 20 74 6f  case are used to
6f20: 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 74 68  .** construct th
6f30: 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49  e OPFLG_INITIALI
6f40: 5a 45 52 20 76 61 6c 75 65 20 74 68 61 74 20 69  ZER value that i
6f50: 6e 69 74 69 61 6c 69 7a 65 73 20 6f 70 63 6f 64  nitializes opcod
6f60: 65 50 72 6f 70 65 72 74 79 5b 5d 2e 0a 2a 2a 20  eProperty[]..** 
6f70: 4b 65 79 77 6f 72 64 73 20 69 6e 63 6c 75 64 65  Keywords include
6f80: 3a 20 69 6e 31 2c 20 69 6e 32 2c 20 69 6e 33 2c  : in1, in2, in3,
6f90: 20 6f 75 74 32 2c 20 6f 75 74 33 2e 20 20 53 65   out2, out3.  Se
6fa0: 65 0a 2a 2a 20 74 68 65 20 6d 6b 6f 70 63 6f 64  e.** the mkopcod
6fb0: 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 66 6f  eh.awk script fo
6fc0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
6fd0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
6fe0: 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61 62  Documentation ab
6ff0: 6f 75 74 20 56 44 42 45 20 6f 70 63 6f 64 65 73  out VDBE opcodes
7000: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
7010: 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 20 66   scanning this f
7020: 69 6c 65 0a 2a 2a 20 66 6f 72 20 6c 69 6e 65 73  ile.** for lines
7030: 20 6f 66 20 74 68 61 74 20 63 6f 6e 74 61 69 6e   of that contain
7040: 20 22 4f 70 63 6f 64 65 3a 22 2e 20 20 54 68 61   "Opcode:".  Tha
7050: 74 20 6c 69 6e 65 20 61 6e 64 20 61 6c 6c 20 73  t line and all s
7060: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 6f 6d  ubsequent.** com
7070: 6d 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 75  ment lines are u
7080: 73 65 64 20 69 6e 20 74 68 65 20 67 65 6e 65 72  sed in the gener
7090: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 63  ation of the opc
70a0: 6f 64 65 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e  ode.html documen
70b0: 74 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2e 0a  tation.** file..
70c0: 2a 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59 3a 0a 2a  **.** SUMMARY:.*
70d0: 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 6d 61 74 74  *.**     Formatt
70e0: 69 6e 67 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  ing is important
70f0: 20 74 6f 20 73 63 72 69 70 74 73 20 74 68 61 74   to scripts that
7100: 20 73 63 61 6e 20 74 68 69 73 20 66 69 6c 65 2e   scan this file.
7110: 0a 2a 2a 20 20 20 20 20 44 6f 20 6e 6f 74 20 64  .**     Do not d
7120: 65 76 69 61 74 65 20 66 72 6f 6d 20 74 68 65 20  eviate from the 
7130: 66 6f 72 6d 61 74 74 69 6e 67 20 73 74 79 6c 65  formatting style
7140: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
7150: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
7160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
71a0: 2a 2a 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ***/../* Opcode:
71b0: 20 20 47 6f 74 6f 20 2a 20 50 32 20 2a 20 2a 20    Goto * P2 * * 
71c0: 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e 63 6f 6e  *.**.** An uncon
71d0: 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f  ditional jump to
71e0: 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 20   address P2..** 
71f0: 54 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  The next instruc
7200: 74 69 6f 6e 20 65 78 65 63 75 74 65 64 20 77 69  tion executed wi
7210: 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65 20 6f 6e  ll be .** the on
7220: 65 20 61 74 20 69 6e 64 65 78 20 50 32 20 66 72  e at index P2 fr
7230: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
7240: 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72 6f 67 72   of.** the progr
7250: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31  am..**.** The P1
7260: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
7270: 74 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20  t actually used 
7280: 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20  by this opcode. 
7290: 20 48 6f 77 65 76 65 72 2c 20 69 74 0a 2a 2a 20   However, it.** 
72a0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 73 65 74  is sometimes set
72b0: 20 74 6f 20 31 20 69 6e 73 74 65 61 64 20 6f 66   to 1 instead of
72c0: 20 30 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20   0 as a hint to 
72d0: 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
72e0: 20 73 68 65 6c 6c 0a 2a 2a 20 74 68 61 74 20 74   shell.** that t
72f0: 68 69 73 20 47 6f 74 6f 20 69 73 20 74 68 65 20  his Goto is the 
7300: 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f 70  bottom of a loop
7310: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6c 69   and that the li
7320: 6e 65 73 20 66 72 6f 6d 20 50 32 20 64 6f 77 6e  nes from P2 down
7330: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65  .** to the curre
7340: 6e 74 20 6c 69 6e 65 20 73 68 6f 75 6c 64 20 62  nt line should b
7350: 65 20 69 6e 64 65 6e 74 65 64 20 66 6f 72 20 45  e indented for E
7360: 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a  XPLAIN output..*
7370: 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 74 6f 3a 20  /.case OP_Goto: 
7380: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
7390: 20 6a 75 6d 70 20 2a 2f 0a 6a 75 6d 70 5f 74 6f   jump */.jump_to
73a0: 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f  _p2_and_check_fo
73b0: 72 5f 69 6e 74 65 72 72 75 70 74 3a 0a 20 20 70  r_interrupt:.  p
73c0: 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70  Op = &aOp[pOp->p
73d0: 32 20 2d 20 31 5d 3b 0a 0a 20 20 2f 2a 20 4f 70  2 - 1];..  /* Op
73e0: 63 6f 64 65 73 20 74 68 61 74 20 61 72 65 20 75  codes that are u
73f0: 73 65 64 20 61 73 20 74 68 65 20 62 6f 74 74 6f  sed as the botto
7400: 6d 20 6f 66 20 61 20 6c 6f 6f 70 20 28 4f 50 5f  m of a loop (OP_
7410: 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 2c 0a 20  Next, OP_Prev,. 
7420: 20 2a 2a 20 4f 50 5f 56 4e 65 78 74 2c 20 6f 72   ** OP_VNext, or
7430: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 29 20   OP_SorterNext) 
7440: 61 6c 6c 20 6a 75 6d 70 20 68 65 72 65 20 75 70  all jump here up
7450: 6f 6e 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 69  on.  ** completi
7460: 6f 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  on.  Check to se
7470: 65 20 69 66 20 73 71 6c 69 74 65 33 5f 69 6e 74  e if sqlite3_int
7480: 65 72 72 75 70 74 28 29 20 68 61 73 20 62 65 65  errupt() has bee
7490: 6e 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 72  n called.  ** or
74a0: 20 69 66 20 74 68 65 20 70 72 6f 67 72 65 73 73   if the progress
74b0: 20 63 61 6c 6c 62 61 63 6b 20 6e 65 65 64 73 20   callback needs 
74c0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 20 0a  to be invoked. .
74d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
74e0: 6f 64 65 20 75 73 65 73 20 75 6e 73 74 72 75 63  ode uses unstruc
74f0: 74 75 72 65 64 20 22 67 6f 74 6f 22 20 73 74 61  tured "goto" sta
7500: 74 65 6d 65 6e 74 73 20 61 6e 64 20 64 6f 65 73  tements and does
7510: 20 6e 6f 74 20 6c 6f 6f 6b 20 63 6c 65 61 6e 2e   not look clean.
7520: 0a 20 20 2a 2a 20 42 75 74 20 74 68 61 74 20 69  .  ** But that i
7530: 73 20 6e 6f 74 20 64 75 65 20 74 6f 20 73 6c 6f  s not due to slo
7540: 70 70 79 20 63 6f 64 69 6e 67 20 68 61 62 69 74  ppy coding habit
7550: 73 2e 20 54 68 65 20 63 6f 64 65 20 69 73 20 77  s. The code is w
7560: 72 69 74 74 65 6e 20 74 68 69 73 0a 20 20 2a 2a  ritten this.  **
7570: 20 77 61 79 20 66 6f 72 20 70 65 72 66 6f 72 6d   way for perform
7580: 61 6e 63 65 2c 20 74 6f 20 61 76 6f 69 64 20 68  ance, to avoid h
7590: 61 76 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65  aving to run the
75a0: 20 69 6e 74 65 72 72 75 70 74 20 61 6e 64 20 70   interrupt and p
75b0: 72 6f 67 72 65 73 73 0a 20 20 2a 2a 20 63 68 65  rogress.  ** che
75c0: 63 6b 73 20 6f 6e 20 65 76 65 72 79 20 6f 70 63  cks on every opc
75d0: 6f 64 65 2e 20 20 54 68 69 73 20 68 65 6c 70 73  ode.  This helps
75e0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
75f0: 74 6f 20 72 75 6e 20 61 62 6f 75 74 20 31 2e 35  to run about 1.5
7600: 25 0a 20 20 2a 2a 20 66 61 73 74 65 72 20 61 63  %.  ** faster ac
7610: 63 6f 72 64 69 6e 67 20 74 6f 20 22 76 61 6c 67  cording to "valg
7620: 72 69 6e 64 20 2d 2d 74 6f 6f 6c 3d 63 61 63 68  rind --tool=cach
7630: 65 67 72 69 6e 64 22 20 2a 2f 0a 63 68 65 63 6b  egrind" */.check
7640: 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3a 0a  _for_interrupt:.
7650: 20 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49    if( db->u1.isI
7660: 6e 74 65 72 72 75 70 74 65 64 20 29 20 67 6f 74  nterrupted ) got
7670: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69  o abort_due_to_i
7680: 6e 74 65 72 72 75 70 74 3b 0a 23 69 66 6e 64 65  nterrupt;.#ifnde
7690: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
76a0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
76b0: 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 70 72    /* Call the pr
76c0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
76d0: 69 66 20 69 74 20 69 73 20 63 6f 6e 66 69 67 75  if it is configu
76e0: 72 65 64 20 61 6e 64 20 74 68 65 20 72 65 71 75  red and the requ
76f0: 69 72 65 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  ired number.  **
7700: 20 6f 66 20 56 44 42 45 20 6f 70 73 20 68 61 76   of VDBE ops hav
7710: 65 20 62 65 65 6e 20 65 78 65 63 75 74 65 64 20  e been executed 
7720: 28 65 69 74 68 65 72 20 73 69 6e 63 65 20 74 68  (either since th
7730: 69 73 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  is invocation of
7740: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  .  ** sqlite3Vdb
7750: 65 45 78 65 63 28 29 20 6f 72 20 73 69 6e 63 65  eExec() or since
7760: 20 6c 61 73 74 20 74 69 6d 65 20 74 68 65 20 70   last time the p
7770: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
7780: 20 77 61 73 20 63 61 6c 6c 65 64 29 2e 0a 20 20   was called)..  
7790: 2a 2a 20 49 66 20 74 68 65 20 70 72 6f 67 72 65  ** If the progre
77a0: 73 73 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  ss callback retu
77b0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 65 78  rns non-zero, ex
77c0: 69 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  it the virtual m
77d0: 61 63 68 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  achine with.  **
77e0: 20 61 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53   a return code S
77f0: 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 20 20 2a  QLITE_ABORT..  *
7800: 2f 0a 20 20 77 68 69 6c 65 28 20 6e 56 6d 53 74  /.  while( nVmSt
7810: 65 70 3e 3d 6e 50 72 6f 67 72 65 73 73 4c 69 6d  ep>=nProgressLim
7820: 69 74 20 26 26 20 64 62 2d 3e 78 50 72 6f 67 72  it && db->xProgr
7830: 65 73 73 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ess!=0 ){.    as
7840: 73 65 72 74 28 20 64 62 2d 3e 6e 50 72 6f 67 72  sert( db->nProgr
7850: 65 73 73 4f 70 73 21 3d 30 20 29 3b 0a 20 20 20  essOps!=0 );.   
7860: 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20   nProgressLimit 
7870: 2b 3d 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73  += db->nProgress
7880: 4f 70 73 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Ops;.    if( db-
7890: 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70  >xProgress(db->p
78a0: 50 72 6f 67 72 65 73 73 41 72 67 29 20 29 7b 0a  ProgressArg) ){.
78b0: 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c        nProgressL
78c0: 69 6d 69 74 20 3d 20 30 78 66 66 66 66 66 66 66  imit = 0xfffffff
78d0: 66 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  f;.      rc = SQ
78e0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
78f0: 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
7900: 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
7910: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
7920: 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f    .  break;.}../
7930: 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 73 75 62  * Opcode:  Gosub
7940: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
7950: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 75 72  ** Write the cur
7960: 72 65 6e 74 20 61 64 64 72 65 73 73 20 6f 6e 74  rent address ont
7970: 6f 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a  o register P1.**
7980: 20 61 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20 74   and then jump t
7990: 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2f  o address P2..*/
79a0: 0a 63 61 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20  .case OP_Gosub: 
79b0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
79c0: 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74  jump */.  assert
79d0: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70  ( pOp->p1>0 && p
79e0: 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p1<=(p->nMem
79f0: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
7a00: 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   );.  pIn1 = &aM
7a10: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
7a20: 73 73 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79  ssert( VdbeMemDy
7a30: 6e 61 6d 69 63 28 70 49 6e 31 29 3d 3d 30 20 29  namic(pIn1)==0 )
7a40: 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
7a50: 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20  ange(p, pIn1);. 
7a60: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d   pIn1->flags = M
7a70: 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e 31 2d 3e  EM_Int;.  pIn1->
7a80: 75 2e 69 20 3d 20 28 69 6e 74 29 28 70 4f 70 2d  u.i = (int)(pOp-
7a90: 61 4f 70 29 3b 0a 20 20 52 45 47 49 53 54 45 52  aOp);.  REGISTER
7aa0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20  _TRACE(pOp->p1, 
7ab0: 70 49 6e 31 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 73  pIn1);..  /* Mos
7ac0: 74 20 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e  t jump operation
7ad0: 73 20 64 6f 20 61 20 67 6f 74 6f 20 74 6f 20 74  s do a goto to t
7ae0: 68 69 73 20 73 70 6f 74 20 69 6e 20 6f 72 64 65  his spot in orde
7af0: 72 20 74 6f 20 75 70 64 61 74 65 0a 20 20 2a 2a  r to update.  **
7b00: 20 74 68 65 20 70 4f 70 20 70 6f 69 6e 74 65 72   the pOp pointer
7b10: 2e 20 2a 2f 0a 6a 75 6d 70 5f 74 6f 5f 70 32 3a  . */.jump_to_p2:
7b20: 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f  .  pOp = &aOp[pO
7b30: 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20 62 72  p->p2 - 1];.  br
7b40: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
7b50: 65 3a 20 20 52 65 74 75 72 6e 20 50 31 20 2a 20  e:  Return P1 * 
7b60: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  * * *.**.** Jump
7b70: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
7b80: 74 72 75 63 74 69 6f 6e 20 61 66 74 65 72 20 74  truction after t
7b90: 68 65 20 61 64 64 72 65 73 73 20 69 6e 20 72 65  he address in re
7ba0: 67 69 73 74 65 72 20 50 31 2e 20 20 41 66 74 65  gister P1.  Afte
7bb0: 72 0a 2a 2a 20 74 68 65 20 6a 75 6d 70 2c 20 72  r.** the jump, r
7bc0: 65 67 69 73 74 65 72 20 50 31 20 62 65 63 6f 6d  egister P1 becom
7bd0: 65 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  es undefined..*/
7be0: 0a 63 61 73 65 20 4f 50 5f 52 65 74 75 72 6e 3a  .case OP_Return:
7bf0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
7c00: 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
7c10: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
7c20: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
7c30: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29  flags==MEM_Int )
7c40: 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70  ;.  pOp = &aOp[p
7c50: 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20 70 49 6e  In1->u.i];.  pIn
7c60: 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  1->flags = MEM_U
7c70: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 62 72 65 61  ndefined;.  brea
7c80: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
7c90: 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 50   InitCoroutine P
7ca0: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
7cb0: 2a 20 53 65 74 20 75 70 20 72 65 67 69 73 74 65  * Set up registe
7cc0: 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20  r P1 so that it 
7cd0: 77 69 6c 6c 20 59 69 65 6c 64 20 74 6f 20 74 68  will Yield to th
7ce0: 65 20 63 6f 72 6f 75 74 69 6e 65 0a 2a 2a 20 6c  e coroutine.** l
7cf0: 6f 63 61 74 65 64 20 61 74 20 61 64 64 72 65 73  ocated at addres
7d00: 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  s P3..**.** If P
7d10: 32 21 3d 30 20 74 68 65 6e 20 74 68 65 20 63 6f  2!=0 then the co
7d20: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
7d30: 74 61 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  tation immediate
7d40: 6c 79 20 66 6f 6c 6c 6f 77 73 0a 2a 2a 20 74 68  ly follows.** th
7d50: 69 73 20 6f 70 63 6f 64 65 2e 20 20 53 6f 20 6a  is opcode.  So j
7d60: 75 6d 70 20 6f 76 65 72 20 74 68 65 20 63 6f 72  ump over the cor
7d70: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
7d80: 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 61 64 64 72  ation to.** addr
7d90: 65 73 73 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65  ess P2..**.** Se
7da0: 65 20 61 6c 73 6f 3a 20 45 6e 64 43 6f 72 6f 75  e also: EndCorou
7db0: 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  tine.*/.case OP_
7dc0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  InitCoroutine: {
7dd0: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
7de0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
7df0: 31 3e 30 20 26 26 20 20 70 4f 70 2d 3e 70 31 3c  1>0 &&  pOp->p1<
7e00: 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
7e10: 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 61  >nCursor) );.  a
7e20: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d  ssert( pOp->p2>=
7e30: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e  0 && pOp->p2<p->
7e40: 6e 4f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nOp );.  assert(
7e50: 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26 26 20 70   pOp->p3>=0 && p
7e60: 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 4f 70 20 29 3b  Op->p3<p->nOp );
7e70: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
7e80: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
7e90: 72 74 28 20 21 56 64 62 65 4d 65 6d 44 79 6e 61  rt( !VdbeMemDyna
7ea0: 6d 69 63 28 70 4f 75 74 29 20 29 3b 0a 20 20 70  mic(pOut) );.  p
7eb0: 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Out->u.i = pOp->
7ec0: 70 33 20 2d 20 31 3b 0a 20 20 70 4f 75 74 2d 3e  p3 - 1;.  pOut->
7ed0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
7ee0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29  .  if( pOp->p2 )
7ef0: 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
7f00: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
7f10: 20 4f 70 63 6f 64 65 3a 20 20 45 6e 64 43 6f 72   Opcode:  EndCor
7f20: 6f 75 74 69 6e 65 20 50 31 20 2a 20 2a 20 2a 20  outine P1 * * * 
7f30: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 73 74  *.**.** The inst
7f40: 72 75 63 74 69 6f 6e 20 61 74 20 74 68 65 20 61  ruction at the a
7f50: 64 64 72 65 73 73 20 69 6e 20 72 65 67 69 73 74  ddress in regist
7f60: 65 72 20 50 31 20 69 73 20 61 20 59 69 65 6c 64  er P1 is a Yield
7f70: 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65  ..** Jump to the
7f80: 20 50 32 20 70 61 72 61 6d 65 74 65 72 20 6f 66   P2 parameter of
7f90: 20 74 68 61 74 20 59 69 65 6c 64 2e 0a 2a 2a 20   that Yield..** 
7fa0: 41 66 74 65 72 20 74 68 65 20 6a 75 6d 70 2c 20  After the jump, 
7fb0: 72 65 67 69 73 74 65 72 20 50 31 20 62 65 63 6f  register P1 beco
7fc0: 6d 65 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  mes undefined..*
7fd0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 49  *.** See also: I
7fe0: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a  nitCoroutine.*/.
7ff0: 63 61 73 65 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  case OP_EndCorou
8000: 74 69 6e 65 3a 20 7b 20 20 20 20 20 20 20 20 20  tine: {         
8010: 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 56 64    /* in1 */.  Vd
8020: 62 65 4f 70 20 2a 70 43 61 6c 6c 65 72 3b 0a 20  beOp *pCaller;. 
8030: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
8040: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
8050: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d  ( pIn1->flags==M
8060: 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65  EM_Int );.  asse
8070: 72 74 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 3d 30  rt( pIn1->u.i>=0
8080: 20 26 26 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 2d   && pIn1->u.i<p-
8090: 3e 6e 4f 70 20 29 3b 0a 20 20 70 43 61 6c 6c 65  >nOp );.  pCalle
80a0: 72 20 3d 20 26 61 4f 70 5b 70 49 6e 31 2d 3e 75  r = &aOp[pIn1->u
80b0: 2e 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  .i];.  assert( p
80c0: 43 61 6c 6c 65 72 2d 3e 6f 70 63 6f 64 65 3d 3d  Caller->opcode==
80d0: 4f 50 5f 59 69 65 6c 64 20 29 3b 0a 20 20 61 73  OP_Yield );.  as
80e0: 73 65 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e 70  sert( pCaller->p
80f0: 32 3e 3d 30 20 26 26 20 70 43 61 6c 6c 65 72 2d  2>=0 && pCaller-
8100: 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  >p2<p->nOp );.  
8110: 70 4f 70 20 3d 20 26 61 4f 70 5b 70 43 61 6c 6c  pOp = &aOp[pCall
8120: 65 72 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20 70  er->p2 - 1];.  p
8130: 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  In1->flags = MEM
8140: 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 62 72  _Undefined;.  br
8150: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
8160: 65 3a 20 20 59 69 65 6c 64 20 50 31 20 50 32 20  e:  Yield P1 P2 
8170: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70  * * *.**.** Swap
8180: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
8190: 6e 74 65 72 20 77 69 74 68 20 74 68 65 20 76 61  nter with the va
81a0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
81b0: 50 31 2e 20 20 54 68 69 73 0a 2a 2a 20 68 61 73  P1.  This.** has
81c0: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 79   the effect of y
81d0: 69 65 6c 64 69 6e 67 20 74 6f 20 61 20 63 6f 72  ielding to a cor
81e0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  outine..**.** If
81f0: 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 74   the coroutine t
8200: 68 61 74 20 69 73 20 6c 61 75 6e 63 68 65 64 20  hat is launched 
8210: 62 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  by this instruct
8220: 69 6f 6e 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a  ion ends with.**
8230: 20 59 69 65 6c 64 20 6f 72 20 52 65 74 75 72 6e   Yield or Return
8240: 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 74   then continue t
8250: 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
8260: 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  uction.  But if.
8270: 2a 2a 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65  ** the coroutine
8280: 20 6c 61 75 6e 63 68 65 64 20 62 79 20 74 68 69   launched by thi
8290: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  s instruction en
82a0: 64 73 20 77 69 74 68 0a 2a 2a 20 45 6e 64 43 6f  ds with.** EndCo
82b0: 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 6a 75  routine, then ju
82c0: 6d 70 20 74 6f 20 50 32 20 72 61 74 68 65 72 20  mp to P2 rather 
82d0: 74 68 61 6e 20 63 6f 6e 74 69 6e 75 69 6e 67 20  than continuing 
82e0: 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 65 78 74  with the.** next
82f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
8300: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 49 6e  .** See also: In
8310: 69 74 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63  itCoroutine.*/.c
8320: 61 73 65 20 4f 50 5f 59 69 65 6c 64 3a 20 7b 20  ase OP_Yield: { 
8330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
8340: 31 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74  1, jump */.  int
8350: 20 70 63 44 65 73 74 3b 0a 20 20 70 49 6e 31 20   pcDest;.  pIn1 
8360: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
8370: 3b 0a 20 20 61 73 73 65 72 74 28 20 56 64 62 65  ;.  assert( Vdbe
8380: 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31 29  MemDynamic(pIn1)
8390: 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66  ==0 );.  pIn1->f
83a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
83b0: 20 20 70 63 44 65 73 74 20 3d 20 28 69 6e 74 29    pcDest = (int)
83c0: 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 70 49 6e  pIn1->u.i;.  pIn
83d0: 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74 29 28 70  1->u.i = (int)(p
83e0: 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 52 45 47  Op - aOp);.  REG
83f0: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
8400: 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 4f  >p1, pIn1);.  pO
8410: 70 20 3d 20 26 61 4f 70 5b 70 63 44 65 73 74 5d  p = &aOp[pcDest]
8420: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
8430: 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 49 66   Opcode:  HaltIf
8440: 4e 75 6c 6c 20 20 50 31 20 50 32 20 50 33 20 50  Null  P1 P2 P3 P
8450: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
8460: 3a 20 69 66 20 72 5b 50 33 5d 3d 6e 75 6c 6c 20  : if r[P3]=null 
8470: 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b  halt.**.** Check
8480: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
8490: 67 69 73 74 65 72 20 50 33 2e 20 20 49 66 20 69  gister P3.  If i
84a0: 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 48  t is NULL then H
84b0: 61 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 70 61 72  alt using.** par
84c0: 61 6d 65 74 65 72 20 50 31 2c 20 50 32 2c 20 61  ameter P1, P2, a
84d0: 6e 64 20 50 34 20 61 73 20 69 66 20 74 68 69 73  nd P4 as if this
84e0: 20 77 65 72 65 20 61 20 48 61 6c 74 20 69 6e 73   were a Halt ins
84f0: 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  truction.  If th
8500: 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 72 65  e.** value in re
8510: 67 69 73 74 65 72 20 50 33 20 69 73 20 6e 6f 74  gister P3 is not
8520: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
8530: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
8540: 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 50 35 20 70  -op..** The P5 p
8550: 61 72 61 6d 65 74 65 72 20 73 68 6f 75 6c 64 20  arameter should 
8560: 62 65 20 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  be 1..*/.case OP
8570: 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a 20 7b 20 20  _HaltIfNull: {  
8580: 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20      /* in3 */.  
8590: 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
85a0: 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51  ->p3];.#ifdef SQ
85b0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
85c0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
85d0: 72 74 20 29 7b 20 73 71 6c 69 74 65 33 56 64 62  rt ){ sqlite3Vdb
85e0: 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c 65  eAssertAbortable
85f0: 28 70 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  (p); }.#endif.  
8600: 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  if( (pIn3->flags
8610: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20   & MEM_Null)==0 
8620: 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61  ) break;.  /* Fa
8630: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
8640: 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a  OP_Halt */.}../*
8650: 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 20 50   Opcode:  Halt P
8660: 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a 0a  1 P2 * P4 P5.**.
8670: 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64 69 61 74  ** Exit immediat
8680: 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65 6e 20 63  ely.  All open c
8690: 75 72 73 6f 72 73 2c 20 65 74 63 20 61 72 65 20  ursors, etc are 
86a0: 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  closed.** automa
86b0: 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50  tically..**.** P
86c0: 31 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  1 is the result 
86d0: 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
86e0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2c   sqlite3_exec(),
86f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
8700: 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f  ,.** or sqlite3_
8710: 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20 46 6f 72  finalize().  For
8720: 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c 74 2c 20   a normal halt, 
8730: 74 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 53  this should be S
8740: 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e 0a 2a 2a  QLITE_OK (0)..**
8750: 20 46 6f 72 20 65 72 72 6f 72 73 2c 20 69 74 20   For errors, it 
8760: 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f 74 68 65  can be some othe
8770: 72 20 76 61 6c 75 65 2e 20 20 49 66 20 50 31 21  r value.  If P1!
8780: 3d 30 20 74 68 65 6e 20 50 32 20 77 69 6c 6c 20  =0 then P2 will 
8790: 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65  determine.** whe
87a0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 72  ther or not to r
87b0: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72 72  ollback the curr
87c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
87d0: 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63    Do not rollbac
87e0: 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f 45 5f 46  k.** if P2==OE_F
87f0: 61 69 6c 2e 20 44 6f 20 74 68 65 20 72 6f 6c 6c  ail. Do the roll
8800: 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f 45 5f 52  back if P2==OE_R
8810: 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20 50 32 3d  ollback.  If P2=
8820: 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a 20 74 68  =OE_Abort,.** th
8830: 65 6e 20 62 61 63 6b 20 6f 75 74 20 61 6c 6c 20  en back out all 
8840: 63 68 61 6e 67 65 73 20 74 68 61 74 20 68 61 76  changes that hav
8850: 65 20 6f 63 63 75 72 72 65 64 20 64 75 72 69 6e  e occurred durin
8860: 67 20 74 68 69 73 20 65 78 65 63 75 74 69 6f 6e  g this execution
8870: 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 2c   of the.** VDBE,
8880: 20 62 75 74 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c   but do not roll
8890: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
88a0: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
88b0: 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74  P4 is not null t
88c0: 68 65 6e 20 69 74 20 69 73 20 61 6e 20 65 72 72  hen it is an err
88d0: 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
88e0: 67 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69 73 20 61  g..**.** P5 is a
88f0: 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 30   value between 0
8900: 20 61 6e 64 20 34 2c 20 69 6e 63 6c 75 73 69 76   and 4, inclusiv
8910: 65 2c 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73  e, that modifies
8920: 20 74 68 65 20 50 34 20 73 74 72 69 6e 67 2e 0a   the P4 string..
8930: 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 28 6e 6f  **.**    0:  (no
8940: 20 63 68 61 6e 67 65 29 0a 2a 2a 20 20 20 20 31   change).**    1
8950: 3a 20 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 74  :  NOT NULL cont
8960: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34  raint failed: P4
8970: 0a 2a 2a 20 20 20 20 32 3a 20 20 55 4e 49 51 55  .**    2:  UNIQU
8980: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  E constraint fai
8990: 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 33 3a  led: P4.**    3:
89a0: 20 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69    CHECK constrai
89b0: 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a  nt failed: P4.**
89c0: 20 20 20 20 34 3a 20 20 46 4f 52 45 49 47 4e 20      4:  FOREIGN 
89d0: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
89e0: 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a 2a 2a 20  ailed: P4.**.** 
89f0: 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a 65 72  If P5 is not zer
8a00: 6f 20 61 6e 64 20 50 34 20 69 73 20 4e 55 4c 4c  o and P4 is NULL
8a10: 2c 20 74 68 65 6e 20 65 76 65 72 79 74 68 69 6e  , then everythin
8a20: 67 20 61 66 74 65 72 20 74 68 65 20 22 3a 22 20  g after the ":" 
8a30: 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 2a  is.** omitted..*
8a40: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e  *.** There is an
8a50: 20 69 6d 70 6c 69 65 64 20 22 48 61 6c 74 20 30   implied "Halt 0
8a60: 20 30 20 30 22 20 69 6e 73 74 72 75 63 74 69 6f   0 0" instructio
8a70: 6e 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68  n inserted at th
8a80: 65 20 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a  e very end of.**
8a90: 20 65 76 65 72 79 20 70 72 6f 67 72 61 6d 2e 20   every program. 
8aa0: 20 53 6f 20 61 20 6a 75 6d 70 20 70 61 73 74 20   So a jump past 
8ab0: 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63  the last instruc
8ac0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67  tion of the prog
8ad0: 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73 61  ram.** is the sa
8ae0: 6d 65 20 61 73 20 65 78 65 63 75 74 69 6e 67 20  me as executing 
8af0: 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Halt..*/.case OP
8b00: 5f 48 61 6c 74 3a 20 7b 0a 20 20 56 64 62 65 46  _Halt: {.  VdbeF
8b10: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
8b20: 69 6e 74 20 70 63 78 3b 0a 0a 20 20 70 63 78 20  int pcx;..  pcx 
8b30: 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  = (int)(pOp - aO
8b40: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
8b50: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f  E_DEBUG.  if( pO
8b60: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20  p->p2==OE_Abort 
8b70: 29 7b 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  ){ sqlite3VdbeAs
8b80: 73 65 72 74 41 62 6f 72 74 61 62 6c 65 28 70 29  sertAbortable(p)
8b90: 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ; }.#endif.  if(
8ba0: 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45   pOp->p1==SQLITE
8bb0: 5f 4f 4b 20 26 26 20 70 2d 3e 70 46 72 61 6d 65  _OK && p->pFrame
8bc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 48 61 6c 74 20   ){.    /* Halt 
8bd0: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e  the sub-program.
8be0: 20 52 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20   Return control 
8bf0: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 66 72  to the parent fr
8c00: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 46 72 61  ame. */.    pFra
8c10: 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a  me = p->pFrame;.
8c20: 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
8c30: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
8c40: 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 2d 2d  .    p->nFrame--
8c50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8c60: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
8c70: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
8c80: 20 70 63 78 20 3d 20 73 71 6c 69 74 65 33 56 64   pcx = sqlite3Vd
8c90: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
8ca0: 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  Frame);.    if( 
8cb0: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e 6f  pOp->p2==OE_Igno
8cc0: 72 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  re ){.      /* I
8cd0: 6e 73 74 72 75 63 74 69 6f 6e 20 70 63 78 20 69  nstruction pcx i
8ce0: 73 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  s the OP_Program
8cf0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
8d00: 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a 20  e sub-program . 
8d10: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
8d20: 79 20 62 65 69 6e 67 20 68 61 6c 74 65 64 2e 20  y being halted. 
8d30: 49 66 20 74 68 65 20 70 32 20 69 6e 73 74 72 75  If the p2 instru
8d40: 63 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 4f 50  ction of this OP
8d50: 5f 48 61 6c 74 0a 20 20 20 20 20 20 2a 2a 20 69  _Halt.      ** i
8d60: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 73 65  nstruction is se
8d70: 74 20 74 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  t to OE_Ignore, 
8d80: 74 68 65 6e 20 74 68 65 20 73 75 62 2d 70 72 6f  then the sub-pro
8d90: 67 72 61 6d 20 69 73 20 74 68 72 6f 77 69 6e 67  gram is throwing
8da0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 49 47 4e  .      ** an IGN
8db0: 4f 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 20 49  ORE exception. I
8dc0: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 6d 70  n this case jump
8dd0: 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
8de0: 73 70 65 63 69 66 69 65 64 0a 20 20 20 20 20 20  specified.      
8df0: 2a 2a 20 61 73 20 74 68 65 20 70 32 20 6f 66 20  ** as the p2 of 
8e00: 74 68 65 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50  the calling OP_P
8e10: 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20  rogram.  */.    
8e20: 20 20 70 63 78 20 3d 20 70 2d 3e 61 4f 70 5b 70    pcx = p->aOp[p
8e30: 63 78 5d 2e 70 32 2d 31 3b 0a 20 20 20 20 7d 0a  cx].p2-1;.    }.
8e40: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 4f 70      aOp = p->aOp
8e50: 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20 70 2d 3e  ;.    aMem = p->
8e60: 61 4d 65 6d 3b 0a 20 20 20 20 70 4f 70 20 3d 20  aMem;.    pOp = 
8e70: 26 61 4f 70 5b 70 63 78 5d 3b 0a 20 20 20 20 62  &aOp[pcx];.    b
8e80: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72  reak;.  }.  p->r
8e90: 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70  c = pOp->p1;.  p
8ea0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
8eb0: 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a 20 20 70  (u8)pOp->p2;.  p
8ec0: 2d 3e 70 63 20 3d 20 70 63 78 3b 0a 20 20 61 73  ->pc = pcx;.  as
8ed0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 3d 34  sert( pOp->p5<=4
8ee0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20   );.  if( p->rc 
8ef0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
8f00: 70 35 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74  p5 ){.      stat
8f10: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
8f20: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
8f30: 20 7b 20 22 4e 4f 54 20 4e 55 4c 4c 22 2c 20 22   { "NOT NULL", "
8f40: 55 4e 49 51 55 45 22 2c 20 22 43 48 45 43 4b 22  UNIQUE", "CHECK"
8f50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
8f80: 46 4f 52 45 49 47 4e 20 4b 45 59 22 20 7d 3b 0a  FOREIGN KEY" };.
8f90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8fa0: 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20  pOp->p5==1 );.  
8fb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
8fc0: 70 2d 3e 70 35 3d 3d 32 20 29 3b 0a 20 20 20 20  p->p5==2 );.    
8fd0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d    testcase( pOp-
8fe0: 3e 70 35 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  >p5==3 );.      
8ff0: 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70  testcase( pOp->p
9000: 35 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 71  5==4 );.      sq
9010: 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
9020: 2c 20 22 25 73 20 63 6f 6e 73 74 72 61 69 6e 74  , "%s constraint
9030: 20 66 61 69 6c 65 64 22 2c 20 61 7a 54 79 70 65   failed", azType
9040: 5b 70 4f 70 2d 3e 70 35 2d 31 5d 29 3b 0a 20 20  [pOp->p5-1]);.  
9050: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e      if( pOp->p4.
9060: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  z ){.        p->
9070: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
9080: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a  3MPrintf(db, "%z
9090: 3a 20 25 73 22 2c 20 70 2d 3e 7a 45 72 72 4d 73  : %s", p->zErrMs
90a0: 67 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  g, pOp->p4.z);. 
90b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
90c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
90d0: 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73 22  dbeError(p, "%s"
90e0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
90f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
9100: 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20 22 61 62  log(pOp->p1, "ab
9110: 6f 72 74 20 61 74 20 25 64 20 69 6e 20 5b 25 73  ort at %d in [%s
9120: 5d 3a 20 25 73 22 2c 20 70 63 78 2c 20 70 2d 3e  ]: %s", pcx, p->
9130: 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  zSql, p->zErrMsg
9140: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
9150: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
9160: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
9170: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72  SQLITE_BUSY || r
9180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
9190: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
91a0: 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
91b0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
91c0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
91d0: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
91e0: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
91f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
9200: 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
9210: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20  _CONSTRAINT );. 
9220: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
9230: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d 3e  QLITE_OK || db->
9240: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 20  nDeferredCons>0 
9250: 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  || db->nDeferred
9260: 49 6d 6d 43 6f 6e 73 3e 30 20 29 3b 0a 20 20 20  ImmCons>0 );.   
9270: 20 72 63 20 3d 20 70 2d 3e 72 63 20 3f 20 53 51   rc = p->rc ? SQ
9280: 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c  LITE_ERROR : SQL
9290: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
92a0: 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
92b0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
92c0: 49 6e 74 65 67 65 72 20 50 31 20 50 32 20 2a 20  Integer P1 P2 * 
92d0: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
92e0: 20 72 5b 50 32 5d 3d 50 31 0a 2a 2a 0a 2a 2a 20   r[P2]=P1.**.** 
92f0: 54 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  The 32-bit integ
9300: 65 72 20 76 61 6c 75 65 20 50 31 20 69 73 20 77  er value P1 is w
9310: 72 69 74 74 65 6e 20 69 6e 74 6f 20 72 65 67 69  ritten into regi
9320: 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
9330: 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b 20 20   OP_Integer: {  
9340: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
9350: 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  /.  pOut = out2P
9360: 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
9370: 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
9380: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65 61   pOp->p1;.  brea
9390: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
93a0: 20 49 6e 74 36 34 20 2a 20 50 32 20 2a 20 50 34   Int64 * P2 * P4
93b0: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
93c0: 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50  r[P2]=P4.**.** P
93d0: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
93e0: 6f 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  o a 64-bit integ
93f0: 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 72 69  er value..** Wri
9400: 74 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  te that value in
9410: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
9420: 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 36 34  */.case OP_Int64
9430: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
9440: 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20   out2 */.  pOut 
9450: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
9460: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73 65  (p, pOp);.  asse
9470: 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70 49 36 34  rt( pOp->p4.pI64
9480: 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75  !=0 );.  pOut->u
9490: 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  .i = *pOp->p4.pI
94a0: 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  64;.  break;.}..
94b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
94c0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
94d0: 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  NT./* Opcode: Re
94e0: 61 6c 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a  al * P2 * P4 *.*
94f0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
9500: 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  ]=P4.**.** P4 is
9510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
9520: 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
9530: 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 20  point value..** 
9540: 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65  Write that value
9550: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
9560: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  2..*/.case OP_Re
9570: 61 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  al: {           
9580: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 46   /* same as TK_F
9590: 4c 4f 41 54 2c 20 6f 75 74 32 20 2a 2f 0a 20 20  LOAT, out2 */.  
95a0: 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
95b0: 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
95c0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
95d0: 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73 73 65 72  EM_Real;.  asser
95e0: 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
95f0: 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29  (*pOp->p4.pReal)
9600: 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 72 20   );.  pOut->u.r 
9610: 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  = *pOp->p4.pReal
9620: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
9630: 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
9640: 53 74 72 69 6e 67 38 20 2a 20 50 32 20 2a 20 50  String8 * P2 * P
9650: 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
9660: 20 72 5b 50 32 5d 3d 27 50 34 27 0a 2a 2a 0a 2a   r[P2]='P4'.**.*
9670: 2a 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61  * P4 points to a
9680: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
9690: 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 54 68  UTF-8 string. Th
96a0: 69 73 20 6f 70 63 6f 64 65 20 69 73 20 74 72 61  is opcode is tra
96b0: 6e 73 66 6f 72 6d 65 64 20 0a 2a 2a 20 69 6e 74  nsformed .** int
96c0: 6f 20 61 20 53 74 72 69 6e 67 20 6f 70 63 6f 64  o a String opcod
96d0: 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 65  e before it is e
96e0: 78 65 63 75 74 65 64 20 66 6f 72 20 74 68 65 20  xecuted for the 
96f0: 66 69 72 73 74 20 74 69 6d 65 2e 20 20 44 75 72  first time.  Dur
9700: 69 6e 67 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e  ing.** this tran
9710: 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 20  sformation, the 
9720: 6c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  length of string
9730: 20 50 34 20 69 73 20 63 6f 6d 70 75 74 65 64 20   P4 is computed 
9740: 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 61 73  and stored.** as
9750: 20 74 68 65 20 50 31 20 70 61 72 61 6d 65 74 65   the P1 paramete
9760: 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74  r..*/.case OP_St
9770: 72 69 6e 67 38 3a 20 7b 20 20 20 20 20 20 20 20  ring8: {        
9780: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53   /* same as TK_S
9790: 54 52 49 4e 47 2c 20 6f 75 74 32 20 2a 2f 0a 20  TRING, out2 */. 
97a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
97b0: 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20  .z!=0 );.  pOut 
97c0: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
97d0: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 70 2d  (p, pOp);.  pOp-
97e0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 74 72  >opcode = OP_Str
97f0: 69 6e 67 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d  ing;.  pOp->p1 =
9800: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
9810: 28 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 0a 23 69  (pOp->p4.z);..#i
9820: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9830: 54 5f 55 54 46 31 36 0a 20 20 69 66 28 20 65 6e  T_UTF16.  if( en
9840: 63 6f 64 69 6e 67 21 3d 53 51 4c 49 54 45 5f 55  coding!=SQLITE_U
9850: 54 46 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  TF8 ){.    rc = 
9860: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
9870: 74 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e  tStr(pOut, pOp->
9880: 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  p4.z, -1, SQLITE
9890: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
98a0: 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65 72  ATIC);.    asser
98b0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
98c0: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 54   || rc==SQLITE_T
98d0: 4f 4f 42 49 47 20 29 3b 0a 20 20 20 20 69 66 28  OOBIG );.    if(
98e0: 20 72 63 20 29 20 67 6f 74 6f 20 74 6f 6f 5f 62   rc ) goto too_b
98f0: 69 67 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ig;.    if( SQLI
9900: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 56 64  TE_OK!=sqlite3Vd
9910: 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
9920: 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29  (pOut, encoding)
9930: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
9940: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 74      assert( pOut
9950: 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 20  ->szMalloc>0 && 
9960: 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70  pOut->zMalloc==p
9970: 4f 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73  Out->z );.    as
9980: 73 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e  sert( VdbeMemDyn
9990: 61 6d 69 63 28 70 4f 75 74 29 3d 3d 30 20 29 3b  amic(pOut)==0 );
99a0: 0a 20 20 20 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c  .    pOut->szMal
99b0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75  loc = 0;.    pOu
99c0: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  t->flags |= MEM_
99d0: 53 74 61 74 69 63 3b 0a 20 20 20 20 69 66 28 20  Static;.    if( 
99e0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
99f0: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
9a00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9a10: 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  b, pOp->p4.z);. 
9a20: 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34     }.    pOp->p4
9a30: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
9a40: 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  C;.    pOp->p4.z
9a50: 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20   = pOut->z;.    
9a60: 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e  pOp->p1 = pOut->
9a70: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
9a80: 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e  if( pOp->p1>db->
9a90: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9aa0: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
9ab0: 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
9ac0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
9ad0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
9ae0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
9af0: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
9b00: 73 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f  se, OP_String */
9b10: 0a 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a  .}.  ./* Opcode:
9b20: 20 53 74 72 69 6e 67 20 50 31 20 50 32 20 50 33   String P1 P2 P3
9b30: 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
9b40: 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 20 28  is: r[P2]='P4' (
9b50: 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 54 68  len=P1).**.** Th
9b60: 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50  e string value P
9b70: 34 20 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28  4 of length P1 (
9b80: 62 79 74 65 73 29 20 69 73 20 73 74 6f 72 65 64  bytes) is stored
9b90: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
9ba0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 20 69 73 20  .**.** If P3 is 
9bb0: 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20 74 68 65  not zero and the
9bc0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
9bd0: 73 74 65 72 20 50 33 20 69 73 20 65 71 75 61 6c  ster P3 is equal
9be0: 20 74 6f 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20   to P5, then.** 
9bf0: 74 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20  the datatype of 
9c00: 74 68 65 20 72 65 67 69 73 74 65 72 20 50 32 20  the register P2 
9c10: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  is converted to 
9c20: 42 4c 4f 42 2e 20 20 54 68 65 20 63 6f 6e 74 65  BLOB.  The conte
9c30: 6e 74 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d  nt is.** the sam
9c40: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62 79  e sequence of by
9c50: 74 65 73 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  tes, it is merel
9c60: 79 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  y interpreted as
9c70: 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 61 64 0a   a BLOB instead.
9c80: 2a 2a 20 6f 66 20 61 20 73 74 72 69 6e 67 2c 20  ** of a string, 
9c90: 61 73 20 69 66 20 69 74 20 68 61 64 20 62 65 65  as if it had bee
9ca0: 6e 20 43 41 53 54 2e 20 20 49 6e 20 6f 74 68 65  n CAST.  In othe
9cb0: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 69  r words:.**.** i
9cc0: 66 28 20 50 33 21 3d 30 20 61 6e 64 20 72 65 67  f( P3!=0 and reg
9cd0: 5b 50 33 5d 3d 3d 50 35 20 29 20 72 65 67 5b 50  [P3]==P5 ) reg[P
9ce0: 32 5d 20 3a 3d 20 43 41 53 54 28 72 65 67 5b 50  2] := CAST(reg[P
9cf0: 32 5d 20 61 73 20 42 4c 4f 42 29 0a 2a 2f 0a 63  2] as BLOB).*/.c
9d00: 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b  ase OP_String: {
9d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
9d20: 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  2 */.  assert( p
9d30: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20  Op->p4.z!=0 );. 
9d40: 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
9d50: 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
9d60: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
9d70: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74  MEM_Str|MEM_Stat
9d80: 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70  ic|MEM_Term;.  p
9d90: 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34  Out->z = pOp->p4
9da0: 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20  .z;.  pOut->n = 
9db0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d  pOp->p1;.  pOut-
9dc0: 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  >enc = encoding;
9dd0: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
9de0: 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 23 69  OBSIZE(pOut);.#i
9df0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b  fndef SQLITE_LIK
9e00: 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42  E_DOESNT_MATCH_B
9e10: 4c 4f 42 53 0a 20 20 69 66 28 20 70 4f 70 2d 3e  LOBS.  if( pOp->
9e20: 70 33 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  p3>0 ){.    asse
9e30: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d  rt( pOp->p3<=(p-
9e40: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
9e50: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e  rsor) );.    pIn
9e60: 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
9e70: 33 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  3];.    assert( 
9e80: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
9e90: 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  M_Int );.    if(
9ea0: 20 70 49 6e 33 2d 3e 75 2e 69 3d 3d 70 4f 70 2d   pIn3->u.i==pOp-
9eb0: 3e 70 35 20 29 20 70 4f 75 74 2d 3e 66 6c 61 67  >p5 ) pOut->flag
9ec0: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  s = MEM_Blob|MEM
9ed0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d  _Static|MEM_Term
9ee0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
9ef0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
9f00: 64 65 3a 20 4e 75 6c 6c 20 50 31 20 50 32 20 50  de: Null P1 P2 P
9f10: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
9f20: 73 3a 20 72 5b 50 32 2e 2e 50 33 5d 3d 4e 55 4c  s: r[P2..P3]=NUL
9f30: 4c 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  L.**.** Write a 
9f40: 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74  NULL into regist
9f50: 65 72 73 20 50 32 2e 20 20 49 66 20 50 33 20 67  ers P2.  If P3 g
9f60: 72 65 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20  reater than P2, 
9f70: 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
9f80: 2a 2a 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67  ** NULL into reg
9f90: 69 73 74 65 72 20 50 33 20 61 6e 64 20 65 76 65  ister P3 and eve
9fa0: 72 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 62  ry register in b
9fb0: 65 74 77 65 65 6e 20 50 32 20 61 6e 64 20 50 33  etween P2 and P3
9fc0: 2e 20 20 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c  .  If P3.** is l
9fd0: 65 73 73 20 74 68 61 6e 20 50 32 20 28 74 79 70  ess than P2 (typ
9fe0: 69 63 61 6c 6c 79 20 50 33 20 69 73 20 7a 65 72  ically P3 is zer
9ff0: 6f 29 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67  o) then only reg
a000: 69 73 74 65 72 20 50 32 20 69 73 0a 2a 2a 20 73  ister P2 is.** s
a010: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
a020: 2a 20 49 66 20 74 68 65 20 50 31 20 76 61 6c 75  * If the P1 valu
a030: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
a040: 68 65 6e 20 61 6c 73 6f 20 73 65 74 20 74 68 65  hen also set the
a050: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c 61   MEM_Cleared fla
a060: 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55 4c  g so that.** NUL
a070: 4c 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e 6f  L values will no
a080: 74 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  t compare equal 
a090: 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 4e  even if SQLITE_N
a0a0: 55 4c 4c 45 51 20 69 73 20 73 65 74 20 6f 6e 0a  ULLEQ is set on.
a0b0: 2a 2a 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f 45  ** OP_Ne or OP_E
a0c0: 71 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75  q..*/.case OP_Nu
a0d0: 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ll: {           
a0e0: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74  /* out2 */.  int
a0f0: 20 63 6e 74 3b 0a 20 20 75 31 36 20 6e 75 6c 6c   cnt;.  u16 null
a100: 46 6c 61 67 3b 0a 20 20 70 4f 75 74 20 3d 20 6f  Flag;.  pOut = o
a110: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
a120: 20 70 4f 70 29 3b 0a 20 20 63 6e 74 20 3d 20 70   pOp);.  cnt = p
a130: 4f 70 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a  Op->p3-pOp->p2;.
a140: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
a150: 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
a160: 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
a170: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e   pOut->flags = n
a180: 75 6c 6c 46 6c 61 67 20 3d 20 70 4f 70 2d 3e 70  ullFlag = pOp->p
a190: 31 20 3f 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  1 ? (MEM_Null|ME
a1a0: 4d 5f 43 6c 65 61 72 65 64 29 20 3a 20 4d 45 4d  M_Cleared) : MEM
a1b0: 5f 4e 75 6c 6c 3b 0a 20 20 70 4f 75 74 2d 3e 6e  _Null;.  pOut->n
a1c0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
a1d0: 49 54 45 5f 44 45 42 55 47 0a 20 20 70 4f 75 74  ITE_DEBUG.  pOut
a1e0: 2d 3e 75 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e  ->uTemp = 0;.#en
a1f0: 64 69 66 0a 20 20 77 68 69 6c 65 28 20 63 6e 74  dif.  while( cnt
a200: 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2b 2b  >0 ){.    pOut++
a210: 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
a220: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
a230: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a240: 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
a250: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  ;.    pOut->flag
a260: 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20 20  s = nullFlag;.  
a270: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20    pOut->n = 0;. 
a280: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20     cnt--;.  }.  
a290: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
a2a0: 6f 64 65 3a 20 53 6f 66 74 4e 75 6c 6c 20 50 31  ode: SoftNull P1
a2b0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f   * * * *.** Syno
a2c0: 70 73 69 73 3a 20 72 5b 50 31 5d 3d 4e 55 4c 4c  psis: r[P1]=NULL
a2d0: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 72 65 67 69 73  .**.** Set regis
a2e0: 74 65 72 20 50 31 20 74 6f 20 68 61 76 65 20 74  ter P1 to have t
a2f0: 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c 20 61 73  he value NULL as
a300: 20 73 65 65 6e 20 62 79 20 74 68 65 20 4f 50 5f   seen by the OP_
a310: 4d 61 6b 65 52 65 63 6f 72 64 0a 2a 2a 20 69 6e  MakeRecord.** in
a320: 73 74 72 75 63 74 69 6f 6e 2c 20 62 75 74 20 64  struction, but d
a330: 6f 20 6e 6f 74 20 66 72 65 65 20 61 6e 79 20 73  o not free any s
a340: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d 65  tring or blob me
a350: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
a360: 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 67 69  with.** the regi
a370: 73 74 65 72 2c 20 73 6f 20 74 68 61 74 20 69 66  ster, so that if
a380: 20 74 68 65 20 76 61 6c 75 65 20 77 61 73 20 61   the value was a
a390: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
a3a0: 74 68 61 74 20 77 61 73 0a 2a 2a 20 70 72 65 76  that was.** prev
a3b0: 69 6f 75 73 6c 79 20 63 6f 70 69 65 64 20 75 73  iously copied us
a3c0: 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2c 20 74 68  ing OP_SCopy, th
a3d0: 65 20 63 6f 70 69 65 73 20 77 69 6c 6c 20 63 6f  e copies will co
a3e0: 6e 74 69 6e 75 65 20 74 6f 20 62 65 20 76 61 6c  ntinue to be val
a3f0: 69 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  id..*/.case OP_S
a400: 6f 66 74 4e 75 6c 6c 3a 20 7b 0a 20 20 61 73 73  oftNull: {.  ass
a410: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
a420: 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e  & pOp->p1<=(p->n
a430: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
a440: 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  or) );.  pOut = 
a450: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
a460: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
a470: 28 70 4f 75 74 2d 3e 66 6c 61 67 73 26 7e 28 4d  (pOut->flags&~(M
a480: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 7c 4d 45 4d  EM_Undefined|MEM
a490: 5f 41 66 66 4d 61 73 6b 29 29 7c 4d 45 4d 5f 4e  _AffMask))|MEM_N
a4a0: 75 6c 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ull;.  break;.}.
a4b0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 6c 6f 62  ./* Opcode: Blob
a4c0: 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a   P1 P2 * P4 *.**
a4d0: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
a4e0: 3d 50 34 20 28 6c 65 6e 3d 50 31 29 0a 2a 2a 0a  =P4 (len=P1).**.
a4f0: 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20  ** P4 points to 
a500: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 50  a blob of data P
a510: 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 53  1 bytes long.  S
a520: 74 6f 72 65 20 74 68 69 73 0a 2a 2a 20 62 6c 6f  tore this.** blo
a530: 62 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  b in register P2
a540: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 6c 6f  ..*/.case OP_Blo
a550: 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  b: {            
a560: 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
a570: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
a580: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c   <= SQLITE_MAX_L
a590: 45 4e 47 54 48 20 29 3b 0a 20 20 70 4f 75 74 20  ENGTH );.  pOut 
a5a0: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
a5b0: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 73 71 6c 69  (p, pOp);.  sqli
a5c0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
a5d0: 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a  (pOut, pOp->p4.z
a5e0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29  , pOp->p1, 0, 0)
a5f0: 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
a600: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41  encoding;.  UPDA
a610: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
a620: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
a630: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61  }../* Opcode: Va
a640: 72 69 61 62 6c 65 20 50 31 20 50 32 20 2a 20 50  riable P1 P2 * P
a650: 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
a660: 20 72 5b 50 32 5d 3d 70 61 72 61 6d 65 74 65 72   r[P2]=parameter
a670: 28 50 31 2c 50 34 29 0a 2a 2a 0a 2a 2a 20 54 72  (P1,P4).**.** Tr
a680: 61 6e 73 66 65 72 20 74 68 65 20 76 61 6c 75 65  ansfer the value
a690: 73 20 6f 66 20 62 6f 75 6e 64 20 70 61 72 61 6d  s of bound param
a6a0: 65 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67  eter P1 into reg
a6b0: 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 49  ister P2.**.** I
a6c0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
a6d0: 69 73 20 6e 61 6d 65 64 2c 20 74 68 65 6e 20 69  is named, then i
a6e0: 74 73 20 6e 61 6d 65 20 61 70 70 65 61 72 73 20  ts name appears 
a6f0: 69 6e 20 50 34 2e 0a 2a 2a 20 54 68 65 20 50 34  in P4..** The P4
a700: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 62   value is used b
a710: 79 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  y sqlite3_bind_p
a720: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 2e  arameter_name().
a730: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 72 69  .*/.case OP_Vari
a740: 61 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20  able: {         
a750: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
a760: 4d 65 6d 20 2a 70 56 61 72 3b 20 20 20 20 20 20  Mem *pVar;      
a770: 20 2f 2a 20 56 61 6c 75 65 20 62 65 69 6e 67 20   /* Value being 
a780: 74 72 61 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a  transferred */..
a790: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
a7a0: 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d  1>0 && pOp->p1<=
a7b0: 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20 61 73 73  p->nVar );.  ass
a7c0: 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d  ert( pOp->p4.z==
a7d0: 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d  0 || pOp->p4.z==
a7e0: 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
a7f0: 6f 4e 61 6d 65 28 70 2d 3e 70 56 4c 69 73 74 2c  oName(p->pVList,
a800: 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 70 56  pOp->p1) );.  pV
a810: 61 72 20 3d 20 26 70 2d 3e 61 56 61 72 5b 70 4f  ar = &p->aVar[pO
a820: 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 69 66  p->p1 - 1];.  if
a830: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
a840: 54 6f 6f 42 69 67 28 70 56 61 72 29 20 29 7b 0a  TooBig(pVar) ){.
a850: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
a860: 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26  ;.  }.  pOut = &
a870: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
a880: 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79 6e 61   if( VdbeMemDyna
a890: 6d 69 63 28 70 4f 75 74 29 20 29 20 73 71 6c 69  mic(pOut) ) sqli
a8a0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
a8b0: 6c 28 70 4f 75 74 29 3b 0a 20 20 6d 65 6d 63 70  l(pOut);.  memcp
a8c0: 79 28 70 4f 75 74 2c 20 70 56 61 72 2c 20 4d 45  y(pOut, pVar, ME
a8d0: 4d 43 45 4c 4c 53 49 5a 45 29 3b 0a 20 20 70 4f  MCELLSIZE);.  pO
a8e0: 75 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d  ut->flags &= ~(M
a8f0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Dyn|MEM_Ephem
a900: 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  );.  pOut->flags
a910: 20 7c 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d   |= MEM_Static|M
a920: 45 4d 5f 46 72 6f 6d 42 69 6e 64 3b 0a 20 20 55  EM_FromBind;.  U
a930: 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
a940: 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
a950: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
a960: 20 4d 6f 76 65 20 50 31 20 50 32 20 50 33 20 2a   Move P1 P2 P3 *
a970: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
a980: 72 5b 50 32 40 50 33 5d 3d 72 5b 50 31 40 50 33  r[P2@P3]=r[P1@P3
a990: 5d 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ].**.** Move the
a9a0: 20 50 33 20 76 61 6c 75 65 73 20 69 6e 20 72 65   P3 values in re
a9b0: 67 69 73 74 65 72 20 50 31 2e 2e 50 31 2b 50 33  gister P1..P1+P3
a9c0: 2d 31 20 6f 76 65 72 20 69 6e 74 6f 0a 2a 2a 20  -1 over into.** 
a9d0: 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e 50 32  registers P2..P2
a9e0: 2b 50 33 2d 31 2e 20 20 52 65 67 69 73 74 65 72  +P3-1.  Register
a9f0: 73 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61 72  s P1..P1+P3-1 ar
aa00: 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c 64 69 6e  e.** left holdin
aa10: 67 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73  g a NULL.  It is
aa20: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 72 65   an error for re
aa30: 67 69 73 74 65 72 20 72 61 6e 67 65 73 0a 2a 2a  gister ranges.**
aa40: 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61 6e 64   P1..P1+P3-1 and
aa50: 20 50 32 2e 2e 50 32 2b 50 33 2d 31 20 74 6f 20   P2..P2+P3-1 to 
aa60: 6f 76 65 72 6c 61 70 2e 20 20 49 74 20 69 73 20  overlap.  It is 
aa70: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 66 6f 72 20  an error.** for 
aa80: 50 33 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  P3 to be less th
aa90: 61 6e 20 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  an 1..*/.case OP
aaa0: 5f 4d 6f 76 65 3a 20 7b 0a 20 20 69 6e 74 20 6e  _Move: {.  int n
aab0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
aac0: 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
aad0: 72 73 20 6c 65 66 74 20 74 6f 20 63 6f 70 79 20  rs left to copy 
aae0: 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20  */.  int p1;    
aaf0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
ab00: 72 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20 2a  r to copy from *
ab10: 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20  /.  int p2;     
ab20: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
ab30: 20 74 6f 20 63 6f 70 79 20 74 6f 20 2a 2f 0a 0a   to copy to */..
ab40: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    n = pOp->p3;. 
ab50: 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20   p1 = pOp->p1;. 
ab60: 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20   p2 = pOp->p2;. 
ab70: 20 61 73 73 65 72 74 28 20 6e 3e 30 20 26 26 20   assert( n>0 && 
ab80: 70 31 3e 30 20 26 26 20 70 32 3e 30 20 29 3b 0a  p1>0 && p2>0 );.
ab90: 20 20 61 73 73 65 72 74 28 20 70 31 2b 6e 3c 3d    assert( p1+n<=
aba0: 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31 20 29  p2 || p2+n<=p1 )
abb0: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
abc0: 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  m[p1];.  pOut = 
abd0: 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 64 6f 7b  &aMem[p2];.  do{
abe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75  .    assert( pOu
abf0: 74 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65  t<=&aMem[(p->nMe
ac00: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
ac10: 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  )] );.    assert
ac20: 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b 28 70  ( pIn1<=&aMem[(p
ac30: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
ac40: 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61  ursor)] );.    a
ac50: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
ac60: 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 6d  d(pIn1) );.    m
ac70: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
ac80: 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 73 71  p, pOut);.    sq
ac90: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65  lite3VdbeMemMove
aca0: 28 70 4f 75 74 2c 20 70 49 6e 31 29 3b 0a 23 69  (pOut, pIn1);.#i
acb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
acc0: 47 0a 20 20 20 20 69 66 28 20 70 4f 75 74 2d 3e  G.    if( pOut->
acd0: 70 53 63 6f 70 79 46 72 6f 6d 3e 3d 26 61 4d 65  pScopyFrom>=&aMe
ace0: 6d 5b 70 31 5d 20 26 26 20 70 4f 75 74 2d 3e 70  m[p1] && pOut->p
acf0: 53 63 6f 70 79 46 72 6f 6d 3c 70 4f 75 74 20 29  ScopyFrom<pOut )
ad00: 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 53  {.      pOut->pS
ad10: 63 6f 70 79 46 72 6f 6d 20 2b 3d 20 70 4f 70 2d  copyFrom += pOp-
ad20: 3e 70 32 20 2d 20 70 31 3b 0a 20 20 20 20 7d 0a  >p2 - p1;.    }.
ad30: 23 65 6e 64 69 66 0a 20 20 20 20 44 65 65 70 68  #endif.    Deeph
ad40: 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29 3b  emeralize(pOut);
ad50: 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52  .    REGISTER_TR
ad60: 41 43 45 28 70 32 2b 2b 2c 20 70 4f 75 74 29 3b  ACE(p2++, pOut);
ad70: 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 20  .    pIn1++;.   
ad80: 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d 77 68 69 6c   pOut++;.  }whil
ad90: 65 28 20 2d 2d 6e 20 29 3b 0a 20 20 62 72 65 61  e( --n );.  brea
ada0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
adb0: 20 43 6f 70 79 20 50 31 20 50 32 20 50 33 20 2a   Copy P1 P2 P3 *
adc0: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
add0: 72 5b 50 32 40 50 33 2b 31 5d 3d 72 5b 50 31 40  r[P2@P3+1]=r[P1@
ade0: 50 33 2b 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65  P3+1].**.** Make
adf0: 20 61 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73   a copy of regis
ae00: 74 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 20 69  ters P1..P1+P3 i
ae10: 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 32  nto registers P2
ae20: 2e 2e 50 32 2b 50 33 2e 0a 2a 2a 0a 2a 2a 20 54  ..P2+P3..**.** T
ae30: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
ae40: 6d 61 6b 65 73 20 61 20 64 65 65 70 20 63 6f 70  makes a deep cop
ae50: 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20  y of the value. 
ae60: 20 41 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20   A duplicate.** 
ae70: 69 73 20 6d 61 64 65 20 6f 66 20 61 6e 79 20 73  is made of any s
ae80: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 63 6f  tring or blob co
ae90: 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 61 6c 73  nstant.  See als
aea0: 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 63  o OP_SCopy..*/.c
aeb0: 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20 7b 0a 20  ase OP_Copy: {. 
aec0: 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70   int n;..  n = p
aed0: 4f 70 2d 3e 70 33 3b 0a 20 20 70 49 6e 31 20 3d  Op->p3;.  pIn1 =
aee0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
aef0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
af00: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65  pOp->p2];.  asse
af10: 72 74 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29  rt( pOut!=pIn1 )
af20: 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
af30: 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
af40: 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20  ange(p, pOut);. 
af50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
af60: 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75  mShallowCopy(pOu
af70: 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68  t, pIn1, MEM_Eph
af80: 65 6d 29 3b 0a 20 20 20 20 44 65 65 70 68 65 6d  em);.    Deephem
af90: 65 72 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 23  eralize(pOut);.#
afa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
afb0: 55 47 0a 20 20 20 20 70 4f 75 74 2d 3e 70 53 63  UG.    pOut->pSc
afc0: 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e  opyFrom = 0;.#en
afd0: 64 69 66 0a 20 20 20 20 52 45 47 49 53 54 45 52  dif.    REGISTER
afe0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 70  _TRACE(pOp->p2+p
aff0: 4f 70 2d 3e 70 33 2d 6e 2c 20 70 4f 75 74 29 3b  Op->p3-n, pOut);
b000: 0a 20 20 20 20 69 66 28 20 28 6e 2d 2d 29 3d 3d  .    if( (n--)==
b010: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
b020: 4f 75 74 2b 2b 3b 0a 20 20 20 20 70 49 6e 31 2b  Out++;.    pIn1+
b030: 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  +;.  }.  break;.
b040: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 43  }../* Opcode: SC
b050: 6f 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  opy P1 P2 * * *.
b060: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
b070: 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 4d  2]=r[P1].**.** M
b080: 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  ake a shallow co
b090: 70 79 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  py of register P
b0a0: 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  1 into register 
b0b0: 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
b0c0: 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73  nstruction makes
b0d0: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
b0e0: 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20 20 49  of the value.  I
b0f0: 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
b100: 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c  s a string or bl
b110: 6f 62 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 70  ob, then the cop
b120: 79 20 69 73 20 6f 6e 6c 79 20 61 20 70 6f 69 6e  y is only a poin
b130: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6f 72  ter to the.** or
b140: 69 67 69 6e 61 6c 20 61 6e 64 20 68 65 6e 63 65  iginal and hence
b150: 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   if the original
b160: 20 63 68 61 6e 67 65 73 20 73 6f 20 77 69 6c 6c   changes so will
b170: 20 74 68 65 20 63 6f 70 79 2e 0a 2a 2a 20 57 6f   the copy..** Wo
b180: 72 73 65 2c 20 69 66 20 74 68 65 20 6f 72 69 67  rse, if the orig
b190: 69 6e 61 6c 20 69 73 20 64 65 61 6c 6c 6f 63 61  inal is dealloca
b1a0: 74 65 64 2c 20 74 68 65 20 63 6f 70 79 20 62 65  ted, the copy be
b1b0: 63 6f 6d 65 73 20 69 6e 76 61 6c 69 64 2e 0a 2a  comes invalid..*
b1c0: 2a 20 54 68 75 73 20 74 68 65 20 70 72 6f 67 72  * Thus the progr
b1d0: 61 6d 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  am must guarante
b1e0: 65 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  e that the origi
b1f0: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 68 61  nal will not cha
b200: 6e 67 65 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  nge.** during th
b210: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68  e lifetime of th
b220: 65 20 63 6f 70 79 2e 20 20 55 73 65 20 4f 50 5f  e copy.  Use OP_
b230: 43 6f 70 79 20 74 6f 20 6d 61 6b 65 20 61 20 63  Copy to make a c
b240: 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f 70 79 2e  omplete.** copy.
b250: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 43 6f 70  .*/.case OP_SCop
b260: 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  y: {            
b270: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e  /* out2 */.  pIn
b280: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
b290: 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  1];.  pOut = &aM
b2a0: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  em[pOp->p2];.  a
b2b0: 73 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49 6e  ssert( pOut!=pIn
b2c0: 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  1 );.  sqlite3Vd
b2d0: 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
b2e0: 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d  (pOut, pIn1, MEM
b2f0: 5f 45 70 68 65 6d 29 3b 0a 23 69 66 64 65 66 20  _Ephem);.#ifdef 
b300: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
b310: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20  Out->pScopyFrom 
b320: 3d 20 70 49 6e 31 3b 0a 20 20 70 4f 75 74 2d 3e  = pIn1;.  pOut->
b330: 6d 53 63 6f 70 79 46 6c 61 67 73 20 3d 20 70 49  mScopyFlags = pI
b340: 6e 31 2d 3e 66 6c 61 67 73 3b 0a 23 65 6e 64 69  n1->flags;.#endi
b350: 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  f.  break;.}../*
b360: 20 4f 70 63 6f 64 65 3a 20 49 6e 74 43 6f 70 79   Opcode: IntCopy
b370: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
b380: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
b390: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 72 61 6e  r[P1].**.** Tran
b3a0: 73 66 65 72 20 74 68 65 20 69 6e 74 65 67 65 72  sfer the integer
b3b0: 20 76 61 6c 75 65 20 68 65 6c 64 20 69 6e 20 72   value held in r
b3c0: 65 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20  egister P1 into 
b3d0: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
b3e0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
b3f0: 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
b400: 6f 66 20 53 43 6f 70 79 20 74 68 61 74 20 77 6f  of SCopy that wo
b410: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 69 6e 74  rks only for int
b420: 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65 73 2e 0a  eger.** values..
b430: 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 43 6f  */.case OP_IntCo
b440: 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  py: {           
b450: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49   /* out2 */.  pI
b460: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
b470: 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  p1];.  assert( (
b480: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
b490: 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 70  M_Int)!=0 );.  p
b4a0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
b4b0: 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p2];.  sqlite3V
b4c0: 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70  dbeMemSetInt64(p
b4d0: 4f 75 74 2c 20 70 49 6e 31 2d 3e 75 2e 69 29 3b  Out, pIn1->u.i);
b4e0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
b4f0: 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c 74 52 6f  Opcode: ResultRo
b500: 77 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  w P1 P2 * * *.**
b510: 20 53 79 6e 6f 70 73 69 73 3a 20 6f 75 74 70 75   Synopsis: outpu
b520: 74 3d 72 5b 50 31 40 50 32 5d 0a 2a 2a 0a 2a 2a  t=r[P1@P2].**.**
b530: 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 50   The registers P
b540: 31 20 74 68 72 6f 75 67 68 20 50 31 2b 50 32 2d  1 through P1+P2-
b550: 31 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e 67  1 contain a sing
b560: 6c 65 20 72 6f 77 20 6f 66 0a 2a 2a 20 72 65 73  le row of.** res
b570: 75 6c 74 73 2e 20 54 68 69 73 20 6f 70 63 6f 64  ults. This opcod
b580: 65 20 63 61 75 73 65 73 20 74 68 65 20 73 71 6c  e causes the sql
b590: 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
b5a0: 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a   to terminate.**
b5b0: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
b5c0: 52 4f 57 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ROW return code 
b5d0: 61 6e 64 20 69 74 20 73 65 74 73 20 75 70 20 74  and it sets up t
b5e0: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 0a  he sqlite3_stmt.
b5f0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
b600: 70 72 6f 76 69 64 65 20 61 63 63 65 73 73 20 74  provide access t
b610: 6f 20 74 68 65 20 72 28 50 31 29 2e 2e 72 28 50  o the r(P1)..r(P
b620: 31 2b 50 32 2d 31 29 20 76 61 6c 75 65 73 20 61  1+P2-1) values a
b630: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
b640: 72 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  row..*/.case OP_
b650: 52 65 73 75 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d  ResultRow: {.  M
b660: 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20  em *pMem;.  int 
b670: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
b680: 6e 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d  nResColumn==pOp-
b690: 3e 70 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >p2 );.  assert(
b6a0: 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20   pOp->p1>0 );.  
b6b0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 2b  assert( pOp->p1+
b6c0: 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p2<=(p->nMe
b6d0: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
b6e0: 29 2b 31 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  )+1 );..  /* If 
b6f0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  this statement h
b700: 61 73 20 76 69 6f 6c 61 74 65 64 20 69 6d 6d 65  as violated imme
b710: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
b720: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 64  y constraints, d
b730: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 74 75 72  o.  ** not retur
b740: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b750: 72 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e 20 41  rows modified. A
b760: 6e 64 20 64 6f 20 6e 6f 74 20 52 45 4c 45 41 53  nd do not RELEAS
b770: 45 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  E the statement.
b780: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
b790: 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65  . It needs to be
b7a0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 2a   rolled back.  *
b7b0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
b7c0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
b7d0: 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30  VdbeCheckFk(p, 0
b7e0: 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  )) ){.    assert
b7f0: 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ( db->flags&SQLI
b800: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a  TE_CountRows );.
b810: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75      assert( p->u
b820: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
b830: 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
b840: 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
b850: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
b860: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
b870: 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
b880: 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 6d 61  sqlite3.flags ma
b890: 73 6b 2c 20 74 68 65 6e 20 0a 20 20 2a 2a 20 44  sk, then .  ** D
b8a0: 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ML statements in
b8b0: 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65  voke this opcode
b8c0: 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6e   to return the n
b8d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20  umber of rows . 
b8e0: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20   ** modified to 
b8f0: 74 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69  the user. This i
b900: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
b910: 68 61 74 20 61 20 56 4d 20 74 68 61 74 0a 20 20  hat a VM that.  
b920: 2a 2a 20 6f 70 65 6e 73 20 61 20 73 74 61 74 65  ** opens a state
b930: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
b940: 20 6d 61 79 20 69 6e 76 6f 6b 65 20 74 68 69 73   may invoke this
b950: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20   opcode..  **.  
b960: 2a 2a 20 49 6e 20 63 61 73 65 20 74 68 69 73 20  ** In case this 
b970: 69 73 20 73 75 63 68 20 61 20 73 74 61 74 65 6d  is such a statem
b980: 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 79 20 73  ent, close any s
b990: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
b9a0: 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 65 64  tion.  ** opened
b9b0: 20 62 79 20 74 68 69 73 20 56 4d 20 62 65 66 6f   by this VM befo
b9c0: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 63 6f 6e  re returning con
b9d0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 73 65 72  trol to the user
b9e0: 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a  . This is to.  *
b9f0: 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 73 74  * ensure that st
ba00: 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
ba10: 69 6f 6e 73 20 61 72 65 20 61 6c 77 61 79 73 20  ions are always 
ba20: 6e 65 73 74 65 64 2c 20 6e 6f 74 20 6f 76 65 72  nested, not over
ba30: 6c 61 70 70 69 6e 67 2e 0a 20 20 2a 2a 20 49 66  lapping..  ** If
ba40: 20 74 68 65 20 6f 70 65 6e 20 73 74 61 74 65 6d   the open statem
ba50: 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent-transaction 
ba60: 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 20 68 65  is not closed he
ba70: 72 65 2c 20 74 68 65 6e 20 74 68 65 20 75 73 65  re, then the use
ba80: 72 0a 20 20 2a 2a 20 6d 61 79 20 73 74 65 70 20  r.  ** may step 
ba90: 61 6e 6f 74 68 65 72 20 56 4d 20 74 68 61 74 20  another VM that 
baa0: 6f 70 65 6e 73 20 69 74 73 20 6f 77 6e 20 73 74  opens its own st
bab0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
bac0: 69 6f 6e 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d  ion. This.  ** m
bad0: 61 79 20 6c 65 61 64 20 74 6f 20 6f 76 65 72 6c  ay lead to overl
bae0: 61 70 70 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  apping statement
baf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20   transactions.. 
bb00: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61   **.  ** The sta
bb10: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
bb20: 6f 6e 20 69 73 20 6e 65 76 65 72 20 61 20 74 6f  on is never a to
bb30: 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74  p-level transact
bb40: 69 6f 6e 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ion.  Hence.  **
bb50: 20 74 68 65 20 52 45 4c 45 41 53 45 20 63 61 6c   the RELEASE cal
bb60: 6c 20 62 65 6c 6f 77 20 63 61 6e 20 6e 65 76 65  l below can neve
bb70: 72 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 61  r fail..  */.  a
bb80: 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
bb90: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 66  ment==0 || db->f
bba0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e  lags&SQLITE_Coun
bbb0: 74 52 6f 77 73 20 29 3b 0a 20 20 72 63 20 3d 20  tRows );.  rc = 
bbc0: 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
bbd0: 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 53 41 56  Statement(p, SAV
bbe0: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
bbf0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
bc00: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f  QLITE_OK );..  /
bc10: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  * Invalidate all
bc20: 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f   ephemeral curso
bc30: 72 20 72 6f 77 20 63 61 63 68 65 73 20 2a 2f 0a  r row caches */.
bc40: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
bc50: 28 70 2d 3e 63 61 63 68 65 43 74 72 20 2b 20 32  (p->cacheCtr + 2
bc60: 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  )|1;..  /* Make 
bc70: 73 75 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  sure the results
bc80: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
bc90: 72 6f 77 20 61 72 65 20 5c 30 30 30 20 74 65 72  row are \000 ter
bca0: 6d 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61 6e 64  minated.  ** and
bcb0: 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
bcc0: 64 20 74 79 70 65 2e 20 20 54 68 65 20 72 65 73  d type.  The res
bcd0: 75 6c 74 73 20 61 72 65 20 64 65 2d 65 70 68 65  ults are de-ephe
bce0: 6d 65 72 61 6c 69 7a 65 64 20 61 73 0a 20 20 2a  meralized as.  *
bcf0: 2a 20 61 20 73 69 64 65 20 65 66 66 65 63 74 2e  * a side effect.
bd00: 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d 20 70  .  */.  pMem = p
bd10: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
bd20: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
bd30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 2d   for(i=0; i<pOp-
bd40: 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  >p2; i++){.    a
bd50: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
bd60: 64 28 26 70 4d 65 6d 5b 69 5d 29 20 29 3b 0a 20  d(&pMem[i]) );. 
bd70: 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a     Deephemeraliz
bd80: 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20  e(&pMem[i]);.   
bd90: 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 5b 69   assert( (pMem[i
bda0: 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 45 70  ].flags & MEM_Ep
bdb0: 68 65 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  hem)==0.        
bdc0: 20 20 20 20 7c 7c 20 28 70 4d 65 6d 5b 69 5d 2e      || (pMem[i].
bdd0: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
bde0: 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29  |MEM_Blob))==0 )
bdf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
be00: 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65  eMemNulTerminate
be10: 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20  (&pMem[i]);.    
be20: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
be30: 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65 6d 5b  Op->p1+i, &pMem[
be40: 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  i]);.  }.  if( d
be50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
be60: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 0a  ) goto no_mem;..
be70: 20 20 69 66 28 20 64 62 2d 3e 6d 54 72 61 63 65    if( db->mTrace
be80: 20 26 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f   & SQLITE_TRACE_
be90: 52 4f 57 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  ROW ){.    db->x
bea0: 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41  Trace(SQLITE_TRA
beb0: 43 45 5f 52 4f 57 2c 20 64 62 2d 3e 70 54 72 61  CE_ROW, db->pTra
bec0: 63 65 41 72 67 2c 20 70 2c 20 30 29 3b 0a 20 20  ceArg, p, 0);.  
bed0: 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 53  }..  /* Return S
bee0: 51 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a 20  QLITE_ROW.  */. 
bef0: 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70   p->pc = (int)(p
bf00: 4f 70 20 2d 20 61 4f 70 29 20 2b 20 31 3b 0a 20  Op - aOp) + 1;. 
bf10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
bf20: 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65  ;.  goto vdbe_re
bf30: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  turn;.}../* Opco
bf40: 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50 32  de: Concat P1 P2
bf50: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
bf60: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d  sis: r[P3]=r[P2]
bf70: 2b 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 41 64 64  +r[P1].**.** Add
bf80: 20 74 68 65 20 74 65 78 74 20 69 6e 20 72 65 67   the text in reg
bf90: 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20 74 68  ister P1 onto th
bfa0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 78  e end of the tex
bfb0: 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72  t in.** register
bfc0: 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68   P2 and store th
bfd0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
bfe0: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
bff0: 69 74 68 65 72 20 74 68 65 20 50 31 20 6f 72 20  ither the P1 or 
c000: 50 32 20 74 65 78 74 20 61 72 65 20 4e 55 4c 4c  P2 text are NULL
c010: 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55 4c 4c   then store NULL
c020: 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 20 20   in P3..**.**   
c030: 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a 2a 2a  P3 = P2 || P1.**
c040: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
c050: 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50 33 20  l for P1 and P3 
c060: 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 72  to be the same r
c070: 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74 69 6d  egister. Sometim
c080: 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69 73 20  es,.** if P3 is 
c090: 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
c0a0: 72 20 61 73 20 50 32 2c 20 74 68 65 20 69 6d 70  r as P2, the imp
c0b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61  lementation is a
c0c0: 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 20  ble.** to avoid 
c0d0: 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f 0a 63  a memcpy()..*/.c
c0e0: 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a 20 7b  ase OP_Concat: {
c0f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
c100: 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41 54 2c  me as TK_CONCAT,
c110: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
c120: 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b 20  */.  i64 nByte; 
c130: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
c140: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75  l size of the ou
c150: 74 70 75 74 20 73 74 72 69 6e 67 20 6f 72 20 62  tput string or b
c160: 6c 6f 62 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61  lob */.  u16 fla
c170: 67 73 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gs1;         /* 
c180: 49 6e 69 74 69 61 6c 20 66 6c 61 67 73 20 66 6f  Initial flags fo
c190: 72 20 50 31 20 2a 2f 0a 20 20 75 31 36 20 66 6c  r P1 */.  u16 fl
c1a0: 61 67 73 32 3b 20 20 20 20 20 20 20 20 20 2f 2a  ags2;         /*
c1b0: 20 49 6e 69 74 69 61 6c 20 66 6c 61 67 73 20 66   Initial flags f
c1c0: 6f 72 20 50 32 20 2a 2f 0a 0a 20 20 70 49 6e 31  or P2 */..  pIn1
c1d0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
c1e0: 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65  ];.  pIn2 = &aMe
c1f0: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f  m[pOp->p2];.  pO
c200: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
c210: 70 33 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p3];.  testcase(
c220: 20 70 49 6e 31 3d 3d 70 49 6e 32 20 29 3b 0a 20   pIn1==pIn2 );. 
c230: 20 74 65 73 74 63 61 73 65 28 20 70 4f 75 74 3d   testcase( pOut=
c240: 3d 70 49 6e 32 20 29 3b 0a 20 20 61 73 73 65 72  =pIn2 );.  asser
c250: 74 28 20 70 49 6e 31 21 3d 70 4f 75 74 20 29 3b  t( pIn1!=pOut );
c260: 0a 20 20 66 6c 61 67 73 31 20 3d 20 70 49 6e 31  .  flags1 = pIn1
c270: 2d 3e 66 6c 61 67 73 3b 0a 20 20 74 65 73 74 63  ->flags;.  testc
c280: 61 73 65 28 20 66 6c 61 67 73 31 20 26 20 4d 45  ase( flags1 & ME
c290: 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 74 65 73 74  M_Null );.  test
c2a0: 63 61 73 65 28 20 70 49 6e 32 2d 3e 66 6c 61 67  case( pIn2->flag
c2b0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
c2c0: 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20    if( (flags1 | 
c2d0: 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d  pIn2->flags) & M
c2e0: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
c2f0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
c300: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20  Null(pOut);.    
c310: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
c320: 20 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f   (flags1 & (MEM_
c330: 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  Str|MEM_Blob))==
c340: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
c350: 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e  ite3VdbeMemStrin
c360: 67 69 66 79 28 70 49 6e 31 2c 65 6e 63 6f 64 69  gify(pIn1,encodi
c370: 6e 67 2c 30 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  ng,0) ) goto no_
c380: 6d 65 6d 3b 0a 20 20 20 20 66 6c 61 67 73 31 20  mem;.    flags1 
c390: 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  = pIn1->flags & 
c3a0: 7e 4d 45 4d 5f 53 74 72 3b 0a 20 20 7d 65 6c 73  ~MEM_Str;.  }els
c3b0: 65 20 69 66 28 20 28 66 6c 61 67 73 31 20 26 20  e if( (flags1 & 
c3c0: 4d 45 4d 5f 5a 65 72 6f 29 21 3d 30 20 29 7b 0a  MEM_Zero)!=0 ){.
c3d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
c3e0: 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62  dbeMemExpandBlob
c3f0: 28 70 49 6e 31 29 20 29 20 67 6f 74 6f 20 6e 6f  (pIn1) ) goto no
c400: 5f 6d 65 6d 3b 0a 20 20 20 20 66 6c 61 67 73 31  _mem;.    flags1
c410: 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26   = pIn1->flags &
c420: 20 7e 4d 45 4d 5f 53 74 72 3b 0a 20 20 7d 0a 20   ~MEM_Str;.  }. 
c430: 20 66 6c 61 67 73 32 20 3d 20 70 49 6e 32 2d 3e   flags2 = pIn2->
c440: 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66 6c  flags;.  if( (fl
c450: 61 67 73 32 20 26 20 28 4d 45 4d 5f 53 74 72 7c  ags2 & (MEM_Str|
c460: 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29 7b  MEM_Blob))==0 ){
c470: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c480: 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79  VdbeMemStringify
c490: 28 70 49 6e 32 2c 65 6e 63 6f 64 69 6e 67 2c 30  (pIn2,encoding,0
c4a0: 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
c4b0: 0a 20 20 20 20 66 6c 61 67 73 32 20 3d 20 70 49  .    flags2 = pI
c4c0: 6e 32 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45 4d  n2->flags & ~MEM
c4d0: 5f 53 74 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _Str;.  }else if
c4e0: 28 20 28 66 6c 61 67 73 32 20 26 20 4d 45 4d 5f  ( (flags2 & MEM_
c4f0: 5a 65 72 6f 29 21 3d 30 20 29 7b 0a 20 20 20 20  Zero)!=0 ){.    
c500: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
c510: 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  emExpandBlob(pIn
c520: 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  2) ) goto no_mem
c530: 3b 0a 20 20 20 20 66 6c 61 67 73 32 20 3d 20 70  ;.    flags2 = p
c540: 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45  In2->flags & ~ME
c550: 4d 5f 53 74 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  M_Str;.  }.  nBy
c560: 74 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70  te = pIn1->n + p
c570: 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42  In2->n;.  if( nB
c580: 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  yte>db->aLimit[S
c590: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
c5a0: 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  TH] ){.    goto 
c5b0: 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 69  too_big;.  }.  i
c5c0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
c5d0: 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74  mGrow(pOut, (int
c5e0: 29 6e 42 79 74 65 2b 33 2c 20 70 4f 75 74 3d 3d  )nByte+3, pOut==
c5f0: 70 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74  pIn2) ){.    got
c600: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
c610: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
c620: 4f 75 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20  Out, MEM_Str);. 
c630: 20 69 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20   if( pOut!=pIn2 
c640: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ){.    memcpy(pO
c650: 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20  ut->z, pIn2->z, 
c660: 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20 20 20 61 73  pIn2->n);.    as
c670: 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61  sert( (pIn2->fla
c680: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d  gs & MEM_Dyn) ==
c690: 20 28 66 6c 61 67 73 32 20 26 20 4d 45 4d 5f 44   (flags2 & MEM_D
c6a0: 79 6e 29 20 29 3b 0a 20 20 20 20 70 49 6e 32 2d  yn) );.    pIn2-
c6b0: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 32 3b  >flags = flags2;
c6c0: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
c6d0: 4f 75 74 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c  Out->z[pIn2->n],
c6e0: 20 70 49 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e   pIn1->z, pIn1->
c6f0: 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  n);.  assert( (p
c700: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
c710: 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73 31  _Dyn) == (flags1
c720: 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20   & MEM_Dyn) );. 
c730: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 66   pIn1->flags = f
c740: 6c 61 67 73 31 3b 0a 20 20 70 4f 75 74 2d 3e 7a  lags1;.  pOut->z
c750: 5b 6e 42 79 74 65 5d 3d 30 3b 0a 20 20 70 4f 75  [nByte]=0;.  pOu
c760: 74 2d 3e 7a 5b 6e 42 79 74 65 2b 31 5d 20 3d 20  t->z[nByte+1] = 
c770: 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79  0;.  pOut->z[nBy
c780: 74 65 2b 32 5d 20 3d 20 30 3b 0a 20 20 70 4f 75  te+2] = 0;.  pOu
c790: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  t->flags |= MEM_
c7a0: 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20  Term;.  pOut->n 
c7b0: 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20  = (int)nByte;.  
c7c0: 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f  pOut->enc = enco
c7d0: 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d  ding;.  UPDATE_M
c7e0: 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
c7f0: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
c800: 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 20 50 31  * Opcode: Add P1
c810: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
c820: 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b  nopsis: r[P3]=r[
c830: 50 31 5d 2b 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20  P1]+r[P2].**.** 
c840: 41 64 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e  Add the value in
c850: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
c860: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
c870: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
c880: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
c890: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
c8a0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
c8b0: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
c8c0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
c8d0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .*/./* Opcode: M
c8e0: 75 6c 74 69 70 6c 79 20 50 31 20 50 32 20 50 33  ultiply P1 P2 P3
c8f0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
c900: 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2a 72 5b  : r[P3]=r[P1]*r[
c910: 50 32 5d 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c  P2].**.**.** Mul
c920: 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75 65 20  tiply the value 
c930: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62  in register P1 b
c940: 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  y the value in r
c950: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e  egister P2.** an
c960: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
c970: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
c980: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
c990: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
c9a0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
c9b0: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
c9c0: 20 53 75 62 74 72 61 63 74 20 50 31 20 50 32 20   Subtract P1 P2 
c9d0: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
c9e0: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2d  is: r[P3]=r[P2]-
c9f0: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 75 62 74  r[P1].**.** Subt
ca00: 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69  ract the value i
ca10: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 66 72  n register P1 fr
ca20: 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  om the value in 
ca30: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
ca40: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
ca50: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
ca60: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
ca70: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
ca80: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
ca90: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
caa0: 3a 20 44 69 76 69 64 65 20 50 31 20 50 32 20 50  : Divide P1 P2 P
cab0: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
cac0: 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2f 72  s: r[P3]=r[P2]/r
cad0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 44 69 76 69 64  [P1].**.** Divid
cae0: 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
caf0: 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74 68  egister P1 by th
cb00: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
cb10: 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74  ter P2.** and st
cb20: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
cb30: 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 28 50  n register P3 (P
cb40: 33 3d 50 32 2f 50 31 29 2e 20 49 66 20 74 68 65  3=P2/P1). If the
cb50: 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20 72 65   value in .** re
cb60: 67 69 73 74 65 72 20 50 31 20 69 73 20 7a 65 72  gister P1 is zer
cb70: 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  o, then the resu
cb80: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20 65  lt is NULL. If e
cb90: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 0a  ither input is .
cba0: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  ** NULL, the res
cbb0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
cbc0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d 61 69  /* Opcode: Remai
cbd0: 6e 64 65 72 20 50 31 20 50 32 20 50 33 20 2a 20  nder P1 P2 P3 * 
cbe0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
cbf0: 5b 50 33 5d 3d 72 5b 50 32 5d 25 72 5b 50 31 5d  [P3]=r[P2]%r[P1]
cc00: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  .**.** Compute t
cc10: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 61 66 74  he remainder aft
cc20: 65 72 20 69 6e 74 65 67 65 72 20 72 65 67 69 73  er integer regis
cc30: 74 65 72 20 50 32 20 69 73 20 64 69 76 69 64 65  ter P2 is divide
cc40: 64 20 62 79 20 0a 2a 2a 20 72 65 67 69 73 74 65  d by .** registe
cc50: 72 20 50 31 20 61 6e 64 20 73 74 6f 72 65 20 74  r P1 and store t
cc60: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
cc70: 69 73 74 65 72 20 50 33 2e 20 0a 2a 2a 20 49 66  ister P3. .** If
cc80: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
cc90: 67 69 73 74 65 72 20 50 31 20 69 73 20 7a 65 72  gister P1 is zer
cca0: 6f 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  o the result is 
ccb0: 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69 74 68  NULL..** If eith
ccc0: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
ccd0: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
cce0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
ccf0: 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20  OP_Add:         
cd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
cd10: 65 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20 69 6e  e as TK_PLUS, in
cd20: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
cd30: 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74  case OP_Subtract
cd40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
cd50: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d 49 4e  * same as TK_MIN
cd60: 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  US, in1, in2, ou
cd70: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75  t3 */.case OP_Mu
cd80: 6c 74 69 70 6c 79 3a 20 20 20 20 20 20 20 20 20  ltiply:         
cd90: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
cda0: 54 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20 69 6e  TK_STAR, in1, in
cdb0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
cdc0: 4f 50 5f 44 69 76 69 64 65 3a 20 20 20 20 20 20  OP_Divide:      
cdd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
cde0: 65 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c 20 69  e as TK_SLASH, i
cdf0: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
ce00: 0a 63 61 73 65 20 4f 50 5f 52 65 6d 61 69 6e 64  .case OP_Remaind
ce10: 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  er: {           
ce20: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 45  /* same as TK_RE
ce30: 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  M, in1, in2, out
ce40: 33 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73  3 */.  u16 flags
ce50: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ;      /* Combin
ce60: 65 64 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20 66  ed MEM_* flags f
ce70: 72 6f 6d 20 62 6f 74 68 20 69 6e 70 75 74 73 20  rom both inputs 
ce80: 2a 2f 0a 20 20 75 31 36 20 74 79 70 65 31 3b 20  */.  u16 type1; 
ce90: 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20       /* Numeric 
cea0: 74 79 70 65 20 6f 66 20 6c 65 66 74 20 6f 70 65  type of left ope
ceb0: 72 61 6e 64 20 2a 2f 0a 20 20 75 31 36 20 74 79  rand */.  u16 ty
cec0: 70 65 32 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  pe2;      /* Num
ced0: 65 72 69 63 20 74 79 70 65 20 6f 66 20 72 69 67  eric type of rig
cee0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
cef0: 69 36 34 20 69 41 3b 20 20 20 20 20 20 20 20 20  i64 iA;         
cf00: 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65  /* Integer value
cf10: 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64   of left operand
cf20: 20 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20   */.  i64 iB;   
cf30: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
cf40: 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20   value of right 
cf50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75  operand */.  dou
cf60: 62 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20  ble rA;      /* 
cf70: 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65  Real value of le
cf80: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
cf90: 64 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20  double rB;      
cfa0: 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66  /* Real value of
cfb0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
cfc0: 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  /..  pIn1 = &aMe
cfd0: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74 79  m[pOp->p1];.  ty
cfe0: 70 65 31 20 3d 20 6e 75 6d 65 72 69 63 54 79 70  pe1 = numericTyp
cff0: 65 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20  e(pIn1);.  pIn2 
d000: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
d010: 3b 0a 20 20 74 79 70 65 32 20 3d 20 6e 75 6d 65  ;.  type2 = nume
d020: 72 69 63 54 79 70 65 28 70 49 6e 32 29 3b 0a 20  ricType(pIn2);. 
d030: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
d040: 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 20  p->p3];.  flags 
d050: 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20  = pIn1->flags | 
d060: 70 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pIn2->flags;.  i
d070: 66 28 20 28 74 79 70 65 31 20 26 20 74 79 70 65  f( (type1 & type
d080: 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  2 & MEM_Int)!=0 
d090: 29 7b 0a 20 20 20 20 69 41 20 3d 20 70 49 6e 31  ){.    iA = pIn1
d0a0: 2d 3e 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d 20  ->u.i;.    iB = 
d0b0: 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 73  pIn2->u.i;.    s
d0c0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
d0d0: 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
d0e0: 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 69   OP_Add:       i
d0f0: 66 28 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74  f( sqlite3AddInt
d100: 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74  64(&iB,iA) ) got
d110: 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61  o fp_math;  brea
d120: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d130: 5f 53 75 62 74 72 61 63 74 3a 20 20 69 66 28 20  _Subtract:  if( 
d140: 73 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34 28  sqlite3SubInt64(
d150: 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66  &iB,iA) ) goto f
d160: 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a  p_math;  break;.
d170: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75        case OP_Mu
d180: 6c 74 69 70 6c 79 3a 20 20 69 66 28 20 73 71 6c  ltiply:  if( sql
d190: 69 74 65 33 4d 75 6c 49 6e 74 36 34 28 26 69 42  ite3MulInt64(&iB
d1a0: 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d  ,iA) ) goto fp_m
d1b0: 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ath;  break;.   
d1c0: 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64     case OP_Divid
d1d0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e: {.        if(
d1e0: 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72   iA==0 ) goto ar
d1f0: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f  ithmetic_result_
d200: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  is_null;.       
d210: 20 69 66 28 20 69 41 3d 3d 2d 31 20 26 26 20 69   if( iA==-1 && i
d220: 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  B==SMALLEST_INT6
d230: 34 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68  4 ) goto fp_math
d240: 3b 0a 20 20 20 20 20 20 20 20 69 42 20 2f 3d 20  ;.        iB /= 
d250: 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  iA;.        brea
d260: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d270: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
d280: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
d290: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
d2a0: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
d2b0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
d2c0: 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20  -1 ) iA = 1;.   
d2d0: 20 20 20 20 20 69 42 20 25 3d 20 69 41 3b 0a 20       iB %= iA;. 
d2e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d2f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d300: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a  pOut->u.i = iB;.
d310: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
d320: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
d330: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
d340: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
d350: 29 21 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  )!=0 ){.    goto
d360: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
d370: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 7d 65  lt_is_null;.  }e
d380: 6c 73 65 7b 0a 66 70 5f 6d 61 74 68 3a 0a 20 20  lse{.fp_math:.  
d390: 20 20 72 41 20 3d 20 73 71 6c 69 74 65 33 56 64    rA = sqlite3Vd
d3a0: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31  beRealValue(pIn1
d3b0: 29 3b 0a 20 20 20 20 72 42 20 3d 20 73 71 6c 69  );.    rB = sqli
d3c0: 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65  te3VdbeRealValue
d3d0: 28 70 49 6e 32 29 3b 0a 20 20 20 20 73 77 69 74  (pIn2);.    swit
d3e0: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
d3f0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
d400: 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20 72 42  _Add:         rB
d410: 20 2b 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72   += rA;       br
d420: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d430: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20  OP_Subtract:    
d440: 72 42 20 2d 3d 20 72 41 3b 20 20 20 20 20 20 20  rB -= rA;       
d450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
d460: 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20  e OP_Multiply:  
d470: 20 20 72 42 20 2a 3d 20 72 41 3b 20 20 20 20 20    rB *= rA;     
d480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
d490: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b  ase OP_Divide: {
d4a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75  .        /* (dou
d4b0: 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
d4c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
d4d0: 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
d4e0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 41  /.        if( rA
d4f0: 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29 20 67 6f  ==(double)0 ) go
d500: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
d510: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
d520: 20 20 20 20 20 20 72 42 20 2f 3d 20 72 41 3b 0a        rB /= rA;.
d530: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
d550: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
d560: 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  iA = sqlite3Vdbe
d570: 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a  IntValue(pIn1);.
d580: 20 20 20 20 20 20 20 20 69 42 20 3d 20 73 71 6c          iB = sql
d590: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
d5a0: 28 70 49 6e 32 29 3b 0a 20 20 20 20 20 20 20 20  (pIn2);.        
d5b0: 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f  if( iA==0 ) goto
d5c0: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
d5d0: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
d5e0: 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29      if( iA==-1 )
d5f0: 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   iA = 1;.       
d600: 20 72 42 20 3d 20 28 64 6f 75 62 6c 65 29 28 69   rB = (double)(i
d610: 42 20 25 20 69 41 29 3b 0a 20 20 20 20 20 20 20  B % iA);.       
d620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d630: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
d640: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
d650: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 70 4f 75 74  G_POINT.    pOut
d660: 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a 20 20 20 20  ->u.i = rB;.    
d670: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
d680: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23  Out, MEM_Int);.#
d690: 65 6c 73 65 0a 20 20 20 20 69 66 28 20 73 71 6c  else.    if( sql
d6a0: 69 74 65 33 49 73 4e 61 4e 28 72 42 29 20 29 7b  ite3IsNaN(rB) ){
d6b0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 72 69 74  .      goto arit
d6c0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
d6d0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _null;.    }.   
d6e0: 20 70 4f 75 74 2d 3e 75 2e 72 20 3d 20 72 42 3b   pOut->u.r = rB;
d6f0: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
d700: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 52 65  lag(pOut, MEM_Re
d710: 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  al);.#endif.  }.
d720: 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74 68 6d    break;..arithm
d730: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
d740: 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 64  ull:.  sqlite3Vd
d750: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
d760: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
d770: 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c 53  /* Opcode: CollS
d780: 65 71 20 50 31 20 2a 20 2a 20 50 34 0a 2a 2a 0a  eq P1 * * P4.**.
d790: 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
d7a0: 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53 65 71 20  er to a CollSeq 
d7b0: 6f 62 6a 65 63 74 2e 20 49 66 20 74 68 65 20 6e  object. If the n
d7c0: 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 20 75 73  ext call to a us
d7d0: 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f  er function.** o
d7e0: 72 20 61 67 67 72 65 67 61 74 65 20 63 61 6c 6c  r aggregate call
d7f0: 73 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63  s sqlite3GetFunc
d800: 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68 69 73 20  CollSeq(), this 
d810: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
d820: 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65  ce will.** be re
d830: 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69 73 20  turned. This is 
d840: 75 73 65 64 20 62 79 20 74 68 65 20 62 75 69 6c  used by the buil
d850: 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d 61 78 28  t-in min(), max(
d860: 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29 0a 2a  ) and nullif().*
d870: 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  * functions..**.
d880: 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 74 20  ** If P1 is not 
d890: 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
d8a0: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
d8b0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6d 69   a subsequent mi
d8c0: 6e 28 29 20 6f 72 0a 2a 2a 20 6d 61 78 28 29 20  n() or.** max() 
d8d0: 61 67 67 72 65 67 61 74 65 20 77 69 6c 6c 20 73  aggregate will s
d8e0: 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 63  et to 1 if the c
d8f0: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 6e 6f  urrent row is no
d900: 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  t the minimum or
d910: 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20 20 54 68  .** maximum.  Th
d920: 65 20 50 31 20 72 65 67 69 73 74 65 72 20 69 73  e P1 register is
d930: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
d940: 30 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75  0 by this instru
d950: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
d960: 20 69 6e 74 65 72 66 61 63 65 20 75 73 65 64 20   interface used 
d970: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
d980: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 66 6f  ation of the afo
d990: 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66 75 6e 63  rementioned func
d9a0: 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 72  tions.** to retr
d9b0: 69 65 76 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  ieve the collati
d9c0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 65 74 20  on sequence set 
d9d0: 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  by this opcode i
d9e0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  s not available.
d9f0: 2a 2a 20 70 75 62 6c 69 63 6c 79 2e 20 20 4f 6e  ** publicly.  On
da00: 6c 79 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63  ly built-in func
da10: 74 69 6f 6e 73 20 68 61 76 65 20 61 63 63 65 73  tions have acces
da20: 73 20 74 6f 20 74 68 69 73 20 66 65 61 74 75 72  s to this featur
da30: 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  e..*/.case OP_Co
da40: 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73 65 72  llSeq: {.  asser
da50: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
da60: 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20  P4_COLLSEQ );.  
da70: 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  if( pOp->p1 ){. 
da80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
da90: 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b  mSetInt64(&aMem[
daa0: 70 4f 70 2d 3e 70 31 5d 2c 20 30 29 3b 0a 20 20  pOp->p1], 0);.  
dab0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
dac0: 20 4f 70 63 6f 64 65 3a 20 42 69 74 41 6e 64 20   Opcode: BitAnd 
dad0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
dae0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
daf0: 72 5b 50 31 5d 26 72 5b 50 32 5d 0a 2a 2a 0a 2a  r[P1]&r[P2].**.*
db00: 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77  * Take the bit-w
db10: 69 73 65 20 41 4e 44 20 6f 66 20 74 68 65 20 76  ise AND of the v
db20: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
db30: 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a  r P1 and P2 and.
db40: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
db50: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
db60: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
db70: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
db80: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
db90: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
dba0: 3a 20 42 69 74 4f 72 20 50 31 20 50 32 20 50 33  : BitOr P1 P2 P3
dbb0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
dbc0: 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 7c 72 5b  : r[P3]=r[P1]|r[
dbd0: 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74  P2].**.** Take t
dbe0: 68 65 20 62 69 74 2d 77 69 73 65 20 4f 52 20 6f  he bit-wise OR o
dbf0: 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  f the values in 
dc00: 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
dc10: 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20  P2 and.** store 
dc20: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
dc30: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
dc40: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
dc50: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
dc60: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
dc70: 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 4c 65   Opcode: ShiftLe
dc80: 66 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ft P1 P2 P3 * *.
dc90: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
dca0: 33 5d 3d 72 5b 50 32 5d 3c 3c 72 5b 50 31 5d 0a  3]=r[P2]<<r[P1].
dcb0: 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20  **.** Shift the 
dcc0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e  integer value in
dcd0: 20 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20   register P2 to 
dce0: 74 68 65 20 6c 65 66 74 20 62 79 20 74 68 65 0a  the left by the.
dcf0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  ** number of bit
dd00: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
dd10: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65  he integer in re
dd20: 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74  gister P1..** St
dd30: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
dd40: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
dd50: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
dd60: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
dd70: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
dd80: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69  /./* Opcode: Shi
dd90: 66 74 52 69 67 68 74 20 50 31 20 50 32 20 50 33  ftRight P1 P2 P3
dda0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
ddb0: 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 3e 3e 72  : r[P3]=r[P2]>>r
ddc0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74  [P1].**.** Shift
ddd0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
dde0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
ddf0: 32 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 62  2 to the right b
de00: 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  y the.** number 
de10: 6f 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65  of bits specifie
de20: 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72  d by the integer
de30: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
de40: 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65  .** Store the re
de50: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
de60: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
de70: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
de80: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
de90: 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
dea0: 42 69 74 41 6e 64 3a 20 20 20 20 20 20 20 20 20  BitAnd:         
deb0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
dec0: 61 73 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e  as TK_BITAND, in
ded0: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
dee0: 63 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20  case OP_BitOr:  
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49  /* same as TK_BI
df10: 54 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  TOR, in1, in2, o
df20: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ut3 */.case OP_S
df30: 68 69 66 74 4c 65 66 74 3a 20 20 20 20 20 20 20  hiftLeft:       
df40: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
df50: 73 20 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31  s TK_LSHIFT, in1
df60: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
df70: 61 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67 68  ase OP_ShiftRigh
df80: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  t: {           /
df90: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 53 48  * same as TK_RSH
dfa0: 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  IFT, in1, in2, o
dfb0: 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b  ut3 */.  i64 iA;
dfc0: 0a 20 20 75 36 34 20 75 41 3b 0a 20 20 69 36 34  .  u64 uA;.  i64
dfd0: 20 69 42 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20   iB;.  u8 op;.. 
dfe0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
dff0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d  p->p1];.  pIn2 =
e000: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
e010: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
e020: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
e030: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70  (pIn1->flags | p
e040: 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45  In2->flags) & ME
e050: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71  M_Null ){.    sq
e060: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
e070: 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62  ull(pOut);.    b
e080: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d  reak;.  }.  iA =
e090: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
e0a0: 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 69 42  alue(pIn2);.  iB
e0b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
e0c0: 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20  tValue(pIn1);.  
e0d0: 6f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  op = pOp->opcode
e0e0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42  ;.  if( op==OP_B
e0f0: 69 74 41 6e 64 20 29 7b 0a 20 20 20 20 69 41 20  itAnd ){.    iA 
e100: 26 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69  &= iB;.  }else i
e110: 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20  f( op==OP_BitOr 
e120: 29 7b 0a 20 20 20 20 69 41 20 7c 3d 20 69 42 3b  ){.    iA |= iB;
e130: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 42 21  .  }else if( iB!
e140: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
e150: 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69  ( op==OP_ShiftRi
e160: 67 68 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68  ght || op==OP_Sh
e170: 69 66 74 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20  iftLeft );..    
e180: 2f 2a 20 49 66 20 73 68 69 66 74 69 6e 67 20 62  /* If shifting b
e190: 79 20 61 20 6e 65 67 61 74 69 76 65 20 61 6d 6f  y a negative amo
e1a0: 75 6e 74 2c 20 73 68 69 66 74 20 69 6e 20 74 68  unt, shift in th
e1b0: 65 20 6f 74 68 65 72 20 64 69 72 65 63 74 69 6f  e other directio
e1c0: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 42 3c  n */.    if( iB<
e1d0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
e1e0: 74 28 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74  t( OP_ShiftRight
e1f0: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 2b 31  ==OP_ShiftLeft+1
e200: 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 32   );.      op = 2
e210: 2a 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 2b 20  *OP_ShiftLeft + 
e220: 31 20 2d 20 6f 70 3b 0a 20 20 20 20 20 20 69 42  1 - op;.      iB
e230: 20 3d 20 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69   = iB>(-64) ? -i
e240: 42 20 3a 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20  B : 64;.    }.. 
e250: 20 20 20 69 66 28 20 69 42 3e 3d 36 34 20 29 7b     if( iB>=64 ){
e260: 0a 20 20 20 20 20 20 69 41 20 3d 20 28 69 41 3e  .      iA = (iA>
e270: 3d 30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69  =0 || op==OP_Shi
e280: 66 74 4c 65 66 74 29 20 3f 20 30 20 3a 20 2d 31  ftLeft) ? 0 : -1
e290: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e2a0: 20 20 20 6d 65 6d 63 70 79 28 26 75 41 2c 20 26     memcpy(&uA, &
e2b0: 69 41 2c 20 73 69 7a 65 6f 66 28 75 41 29 29 3b  iA, sizeof(uA));
e2c0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f  .      if( op==O
e2d0: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 7b 0a 20  P_ShiftLeft ){. 
e2e0: 20 20 20 20 20 20 20 75 41 20 3c 3c 3d 20 69 42         uA <<= iB
e2f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e300: 20 20 20 20 20 20 20 75 41 20 3e 3e 3d 20 69 42         uA >>= iB
e310: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 67  ;.        /* Sig
e320: 6e 2d 65 78 74 65 6e 64 20 6f 6e 20 61 20 72 69  n-extend on a ri
e330: 67 68 74 20 73 68 69 66 74 20 6f 66 20 61 20 6e  ght shift of a n
e340: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 2a  egative number *
e350: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41  /.        if( iA
e360: 3c 30 20 29 20 75 41 20 7c 3d 20 28 28 28 28 75  <0 ) uA |= ((((u
e370: 36 34 29 30 78 66 66 66 66 66 66 66 66 29 3c 3c  64)0xffffffff)<<
e380: 33 32 29 7c 30 78 66 66 66 66 66 66 66 66 29 20  32)|0xffffffff) 
e390: 3c 3c 20 28 36 34 2d 69 42 29 3b 0a 20 20 20 20  << (64-iB);.    
e3a0: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
e3b0: 28 26 69 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f  (&iA, &uA, sizeo
e3c0: 66 28 69 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20  f(iA));.    }.  
e3d0: 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  }.  pOut->u.i = 
e3e0: 69 41 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65  iA;.  MemSetType
e3f0: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
e400: 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  nt);.  break;.}.
e410: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 49  ./* Opcode: AddI
e420: 6d 6d 20 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  mm  P1 P2 * * *.
e430: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
e440: 31 5d 3d 72 5b 50 31 5d 2b 50 32 0a 2a 2a 20 0a  1]=r[P1]+P2.** .
e450: 2a 2a 20 41 64 64 20 74 68 65 20 63 6f 6e 73 74  ** Add the const
e460: 61 6e 74 20 50 32 20 74 6f 20 74 68 65 20 76 61  ant P2 to the va
e470: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
e480: 50 31 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  P1..** The resul
e490: 74 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20 69  t is always an i
e4a0: 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f  nteger..**.** To
e4b0: 20 66 6f 72 63 65 20 61 6e 79 20 72 65 67 69 73   force any regis
e4c0: 74 65 72 20 74 6f 20 62 65 20 61 6e 20 69 6e 74  ter to be an int
e4d0: 65 67 65 72 2c 20 6a 75 73 74 20 61 64 64 20 30  eger, just add 0
e4e0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64  ..*/.case OP_Add
e4f0: 49 6d 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20  Imm: {          
e500: 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49    /* in1 */.  pI
e510: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
e520: 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p1];.  memAboutT
e530: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
e540: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
e550: 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
e560: 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20  1);.  pIn1->u.i 
e570: 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72  += pOp->p2;.  br
e580: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
e590: 65 3a 20 4d 75 73 74 42 65 49 6e 74 20 50 31 20  e: MustBeInt P1 
e5a0: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20  P2 * * *.** .** 
e5b0: 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20  Force the value 
e5c0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
e5d0: 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e  o be an integer.
e5e0: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
e5f0: 2a 20 69 6e 20 50 31 20 69 73 20 6e 6f 74 20 61  * in P1 is not a
e600: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 63 61  n integer and ca
e610: 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65  nnot be converte
e620: 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  d into an intege
e630: 72 0a 2a 2a 20 77 69 74 68 6f 75 74 20 64 61 74  r.** without dat
e640: 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d  a loss, then jum
e650: 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
e660: 20 50 32 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30   P2, or if P2==0
e670: 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c  .** raise an SQL
e680: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 65 78 63  ITE_MISMATCH exc
e690: 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  eption..*/.case 
e6a0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20  OP_MustBeInt: { 
e6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
e6c0: 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  mp, in1 */.  pIn
e6d0: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
e6e0: 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  1];.  if( (pIn1-
e6f0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
e700: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c  )==0 ){.    appl
e710: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20  yAffinity(pIn1, 
e720: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
e730: 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  IC, encoding);. 
e740: 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c     if( (pIn1->fl
e750: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
e760: 30 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 42  0 ){.      VdbeB
e770: 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 20 32 29  ranchTaken(1, 2)
e780: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  ;.      if( pOp-
e790: 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >p2==0 ){.      
e7a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49    rc = SQLITE_MI
e7b0: 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20  SMATCH;.        
e7c0: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
e7d0: 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
e7e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f  else{.        go
e7f0: 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
e800: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e810: 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
e820: 65 6e 28 30 2c 20 32 29 3b 0a 20 20 4d 65 6d 53  en(0, 2);.  MemS
e830: 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c  etTypeFlag(pIn1,
e840: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65   MEM_Int);.  bre
e850: 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ak;.}..#ifndef S
e860: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
e870: 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63  ING_POINT./* Opc
e880: 6f 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69 74  ode: RealAffinit
e890: 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  y P1 * * * *.**.
e8a0: 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20 50  ** If register P
e8b0: 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67  1 holds an integ
e8c0: 65 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f  er convert it to
e8d0: 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a   a real value..*
e8e0: 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
e8f0: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 65 78   is used when ex
e900: 74 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d 61  tracting informa
e910: 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c 75  tion from a colu
e920: 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 52  mn that.** has R
e930: 45 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20 53  EAL affinity.  S
e940: 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  uch column value
e950: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 73  s may still be s
e960: 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74 65  tored as.** inte
e970: 67 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65 20  gers, for space 
e980: 65 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74 20  efficiency, but 
e990: 61 66 74 65 72 20 65 78 74 72 61 63 74 69 6f 6e  after extraction
e9a0: 20 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a 2a   we want them.**
e9b0: 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61 20   to have only a 
e9c0: 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63  real value..*/.c
e9d0: 61 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  ase OP_RealAffin
e9e0: 69 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ity: {          
e9f0: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
ea00: 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
ea10: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
ea20: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 28   pIn1->flags & (
ea30: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52  MEM_Int|MEM_IntR
ea40: 65 61 6c 29 20 29 7b 0a 20 20 20 20 74 65 73 74  eal) ){.    test
ea50: 63 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67  case( pIn1->flag
ea60: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
ea70: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e     testcase( pIn
ea80: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  1->flags & MEM_I
ea90: 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 73 71  ntReal );.    sq
eaa0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c  lite3VdbeMemReal
eab0: 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20  ify(pIn1);.  }. 
eac0: 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
ead0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
eae0: 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f 70  _OMIT_CAST./* Op
eaf0: 63 6f 64 65 3a 20 43 61 73 74 20 50 31 20 50 32  code: Cast P1 P2
eb00: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
eb10: 69 73 3a 20 61 66 66 69 6e 69 74 79 28 72 5b 50  is: affinity(r[P
eb20: 31 5d 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20  1]).**.** Force 
eb30: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
eb40: 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 74  ister P1 to be t
eb50: 68 65 20 74 79 70 65 20 64 65 66 69 6e 65 64 20  he type defined 
eb60: 62 79 20 50 32 2e 0a 2a 2a 20 0a 2a 2a 20 3c 75  by P2..** .** <u
eb70: 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27  l>.** <li> P2=='
eb80: 41 27 20 26 72 61 72 72 3b 20 42 4c 4f 42 0a 2a  A' &rarr; BLOB.*
eb90: 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 42 27 20 26  * <li> P2=='B' &
eba0: 72 61 72 72 3b 20 54 45 58 54 0a 2a 2a 20 3c 6c  rarr; TEXT.** <l
ebb0: 69 3e 20 50 32 3d 3d 27 43 27 20 26 72 61 72 72  i> P2=='C' &rarr
ebc0: 3b 20 4e 55 4d 45 52 49 43 0a 2a 2a 20 3c 6c 69  ; NUMERIC.** <li
ebd0: 3e 20 50 32 3d 3d 27 44 27 20 26 72 61 72 72 3b  > P2=='D' &rarr;
ebe0: 20 49 4e 54 45 47 45 52 0a 2a 2a 20 3c 6c 69 3e   INTEGER.** <li>
ebf0: 20 50 32 3d 3d 27 45 27 20 26 72 61 72 72 3b 20   P2=='E' &rarr; 
ec00: 52 45 41 4c 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a  REAL.** </ul>.**
ec10: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65  .** A NULL value
ec20: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20   is not changed 
ec30: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
ec40: 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c    It remains NUL
ec50: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 61  L..*/.case OP_Ca
ec60: 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  st: {           
ec70: 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f         /* in1 */
ec80: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
ec90: 70 32 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  p2>=SQLITE_AFF_B
eca0: 4c 4f 42 20 26 26 20 70 4f 70 2d 3e 70 32 3c 3d  LOB && pOp->p2<=
ecb0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
ecc0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
ecd0: 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41  Op->p2==SQLITE_A
ece0: 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 74 65 73  FF_TEXT );.  tes
ecf0: 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d  tcase( pOp->p2==
ed00: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
ed10: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
ed20: 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41  Op->p2==SQLITE_A
ed30: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
ed40: 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70  testcase( pOp->p
ed50: 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  2==SQLITE_AFF_IN
ed60: 54 45 47 45 52 20 29 3b 0a 20 20 74 65 73 74 63  TEGER );.  testc
ed70: 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51  ase( pOp->p2==SQ
ed80: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b  LITE_AFF_REAL );
ed90: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
eda0: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41  pOp->p1];.  memA
edb0: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
edc0: 70 49 6e 31 29 3b 0a 20 20 72 63 20 3d 20 45 78  pIn1);.  rc = Ex
edd0: 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a  pandBlob(pIn1);.
ede0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
edf0: 43 61 73 74 28 70 49 6e 31 2c 20 70 4f 70 2d 3e  Cast(pIn1, pOp->
ee00: 70 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  p2, encoding);. 
ee10: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
ee20: 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 69 66  SIZE(pIn1);.  if
ee30: 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
ee40: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
ee50: 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
ee60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ee70: 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  _CAST */../* Opc
ee80: 6f 64 65 3a 20 45 71 20 50 31 20 50 32 20 50 33  ode: Eq P1 P2 P3
ee90: 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
eea0: 69 73 3a 20 49 46 20 72 5b 50 33 5d 3d 3d 72 5b  is: IF r[P3]==r[
eeb0: 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72  P1].**.** Compar
eec0: 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  e the values in 
eed0: 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
eee0: 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29 3d  P3.  If reg(P3)=
eef0: 3d 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a  =reg(P1) then.**
ef00: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
ef10: 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65 20   P2.  Or if the 
ef20: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 66  SQLITE_STOREP2 f
ef30: 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 50 35  lag is set in P5
ef40: 2c 20 74 68 65 6e 0a 2a 2a 20 73 74 6f 72 65 20  , then.** store 
ef50: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
ef60: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 72 65 67 69  mparison in regi
ef70: 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  ster P2..**.** T
ef80: 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41  he SQLITE_AFF_MA
ef90: 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35  SK portion of P5
efa0: 20 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66 69   must be an affi
efb0: 6e 69 74 79 20 63 68 61 72 61 63 74 65 72 20 2d  nity character -
efc0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  .** SQLITE_AFF_T
efd0: 45 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  EXT, SQLITE_AFF_
efe0: 49 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20  INTEGER, and so 
eff0: 66 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70  forth. An attemp
f000: 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f  t is made .** to
f010: 20 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70   coerce both inp
f020: 75 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  uts according to
f030: 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 20 62   this affinity b
f040: 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  efore the.** com
f050: 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e  parison is made.
f060: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   If the SQLITE_A
f070: 46 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c  FF_MASK is 0x00,
f080: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a   then numeric.**
f090: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
f0a0: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  d. Note that the
f0b0: 20 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72   affinity conver
f0c0: 73 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64  sions are stored
f0d0: 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  .** back into th
f0e0: 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
f0f0: 73 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f  s P1 and P3.  So
f100: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e   this opcode can
f110: 20 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73   cause.** persis
f120: 74 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20  tent changes to 
f130: 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64  registers P1 and
f140: 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20   P3..**.** Once 
f150: 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  any conversions 
f160: 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65  have taken place
f170: 2c 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61  , and neither va
f180: 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a  lue is NULL, .**
f190: 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
f1a0: 63 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74  compared. If bot
f1b0: 68 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f  h values are blo
f1c0: 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29  bs then memcmp()
f1d0: 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64   is.** used to d
f1e0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73  etermine the res
f1f0: 75 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ults of the comp
f200: 61 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68  arison.  If both
f210: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74   values.** are t
f220: 65 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70  ext, then the ap
f230: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
f240: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65  ing function spe
f250: 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20  cified in.** P4 
f260: 69 73 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68  is used to do th
f270: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49  e comparison.  I
f280: 66 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63  f P4 is not spec
f290: 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65  ified then.** me
f2a0: 6d 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74  mcmp() is used t
f2b0: 6f 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73  o compare text s
f2c0: 74 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20  tring.  If both 
f2d0: 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75  values are.** nu
f2e0: 6d 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75  meric, then a nu
f2f0: 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e  meric comparison
f300: 20 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65   is used. If the
f310: 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61   two values.** a
f320: 72 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  re of different 
f330: 74 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62  types, then numb
f340: 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
f350: 65 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  ed less than.** 
f360: 73 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69  strings and stri
f370: 6e 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ngs are consider
f380: 65 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f  ed less than blo
f390: 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  bs..**.** If SQL
f3a0: 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65  ITE_NULLEQ is se
f3b0: 74 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68 65  t in P5 then the
f3c0: 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
f3d0: 72 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  rison is always 
f3e0: 65 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20 6f  either.** true o
f3f0: 72 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20 6e  r false and is n
f400: 65 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20 62  ever NULL.  If b
f410: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65  oth operands are
f420: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72   NULL then the r
f430: 65 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70  esult.** of comp
f440: 61 72 69 73 6f 6e 20 69 73 20 74 72 75 65 2e 20  arison is true. 
f450: 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   If either opera
f460: 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  nd is NULL then 
f470: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  the result is fa
f480: 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74 68  lse..** If neith
f490: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
f4a0: 4c 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  LL the result is
f4b0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 74 20   the same as it 
f4c0: 77 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74  would be if.** t
f4d0: 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  he SQLITE_NULLEQ
f4e0: 20 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74 74   flag were omitt
f4f0: 65 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2a 0a 2a  ed from P5..**.*
f500: 2a 20 49 66 20 62 6f 74 68 20 53 51 4c 49 54 45  * If both SQLITE
f510: 5f 53 54 4f 52 45 50 32 20 61 6e 64 20 53 51 4c  _STOREP2 and SQL
f520: 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c 61  ITE_KEEPNULL fla
f530: 67 73 20 61 72 65 20 73 65 74 20 74 68 65 6e 20  gs are set then 
f540: 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
f550: 66 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79 20  f r[P2] is only 
f560: 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 6e  changed if the n
f570: 65 77 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ew value is NULL
f580: 20 6f 72 20 30 20 28 66 61 6c 73 65 29 2e 0a 2a   or 0 (false)..*
f590: 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
f5a0: 2c 20 61 20 70 72 69 6f 72 20 72 5b 50 32 5d 20  , a prior r[P2] 
f5b0: 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 62  value will not b
f5c0: 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  e overwritten by
f5d0: 20 31 20 28 74 72 75 65 29 2e 0a 2a 2f 0a 2f 2a   1 (true)..*/./*
f5e0: 20 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31 20 50   Opcode: Ne P1 P
f5f0: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
f600: 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d  nopsis: IF r[P3]
f610: 21 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68  !=r[P1].**.** Th
f620: 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  is works just li
f630: 6b 65 20 74 68 65 20 45 71 20 6f 70 63 6f 64 65  ke the Eq opcode
f640: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
f650: 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
f660: 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e 64  f.** the operand
f670: 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 50  s in registers P
f680: 31 20 61 6e 64 20 50 33 20 61 72 65 20 6e 6f 74  1 and P3 are not
f690: 20 65 71 75 61 6c 2e 20 20 53 65 65 20 74 68 65   equal.  See the
f6a0: 20 45 71 20 6f 70 63 6f 64 65 20 66 6f 72 0a 2a   Eq opcode for.*
f6b0: 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * additional inf
f6c0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
f6d0: 49 66 20 62 6f 74 68 20 53 51 4c 49 54 45 5f 53  If both SQLITE_S
f6e0: 54 4f 52 45 50 32 20 61 6e 64 20 53 51 4c 49 54  TOREP2 and SQLIT
f6f0: 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67 73  E_KEEPNULL flags
f700: 20 61 72 65 20 73 65 74 20 74 68 65 6e 20 74 68   are set then th
f710: 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
f720: 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79 20 63 68  r[P2] is only ch
f730: 61 6e 67 65 64 20 69 66 20 74 68 65 20 6e 65 77  anged if the new
f740: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20 6f   value is NULL o
f750: 72 20 31 20 28 74 72 75 65 29 2e 0a 2a 2a 20 49  r 1 (true)..** I
f760: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
f770: 20 70 72 69 6f 72 20 72 5b 50 32 5d 20 76 61 6c   prior r[P2] val
f780: 75 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f  ue will not be o
f790: 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 30 20  verwritten by 0 
f7a0: 28 66 61 6c 73 65 29 2e 0a 2a 2f 0a 2f 2a 20 4f  (false)..*/./* O
f7b0: 70 63 6f 64 65 3a 20 4c 74 20 50 31 20 50 32 20  pcode: Lt P1 P2 
f7c0: 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
f7d0: 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3c 72  psis: IF r[P3]<r
f7e0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  [P1].**.** Compa
f7f0: 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  re the values in
f800: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
f810: 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29   P3.  If reg(P3)
f820: 3c 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a  <reg(P1) then.**
f830: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
f840: 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65 20   P2.  Or if the 
f850: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 66  SQLITE_STOREP2 f
f860: 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 50 35  lag is set in P5
f870: 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65   store.** the re
f880: 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
f890: 6f 6e 20 28 30 20 6f 72 20 31 20 6f 72 20 4e 55  on (0 or 1 or NU
f8a0: 4c 4c 29 20 69 6e 74 6f 20 72 65 67 69 73 74 65  LL) into registe
f8b0: 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  r P2..**.** If t
f8c0: 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  he SQLITE_JUMPIF
f8d0: 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20 69  NULL bit of P5 i
f8e0: 73 20 73 65 74 20 61 6e 64 20 65 69 74 68 65 72  s set and either
f8f0: 20 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20 72   reg(P1) or.** r
f900: 65 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20 74  eg(P3) is NULL t
f910: 68 65 6e 20 74 68 65 20 74 61 6b 65 20 74 68 65  hen the take the
f920: 20 6a 75 6d 70 2e 20 20 49 66 20 74 68 65 20 53   jump.  If the S
f930: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
f940: 20 0a 2a 2a 20 62 69 74 20 69 73 20 63 6c 65 61   .** bit is clea
f950: 72 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  r then fall thro
f960: 75 67 68 20 69 66 20 65 69 74 68 65 72 20 6f 70  ugh if either op
f970: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a  erand is NULL..*
f980: 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
f990: 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e  AFF_MASK portion
f9a0: 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20 61   of P5 must be a
f9b0: 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 72 61  n affinity chara
f9c0: 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45  cter -.** SQLITE
f9d0: 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54  _AFF_TEXT, SQLIT
f9e0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61  E_AFF_INTEGER, a
f9f0: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20  nd so forth. An 
fa00: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
fa10: 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f  .** to coerce bo
fa20: 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64  th inputs accord
fa30: 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66 69  ing to this affi
fa40: 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a  nity before the.
fa50: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ** comparison is
fa60: 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53 51   made. If the SQ
fa70: 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73  LITE_AFF_MASK is
fa80: 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65   0x00, then nume
fa90: 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  ric.** affinity 
faa0: 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68  is used. Note th
fab0: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
fac0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
fad0: 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69  stored.** back i
fae0: 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65  nto the input re
faf0: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
fb00: 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f  3.  So this opco
fb10: 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20  de can cause.** 
fb20: 70 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67  persistent chang
fb30: 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73 20  es to registers 
fb40: 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a  P1 and P3..**.**
fb50: 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72   Once any conver
fb60: 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e  sions have taken
fb70: 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74   place, and neit
fb80: 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  her value is NUL
fb90: 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  L, .** the value
fba0: 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20  s are compared. 
fbb0: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61  If both values a
fbc0: 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65  re blobs then me
fbd0: 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65  mcmp() is.** use
fbe0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
fbf0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
fc00: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49  e comparison.  I
fc10: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a  f both values.**
fc20: 20 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20   are text, then 
fc30: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
fc40: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
fc50: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a  on specified in.
fc60: 2a 2a 20 50 34 20 69 73 20 20 75 73 65 64 20 74  ** P4 is  used t
fc70: 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  o do the compari
fc80: 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20 6e  son.  If P4 is n
fc90: 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 68 65  ot specified the
fca0: 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73  n.** memcmp() is
fcb0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
fcc0: 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20 49   text string.  I
fcd0: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72  f both values ar
fce0: 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68  e.** numeric, th
fcf0: 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d  en a numeric com
fd00: 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64 2e  parison is used.
fd10: 20 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75   If the two valu
fd20: 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69 66  es.** are of dif
fd30: 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74 68  ferent types, th
fd40: 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 63  en numbers are c
fd50: 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74  onsidered less t
fd60: 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61  han.** strings a
fd70: 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 63  nd strings are c
fd80: 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74  onsidered less t
fd90: 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 2f 2a  han blobs..*/./*
fda0: 20 4f 70 63 6f 64 65 3a 20 4c 65 20 50 31 20 50   Opcode: Le P1 P
fdb0: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
fdc0: 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d  nopsis: IF r[P3]
fdd0: 3c 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68  <=r[P1].**.** Th
fde0: 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  is works just li
fdf0: 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ke the Lt opcode
fe00: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
fe10: 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
fe20: 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  f.** the content
fe30: 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20   of register P3 
fe40: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
fe50: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e  equal to the con
fe60: 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73  tent of.** regis
fe70: 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65  ter P1.  See the
fe80: 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61   Lt opcode for a
fe90: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
fea0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ation..*/./* Opc
feb0: 6f 64 65 3a 20 47 74 20 50 31 20 50 32 20 50 33  ode: Gt P1 P2 P3
fec0: 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
fed0: 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e 72 5b 50  is: IF r[P3]>r[P
fee0: 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  1].**.** This wo
fef0: 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68  rks just like th
ff00: 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65  e Lt opcode exce
ff10: 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  pt that the jump
ff20: 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20   is taken if.** 
ff30: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
ff40: 65 67 69 73 74 65 72 20 50 33 20 69 73 20 67 72  egister P3 is gr
ff50: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
ff60: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67  ontent of.** reg
ff70: 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74  ister P1.  See t
ff80: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72  he Lt opcode for
ff90: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
ffa0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f  rmation..*/./* O
ffb0: 70 63 6f 64 65 3a 20 47 65 20 50 31 20 50 32 20  pcode: Ge P1 P2 
ffc0: 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
ffd0: 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e 3d  psis: IF r[P3]>=
ffe0: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r[P1].**.** This
fff0: 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
10000 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65   the Lt opcode e
10010 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a  xcept that the j
10020 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a  ump is taken if.
10030 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
10040 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  f register P3 is
10050 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
10060 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f   equal to the co
10070 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69  ntent of.** regi
10080 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68  ster P1.  See th
10090 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
100a0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
100b0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  mation..*/.case 
100c0 4f 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20 20  OP_Eq:          
100d0 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
100e0 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_EQ, jump, in1
100f0 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
10100 5f 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Ne:            
10110 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
10120 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _NE, jump, in1, 
10130 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c  in3 */.case OP_L
10140 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
10150 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c   /* same as TK_L
10160 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  T, jump, in1, in
10170 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65 3a  3 */.case OP_Le:
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10190 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45 2c  * same as TK_LE,
101a0 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
101b0 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20 20  */.case OP_Gt:  
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
101d0 73 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20 6a  same as TK_GT, j
101e0 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
101f0 0a 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20 20  .case OP_Ge: {  
10200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
10210 6d 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75 6d  me as TK_GE, jum
10220 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20  p, in1, in3 */. 
10230 20 69 6e 74 20 72 65 73 2c 20 72 65 73 32 3b 20   int res, res2; 
10240 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
10250 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
10260 20 6f 66 20 70 49 6e 31 20 61 67 61 69 6e 73 74   of pIn1 against
10270 20 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61 72 20   pIn3 */.  char 
10280 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 2f  affinity;      /
10290 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73  * Affinity to us
102a0 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  e for comparison
102b0 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 31   */.  u16 flags1
102c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;         /* Cop
102d0 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c  y of initial val
102e0 75 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c 61 67  ue of pIn1->flag
102f0 73 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73  s */.  u16 flags
10300 33 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  3;         /* Co
10310 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61  py of initial va
10320 6c 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66 6c 61  lue of pIn3->fla
10330 67 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20  gs */..  pIn1 = 
10340 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
10350 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
10360 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73  Op->p3];.  flags
10370 31 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3b  1 = pIn1->flags;
10380 0a 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e 33  .  flags3 = pIn3
10390 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28  ->flags;.  if( (
103a0 66 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33 29  flags1 | flags3)
103b0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
103c0 20 2f 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20   /* One or both 
103d0 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c  operands are NUL
103e0 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70  L */.    if( pOp
103f0 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55  ->p5 & SQLITE_NU
10400 4c 4c 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  LLEQ ){.      /*
10410 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45   If SQLITE_NULLE
10420 51 20 69 73 20 73 65 74 20 28 77 68 69 63 68 20  Q is set (which 
10430 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65 6e  will only happen
10440 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   if the operator
10450 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f   is.      ** OP_
10460 45 71 20 6f 72 20 4f 50 5f 4e 65 29 20 74 68 65  Eq or OP_Ne) the
10470 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  n take the jump 
10480 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67  or not depending
10490 20 6f 6e 20 77 68 65 74 68 65 72 0a 20 20 20 20   on whether.    
104a0 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 62 6f 74 68    ** or not both
104b0 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 75   operands are nu
104c0 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
104d0 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
104e0 73 31 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65 64  s1 & MEM_Cleared
104f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )==0 );.      as
10500 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26  sert( (pOp->p5 &
10510 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
10520 4c 4c 29 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50  LL)==0 || CORRUP
10530 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 74 65  T_DB );.      te
10540 73 74 63 61 73 65 28 20 28 70 4f 70 2d 3e 70 35  stcase( (pOp->p5
10550 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   & SQLITE_JUMPIF
10560 4e 55 4c 4c 29 21 3d 30 20 29 3b 0a 20 20 20 20  NULL)!=0 );.    
10570 20 20 69 66 28 20 28 66 6c 61 67 73 31 26 66 6c    if( (flags1&fl
10580 61 67 73 33 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d  ags3&MEM_Null)!=
10590 30 0a 20 20 20 20 20 20 20 26 26 20 28 66 6c 61  0.       && (fla
105a0 67 73 33 26 4d 45 4d 5f 43 6c 65 61 72 65 64 29  gs3&MEM_Cleared)
105b0 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
105c0 20 20 20 20 20 72 65 73 20 3d 20 30 3b 20 20 2f       res = 0;  /
105d0 2a 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20 65  * Operands are e
105e0 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 65  qual */.      }e
105f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
10600 20 3d 20 28 28 66 6c 61 67 73 33 20 26 20 4d 45   = ((flags3 & ME
10610 4d 5f 4e 75 6c 6c 29 20 3f 20 2d 31 20 3a 20 2b  M_Null) ? -1 : +
10620 31 29 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73  1);  /* Operands
10630 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a   are not equal *
10640 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
10650 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 51  lse{.      /* SQ
10660 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 63  LITE_NULLEQ is c
10670 6c 65 61 72 20 61 6e 64 20 61 74 20 6c 65 61 73  lear and at leas
10680 74 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73  t one operand is
10690 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20   NULL,.      ** 
106a0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
106b0 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e 0a  is always NULL..
106c0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d        ** The jum
106d0 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68  p is taken if th
106e0 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  e SQLITE_JUMPIFN
106f0 55 4c 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a  ULL bit is set..
10700 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
10710 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
10720 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
10730 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61         pOut = &a
10740 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
10750 20 20 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d        iCompare =
10760 20 31 3b 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e   1;    /* Operan
10770 64 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c  ds are not equal
10780 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 41   */.        memA
10790 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
107a0 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 4d  pOut);.        M
107b0 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
107c0 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  ut, MEM_Null);. 
107d0 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f         REGISTER_
107e0 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70  TRACE(pOp->p2, p
107f0 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
10800 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 42  e{.        VdbeB
10810 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29 3b  ranchTaken(2,3);
10820 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
10830 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55  ->p5 & SQLITE_JU
10840 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  MPIFNULL ){.    
10850 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f        goto jump_
10860 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20 20 7d  to_p2;.        }
10870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  reak;.    }.  }e
10890 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  lse{.    /* Neit
108a0 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
108b0 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70 61  ULL.  Do a compa
108c0 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 66  rison. */.    af
108d0 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 35  finity = pOp->p5
108e0 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41   & SQLITE_AFF_MA
108f0 53 4b 3b 0a 20 20 20 20 69 66 28 20 61 66 66 69  SK;.    if( affi
10900 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46  nity>=SQLITE_AFF
10910 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
10920 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20    if( (flags1 | 
10930 66 6c 61 67 73 33 29 26 4d 45 4d 5f 53 74 72 20  flags3)&MEM_Str 
10940 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
10950 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f 49 6e  flags1 & (MEM_In
10960 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c 4d 45  t|MEM_IntReal|ME
10970 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29  M_Real|MEM_Str))
10980 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  ==MEM_Str ){.   
10990 20 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65         applyNume
109a0 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 31  ricAffinity(pIn1
109b0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ,0);.          a
109c0 73 73 65 72 74 28 20 66 6c 61 67 73 33 3d 3d 70  ssert( flags3==p
109d0 49 6e 33 2d 3e 66 6c 61 67 73 20 29 3b 0a 20 20  In3->flags );.  
109e0 20 20 20 20 20 20 20 20 2f 2a 20 74 65 73 74 63          /* testc
109f0 61 73 65 28 20 66 6c 61 67 73 33 21 3d 70 49 6e  ase( flags3!=pIn
10a00 33 2d 3e 66 6c 61 67 73 20 29 3b 0a 20 20 20 20  3->flags );.    
10a10 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 75 73        ** this us
10a20 65 64 20 74 6f 20 62 65 20 70 6f 73 73 69 62 6c  ed to be possibl
10a30 65 20 77 69 74 68 20 70 49 6e 31 3d 3d 70 49 6e  e with pIn1==pIn
10a40 33 2c 20 62 75 74 20 6e 6f 74 20 73 69 6e 63 65  3, but not since
10a50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
10a60 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 77  e column cache w
10a70 61 73 20 72 65 6d 6f 76 65 64 2e 20 20 54 68 65  as removed.  The
10a80 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 69 67   following assig
10a90 6e 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  nment.          
10aa0 2a 2a 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c  ** is essentiall
10ab0 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 2c  y a no-op.  But,
10ac0 20 69 74 20 70 72 6f 76 69 64 65 73 20 64 65 66   it provides def
10ad0 65 6e 73 65 2d 69 6e 2d 64 65 70 74 68 0a 20 20  ense-in-depth.  
10ae0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 63 61          ** in ca
10af0 73 65 20 6f 75 72 20 61 6e 61 6c 79 73 69 73 20  se our analysis 
10b00 69 73 20 69 6e 63 6f 72 72 65 63 74 2c 20 73 6f  is incorrect, so
10b10 20 69 74 20 69 73 20 6c 65 66 74 20 69 6e 2e 20   it is left in. 
10b20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  */.          fla
10b30 67 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67  gs3 = pIn3->flag
10b40 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  s;.        }.   
10b50 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 33       if( (flags3
10b60 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
10b70 49 6e 74 52 65 61 6c 7c 4d 45 4d 5f 52 65 61 6c  IntReal|MEM_Real
10b80 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f  |MEM_Str))==MEM_
10b90 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Str ){.         
10ba0 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
10bb0 69 6e 69 74 79 28 70 49 6e 33 2c 30 29 3b 0a 20  inity(pIn3,0);. 
10bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10bd0 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65  .      /* Handle
10be0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
10bf0 20 6f 66 20 69 6e 74 65 67 65 72 20 63 6f 6d 70   of integer comp
10c00 61 72 69 73 6f 6e 20 68 65 72 65 2c 20 61 73 20  arison here, as 
10c10 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69  an.      ** opti
10c20 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 61 76 6f  mization, to avo
10c30 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  id a call to sql
10c40 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
10c50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
10c60 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e  In1->flags & pIn
10c70 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
10c80 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
10c90 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20    if( pIn3->u.i 
10ca0 3e 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72  > pIn1->u.i ){ r
10cb0 65 73 20 3d 20 2b 31 3b 20 67 6f 74 6f 20 63 6f  es = +1; goto co
10cc0 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20  mpare_op; }.    
10cd0 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e      if( pIn3->u.
10ce0 69 20 3c 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b  i < pIn1->u.i ){
10cf0 20 72 65 73 20 3d 20 2d 31 3b 20 67 6f 74 6f 20   res = -1; goto 
10d00 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20  compare_op; }.  
10d10 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
10d20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 70         goto comp
10d30 61 72 65 5f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  are_op;.      }.
10d40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66      }else if( af
10d50 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
10d60 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  FF_TEXT ){.     
10d70 20 69 66 28 20 28 66 6c 61 67 73 31 20 26 20 4d   if( (flags1 & M
10d80 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20 28 66  EM_Str)==0 && (f
10d90 6c 61 67 73 31 26 28 4d 45 4d 5f 49 6e 74 7c 4d  lags1&(MEM_Int|M
10da0 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52  EM_Real|MEM_IntR
10db0 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  eal))!=0 ){.    
10dc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
10dd0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
10de0 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  Int );.        t
10df0 65 73 74 63 61 73 65 28 20 70 49 6e 31 2d 3e 66  estcase( pIn1->f
10e00 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
10e10 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
10e20 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ase( pIn1->flags
10e30 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29   & MEM_IntReal )
10e40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10e50 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
10e60 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67  y(pIn1, encoding
10e70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65  , 1);.        te
10e80 73 74 63 61 73 65 28 20 28 66 6c 61 67 73 31 26  stcase( (flags1&
10e90 4d 45 4d 5f 44 79 6e 29 20 21 3d 20 28 70 49 6e  MEM_Dyn) != (pIn
10ea0 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  1->flags&MEM_Dyn
10eb0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  ) );.        fla
10ec0 67 73 31 20 3d 20 28 70 49 6e 31 2d 3e 66 6c 61  gs1 = (pIn1->fla
10ed0 67 73 20 26 20 7e 4d 45 4d 5f 54 79 70 65 4d 61  gs & ~MEM_TypeMa
10ee0 73 6b 29 20 7c 20 28 66 6c 61 67 73 31 20 26 20  sk) | (flags1 & 
10ef0 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20  MEM_TypeMask);. 
10f00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10f10 49 6e 31 21 3d 70 49 6e 33 20 29 3b 0a 20 20 20  In1!=pIn3 );.   
10f20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
10f30 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 53 74 72  flags3 & MEM_Str
10f40 29 3d 3d 30 20 26 26 20 28 66 6c 61 67 73 33 26  )==0 && (flags3&
10f50 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
10f60 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21  l|MEM_IntReal))!
10f70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
10f80 73 74 63 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c  stcase( pIn3->fl
10f90 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b  ags & MEM_Int );
10fa0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
10fb0 65 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  e( pIn3->flags &
10fc0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
10fd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
10fe0 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
10ff0 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20  _IntReal );.    
11000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
11010 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49 6e 33  emStringify(pIn3
11020 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a  , encoding, 1);.
11030 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
11040 28 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 44 79  ( (flags3&MEM_Dy
11050 6e 29 20 21 3d 20 28 70 49 6e 33 2d 3e 66 6c 61  n) != (pIn3->fla
11060 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20  gs&MEM_Dyn) );. 
11070 20 20 20 20 20 20 20 66 6c 61 67 73 33 20 3d 20         flags3 = 
11080 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 7e  (pIn3->flags & ~
11090 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20  MEM_TypeMask) | 
110a0 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 54 79  (flags3 & MEM_Ty
110b0 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d  peMask);.      }
110c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
110d0 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
110e0 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f  P4_COLLSEQ || pO
110f0 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29  p->p4.pColl==0 )
11100 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
11110 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 49  te3MemCompare(pI
11120 6e 33 2c 20 70 49 6e 31 2c 20 70 4f 70 2d 3e 70  n3, pIn1, pOp->p
11130 34 2e 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 63 6f  4.pColl);.  }.co
11140 6d 70 61 72 65 5f 6f 70 3a 0a 20 20 2f 2a 20 41  mpare_op:.  /* A
11150 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 72 65  t this point, re
11160 73 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  s is negative, z
11170 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
11180 20 69 66 20 72 65 67 5b 50 31 5d 20 69 73 0a 20   if reg[P1] is. 
11190 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   ** less than, e
111a0 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
111b0 74 65 72 20 74 68 61 6e 20 72 65 67 5b 50 33 5d  ter than reg[P3]
111c0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
111d0 20 43 6f 6d 70 75 74 65 0a 20 20 2a 2a 20 74 68   Compute.  ** th
111e0 65 20 61 6e 73 77 65 72 20 74 6f 20 74 68 69 73  e answer to this
111f0 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 72 65 73   operator in res
11200 32 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  2, depending on 
11210 77 68 61 74 20 74 68 65 20 63 6f 6d 70 61 72 69  what the compari
11220 73 6f 6e 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  son.  ** operato
11230 72 20 61 63 74 75 61 6c 6c 79 20 69 73 2e 20 20  r actually is.  
11240 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
11250 66 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  f code depends o
11260 6e 20 74 68 65 20 66 61 63 74 0a 20 20 2a 2a 20  n the fact.  ** 
11270 74 68 61 74 20 74 68 65 20 36 20 63 6f 6d 70 61  that the 6 compa
11280 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20  rison operators 
11290 61 72 65 20 63 6f 6e 73 65 63 75 74 69 76 65 20  are consecutive 
112a0 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 69 73  integers in this
112b0 0a 20 20 2a 2a 20 6f 72 64 65 72 3a 20 20 4e 45  .  ** order:  NE
112c0 2c 20 45 51 2c 20 47 54 2c 20 4c 45 2c 20 4c 54  , EQ, GT, LE, LT
112d0 2c 20 47 45 20 2a 2f 0a 20 20 61 73 73 65 72 74  , GE */.  assert
112e0 28 20 4f 50 5f 45 71 3d 3d 4f 50 5f 4e 65 2b 31  ( OP_Eq==OP_Ne+1
112f0 20 29 3b 20 61 73 73 65 72 74 28 20 4f 50 5f 47   ); assert( OP_G
11300 74 3d 3d 4f 50 5f 4e 65 2b 32 20 29 3b 20 61 73  t==OP_Ne+2 ); as
11310 73 65 72 74 28 20 4f 50 5f 4c 65 3d 3d 4f 50 5f  sert( OP_Le==OP_
11320 4e 65 2b 33 20 29 3b 0a 20 20 61 73 73 65 72 74  Ne+3 );.  assert
11330 28 20 4f 50 5f 4c 74 3d 3d 4f 50 5f 4e 65 2b 34  ( OP_Lt==OP_Ne+4
11340 20 29 3b 20 61 73 73 65 72 74 28 20 4f 50 5f 47   ); assert( OP_G
11350 65 3d 3d 4f 50 5f 4e 65 2b 35 20 29 3b 0a 20 20  e==OP_Ne+5 );.  
11360 69 66 28 20 72 65 73 3c 30 20 29 7b 20 20 20 20  if( res<0 ){    
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 20 2f 2a 20 6e 65 2c 20 65 71 2c 20 67      /* ne, eq, g
11390 74 2c 20 6c 65 2c 20 6c 74 2c 20 67 65 20 2a 2f  t, le, lt, ge */
113a0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
113b0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
113c0 61 4c 54 62 5b 5d 20 3d 20 7b 20 31 2c 20 20 30  aLTb[] = { 1,  0
113d0 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 30  ,  0,  1,  1,  0
113e0 20 7d 3b 0a 20 20 20 20 72 65 73 32 20 3d 20 61   };.    res2 = a
113f0 4c 54 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  LTb[pOp->opcode 
11400 2d 20 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 65 6c 73  - OP_Ne];.  }els
11410 65 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a  e if( res==0 ){.
11420 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
11430 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
11440 45 51 62 5b 5d 20 3d 20 7b 20 30 2c 20 20 31 2c  EQb[] = { 0,  1,
11450 20 20 30 2c 20 20 31 2c 20 20 30 2c 20 20 31 20    0,  1,  0,  1 
11460 7d 3b 0a 20 20 20 20 72 65 73 32 20 3d 20 61 45  };.    res2 = aE
11470 51 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d  Qb[pOp->opcode -
11480 20 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 65 6c 73 65   OP_Ne];.  }else
11490 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
114a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
114b0 20 61 47 54 62 5b 5d 20 3d 20 7b 20 31 2c 20 20   aGTb[] = { 1,  
114c0 30 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20  0,  1,  0,  0,  
114d0 31 20 7d 3b 0a 20 20 20 20 72 65 73 32 20 3d 20  1 };.    res2 = 
114e0 61 47 54 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  aGTb[pOp->opcode
114f0 20 2d 20 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 0a 0a   - OP_Ne];.  }..
11500 20 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68    /* Undo any ch
11510 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61 70  anges made by ap
11520 70 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f  plyAffinity() to
11530 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73   the input regis
11540 74 65 72 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ters. */.  asser
11550 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  t( (pIn1->flags 
11560 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 66  & MEM_Dyn) == (f
11570 6c 61 67 73 31 20 26 20 4d 45 4d 5f 44 79 6e 29  lags1 & MEM_Dyn)
11580 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67   );.  pIn1->flag
11590 73 20 3d 20 66 6c 61 67 73 31 3b 0a 20 20 61 73  s = flags1;.  as
115a0 73 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61  sert( (pIn3->fla
115b0 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d  gs & MEM_Dyn) ==
115c0 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 44   (flags3 & MEM_D
115d0 79 6e 29 20 29 3b 0a 20 20 70 49 6e 33 2d 3e 66  yn) );.  pIn3->f
115e0 6c 61 67 73 20 3d 20 66 6c 61 67 73 33 3b 0a 0a  lags = flags3;..
115f0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
11600 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29  SQLITE_STOREP2 )
11610 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d  {.    pOut = &aM
11620 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  em[pOp->p2];.   
11630 20 69 43 6f 6d 70 61 72 65 20 3d 20 72 65 73 3b   iCompare = res;
11640 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70  .    if( (pOp->p
11650 35 20 26 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e  5 & SQLITE_KEEPN
11660 55 4c 4c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)!=0 ){.     
11670 20 2f 2a 20 54 68 65 20 4b 45 45 50 4e 55 4c 4c   /* The KEEPNULL
11680 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 4f   flag prevents O
11690 50 5f 45 71 20 66 72 6f 6d 20 6f 76 65 72 77 72  P_Eq from overwr
116a0 69 74 69 6e 67 20 61 20 4e 55 4c 4c 20 77 69 74  iting a NULL wit
116b0 68 20 31 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  h 1.      ** and
116c0 20 70 72 65 76 65 6e 74 73 20 4f 50 5f 4e 65 20   prevents OP_Ne 
116d0 66 72 6f 6d 20 6f 76 65 72 77 72 69 74 69 6e 67  from overwriting
116e0 20 4e 55 4c 4c 20 77 69 74 68 20 30 2e 20 20 54   NULL with 0.  T
116f0 68 69 73 20 66 6c 61 67 0a 20 20 20 20 20 20 2a  his flag.      *
11700 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69  * is only used i
11710 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65  n contexts where
11720 20 65 69 74 68 65 72 3a 0a 20 20 20 20 20 20 2a   either:.      *
11730 2a 20 20 20 28 31 29 20 6f 70 3d 3d 4f 50 5f 45  *   (1) op==OP_E
11740 71 20 26 26 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c  q && (r[P2]==NUL
11750 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d 30 29 0a 20  L || r[P2]==0). 
11760 20 20 20 20 20 2a 2a 20 20 20 28 32 29 20 6f 70       **   (2) op
11770 3d 3d 4f 50 5f 4e 65 20 26 26 20 28 72 5b 50 32  ==OP_Ne && (r[P2
11780 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d  ]==NULL || r[P2]
11790 3d 3d 31 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  ==1).      ** Th
117a0 65 72 65 66 6f 72 65 20 69 74 20 69 73 20 6e 6f  erefore it is no
117b0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  t necessary to c
117c0 68 65 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  heck the content
117d0 20 6f 66 20 72 5b 50 32 5d 20 66 6f 72 0a 20 20   of r[P2] for.  
117e0 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 20 2a 2f 0a      ** NULL. */.
117f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
11800 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65  p->opcode==OP_Ne
11810 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
11820 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
11830 61 73 73 65 72 74 28 20 72 65 73 32 3d 3d 30 20  assert( res2==0 
11840 7c 7c 20 72 65 73 32 3d 3d 31 20 29 3b 0a 20 20  || res2==1 );.  
11850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
11860 73 32 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70  s2==0 && pOp->op
11870 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  code==OP_Eq );. 
11880 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11890 65 73 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f  es2==1 && pOp->o
118a0 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a  pcode==OP_Eq );.
118b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
118c0 72 65 73 32 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  res2==0 && pOp->
118d0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b  opcode==OP_Ne );
118e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
118f0 20 72 65 73 32 3d 3d 31 20 26 26 20 70 4f 70 2d   res2==1 && pOp-
11900 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29  >opcode==OP_Ne )
11910 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 70  ;.      if( (pOp
11920 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 29  ->opcode==OP_Eq)
11930 3d 3d 72 65 73 32 20 29 20 62 72 65 61 6b 3b 0a  ==res2 ) break;.
11940 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 41 62 6f      }.    memAbo
11950 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
11960 75 74 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54  ut);.    MemSetT
11970 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
11980 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 70 4f 75 74  M_Int);.    pOut
11990 2d 3e 75 2e 69 20 3d 20 72 65 73 32 3b 0a 20 20  ->u.i = res2;.  
119a0 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
119b0 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b  (pOp->p2, pOut);
119c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
119d0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65  beBranchTaken(re
119e0 73 32 21 3d 30 2c 20 28 70 4f 70 2d 3e 70 35 20  s2!=0, (pOp->p5 
119f0 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  & SQLITE_NULLEQ)
11a00 3f 32 3a 33 29 3b 0a 20 20 20 20 69 66 28 20 72  ?2:3);.    if( r
11a10 65 73 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  es2 ){.      got
11a20 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
11a30 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
11a40 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45  .}../* Opcode: E
11a50 6c 73 65 4e 6f 74 45 71 20 2a 20 50 32 20 2a 20  lseNotEq * P2 * 
11a60 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  * *.**.** This o
11a70 70 63 6f 64 65 20 6d 75 73 74 20 69 6d 6d 65 64  pcode must immed
11a80 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 61 6e  iately follow an
11a90 20 4f 50 5f 4c 74 20 6f 72 20 4f 50 5f 47 74 20   OP_Lt or OP_Gt 
11aa0 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
11ab0 74 6f 72 2e 0a 2a 2a 20 49 66 20 72 65 73 75 6c  tor..** If resul
11ac0 74 20 6f 66 20 61 6e 20 4f 50 5f 45 71 20 63 6f  t of an OP_Eq co
11ad0 6d 70 61 72 69 73 6f 6e 20 6f 6e 20 74 68 65 20  mparison on the 
11ae0 73 61 6d 65 20 74 77 6f 20 6f 70 65 72 61 6e 64  same two operand
11af0 73 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  s.** would have 
11b00 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65  be NULL or false
11b10 20 28 30 29 2c 20 74 68 65 6e 20 74 68 65 6e 20   (0), then then 
11b20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 20  jump to P2. .** 
11b30 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  If the result of
11b40 20 61 6e 20 4f 50 5f 45 71 20 63 6f 6d 70 61 72   an OP_Eq compar
11b50 69 73 6f 6e 20 6f 6e 20 74 68 65 20 74 77 6f 20  ison on the two 
11b60 70 72 65 76 69 6f 75 73 20 6f 70 65 72 61 6e 64  previous operand
11b70 73 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  s.** would have 
11b80 62 65 65 6e 20 74 72 75 65 20 28 31 29 2c 20 74  been true (1), t
11b90 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
11ba0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 6c 73  ..*/.case OP_Els
11bb0 65 4e 6f 74 45 71 3a 20 7b 20 20 20 20 20 20 20  eNotEq: {       
11bc0 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 45 53  /* same as TK_ES
11bd0 43 41 50 45 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20  CAPE, jump */.  
11be0 61 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70 20  assert( pOp>aOp 
11bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
11c00 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
11c10 4c 74 20 7c 7c 20 70 4f 70 5b 2d 31 5d 2e 6f 70  Lt || pOp[-1].op
11c20 63 6f 64 65 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  code==OP_Gt );. 
11c30 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
11c40 2e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f  .p5 & SQLITE_STO
11c50 52 45 50 32 20 29 3b 0a 20 20 56 64 62 65 42 72  REP2 );.  VdbeBr
11c60 61 6e 63 68 54 61 6b 65 6e 28 69 43 6f 6d 70 61  anchTaken(iCompa
11c70 72 65 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28  re!=0, 2);.  if(
11c80 20 69 43 6f 6d 70 61 72 65 21 3d 30 20 29 20 67   iCompare!=0 ) g
11c90 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
11ca0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
11cb0 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75 74 61 74  Opcode: Permutat
11cc0 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a  ion * * * P4 *.*
11cd0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 65 72  *.** Set the per
11ce0 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 62 79  mutation used by
11cf0 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 20   the OP_Compare 
11d00 6f 70 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  operator in the 
11d10 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74  next.** instruct
11d20 69 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74  ion.  The permut
11d30 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20  ation is stored 
11d40 69 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  in the P4 operan
11d50 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72  d..**.** The per
11d60 6d 75 74 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  mutation is only
11d70 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
11d80 20 6e 65 78 74 20 4f 50 5f 43 6f 6d 70 61 72 65   next OP_Compare
11d90 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 74 68 65   that has.** the
11da0 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20   OPFLAG_PERMUTE 
11db0 62 69 74 20 73 65 74 20 69 6e 20 50 35 2e 20 54  bit set in P5. T
11dc0 79 70 69 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f  ypically the OP_
11dd0 50 65 72 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75  Permutation shou
11de0 6c 64 20 0a 2a 2a 20 6f 63 63 75 72 20 69 6d 6d  ld .** occur imm
11df0 65 64 69 61 74 65 6c 79 20 70 72 69 6f 72 20 74  ediately prior t
11e00 6f 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65  o the OP_Compare
11e10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
11e20 74 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65  t integer in the
11e30 20 50 34 20 69 6e 74 65 67 65 72 20 61 72 72 61   P4 integer arra
11e40 79 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20  y is the length 
11e50 6f 66 20 74 68 65 20 61 72 72 61 79 0a 2a 2a 20  of the array.** 
11e60 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 62 65 63  and does not bec
11e70 6f 6d 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  ome part of the 
11e80 70 65 72 6d 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  permutation..*/.
11e90 63 61 73 65 20 4f 50 5f 50 65 72 6d 75 74 61 74  case OP_Permutat
11ea0 69 6f 6e 3a 20 7b 0a 20 20 61 73 73 65 72 74 28  ion: {.  assert(
11eb0 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
11ec0 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a 20 20 61  _INTARRAY );.  a
11ed0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 61  ssert( pOp->p4.a
11ee0 69 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  i );.  assert( p
11ef0 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  Op[1].opcode==OP
11f00 5f 43 6f 6d 70 61 72 65 20 29 3b 0a 20 20 61 73  _Compare );.  as
11f10 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 35 20  sert( pOp[1].p5 
11f20 26 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  & OPFLAG_PERMUTE
11f30 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   );.  break;.}..
11f40 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6d 70 61  /* Opcode: Compa
11f50 72 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  re P1 P2 P3 P4 P
11f60 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  5.** Synopsis: r
11f70 5b 50 31 40 50 33 5d 20 3c 2d 3e 20 72 5b 50 32  [P1@P3] <-> r[P2
11f80 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  @P3].**.** Compa
11f90 72 65 20 74 77 6f 20 76 65 63 74 6f 72 73 20 6f  re two vectors o
11fa0 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 72  f registers in r
11fb0 65 67 28 50 31 29 2e 2e 72 65 67 28 50 31 2b 50  eg(P1)..reg(P1+P
11fc0 33 2d 31 29 20 28 63 61 6c 6c 20 74 68 69 73 0a  3-1) (call this.
11fd0 2a 2a 20 76 65 63 74 6f 72 20 22 41 22 29 20 61  ** vector "A") a
11fe0 6e 64 20 69 6e 20 72 65 67 28 50 32 29 2e 2e 72  nd in reg(P2)..r
11ff0 65 67 28 50 32 2b 50 33 2d 31 29 20 28 22 42 22  eg(P2+P3-1) ("B"
12000 29 2e 20 20 53 61 76 65 20 74 68 65 20 72 65 73  ).  Save the res
12010 75 6c 74 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  ult of.** the co
12020 6d 70 61 72 69 73 6f 6e 20 66 6f 72 20 75 73 65  mparison for use
12030 20 62 79 20 74 68 65 20 6e 65 78 74 20 4f 50 5f   by the next OP_
12040 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a  Jump instruct..*
12050 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73 20 74  *.** If P5 has t
12060 68 65 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  he OPFLAG_PERMUT
12070 45 20 62 69 74 20 73 65 74 2c 20 74 68 65 6e 20  E bit set, then 
12080 74 68 65 20 6f 72 64 65 72 20 6f 66 20 63 6f 6d  the order of com
12090 70 61 72 69 73 6f 6e 20 69 73 0a 2a 2a 20 64 65  parison is.** de
120a0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
120b0 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f 50 5f 50  most recent OP_P
120c0 65 72 6d 75 74 61 74 69 6f 6e 20 6f 70 65 72 61  ermutation opera
120d0 74 6f 72 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  tor.  If the.** 
120e0 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62  OPFLAG_PERMUTE b
120f0 69 74 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65  it is clear, the
12100 6e 20 72 65 67 69 73 74 65 72 20 61 72 65 20 63  n register are c
12110 6f 6d 70 61 72 65 64 20 69 6e 20 73 65 71 75 65  ompared in seque
12120 6e 74 69 61 6c 0a 2a 2a 20 6f 72 64 65 72 2e 0a  ntial.** order..
12130 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 4b 65  **.** P4 is a Ke
12140 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
12150 74 68 61 74 20 64 65 66 69 6e 65 73 20 63 6f 6c  that defines col
12160 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
12170 20 61 6e 64 20 73 6f 72 74 0a 2a 2a 20 6f 72 64   and sort.** ord
12180 65 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  ers for the comp
12190 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 70 65 72  arison.  The per
121a0 6d 75 74 61 74 69 6f 6e 20 61 70 70 6c 69 65 73  mutation applies
121b0 20 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a   to registers.**
121c0 20 6f 6e 6c 79 2e 20 20 54 68 65 20 4b 65 79 49   only.  The KeyI
121d0 6e 66 6f 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  nfo elements are
121e0 20 75 73 65 64 20 73 65 71 75 65 6e 74 69 61 6c   used sequential
121f0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ly..**.** The co
12200 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 73 6f  mparison is a so
12210 72 74 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 73  rt comparison, s
12220 6f 20 4e 55 4c 4c 73 20 63 6f 6d 70 61 72 65 20  o NULLs compare 
12230 65 71 75 61 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20  equal,.** NULLs 
12240 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 75  are less than nu
12250 6d 62 65 72 73 2c 20 6e 75 6d 62 65 72 73 20 61  mbers, numbers a
12260 72 65 20 6c 65 73 73 20 74 68 61 6e 20 73 74 72  re less than str
12270 69 6e 67 73 2c 0a 2a 2a 20 61 6e 64 20 73 74 72  ings,.** and str
12280 69 6e 67 73 20 61 72 65 20 6c 65 73 73 20 74 68  ings are less th
12290 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73  an blobs..*/.cas
122a0 65 20 4f 50 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a  e OP_Compare: {.
122b0 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69    int n;.  int i
122c0 3b 0a 20 20 69 6e 74 20 70 31 3b 0a 20 20 69 6e  ;.  int p1;.  in
122d0 74 20 70 32 3b 0a 20 20 63 6f 6e 73 74 20 4b 65  t p2;.  const Ke
122e0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
122f0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 43 6f  .  int idx;.  Co
12300 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
12310 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
12320 71 75 65 6e 63 65 20 74 6f 20 75 73 65 20 6f 6e  quence to use on
12330 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
12340 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
12350 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 44     /* True for D
12360 45 53 43 45 4e 44 49 4e 47 20 73 6f 72 74 20 6f  ESCENDING sort o
12370 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  rder */.  int *a
12380 50 65 72 6d 75 74 65 3b 20 20 20 20 20 2f 2a 20  Permute;     /* 
12390 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  The permutation 
123a0 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e  */..  if( (pOp->
123b0 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 45 52 4d  p5 & OPFLAG_PERM
123c0 55 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  UTE)==0 ){.    a
123d0 50 65 72 6d 75 74 65 20 3d 20 30 3b 0a 20 20 7d  Permute = 0;.  }
123e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
123f0 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 20  ( pOp>aOp );.   
12400 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
12410 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 65 72 6d  .opcode==OP_Perm
12420 75 74 61 74 69 6f 6e 20 29 3b 0a 20 20 20 20 61  utation );.    a
12430 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70  ssert( pOp[-1].p
12440 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52  4type==P4_INTARR
12450 41 59 20 29 3b 0a 20 20 20 20 61 50 65 72 6d 75  AY );.    aPermu
12460 74 65 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e  te = pOp[-1].p4.
12470 61 69 20 2b 20 31 3b 0a 20 20 20 20 61 73 73 65  ai + 1;.    asse
12480 72 74 28 20 61 50 65 72 6d 75 74 65 21 3d 30 20  rt( aPermute!=0 
12490 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 70 4f 70  );.  }.  n = pOp
124a0 2d 3e 70 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f  ->p3;.  pKeyInfo
124b0 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
124c0 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  nfo;.  assert( n
124d0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
124e0 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20  pKeyInfo!=0 );. 
124f0 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20   p1 = pOp->p1;. 
12500 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23   p2 = pOp->p2;.#
12510 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
12520 55 47 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  UG.  if( aPermut
12530 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20  e ){.    int k, 
12540 6d 78 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  mx = 0;.    for(
12550 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 20 69  k=0; k<n; k++) i
12560 66 28 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3e 6d  f( aPermute[k]>m
12570 78 20 29 20 6d 78 20 3d 20 61 50 65 72 6d 75 74  x ) mx = aPermut
12580 65 5b 6b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e[k];.    assert
12590 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6d 78 3c  ( p1>0 && p1+mx<
125a0 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
125b0 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20  >nCursor)+1 );. 
125c0 20 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20     assert( p2>0 
125d0 26 26 20 70 32 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d  && p2+mx<=(p->nM
125e0 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
125f0 72 29 2b 31 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  r)+1 );.  }else{
12600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
12610 30 20 26 26 20 70 31 2b 6e 3c 3d 28 70 2d 3e 6e  0 && p1+n<=(p->n
12620 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
12630 6f 72 29 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  or)+1 );.    ass
12640 65 72 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b  ert( p2>0 && p2+
12650 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  n<=(p->nMem+1 - 
12660 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
12670 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
12680 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 20  QLITE_DEBUG */. 
12690 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
126a0 2b 2b 29 7b 0a 20 20 20 20 69 64 78 20 3d 20 61  ++){.    idx = a
126b0 50 65 72 6d 75 74 65 20 3f 20 61 50 65 72 6d 75  Permute ? aPermu
126c0 74 65 5b 69 5d 20 3a 20 69 3b 0a 20 20 20 20 61  te[i] : i;.    a
126d0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
126e0 64 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29  d(&aMem[p1+idx])
126f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12700 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d  memIsValid(&aMem
12710 5b 70 32 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20  [p2+idx]) );.   
12720 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
12730 70 31 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 31  p1+idx, &aMem[p1
12740 2b 69 64 78 5d 29 3b 0a 20 20 20 20 52 45 47 49  +idx]);.    REGI
12750 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b 69 64  STER_TRACE(p2+id
12760 78 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d  x, &aMem[p2+idx]
12770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
12780 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  <pKeyInfo->nKeyF
12790 69 65 6c 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c  ield );.    pCol
127a0 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
127b0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76  oll[i];.    bRev
127c0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
127d0 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
127e0 69 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  iCompare = sqlit
127f0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d  e3MemCompare(&aM
12800 65 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65  em[p1+idx], &aMe
12810 6d 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c  m[p2+idx], pColl
12820 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d 70  );.    if( iComp
12830 61 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  are ){.      if(
12840 20 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72 65   bRev ) iCompare
12850 20 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20   = -iCompare;.  
12860 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12870 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
12880 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70  ./* Opcode: Jump
12890 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
128a0 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20  .** Jump to the 
128b0 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61  instruction at a
128c0 64 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20 6f  ddress P1, P2, o
128d0 72 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20 6f  r P3 depending o
128e0 6e 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20  n whether.** in 
128f0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
12900 4f 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74 72  OP_Compare instr
12910 75 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76 65  uction the P1 ve
12920 63 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74 68  ctor was less th
12930 61 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20  an.** equal to, 
12940 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
12950 74 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20 72  the P2 vector, r
12960 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a  espectively..*/.
12970 63 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20  case OP_Jump: { 
12980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
12990 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  ump */.  if( iCo
129a0 6d 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20 56  mpare<0 ){.    V
129b0 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 30  dbeBranchTaken(0
129c0 2c 34 29 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b  ,4); pOp = &aOp[
129d0 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20  pOp->p1 - 1];.  
129e0 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6d 70 61  }else if( iCompa
129f0 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  re==0 ){.    Vdb
12a00 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 34  eBranchTaken(1,4
12a10 29 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f  ); pOp = &aOp[pO
12a20 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20 7d 65  p->p2 - 1];.  }e
12a30 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61  lse{.    VdbeBra
12a40 6e 63 68 54 61 6b 65 6e 28 32 2c 34 29 3b 20 70  nchTaken(2,4); p
12a50 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70  Op = &aOp[pOp->p
12a60 33 20 2d 20 31 5d 3b 0a 20 20 7d 0a 20 20 62 72  3 - 1];.  }.  br
12a70 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
12a80 65 3a 20 41 6e 64 20 50 31 20 50 32 20 50 33 20  e: And P1 P2 P3 
12a90 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
12aa0 20 72 5b 50 33 5d 3d 28 72 5b 50 31 5d 20 26 26   r[P3]=(r[P1] &&
12ab0 20 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61   r[P2]).**.** Ta
12ac0 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 41  ke the logical A
12ad0 4e 44 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  ND of the values
12ae0 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 50 31   in registers P1
12af0 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 77   and P2 and.** w
12b00 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 20  rite the result 
12b10 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33  into register P3
12b20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
12b30 72 20 50 31 20 6f 72 20 50 32 20 69 73 20 30 20  r P1 or P2 is 0 
12b40 28 66 61 6c 73 65 29 20 74 68 65 6e 20 74 68 65  (false) then the
12b50 20 72 65 73 75 6c 74 20 69 73 20 30 20 65 76 65   result is 0 eve
12b60 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65  n if.** the othe
12b70 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e  r input is NULL.
12b80 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 74 72 75    A NULL and tru
12b90 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 20 67  e or two NULLs g
12ba0 69 76 65 0a 2a 2a 20 61 20 4e 55 4c 4c 20 6f 75  ive.** a NULL ou
12bb0 74 70 75 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  tput..*/./* Opco
12bc0 64 65 3a 20 4f 72 20 50 31 20 50 32 20 50 33 20  de: Or P1 P2 P3 
12bd0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
12be0 20 72 5b 50 33 5d 3d 28 72 5b 50 31 5d 20 7c 7c   r[P3]=(r[P1] ||
12bf0 20 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61   r[P2]).**.** Ta
12c00 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f  ke the logical O
12c10 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  R of the values 
12c20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
12c30 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f  nd P2 and.** sto
12c40 72 65 20 74 68 65 20 61 6e 73 77 65 72 20 69 6e  re the answer in
12c50 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
12c60 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 31  .** If either P1
12c70 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72   or P2 is nonzer
12c80 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20 74 68  o (true) then th
12c90 65 20 72 65 73 75 6c 74 20 69 73 20 31 20 28 74  e result is 1 (t
12ca0 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20  rue).** even if 
12cb0 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20  the other input 
12cc0 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c  is NULL.  A NULL
12cd0 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20 74 77   and false or tw
12ce0 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20  o NULLs.** give 
12cf0 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a  a NULL output..*
12d00 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20  /.case OP_And:  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
12d20 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69  ame as TK_AND, i
12d30 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
12d40 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20  .case OP_Or: {  
12d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
12d60 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31  me as TK_OR, in1
12d70 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
12d80 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c   int v1;    /* L
12d90 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d  eft operand:  0=
12da0 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c  =FALSE, 1==TRUE,
12db0 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
12dc0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b  ULL */.  int v2;
12dd0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
12de0 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20  rand: 0==FALSE, 
12df0 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e  1==TRUE, 2==UNKN
12e00 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a  OWN or NULL */..
12e10 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 64    v1 = sqlite3Vd
12e20 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 26  beBooleanValue(&
12e30 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 32  aMem[pOp->p1], 2
12e40 29 3b 0a 20 20 76 32 20 3d 20 73 71 6c 69 74 65  );.  v2 = sqlite
12e50 33 56 64 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75  3VdbeBooleanValu
12e60 65 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  e(&aMem[pOp->p2]
12e70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  , 2);.  if( pOp-
12e80 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20  >opcode==OP_And 
12e90 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
12ea0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12eb0 72 20 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20  r and_logic[] = 
12ec0 7b 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c  { 0, 0, 0, 0, 1,
12ed0 20 32 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20   2, 0, 2, 2 };. 
12ee0 20 20 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69     v1 = and_logi
12ef0 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65  c[v1*3+v2];.  }e
12f00 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
12f10 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
12f20 68 61 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d  har or_logic[] =
12f30 20 7b 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31   { 0, 1, 2, 1, 1
12f40 2c 20 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a  , 1, 2, 1, 2 };.
12f50 20 20 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69      v1 = or_logi
12f60 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a  c[v1*3+v2];.  }.
12f70 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
12f80 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76  Op->p3];.  if( v
12f90 31 3d 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53  1==2 ){.    MemS
12fa0 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
12fb0 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65   MEM_Null);.  }e
12fc0 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  lse{.    pOut->u
12fd0 2e 69 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d  .i = v1;.    Mem
12fe0 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
12ff0 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a  , MEM_Int);.  }.
13000 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
13010 70 63 6f 64 65 3a 20 49 73 54 72 75 65 20 50 31  pcode: IsTrue P1
13020 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53   P2 P3 P4 *.** S
13030 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 20 3d  ynopsis: r[P2] =
13040 20 63 6f 61 6c 65 73 63 65 28 72 5b 50 31 5d 3d   coalesce(r[P1]=
13050 3d 54 52 55 45 2c 50 33 29 20 5e 20 50 34 0a 2a  =TRUE,P3) ^ P4.*
13060 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
13070 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
13080 49 53 20 54 52 55 45 2c 20 49 53 20 46 41 4c 53  IS TRUE, IS FALS
13090 45 2c 20 49 53 20 4e 4f 54 20 54 52 55 45 2c 20  E, IS NOT TRUE, 
130a0 61 6e 64 0a 2a 2a 20 49 53 20 4e 4f 54 20 46 41  and.** IS NOT FA
130b0 4c 53 45 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  LSE operators..*
130c0 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74  *.** Interpret t
130d0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
130e0 73 74 65 72 20 50 31 20 61 73 20 61 20 62 6f 6f  ster P1 as a boo
130f0 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 53 74 6f  lean value.  Sto
13100 72 65 20 74 68 61 74 0a 2a 2a 20 62 6f 6f 6c 65  re that.** boole
13110 61 6e 20 28 61 20 30 20 6f 72 20 31 29 20 69 6e  an (a 0 or 1) in
13120 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 4f   register P2.  O
13130 72 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  r if the value i
13140 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
13150 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   .** NULL, then 
13160 74 68 65 20 50 33 20 69 73 20 73 74 6f 72 65 64  the P3 is stored
13170 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
13180 20 20 49 6e 76 65 72 74 20 74 68 65 20 61 6e 73    Invert the ans
13190 77 65 72 20 69 66 20 50 34 0a 2a 2a 20 69 73 20  wer if P4.** is 
131a0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 67  1..**.** The log
131b0 69 63 20 69 73 20 73 75 6d 6d 61 72 69 7a 65 64  ic is summarized
131c0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
131d0 2a 20 3c 75 6c 3e 20 0a 2a 2a 20 3c 6c 69 3e 20  * <ul> .** <li> 
131e0 49 66 20 50 33 3d 3d 30 20 61 6e 64 20 50 34 3d  If P3==0 and P4=
131f0 3d 30 20 20 74 68 65 6e 20 20 72 5b 50 32 5d 20  =0  then  r[P2] 
13200 3a 3d 20 72 5b 50 31 5d 20 49 53 20 54 52 55 45  := r[P1] IS TRUE
13210 0a 2a 2a 20 3c 6c 69 3e 20 49 66 20 50 33 3d 3d  .** <li> If P3==
13220 31 20 61 6e 64 20 50 34 3d 3d 31 20 20 74 68 65  1 and P4==1  the
13230 6e 20 20 72 5b 50 32 5d 20 3a 3d 20 72 5b 50 31  n  r[P2] := r[P1
13240 5d 20 49 53 20 46 41 4c 53 45 0a 2a 2a 20 3c 6c  ] IS FALSE.** <l
13250 69 3e 20 49 66 20 50 33 3d 3d 30 20 61 6e 64 20  i> If P3==0 and 
13260 50 34 3d 3d 31 20 20 74 68 65 6e 20 20 72 5b 50  P4==1  then  r[P
13270 32 5d 20 3a 3d 20 72 5b 50 31 5d 20 49 53 20 4e  2] := r[P1] IS N
13280 4f 54 20 54 52 55 45 0a 2a 2a 20 3c 6c 69 3e 20  OT TRUE.** <li> 
13290 49 66 20 50 33 3d 3d 31 20 61 6e 64 20 50 34 3d  If P3==1 and P4=
132a0 3d 30 20 20 74 68 65 6e 20 20 72 5b 50 32 5d 20  =0  then  r[P2] 
132b0 3a 3d 20 72 5b 50 31 5d 20 49 53 20 4e 4f 54 20  := r[P1] IS NOT 
132c0 46 41 4c 53 45 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a  FALSE.** </ul>.*
132d0 2f 0a 63 61 73 65 20 4f 50 5f 49 73 54 72 75 65  /.case OP_IsTrue
132e0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
132f0 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32 20 2a    /* in1, out2 *
13300 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
13310 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
13320 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
13330 4f 70 2d 3e 70 34 2e 69 3d 3d 30 20 7c 7c 20 70  Op->p4.i==0 || p
13340 4f 70 2d 3e 70 34 2e 69 3d 3d 31 20 29 3b 0a 20  Op->p4.i==1 );. 
13350 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
13360 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 || pOp->p3==
13370 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  1 );.  sqlite3Vd
13380 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61  beMemSetInt64(&a
13390 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 2c 0a 20 20  Mem[pOp->p2],.  
133a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 42      sqlite3VdbeB
133b0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 26 61 4d 65  ooleanValue(&aMe
133c0 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 70 4f 70 2d  m[pOp->p1], pOp-
133d0 3e 70 33 29 20 5e 20 70 4f 70 2d 3e 70 34 2e 69  >p3) ^ pOp->p4.i
133e0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
133f0 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31  * Opcode: Not P1
13400 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
13410 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 20 21 72  opsis: r[P2]= !r
13420 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  [P1].**.** Inter
13430 70 72 65 74 20 74 68 65 20 76 61 6c 75 65 20 69  pret the value i
13440 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73  n register P1 as
13450 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
13460 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20  .  Store the.** 
13470 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65  boolean compleme
13480 6e 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  nt in register P
13490 32 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65  2.  If the value
134a0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
134b0 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  is .** NULL, the
134c0 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72  n a NULL is stor
134d0 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73  ed in P2..*/.cas
134e0 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20  e OP_Not: {     
134f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
13500 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e  me as TK_NOT, in
13510 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e  1, out2 */.  pIn
13520 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
13530 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  1];.  pOut = &aM
13540 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69  em[pOp->p2];.  i
13550 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
13560 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
13570 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
13580 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4f 75  eMemSetInt64(pOu
13590 74 2c 20 21 73 71 6c 69 74 65 33 56 64 62 65 42  t, !sqlite3VdbeB
135a0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 70 49 6e 31  ooleanValue(pIn1
135b0 2c 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ,0));.  }else{. 
135c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
135d0 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
135e0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
135f0 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 4e 6f  /* Opcode: BitNo
13600 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
13610 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
13620 3d 20 7e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49  = ~r[P1].**.** I
13630 6e 74 65 72 70 72 65 74 20 74 68 65 20 63 6f 6e  nterpret the con
13640 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
13650 20 50 31 20 61 73 20 61 6e 20 69 6e 74 65 67 65   P1 as an intege
13660 72 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a  r.  Store the.**
13670 20 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   ones-complement
13680 20 6f 66 20 74 68 65 20 50 31 20 76 61 6c 75 65   of the P1 value
13690 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
136a0 32 2e 20 20 49 66 20 50 31 20 68 6f 6c 64 73 0a  2.  If P1 holds.
136b0 2a 2a 20 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73  ** a NULL then s
136c0 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50  tore a NULL in P
136d0 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69  2..*/.case OP_Bi
136e0 74 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20  tNot: {         
136f0 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
13700 4b 5f 42 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f  K_BITNOT, in1, o
13710 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  ut2 */.  pIn1 = 
13720 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
13730 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
13740 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74  Op->p2];.  sqlit
13750 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
13760 28 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 28 70  (pOut);.  if( (p
13770 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
13780 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  _Null)==0 ){.   
13790 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
137a0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74  EM_Int;.    pOut
137b0 2d 3e 75 2e 69 20 3d 20 7e 73 71 6c 69 74 65 33  ->u.i = ~sqlite3
137c0 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
137d0 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  1);.  }.  break;
137e0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
137f0 6e 63 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  nce P1 P2 * * *.
13800 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68 72 6f 75  **.** Fall throu
13810 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
13820 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66  nstruction the f
13830 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 6f  irst time this o
13840 70 63 6f 64 65 20 69 73 0a 2a 2a 20 65 6e 63 6f  pcode is.** enco
13850 75 6e 74 65 72 65 64 20 6f 6e 20 65 61 63 68 20  untered on each 
13860 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
13870 65 20 62 79 74 65 2d 63 6f 64 65 20 70 72 6f 67  e byte-code prog
13880 72 61 6d 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32  ram.  Jump to P2
13890 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  .** on the secon
138a0 64 20 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  d and all subseq
138b0 75 65 6e 74 20 65 6e 63 6f 75 6e 74 65 72 73 20  uent encounters 
138c0 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20  during the same 
138d0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  invocation..**.*
138e0 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 70 72 6f 67  * Top-level prog
138f0 72 61 6d 73 20 64 65 74 65 72 6d 69 6e 65 20 66  rams determine f
13900 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
13910 62 79 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  by comparing the
13920 20 50 31 0a 2a 2a 20 6f 70 65 72 61 6e 64 20 61   P1.** operand a
13930 67 61 69 6e 73 74 20 74 68 65 20 50 31 20 6f 70  gainst the P1 op
13940 65 72 61 6e 64 20 6f 6e 20 74 68 65 20 4f 50 5f  erand on the OP_
13950 49 6e 69 74 20 6f 70 63 6f 64 65 20 61 74 20 74  Init opcode at t
13960 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  he beginning.** 
13970 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
13980 20 49 66 20 74 68 65 20 50 31 20 76 61 6c 75 65   If the P1 value
13990 73 20 64 69 66 66 65 72 2c 20 74 68 65 6e 20 66  s differ, then f
139a0 61 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e 64 20  all through and 
139b0 6d 61 6b 65 0a 2a 2a 20 74 68 65 20 50 31 20 6f  make.** the P1 o
139c0 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20 65 71  f this opcode eq
139d0 75 61 6c 20 74 6f 20 74 68 65 20 50 31 20 6f 66  ual to the P1 of
139e0 20 4f 50 5f 49 6e 69 74 2e 20 20 49 66 20 50 31   OP_Init.  If P1
139f0 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 74   values are.** t
13a00 68 65 20 73 61 6d 65 20 74 68 65 6e 20 74 61 6b  he same then tak
13a10 65 20 74 68 65 20 6a 75 6d 70 2e 0a 2a 2a 0a 2a  e the jump..**.*
13a20 2a 20 46 6f 72 20 73 75 62 70 72 6f 67 72 61 6d  * For subprogram
13a30 73 2c 20 74 68 65 72 65 20 69 73 20 61 20 62 69  s, there is a bi
13a40 74 6d 61 73 6b 20 69 6e 20 74 68 65 20 56 64 62  tmask in the Vdb
13a50 65 46 72 61 6d 65 20 74 68 61 74 20 64 65 74 65  eFrame that dete
13a60 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65  rmines.** whethe
13a70 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 75 6d  r or not the jum
13a80 70 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65  p should be take
13a90 6e 2e 20 20 54 68 65 20 62 69 74 6d 61 73 6b 20  n.  The bitmask 
13aa0 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20  is necessary.** 
13ab0 62 65 63 61 75 73 65 20 74 68 65 20 73 65 6c 66  because the self
13ac0 2d 61 6c 74 65 72 69 6e 67 20 63 6f 64 65 20 74  -altering code t
13ad0 72 69 63 6b 20 64 6f 65 73 20 6e 6f 74 20 77 6f  rick does not wo
13ae0 72 6b 20 66 6f 72 20 72 65 63 75 72 73 69 76 65  rk for recursive
13af0 0a 2a 2a 20 74 72 69 67 67 65 72 73 2e 0a 2a 2f  .** triggers..*/
13b00 0a 63 61 73 65 20 4f 50 5f 4f 6e 63 65 3a 20 7b  .case OP_Once: {
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b20 6a 75 6d 70 20 2a 2f 0a 20 20 75 33 32 20 69 41  jump */.  u32 iA
13b30 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
13b40 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13b50 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
13b60 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  on */.  assert( 
13b70 70 2d 3e 61 4f 70 5b 30 5d 2e 6f 70 63 6f 64 65  p->aOp[0].opcode
13b80 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 69  ==OP_Init );.  i
13b90 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
13ba0 20 20 20 20 69 41 64 64 72 20 3d 20 28 69 6e 74      iAddr = (int
13bb0 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 3b  )(pOp - p->aOp);
13bc0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 46 72  .    if( (p->pFr
13bd0 61 6d 65 2d 3e 61 4f 6e 63 65 5b 69 41 64 64 72  ame->aOnce[iAddr
13be0 2f 38 5d 20 26 20 28 31 3c 3c 28 69 41 64 64 72  /8] & (1<<(iAddr
13bf0 20 26 20 37 29 29 29 21 3d 30 20 29 7b 0a 20 20   & 7)))!=0 ){.  
13c00 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
13c10 6b 65 6e 28 31 2c 20 32 29 3b 0a 20 20 20 20 20  ken(1, 2);.     
13c20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
13c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
13c40 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 5b 69 41 64  Frame->aOnce[iAd
13c50 64 72 2f 38 5d 20 7c 3d 20 31 3c 3c 28 69 41 64  dr/8] |= 1<<(iAd
13c60 64 72 20 26 20 37 29 3b 0a 20 20 7d 65 6c 73 65  dr & 7);.  }else
13c70 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4f 70  {.    if( p->aOp
13c80 5b 30 5d 2e 70 31 3d 3d 70 4f 70 2d 3e 70 31 20  [0].p1==pOp->p1 
13c90 29 7b 0a 20 20 20 20 20 20 56 64 62 65 42 72 61  ){.      VdbeBra
13ca0 6e 63 68 54 61 6b 65 6e 28 31 2c 20 32 29 3b 0a  nchTaken(1, 2);.
13cb0 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f        goto jump_
13cc0 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  to_p2;.    }.  }
13cd0 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
13ce0 65 6e 28 30 2c 20 32 29 3b 0a 20 20 70 4f 70 2d  en(0, 2);.  pOp-
13cf0 3e 70 31 20 3d 20 70 2d 3e 61 4f 70 5b 30 5d 2e  >p1 = p->aOp[0].
13d00 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p1;.  break;.}..
13d10 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 20 50 31  /* Opcode: If P1
13d20 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
13d30 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
13d40 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
13d50 73 74 65 72 20 50 31 20 69 73 20 74 72 75 65 2e  ster P1 is true.
13d60 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69    The value.** i
13d70 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75  s considered tru
13d80 65 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72  e if it is numer
13d90 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e  ic and non-zero.
13da0 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
13db0 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20  * in P1 is NULL 
13dc0 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
13dd0 6d 70 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  mp if and only i
13de0 66 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P3 is non-zero
13df0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 3a  ..*/.case OP_If:
13e00 20 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20    {             
13e10 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
13e20 2f 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d  /.  int c;.  c =
13e30 20 73 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c   sqlite3VdbeBool
13e40 65 61 6e 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70  eanValue(&aMem[p
13e50 4f 70 2d 3e 70 31 5d 2c 20 70 4f 70 2d 3e 70 33  Op->p1], pOp->p3
13e60 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
13e70 61 6b 65 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20  aken(c!=0, 2);. 
13e80 20 69 66 28 20 63 20 29 20 67 6f 74 6f 20 6a 75   if( c ) goto ju
13e90 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
13ea0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
13eb0 20 49 66 4e 6f 74 20 50 31 20 50 32 20 50 33 20   IfNot P1 P2 P3 
13ec0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74  * *.**.** Jump t
13ed0 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75  o P2 if the valu
13ee0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
13ef0 20 69 73 20 46 61 6c 73 65 2e 20 20 54 68 65 20   is False.  The 
13f00 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73  value.** is cons
13f10 69 64 65 72 65 64 20 66 61 6c 73 65 20 69 66 20  idered false if 
13f20 69 74 20 68 61 73 20 61 20 6e 75 6d 65 72 69 63  it has a numeric
13f30 20 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f 2e 20   value of zero. 
13f40 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   If the value.**
13f50 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74   in P1 is NULL t
13f60 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  hen take the jum
13f70 70 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  p if and only if
13f80 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e   P3 is non-zero.
13f90 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f  .*/.case OP_IfNo
13fa0 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
13fb0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
13fc0 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 21    int c;.  c = !
13fd0 73 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c 65  sqlite3VdbeBoole
13fe0 61 6e 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70 4f  anValue(&aMem[pO
13ff0 70 2d 3e 70 31 5d 2c 20 21 70 4f 70 2d 3e 70 33  p->p1], !pOp->p3
14000 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
14010 61 6b 65 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20  aken(c!=0, 2);. 
14020 20 69 66 28 20 63 20 29 20 67 6f 74 6f 20 6a 75   if( c ) goto ju
14030 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
14040 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
14050 20 49 73 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20   IsNull P1 P2 * 
14060 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
14070 20 69 66 20 72 5b 50 31 5d 3d 3d 4e 55 4c 4c 20   if r[P1]==NULL 
14080 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75  goto P2.**.** Ju
14090 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
140a0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
140b0 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  r P1 is NULL..*/
140c0 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c 6c 3a  .case OP_IsNull:
140d0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
140e0 20 73 61 6d 65 20 61 73 20 54 4b 5f 49 53 4e 55   same as TK_ISNU
140f0 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f  LL, jump, in1 */
14100 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
14110 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65  pOp->p1];.  Vdbe
14120 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 28 70 49  BranchTaken( (pI
14130 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
14140 4e 75 6c 6c 29 21 3d 30 2c 20 32 29 3b 0a 20 20  Null)!=0, 2);.  
14150 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
14160 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20   & MEM_Null)!=0 
14170 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
14180 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
14190 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
141a0 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50 32  e: NotNull P1 P2
141b0 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
141c0 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d 4e 55  is: if r[P1]!=NU
141d0 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a  LL goto P2.**.**
141e0 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
141f0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
14200 73 74 65 72 20 50 31 20 69 73 20 6e 6f 74 20 4e  ster P1 is not N
14210 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f  ULL.  .*/.case O
14220 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20 20 20  P_NotNull: {    
14230 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
14240 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a  as TK_NOTNULL, j
14250 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  ump, in1 */.  pI
14260 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
14270 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  p1];.  VdbeBranc
14280 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d 3e 66  hTaken( (pIn1->f
14290 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
142a0 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 28  ==0, 2);.  if( (
142b0 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
142c0 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Null)==0 ){.  
142d0 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
142e0 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
142f0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
14300 4e 75 6c 6c 52 6f 77 20 50 31 20 50 32 20 50 33  NullRow P1 P2 P3
14310 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
14320 3a 20 69 66 20 50 31 2e 6e 75 6c 6c 52 6f 77 20  : if P1.nullRow 
14330 74 68 65 6e 20 72 5b 50 33 5d 3d 4e 55 4c 4c 2c  then r[P3]=NULL,
14340 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 43   goto P2.**.** C
14350 68 65 63 6b 20 74 68 65 20 63 75 72 73 6f 72 20  heck the cursor 
14360 50 31 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  P1 to see if it 
14370 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
14380 6e 74 69 6e 67 20 61 74 20 61 20 4e 55 4c 4c 20  nting at a NULL 
14390 72 6f 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  row..** If it is
143a0 2c 20 74 68 65 6e 20 73 65 74 20 72 65 67 69 73  , then set regis
143b0 74 65 72 20 50 33 20 74 6f 20 4e 55 4c 4c 20 61  ter P3 to NULL a
143c0 6e 64 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  nd jump immediat
143d0 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66  ely to P2..** If
143e0 20 50 31 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20   P1 is not on a 
143f0 4e 55 4c 4c 20 72 6f 77 2c 20 74 68 65 6e 20 66  NULL row, then f
14400 61 6c 6c 20 74 68 72 6f 75 67 68 20 77 69 74 68  all through with
14410 6f 75 74 20 6d 61 6b 69 6e 67 20 61 6e 79 0a 2a  out making any.*
14420 2a 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 63 61  * changes..*/.ca
14430 73 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 3a  se OP_IfNullRow:
14440 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75   {         /* ju
14450 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  mp */.  assert( 
14460 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
14470 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
14480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
14490 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21  >apCsr[pOp->p1]!
144a0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
144b0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 6e  pCsr[pOp->p1]->n
144c0 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 73 71  ullRow ){.    sq
144d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
144e0 75 6c 6c 28 61 4d 65 6d 20 2b 20 70 4f 70 2d 3e  ull(aMem + pOp->
144f0 70 33 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  p3);.    goto ju
14500 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
14510 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66  break;.}..#ifdef
14520 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
14530 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f  FFSET_SQL_FUNC./
14540 2a 20 4f 70 63 6f 64 65 3a 20 4f 66 66 73 65 74  * Opcode: Offset
14550 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
14560 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
14570 20 3d 20 73 71 6c 69 74 65 5f 6f 66 66 73 65 74   = sqlite_offset
14580 28 50 31 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65  (P1).**.** Store
14590 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 5b 50   in register r[P
145a0 33 5d 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  3] the byte offs
145b0 65 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  et into the data
145c0 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 69  base file that i
145d0 73 20 74 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f  s the.** start o
145e0 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f  f the payload fo
145f0 72 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 20  r the record at 
14600 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f  which that curso
14610 72 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  r P1 is currentl
14620 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  y.** pointing..*
14630 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 63  *.** P2 is the c
14640 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72  olumn number for
14650 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
14660 20 74 68 65 20 73 71 6c 69 74 65 5f 6f 66 66 73   the sqlite_offs
14670 65 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  et() function..*
14680 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  * This opcode do
14690 65 73 20 6e 6f 74 20 75 73 65 20 50 32 20 69 74  es not use P2 it
146a0 73 65 6c 66 2c 20 62 75 74 20 74 68 65 20 50 32  self, but the P2
146b0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 62   value is used b
146c0 79 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 67 65  y the.** code ge
146d0 6e 65 72 61 74 6f 72 2e 20 20 54 68 65 20 50 31  nerator.  The P1
146e0 2c 20 50 32 2c 20 61 6e 64 20 50 33 20 6f 70 65  , P2, and P3 ope
146f0 72 61 6e 64 73 20 74 6f 20 74 68 69 73 20 6f 70  rands to this op
14700 63 6f 64 65 20 61 72 65 20 74 68 65 0a 2a 2a 20  code are the.** 
14710 73 61 6d 65 20 61 73 20 66 6f 72 20 4f 50 5f 43  same as for OP_C
14720 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  olumn..**.** Thi
14730 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79  s opcode is only
14740 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51   available if SQ
14750 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64  Lite is compiled
14760 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 2d 44 53   with the.** -DS
14770 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46  QLITE_ENABLE_OFF
14780 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20 6f 70 74  SET_SQL_FUNC opt
14790 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
147a0 4f 66 66 73 65 74 3a 20 7b 20 20 20 20 20 20 20  Offset: {       
147b0 20 20 20 2f 2a 20 6f 75 74 33 20 2a 2f 0a 20 20     /* out3 */.  
147c0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20  VdbeCursor *pC; 
147d0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
147e0 75 72 73 6f 72 20 2a 2f 0a 20 20 61 73 73 65 72  ursor */.  asser
147f0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
14800 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
14810 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
14820 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
14830 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d  .  pOut = &p->aM
14840 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
14850 66 28 20 4e 45 56 45 52 28 70 43 3d 3d 30 29 20  f( NEVER(pC==0) 
14860 7c 7c 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21  || pC->eCurType!
14870 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
14880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14890 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
148a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
148b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
148c0 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 73 71 6c  tInt64(pOut, sql
148d0 69 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28  ite3BtreeOffset(
148e0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 29  pC->uc.pCursor))
148f0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
14900 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14910 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f  E_ENABLE_OFFSET_
14920 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20  SQL_FUNC */../* 
14930 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50  Opcode: Column P
14940 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
14950 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
14960 3d 50 58 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  =PX.**.** Interp
14970 72 65 74 20 74 68 65 20 64 61 74 61 20 74 68 61  ret the data tha
14980 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e  t cursor P1 poin
14990 74 73 20 74 6f 20 61 73 20 61 20 73 74 72 75 63  ts to as a struc
149a0 74 75 72 65 20 62 75 69 6c 74 20 75 73 69 6e 67  ture built using
149b0 0a 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 63 6f  .** the MakeReco
149c0 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  rd instruction. 
149d0 20 28 53 65 65 20 74 68 65 20 4d 61 6b 65 52 65   (See the MakeRe
149e0 63 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f 72 20  cord opcode for 
149f0 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e  additional.** in
14a00 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
14a10 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  the format of th
14a20 65 20 64 61 74 61 2e 29 20 20 45 78 74 72 61 63  e data.)  Extrac
14a30 74 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75  t the P2-th colu
14a40 6d 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20  mn.** from this 
14a50 72 65 63 6f 72 64 2e 20 20 49 66 20 74 68 65 72  record.  If ther
14a60 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 74 20  e are less that 
14a70 28 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65  (P2+1) .** value
14a80 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2c  s in the record,
14a90 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e   extract a NULL.
14aa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
14ab0 20 65 78 74 72 61 63 74 65 64 20 69 73 20 73 74   extracted is st
14ac0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
14ad0 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P3..**.** If th
14ae0 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e  e record contain
14af0 73 20 66 65 77 65 72 20 74 68 61 6e 20 50 32 20  s fewer than P2 
14b00 66 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 78 74  fields, then ext
14b10 72 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72  ract a NULL.  Or
14b20 2c 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 20 61  ,.** if the P4 a
14b30 72 67 75 6d 65 6e 74 20 69 73 20 61 20 50 34 5f  rgument is a P4_
14b40 4d 45 4d 20 75 73 65 20 74 68 65 20 76 61 6c 75  MEM use the valu
14b50 65 20 6f 66 20 74 68 65 20 50 34 20 61 72 67 75  e of the P4 argu
14b60 6d 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 20 72  ment as.** the r
14b70 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
14b80 74 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  the OPFLAG_CLEAR
14b90 43 41 43 48 45 20 62 69 74 20 69 73 20 73 65 74  CACHE bit is set
14ba0 20 6f 6e 20 50 35 20 61 6e 64 20 50 31 20 69 73   on P5 and P1 is
14bb0 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20   a pseudo-table 
14bc0 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20  cursor,.** then 
14bd0 74 68 65 20 63 61 63 68 65 20 6f 66 20 74 68 65  the cache of the
14be0 20 63 75 72 73 6f 72 20 69 73 20 72 65 73 65 74   cursor is reset
14bf0 20 70 72 69 6f 72 20 74 6f 20 65 78 74 72 61 63   prior to extrac
14c00 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  ting the column.
14c10 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 4f 50  .** The first OP
14c20 5f 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20  _Column against 
14c30 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 61  a pseudo-table a
14c40 66 74 65 72 20 74 68 65 20 76 61 6c 75 65 20 6f  fter the value o
14c50 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  f the content.**
14c60 20 72 65 67 69 73 74 65 72 20 68 61 73 20 63 68   register has ch
14c70 61 6e 67 65 64 20 73 68 6f 75 6c 64 20 68 61 76  anged should hav
14c80 65 20 74 68 69 73 20 62 69 74 20 73 65 74 2e 0a  e this bit set..
14c90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
14ca0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e  LAG_LENGTHARG an
14cb0 64 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  d OPFLAG_TYPEOFA
14cc0 52 47 20 62 69 74 73 20 61 72 65 20 73 65 74 20  RG bits are set 
14cd0 6f 6e 20 50 35 20 74 68 65 6e 0a 2a 2a 20 74 68  on P5 then.** th
14ce0 65 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72  e result is guar
14cf0 61 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62  anteed to only b
14d00 65 20 75 73 65 64 20 61 73 20 74 68 65 20 61 72  e used as the ar
14d10 67 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67  gument of a leng
14d20 74 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f  th().** or typeo
14d30 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65  f() function, re
14d40 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
14d50 20 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61 72 67   loading of larg
14d60 65 20 62 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a  e blobs can be.*
14d70 2a 20 73 6b 69 70 70 65 64 20 66 6f 72 20 6c 65  * skipped for le
14d80 6e 67 74 68 28 29 20 61 6e 64 20 61 6c 6c 20 63  ngth() and all c
14d90 6f 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63  ontent loading c
14da0 61 6e 20 62 65 20 73 6b 69 70 70 65 64 20 66 6f  an be skipped fo
14db0 72 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63  r typeof()..*/.c
14dc0 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b  ase OP_Column: {
14dd0 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20  .  int p2;      
14de0 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20        /* column 
14df0 6e 75 6d 62 65 72 20 74 6f 20 72 65 74 72 69 65  number to retrie
14e00 76 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  ve */.  VdbeCurs
14e10 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68  or *pC;    /* Th
14e20 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 2a 2f  e VDBE cursor */
14e30 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
14e40 73 72 3b 20 20 20 2f 2a 20 54 68 65 20 42 54 72  sr;   /* The BTr
14e50 65 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75  ee cursor */.  u
14e60 33 32 20 2a 61 4f 66 66 73 65 74 3b 20 20 20 20  32 *aOffset;    
14e70 20 20 2f 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20    /* aOffset[i] 
14e80 69 73 20 6f 66 66 73 65 74 20 74 6f 20 73 74 61  is offset to sta
14e90 72 74 20 6f 66 20 64 61 74 61 20 66 6f 72 20 69  rt of data for i
14ea0 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  -th column */.  
14eb0 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  int len;        
14ec0 20 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68     /* The length
14ed0 20 6f 66 20 74 68 65 20 73 65 72 69 61 6c 69 7a   of the serializ
14ee0 65 64 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ed data for the 
14ef0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
14f00 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  i;             /
14f10 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
14f20 2f 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20  /.  Mem *pDest; 
14f30 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
14f40 74 6f 20 77 72 69 74 65 20 74 68 65 20 65 78 74  to write the ext
14f50 72 61 63 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a  racted value */.
14f60 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20    Mem sMem;     
14f70 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72       /* For stor
14f80 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 62  ing the record b
14f90 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
14fa0 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 44 61 74    const u8 *zDat
14fb0 61 3b 20 20 20 2f 2a 20 50 61 72 74 20 6f 66 20  a;   /* Part of 
14fc0 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67  the record being
14fd0 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f   decoded */.  co
14fe0 6e 73 74 20 75 38 20 2a 7a 48 64 72 3b 20 20 20  nst u8 *zHdr;   
14ff0 20 2f 2a 20 4e 65 78 74 20 75 6e 70 61 72 73 65   /* Next unparse
15000 64 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  d byte of the he
15010 61 64 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ader */.  const 
15020 75 38 20 2a 7a 45 6e 64 48 64 72 3b 20 2f 2a 20  u8 *zEndHdr; /* 
15030 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74  Pointer to first
15040 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20   byte after the 
15050 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 36 34 20  header */.  u64 
15060 6f 66 66 73 65 74 36 34 3b 20 20 20 20 20 20 2f  offset64;      /
15070 2a 20 36 34 2d 62 69 74 20 6f 66 66 73 65 74 20  * 64-bit offset 
15080 2a 2f 0a 20 20 75 33 32 20 74 3b 20 20 20 20 20  */.  u32 t;     
15090 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 79 70          /* A typ
150a0 65 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  e code from the 
150b0 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 2a 2f  record header */
150c0 0a 20 20 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20  .  Mem *pReg;   
150d0 20 20 20 20 20 20 2f 2a 20 50 73 65 75 64 6f 54        /* PseudoT
150e0 61 62 6c 65 20 69 6e 70 75 74 20 72 65 67 69 73  able input regis
150f0 74 65 72 20 2a 2f 0a 0a 20 20 70 43 20 3d 20 70  ter */..  pC = p
15100 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
15110 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32  ;.  p2 = pOp->p2
15120 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
15130 75 72 73 6f 72 20 63 61 63 68 65 20 69 73 20 73  ursor cache is s
15140 74 61 6c 65 20 28 6d 65 61 6e 69 6e 67 20 69 74  tale (meaning it
15150 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
15160 79 20 70 6f 69 6e 74 20 61 74 0a 20 20 2a 2a 20  y point at.  ** 
15170 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 29  the correct row)
15180 20 74 68 65 6e 20 62 72 69 6e 67 20 69 74 20 75   then bring it u
15190 70 2d 74 6f 2d 64 61 74 65 20 62 79 20 64 6f 69  p-to-date by doi
151a0 6e 67 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ng the necessary
151b0 20 0a 20 20 2a 2a 20 42 2d 54 72 65 65 20 73 65   .  ** B-Tree se
151c0 65 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ek. */.  rc = sq
151d0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
151e0 6f 76 65 74 6f 28 26 70 43 2c 20 26 70 32 29 3b  oveto(&pC, &p2);
151f0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
15200 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
15210 72 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ror;..  assert( 
15220 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
15230 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
15240 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
15250 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65  ;.  pDest = &aMe
15260 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65  m[pOp->p3];.  me
15270 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
15280 2c 20 70 44 65 73 74 29 3b 0a 20 20 61 73 73 65  , pDest);.  asse
15290 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
152a0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
152b0 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
152c0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
152d0 65 72 74 28 20 70 32 3c 70 43 2d 3e 6e 46 69 65  ert( p2<pC->nFie
152e0 6c 64 20 29 3b 0a 20 20 61 4f 66 66 73 65 74 20  ld );.  aOffset 
152f0 3d 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20  = pC->aOffset;. 
15300 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
15310 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 56  rType!=CURTYPE_V
15320 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TAB );.  assert(
15330 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43   pC->eCurType!=C
15340 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c  URTYPE_PSEUDO ||
15350 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a   pC->nullRow );.
15360 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
15370 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f  urType!=CURTYPE_
15380 53 4f 52 54 45 52 20 29 3b 0a 0a 20 20 69 66 28  SORTER );..  if(
15390 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
153a0 21 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b  !=p->cacheCtr ){
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
153d0 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 69 66  F-FALSE*/.    if
153e0 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  ( pC->nullRow ){
153f0 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 65  .      if( pC->e
15400 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
15410 5f 50 53 45 55 44 4f 20 29 7b 0a 20 20 20 20 20  _PSEUDO ){.     
15420 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 73 70     /* For the sp
15430 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 73  ecial case of as
15440 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2c 20   pseudo-cursor, 
15450 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 66  the seekResult f
15460 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
15470 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 72  identifies the r
15480 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
15490 64 73 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  ds the record */
154a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
154b0 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 3e   pC->seekResult>
154c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  0 );.        pRe
154d0 67 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 73 65  g = &aMem[pC->se
154e0 65 6b 52 65 73 75 6c 74 5d 3b 0a 20 20 20 20 20  ekResult];.     
154f0 20 20 20 61 73 73 65 72 74 28 20 70 52 65 67 2d     assert( pReg-
15500 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
15510 62 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b );.        ass
15520 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
15530 70 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 20  pReg) );.       
15540 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65   pC->payloadSize
15550 20 3d 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 70   = pC->szRow = p
15560 52 65 67 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  Reg->n;.        
15570 70 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29  pC->aRow = (u8*)
15580 70 52 65 67 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pReg->z;.      }
15590 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
155a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
155b0 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ull(pDest);.    
155c0 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75      goto op_colu
155d0 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  mn_out;.      }.
155e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155f0 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e   pCrsr = pC->uc.
15600 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 61  pCursor;.      a
15610 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
15620 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
15630 45 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EE );.      asse
15640 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 20  rt( pCrsr );.   
15650 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
15660 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
15670 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20  alid(pCrsr) );. 
15680 20 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64       pC->payload
15690 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 42 74  Size = sqlite3Bt
156a0 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
156b0 43 72 73 72 29 3b 0a 20 20 20 20 20 20 70 43 2d  Crsr);.      pC-
156c0 3e 61 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 42  >aRow = sqlite3B
156d0 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68  treePayloadFetch
156e0 28 70 43 72 73 72 2c 20 26 70 43 2d 3e 73 7a 52  (pCrsr, &pC->szR
156f0 6f 77 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ow);.      asser
15700 74 28 20 70 43 2d 3e 73 7a 52 6f 77 3c 3d 70 43  t( pC->szRow<=pC
15710 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 29 3b  ->payloadSize );
15720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15730 43 2d 3e 73 7a 52 6f 77 3c 3d 36 35 35 33 36 20  C->szRow<=65536 
15740 29 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 70  );  /* Maximum p
15750 61 67 65 20 73 69 7a 65 20 69 73 20 36 34 4b 69  age size is 64Ki
15760 42 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  B */.      if( p
15770 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e  C->payloadSize >
15780 20 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74   (u32)db->aLimit
15790 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
157a0 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 20  NGTH] ){.       
157b0 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
157c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
157d0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
157e0 20 3d 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a   = p->cacheCtr;.
157f0 20 20 20 20 70 43 2d 3e 69 48 64 72 4f 66 66 73      pC->iHdrOffs
15800 65 74 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  et = getVarint32
15810 28 70 43 2d 3e 61 52 6f 77 2c 20 61 4f 66 66 73  (pC->aRow, aOffs
15820 65 74 5b 30 5d 29 3b 0a 20 20 20 20 70 43 2d 3e  et[0]);.    pC->
15830 6e 48 64 72 50 61 72 73 65 64 20 3d 20 30 3b 0a  nHdrParsed = 0;.
15840 0a 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 73 7a  ..    if( pC->sz
15850 52 6f 77 3c 61 4f 66 66 73 65 74 5b 30 5d 20 29  Row<aOffset[0] )
15860 7b 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a  {      /*OPTIMIZ
15870 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
15880 0a 20 20 20 20 20 20 2f 2a 20 70 43 2d 3e 61 52  .      /* pC->aR
15890 6f 77 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ow does not have
158a0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
158b0 69 72 65 20 72 6f 77 2c 20 62 75 74 20 69 74 20  ire row, but it 
158c0 64 6f 65 73 20 61 74 20 6c 65 61 73 74 0a 20 20  does at least.  
158d0 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 63      ** need to c
158e0 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20  over the header 
158f0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20  of the record.  
15900 49 66 20 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73  If pC->aRow does
15910 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 20 20 20   not contain.   
15920 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6c 65     ** the comple
15930 74 65 20 68 65 61 64 65 72 2c 20 74 68 65 6e 20  te header, then 
15940 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f 2c 20  set it to zero, 
15950 66 6f 72 63 69 6e 67 20 74 68 65 20 68 65 61 64  forcing the head
15960 65 72 20 74 6f 20 62 65 0a 20 20 20 20 20 20 2a  er to be.      *
15970 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
15980 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20  located. */.    
15990 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a    pC->aRow = 0;.
159a0 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20        pC->szRow 
159b0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  = 0;..      /* M
159c0 61 6b 65 20 73 75 72 65 20 61 20 63 6f 72 72 75  ake sure a corru
159d0 70 74 20 64 61 74 61 62 61 73 65 20 68 61 73 20  pt database has 
159e0 6e 6f 74 20 67 69 76 65 6e 20 75 73 20 61 6e 20  not given us an 
159f0 6f 76 65 72 73 69 7a 65 20 68 65 61 64 65 72 2e  oversize header.
15a00 0a 20 20 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  .      ** Do thi
15a10 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69 64 20 61  s now to avoid a
15a20 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65 6d 6f 72  n oversize memor
15a30 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20  y allocation..  
15a40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
15a50 54 79 70 65 20 65 6e 74 72 69 65 73 20 63 61 6e  Type entries can
15a60 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e   be between 1 an
15a70 64 20 35 20 62 79 74 65 73 20 65 61 63 68 2e 20  d 5 bytes each. 
15a80 20 42 75 74 20 34 20 61 6e 64 20 35 20 62 79 74   But 4 and 5 byt
15a90 65 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 73  e.      ** types
15aa0 20 75 73 65 20 73 6f 20 6d 75 63 68 20 64 61 74   use so much dat
15ab0 61 20 73 70 61 63 65 20 74 68 61 74 20 74 68 65  a space that the
15ac0 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34  re can only be 4
15ad0 30 39 36 20 61 6e 64 20 33 32 20 6f 66 0a 20 20  096 and 32 of.  
15ae0 20 20 20 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73      ** them, res
15af0 70 65 63 74 69 76 65 6c 79 2e 20 20 53 6f 20 74  pectively.  So t
15b00 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 61 64 65  he maximum heade
15b10 72 20 6c 65 6e 67 74 68 20 72 65 73 75 6c 74 73  r length results
15b20 20 66 72 6f 6d 20 61 0a 20 20 20 20 20 20 2a 2a   from a.      **
15b30 20 33 2d 62 79 74 65 20 74 79 70 65 20 66 6f 72   3-byte type for
15b40 20 65 61 63 68 20 6f 66 20 74 68 65 20 6d 61 78   each of the max
15b50 69 6d 75 6d 20 6f 66 20 33 32 37 36 38 20 63 6f  imum of 32768 co
15b60 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68 72 65 65  lumns plus three
15b70 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 20  .      ** extra 
15b80 62 79 74 65 73 20 66 6f 72 20 74 68 65 20 68 65  bytes for the he
15b90 61 64 65 72 20 6c 65 6e 67 74 68 20 69 74 73 65  ader length itse
15ba0 6c 66 2e 20 20 33 32 37 36 38 2a 33 20 2b 20 33  lf.  32768*3 + 3
15bb0 20 3d 20 39 38 33 30 37 2e 0a 20 20 20 20 20 20   = 98307..      
15bc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61 4f 66  */.      if( aOf
15bd0 66 73 65 74 5b 30 5d 20 3e 20 39 38 33 30 37 20  fset[0] > 98307 
15be0 7c 7c 20 61 4f 66 66 73 65 74 5b 30 5d 20 3e 20  || aOffset[0] > 
15bf0 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20  pC->payloadSize 
15c00 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
15c10 6f 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75 70  op_column_corrup
15c20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
15c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
15c40 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
15c50 7a 61 74 69 6f 6e 2e 20 20 42 79 20 73 6b 69 70  zation.  By skip
15c60 70 69 6e 67 20 6f 76 65 72 20 74 68 65 20 66 69  ping over the fi
15c70 72 73 74 20 66 65 77 20 74 65 73 74 73 0a 20 20  rst few tests.  
15c80 20 20 20 20 2a 2a 20 28 65 78 3a 20 70 43 2d 3e      ** (ex: pC->
15c90 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32 29 20  nHdrParsed<=p2) 
15ca0 69 6e 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  in the next sect
15cb0 69 6f 6e 2c 20 77 65 20 61 63 68 69 65 76 65 20  ion, we achieve 
15cc0 61 0a 20 20 20 20 20 20 2a 2a 20 6d 65 61 73 75  a.      ** measu
15cd0 72 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63  rable performanc
15ce0 65 20 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2a  e gain..      **
15cf0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62  .      ** This b
15d00 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 65  ranch is taken e
15d10 76 65 6e 20 69 66 20 61 4f 66 66 73 65 74 5b 30  ven if aOffset[0
15d20 5d 3d 3d 30 2e 20 20 53 75 63 68 20 61 20 72 65  ]==0.  Such a re
15d30 63 6f 72 64 20 69 73 20 6e 65 76 65 72 0a 20 20  cord is never.  
15d40 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64      ** generated
15d50 20 62 79 20 53 51 4c 69 74 65 2c 20 61 6e 64 20   by SQLite, and 
15d60 63 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65  could be conside
15d70 72 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2c 20  red corruption, 
15d80 62 75 74 20 77 65 0a 20 20 20 20 20 20 2a 2a 20  but we.      ** 
15d90 61 63 63 65 70 74 20 69 74 20 66 6f 72 20 68 69  accept it for hi
15da0 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
15db0 2e 20 20 57 68 65 6e 20 61 4f 66 66 73 65 74 5b  .  When aOffset[
15dc0 30 5d 3d 3d 30 2c 20 74 68 65 20 63 6f 64 65 20  0]==0, the code 
15dd0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 72  this.      ** br
15de0 61 6e 63 68 20 6a 75 6d 70 73 20 74 6f 20 72 65  anch jumps to re
15df0 61 64 73 20 70 61 73 74 20 74 68 65 20 65 6e 64  ads past the end
15e00 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
15e10 62 75 74 20 6e 65 76 65 72 20 6d 6f 72 65 0a 20  but never more. 
15e20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 20 66       ** than a f
15e30 65 77 20 62 79 74 65 73 2e 20 20 45 76 65 6e 20  ew bytes.  Even 
15e40 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 6f 63  if the record oc
15e50 63 75 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  curs at the end 
15e60 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  of the page.    
15e70 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65    ** content are
15e80 61 2c 20 74 68 65 20 22 70 61 67 65 20 68 65 61  a, the "page hea
15e90 64 65 72 22 20 63 6f 6d 65 73 20 61 66 74 65 72  der" comes after
15ea0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
15eb0 74 20 61 6e 64 20 73 6f 0a 20 20 20 20 20 20 2a  t and so.      *
15ec0 2a 20 74 68 69 73 20 6f 76 65 72 72 65 61 64 20  * this overread 
15ed0 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 53 69  is harmless.  Si
15ee0 6d 69 6c 61 72 20 6f 76 65 72 72 65 61 64 73 20  milar overreads 
15ef0 63 61 6e 20 6f 63 63 75 72 20 66 6f 72 20 61 20  can occur for a 
15f00 63 6f 72 72 75 70 74 0a 20 20 20 20 20 20 2a 2a  corrupt.      **
15f10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
15f20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 7a        */.      z
15f30 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77 3b  Data = pC->aRow;
15f40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15f50 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d 70  C->nHdrParsed<=p
15f60 32 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  2 );         /* 
15f70 43 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 6b 69 70  Conditional skip
15f80 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ped */.      tes
15f90 74 63 61 73 65 28 20 61 4f 66 66 73 65 74 5b 30  tcase( aOffset[0
15fa0 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 6f  ]==0 );.      go
15fb0 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61  to op_column_rea
15fc0 64 5f 68 65 61 64 65 72 3b 0a 20 20 20 20 7d 0a  d_header;.    }.
15fd0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
15fe0 75 72 65 20 61 74 20 6c 65 61 73 74 20 74 68 65  ure at least the
15ff0 20 66 69 72 73 74 20 70 32 2b 31 20 65 6e 74 72   first p2+1 entr
16000 69 65 73 20 6f 66 20 74 68 65 20 68 65 61 64 65  ies of the heade
16010 72 20 68 61 76 65 20 62 65 65 6e 0a 20 20 2a 2a  r have been.  **
16020 20 70 61 72 73 65 64 20 61 6e 64 20 76 61 6c 69   parsed and vali
16030 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  d information is
16040 20 69 6e 20 61 4f 66 66 73 65 74 5b 5d 20 61 6e   in aOffset[] an
16050 64 20 70 43 2d 3e 61 54 79 70 65 5b 5d 2e 0a 20  d pC->aType[].. 
16060 20 2a 2f 0a 20 20 69 66 28 20 70 43 2d 3e 6e 48   */.  if( pC->nH
16070 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29 7b 0a  drParsed<=p2 ){.
16080 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
16090 69 73 20 6d 6f 72 65 20 68 65 61 64 65 72 20 61  is more header a
160a0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 61 72  vailable for par
160b0 73 69 6e 67 20 69 6e 20 74 68 65 20 72 65 63 6f  sing in the reco
160c0 72 64 2c 20 74 72 79 0a 20 20 20 20 2a 2a 20 74  rd, try.    ** t
160d0 6f 20 65 78 74 72 61 63 74 20 61 64 64 69 74 69  o extract additi
160e0 6f 6e 61 6c 20 66 69 65 6c 64 73 20 75 70 20 74  onal fields up t
160f0 68 72 6f 75 67 68 20 74 68 65 20 70 32 2b 31 2d  hrough the p2+1-
16100 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2f  th field .    */
16110 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69 48 64  .    if( pC->iHd
16120 72 4f 66 66 73 65 74 3c 61 4f 66 66 73 65 74 5b  rOffset<aOffset[
16130 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4d  0] ){.      /* M
16140 61 6b 65 20 73 75 72 65 20 7a 44 61 74 61 20 70  ake sure zData p
16150 6f 69 6e 74 73 20 74 6f 20 65 6e 6f 75 67 68 20  oints to enough 
16160 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  of the record to
16170 20 63 6f 76 65 72 20 74 68 65 20 68 65 61 64 65   cover the heade
16180 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
16190 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 7b 0a 20  pC->aRow==0 ){. 
161a0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
161b0 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Mem, 0, sizeof(s
161c0 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Mem));.        r
161d0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
161e0 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
161f0 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 61  uc.pCursor, 0, a
16200 4f 66 66 73 65 74 5b 30 5d 2c 20 26 73 4d 65 6d  Offset[0], &sMem
16210 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16220 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
16230 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
16240 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
16250 7a 44 61 74 61 20 3d 20 28 75 38 2a 29 73 4d 65  zData = (u8*)sMe
16260 6d 2e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m.z;.      }else
16270 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61 20  {.        zData 
16280 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20  = pC->aRow;.    
16290 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
162a0 46 69 6c 6c 20 69 6e 20 70 43 2d 3e 61 54 79 70  Fill in pC->aTyp
162b0 65 5b 69 5d 20 61 6e 64 20 61 4f 66 66 73 65 74  e[i] and aOffset
162c0 5b 69 5d 20 76 61 6c 75 65 73 20 74 68 72 6f 75  [i] values throu
162d0 67 68 20 74 68 65 20 70 32 2d 74 68 20 66 69 65  gh the p2-th fie
162e0 6c 64 2e 20 2a 2f 0a 20 20 20 20 6f 70 5f 63 6f  ld. */.    op_co
162f0 6c 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65 72  lumn_read_header
16300 3a 0a 20 20 20 20 20 20 69 20 3d 20 70 43 2d 3e  :.      i = pC->
16310 6e 48 64 72 50 61 72 73 65 64 3b 0a 20 20 20 20  nHdrParsed;.    
16320 20 20 6f 66 66 73 65 74 36 34 20 3d 20 61 4f 66    offset64 = aOf
16330 66 73 65 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7a  fset[i];.      z
16340 48 64 72 20 3d 20 7a 44 61 74 61 20 2b 20 70 43  Hdr = zData + pC
16350 2d 3e 69 48 64 72 4f 66 66 73 65 74 3b 0a 20 20  ->iHdrOffset;.  
16360 20 20 20 20 7a 45 6e 64 48 64 72 20 3d 20 7a 44      zEndHdr = zD
16370 61 74 61 20 2b 20 61 4f 66 66 73 65 74 5b 30 5d  ata + aOffset[0]
16380 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16390 28 20 7a 48 64 72 3e 3d 7a 45 6e 64 48 64 72 20  ( zHdr>=zEndHdr 
163a0 29 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  );.      do{.   
163b0 20 20 20 20 20 69 66 28 20 28 70 43 2d 3e 61 54       if( (pC->aT
163c0 79 70 65 5b 69 5d 20 3d 20 74 20 3d 20 7a 48 64  ype[i] = t = zHd
163d0 72 5b 30 5d 29 3c 30 78 38 30 20 29 7b 0a 20 20  r[0])<0x80 ){.  
163e0 20 20 20 20 20 20 20 20 7a 48 64 72 2b 2b 3b 0a          zHdr++;.
163f0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
16400 36 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  64 += sqlite3Vdb
16410 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79  eOneByteSerialTy
16420 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20  peLen(t);.      
16430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16440 20 20 20 7a 48 64 72 20 2b 3d 20 73 71 6c 69 74     zHdr += sqlit
16450 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 7a 48  e3GetVarint32(zH
16460 64 72 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 20  dr, &t);.       
16470 20 20 20 70 43 2d 3e 61 54 79 70 65 5b 69 5d 20     pC->aType[i] 
16480 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  = t;.          o
16490 66 66 73 65 74 36 34 20 2b 3d 20 73 71 6c 69 74  ffset64 += sqlit
164a0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
164b0 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20  Len(t);.        
164c0 7d 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73 65  }.        aOffse
164d0 74 5b 2b 2b 69 5d 20 3d 20 28 75 33 32 29 28 6f  t[++i] = (u32)(o
164e0 66 66 73 65 74 36 34 20 26 20 30 78 66 66 66 66  ffset64 & 0xffff
164f0 66 66 66 66 29 3b 0a 20 20 20 20 20 20 7d 77 68  ffff);.      }wh
16500 69 6c 65 28 20 69 3c 3d 70 32 20 26 26 20 7a 48  ile( i<=p2 && zH
16510 64 72 3c 7a 45 6e 64 48 64 72 20 29 3b 0a 0a 20  dr<zEndHdr );.. 
16520 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
16530 72 64 20 69 73 20 63 6f 72 72 75 70 74 20 69 66  rd is corrupt if
16540 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
16550 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
16560 20 20 20 20 20 20 2a 2a 20 28 31 29 20 74 68 65        ** (1) the
16570 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 68 65   bytes of the he
16580 61 64 65 72 20 65 78 74 65 6e 64 20 70 61 73 74  ader extend past
16590 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 68 65   the declared he
165a0 61 64 65 72 20 73 69 7a 65 0a 20 20 20 20 20 20  ader size.      
165b0 2a 2a 20 28 32 29 20 74 68 65 20 65 6e 74 69 72  ** (2) the entir
165c0 65 20 68 65 61 64 65 72 20 77 61 73 20 75 73 65  e header was use
165d0 64 20 62 75 74 20 6e 6f 74 20 61 6c 6c 20 64 61  d but not all da
165e0 74 61 20 77 61 73 20 75 73 65 64 0a 20 20 20 20  ta was used.    
165f0 20 20 2a 2a 20 28 33 29 20 74 68 65 20 65 6e 64    ** (3) the end
16600 20 6f 66 20 74 68 65 20 64 61 74 61 20 65 78 74   of the data ext
16610 65 6e 64 73 20 62 65 79 6f 6e 64 20 74 68 65 20  ends beyond the 
16620 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72  end of the recor
16630 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
16640 20 20 69 66 28 20 28 7a 48 64 72 3e 3d 7a 45 6e    if( (zHdr>=zEn
16650 64 48 64 72 20 26 26 20 28 7a 48 64 72 3e 7a 45  dHdr && (zHdr>zE
16660 6e 64 48 64 72 20 7c 7c 20 6f 66 66 73 65 74 36  ndHdr || offset6
16670 34 21 3d 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69  4!=pC->payloadSi
16680 7a 65 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ze)).       || (
16690 6f 66 66 73 65 74 36 34 20 3e 20 70 43 2d 3e 70  offset64 > pC->p
166a0 61 79 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20 20  ayloadSize).    
166b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28    ){.        if(
166c0 20 61 4f 66 66 73 65 74 5b 30 5d 3d 3d 30 20 29   aOffset[0]==0 )
166d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  {.          i = 
166e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 48 64  0;.          zHd
166f0 72 20 3d 20 7a 45 6e 64 48 64 72 3b 0a 20 20 20  r = zEndHdr;.   
16700 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16710 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52        if( pC->aR
16720 6f 77 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ow==0 ) sqlite3V
16730 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73  dbeMemRelease(&s
16740 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Mem);.          
16750 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 63  goto op_column_c
16760 6f 72 72 75 70 74 3b 0a 20 20 20 20 20 20 20 20  orrupt;.        
16770 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
16780 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 20   pC->nHdrParsed 
16790 3d 20 69 3b 0a 20 20 20 20 20 20 70 43 2d 3e 69  = i;.      pC->i
167a0 48 64 72 4f 66 66 73 65 74 20 3d 20 28 75 33 32  HdrOffset = (u32
167b0 29 28 7a 48 64 72 20 2d 20 7a 44 61 74 61 29 3b  )(zHdr - zData);
167c0 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 61  .      if( pC->a
167d0 52 6f 77 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Row==0 ) sqlite3
167e0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
167f0 73 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sMem);.    }else
16800 7b 0a 20 20 20 20 20 20 74 20 3d 20 30 3b 0a 20  {.      t = 0;. 
16810 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
16820 61 66 74 65 72 20 74 72 79 69 6e 67 20 74 6f 20  after trying to 
16830 65 78 74 72 61 63 74 20 6e 65 77 20 65 6e 74 72  extract new entr
16840 69 65 73 20 66 72 6f 6d 20 74 68 65 20 68 65 61  ies from the hea
16850 64 65 72 2c 20 6e 48 64 72 50 61 72 73 65 64 20  der, nHdrParsed 
16860 69 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  is.    ** still 
16870 6e 6f 74 20 75 70 20 74 6f 20 70 32 2c 20 74 68  not up to p2, th
16880 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
16890 65 20 72 65 63 6f 72 64 20 68 61 73 20 66 65 77  e record has few
168a0 65 72 20 74 68 61 6e 20 70 32 0a 20 20 20 20 2a  er than p2.    *
168b0 2a 20 63 6f 6c 75 6d 6e 73 2e 20 20 53 6f 20 74  * columns.  So t
168c0 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c 20 62  he result will b
168d0 65 20 65 69 74 68 65 72 20 74 68 65 20 64 65 66  e either the def
168e0 61 75 6c 74 20 76 61 6c 75 65 20 6f 72 20 61 20  ault value or a 
168f0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
16900 20 69 66 28 20 70 43 2d 3e 6e 48 64 72 50 61 72   if( pC->nHdrPar
16910 73 65 64 3c 3d 70 32 20 29 7b 0a 20 20 20 20 20  sed<=p2 ){.     
16920 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
16930 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20 20 20 20  ==P4_MEM ){.    
16940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
16950 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44  emShallowCopy(pD
16960 65 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  est, pOp->p4.pMe
16970 6d 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a  m, MEM_Static);.
16980 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
169a0 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74  MemSetNull(pDest
169b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
169c0 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f   goto op_column_
169d0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  out;.    }.  }el
169e0 73 65 7b 0a 20 20 20 20 74 20 3d 20 70 43 2d 3e  se{.    t = pC->
169f0 61 54 79 70 65 5b 70 32 5d 3b 0a 20 20 7d 0a 0a  aType[p2];.  }..
16a00 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
16a10 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65   content for the
16a20 20 70 32 2b 31 2d 74 68 20 63 6f 6c 75 6d 6e 2e   p2+1-th column.
16a30 20 20 43 6f 6e 74 72 6f 6c 20 63 61 6e 20 6f 6e    Control can on
16a40 6c 79 0a 20 20 2a 2a 20 72 65 61 63 68 20 74 68  ly.  ** reach th
16a50 69 73 20 70 6f 69 6e 74 20 69 66 20 61 4f 66 66  is point if aOff
16a60 73 65 74 5b 70 32 5d 2c 20 61 4f 66 66 73 65 74  set[p2], aOffset
16a70 5b 70 32 2b 31 5d 2c 20 61 6e 64 20 70 43 2d 3e  [p2+1], and pC->
16a80 61 54 79 70 65 5b 70 32 5d 20 61 72 65 0a 20 20  aType[p2] are.  
16a90 2a 2a 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 20 20  ** all valid..  
16aa0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 32 3c  */.  assert( p2<
16ab0 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 29  pC->nHdrParsed )
16ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
16ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
16ae0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
16af0 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
16b00 61 6e 74 73 28 70 44 65 73 74 29 20 29 3b 0a 20  ants(pDest) );. 
16b10 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79 6e 61   if( VdbeMemDyna
16b20 6d 69 63 28 70 44 65 73 74 29 20 29 7b 0a 20 20  mic(pDest) ){.  
16b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
16b40 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a  SetNull(pDest);.
16b50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 3d    }.  assert( t=
16b60 3d 70 43 2d 3e 61 54 79 70 65 5b 70 32 5d 20 29  =pC->aType[p2] )
16b70 3b 0a 20 20 69 66 28 20 70 43 2d 3e 73 7a 52 6f  ;.  if( pC->szRo
16b80 77 3e 3d 61 4f 66 66 73 65 74 5b 70 32 2b 31 5d  w>=aOffset[p2+1]
16b90 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
16ba0 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
16bb0 73 65 20 77 68 65 72 65 20 74 68 65 20 64 65 73  se where the des
16bc0 69 72 65 64 20 63 6f 6e 74 65 6e 74 20 66 69 74  ired content fit
16bd0 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  s on the origina
16be0 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 2d 20  l.    ** page - 
16bf0 77 68 65 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  where the conten
16c00 74 20 69 73 20 6e 6f 74 20 6f 6e 20 61 6e 20 6f  t is not on an o
16c10 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a  verflow page */.
16c20 20 20 20 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e      zData = pC->
16c30 61 52 6f 77 20 2b 20 61 4f 66 66 73 65 74 5b 70  aRow + aOffset[p
16c40 32 5d 3b 0a 20 20 20 20 69 66 28 20 74 3c 31 32  2];.    if( t<12
16c50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16c60 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 7a  3VdbeSerialGet(z
16c70 44 61 74 61 2c 20 74 2c 20 70 44 65 73 74 29 3b  Data, t, pDest);
16c80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16c90 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
16ca0 6d 6e 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  mn value is a st
16cb0 72 69 6e 67 2c 20 77 65 20 6e 65 65 64 20 61 20  ring, we need a 
16cc0 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c 75 65  persistent value
16cd0 2c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61  , not.      ** a
16ce0 20 4d 45 4d 5f 45 70 68 65 6d 20 76 61 6c 75 65   MEM_Ephem value
16cf0 2e 20 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  .  This branch i
16d00 73 20 61 20 66 61 73 74 20 73 68 6f 72 74 2d 63  s a fast short-c
16d10 75 74 20 74 68 61 74 20 69 73 20 65 71 75 69 76  ut that is equiv
16d20 61 6c 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  alent.      ** t
16d30 6f 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  o calling sqlite
16d40 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
16d50 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
16d60 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 29  Deephemeralize()
16d70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16d80 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
16d90 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45  6 aFlag[] = { ME
16da0 4d 5f 42 6c 6f 62 2c 20 4d 45 4d 5f 53 74 72 7c  M_Blob, MEM_Str|
16db0 4d 45 4d 5f 54 65 72 6d 20 7d 3b 0a 20 20 20 20  MEM_Term };.    
16dc0 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 6c 65 6e    pDest->n = len
16dd0 20 3d 20 28 74 2d 31 32 29 2f 32 3b 0a 20 20 20   = (t-12)/2;.   
16de0 20 20 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20     pDest->enc = 
16df0 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20 20 20  encoding;.      
16e00 69 66 28 20 70 44 65 73 74 2d 3e 73 7a 4d 61 6c  if( pDest->szMal
16e10 6c 6f 63 20 3c 20 6c 65 6e 2b 32 20 29 7b 0a 20  loc < len+2 ){. 
16e20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c         pDest->fl
16e30 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
16e40 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
16e50 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
16e60 44 65 73 74 2c 20 6c 65 6e 2b 32 2c 20 30 29 20  Dest, len+2, 0) 
16e70 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
16e80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16e90 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20 70      pDest->z = p
16ea0 44 65 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20  Dest->zMalloc;. 
16eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
16ec0 63 70 79 28 70 44 65 73 74 2d 3e 7a 2c 20 7a 44  cpy(pDest->z, zD
16ed0 61 74 61 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  ata, len);.     
16ee0 20 70 44 65 73 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d   pDest->z[len] =
16ef0 20 30 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d   0;.      pDest-
16f00 3e 7a 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20  >z[len+1] = 0;. 
16f10 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67       pDest->flag
16f20 73 20 3d 20 61 46 6c 61 67 5b 74 26 31 5d 3b 0a  s = aFlag[t&1];.
16f30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
16f40 20 20 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20     pDest->enc = 
16f50 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20 2f 2a  encoding;.    /*
16f60 20 54 68 69 73 20 62 72 61 6e 63 68 20 68 61 70   This branch hap
16f70 70 65 6e 73 20 6f 6e 6c 79 20 77 68 65 6e 20 63  pens only when c
16f80 6f 6e 74 65 6e 74 20 69 73 20 6f 6e 20 6f 76 65  ontent is on ove
16f90 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
16fa0 20 20 20 69 66 28 20 28 28 70 4f 70 2d 3e 70 35     if( ((pOp->p5
16fb0 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   & (OPFLAG_LENGT
16fc0 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45  HARG|OPFLAG_TYPE
16fd0 4f 46 41 52 47 29 29 21 3d 30 0a 20 20 20 20 20  OFARG))!=0.     
16fe0 20 20 20 20 20 26 26 20 28 28 74 3e 3d 31 32 20       && ((t>=12 
16ff0 26 26 20 28 74 26 31 29 3d 3d 30 29 20 7c 7c 20  && (t&1)==0) || 
17000 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
17010 47 5f 54 59 50 45 4f 46 41 52 47 29 21 3d 30 29  G_TYPEOFARG)!=0)
17020 29 0a 20 20 20 20 20 7c 7c 20 28 6c 65 6e 20 3d  ).     || (len =
17030 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17040 61 6c 54 79 70 65 4c 65 6e 28 74 29 29 3d 3d 30  alTypeLen(t))==0
17050 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
17060 20 43 6f 6e 74 65 6e 74 20 69 73 20 69 72 72 65   Content is irre
17070 6c 65 76 61 6e 74 20 66 6f 72 0a 20 20 20 20 20  levant for.     
17080 20 2a 2a 20 20 20 20 31 2e 20 74 68 65 20 74 79   **    1. the ty
17090 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c  peof() function,
170a0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 32 2e 20  .      **    2. 
170b0 74 68 65 20 6c 65 6e 67 74 68 28 58 29 20 66 75  the length(X) fu
170c0 6e 63 74 69 6f 6e 20 69 66 20 58 20 69 73 20 61  nction if X is a
170d0 20 62 6c 6f 62 2c 20 61 6e 64 0a 20 20 20 20 20   blob, and.     
170e0 20 2a 2a 20 20 20 20 33 2e 20 69 66 20 74 68 65   **    3. if the
170f0 20 63 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20   content length 
17100 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 20 20 2a  is zero..      *
17110 2a 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73  * So we might as
17120 20 77 65 6c 6c 20 75 73 65 20 62 6f 67 75 73 20   well use bogus 
17130 63 6f 6e 74 65 6e 74 20 72 61 74 68 65 72 20 74  content rather t
17140 68 61 6e 20 72 65 61 64 69 6e 67 0a 20 20 20 20  han reading.    
17150 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f    ** content fro
17160 6d 20 64 69 73 6b 2e 20 0a 20 20 20 20 20 20 2a  m disk. .      *
17170 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 68 6f  *.      ** Altho
17180 75 67 68 20 73 71 6c 69 74 65 33 56 64 62 65 53  ugh sqlite3VdbeS
17190 65 72 69 61 6c 47 65 74 28 29 20 6d 61 79 20 72  erialGet() may r
171a0 65 61 64 20 61 74 20 6d 6f 73 74 20 38 20 62 79  ead at most 8 by
171b0 74 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  tes from the.   
171c0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73     ** buffer pas
171d0 73 65 64 20 74 6f 20 69 74 2c 20 64 65 62 75 67  sed to it, debug
171e0 67 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 56 64  ging function Vd
171f0 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74  beMemPrettyPrint
17200 28 29 20 6d 61 79 0a 20 20 20 20 20 20 2a 2a 20  () may.      ** 
17210 72 65 61 64 20 75 70 20 74 6f 20 31 36 2e 20 53  read up to 16. S
17220 6f 20 31 36 20 62 79 74 65 73 20 6f 66 20 62 6f  o 16 bytes of bo
17230 67 75 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 73  gus content is s
17240 75 70 70 6c 69 65 64 2e 0a 20 20 20 20 20 20 2a  upplied..      *
17250 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 75  /.      static u
17260 38 20 61 5a 65 72 6f 5b 31 36 5d 3b 20 20 2f 2a  8 aZero[16];  /*
17270 20 54 68 69 73 20 69 73 20 74 68 65 20 62 6f 67   This is the bog
17280 75 73 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  us content */.  
17290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
172a0 65 72 69 61 6c 47 65 74 28 61 5a 65 72 6f 2c 20  erialGet(aZero, 
172b0 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d  t, pDest);.    }
172c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
172d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
172e0 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 75 63 2e  romBtree(pC->uc.
172f0 70 43 75 72 73 6f 72 2c 20 61 4f 66 66 73 65 74  pCursor, aOffset
17300 5b 70 32 5d 2c 20 6c 65 6e 2c 20 70 44 65 73 74  [p2], len, pDest
17310 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
17320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
17330 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
17340 72 72 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rror;.      sqli
17350 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17360 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 44 65 73  ((const u8*)pDes
17370 74 2d 3e 7a 2c 20 74 2c 20 70 44 65 73 74 29 3b  t->z, t, pDest);
17380 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c  .      pDest->fl
17390 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 45 70 68 65  ags &= ~MEM_Ephe
173a0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6f 70  m;.    }.  }..op
173b0 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55  _column_out:.  U
173c0 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
173d0 5a 45 28 70 44 65 73 74 29 3b 0a 20 20 52 45 47  ZE(pDest);.  REG
173e0 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
173f0 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 62  >p3, pDest);.  b
17400 72 65 61 6b 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e  reak;..op_column
17410 5f 63 6f 72 72 75 70 74 3a 0a 20 20 69 66 28 20  _corrupt:.  if( 
17420 61 4f 70 5b 30 5d 2e 70 33 3e 30 20 29 7b 0a 20  aOp[0].p3>0 ){. 
17430 20 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 61 4f     pOp = &aOp[aO
17440 70 5b 30 5d 2e 70 33 2d 31 5d 3b 0a 20 20 20 20  p[0].p3-1];.    
17450 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  break;.  }else{.
17460 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17470 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
17480 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
17490 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 7d  _to_error;.  }.}
174a0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66 66  ../* Opcode: Aff
174b0 69 6e 69 74 79 20 50 31 20 50 32 20 2a 20 50 34  inity P1 P2 * P4
174c0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
174d0 61 66 66 69 6e 69 74 79 28 72 5b 50 31 40 50 32  affinity(r[P1@P2
174e0 5d 29 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61  ]).**.** Apply a
174f0 66 66 69 6e 69 74 69 65 73 20 74 6f 20 61 20 72  ffinities to a r
17500 61 6e 67 65 20 6f 66 20 50 32 20 72 65 67 69 73  ange of P2 regis
17510 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
17520 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  th P1..**.** P4 
17530 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  is a string that
17540 20 69 73 20 50 32 20 63 68 61 72 61 63 74 65 72   is P2 character
17550 73 20 6c 6f 6e 67 2e 20 54 68 65 20 4e 2d 74 68  s long. The N-th
17560 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
17570 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69  e.** string indi
17580 63 61 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  cates the column
17590 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
175a0 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
175b0 72 20 74 68 65 20 4e 2d 74 68 0a 2a 2a 20 6d 65  r the N-th.** me
175c0 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 65  mory cell in the
175d0 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20   range..*/.case 
175e0 4f 50 5f 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20  OP_Affinity: {. 
175f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66   const char *zAf
17600 66 69 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68 65  finity;   /* The
17610 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20   affinity to be 
17620 61 70 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 7a 41  applied */..  zA
17630 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70  ffinity = pOp->p
17640 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  4.z;.  assert( z
17650 41 66 66 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20  Affinity!=0 );. 
17660 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
17670 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
17680 7a 41 66 66 69 6e 69 74 79 5b 70 4f 70 2d 3e 70  zAffinity[pOp->p
17690 32 5d 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20  2]==0 );.  pIn1 
176a0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
176b0 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 2f 2a 65  ;.  while( 1 /*e
176c0 64 69 74 2d 62 79 2d 62 72 65 61 6b 2a 2f 20 29  dit-by-break*/ )
176d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
176e0 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 28  n1 <= &p->aMem[(
176f0 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
17700 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20 20  Cursor)] );.    
17710 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
17720 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20 20  id(pIn1) );.    
17730 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49  applyAffinity(pI
17740 6e 31 2c 20 7a 41 66 66 69 6e 69 74 79 5b 30 5d  n1, zAffinity[0]
17750 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  , encoding);.   
17760 20 69 66 28 20 7a 41 66 66 69 6e 69 74 79 5b 30   if( zAffinity[0
17770 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  ]==SQLITE_AFF_RE
17780 41 4c 20 26 26 20 28 70 49 6e 31 2d 3e 66 6c 61  AL && (pIn1->fla
17790 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  gs & MEM_Int)!=0
177a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65   ){.      /* Whe
177b0 6e 20 61 70 70 6c 79 69 6e 67 20 52 45 41 4c 20  n applying REAL 
177c0 61 66 66 69 6e 69 74 79 2c 20 69 66 20 74 68 65  affinity, if the
177d0 20 72 65 73 75 6c 74 20 69 73 20 73 74 69 6c 6c   result is still
177e0 20 4d 45 4d 5f 49 6e 74 2c 20 0a 20 20 20 20 20   MEM_Int, .     
177f0 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 61   ** indicate tha
17800 74 20 52 45 41 4c 20 69 73 20 61 63 74 75 61 6c  t REAL is actual
17810 6c 79 20 64 65 73 69 72 65 64 20 2a 2f 0a 20 20  ly desired */.  
17820 20 20 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20      pIn1->flags 
17830 7c 3d 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 3b 0a  |= MEM_IntReal;.
17840 20 20 20 20 20 20 70 49 6e 31 2d 3e 66 6c 61 67        pIn1->flag
17850 73 20 26 3d 20 7e 4d 45 4d 5f 49 6e 74 3b 0a 20  s &= ~MEM_Int;. 
17860 20 20 20 7d 0a 20 20 20 20 52 45 47 49 53 54 45     }.    REGISTE
17870 52 5f 54 52 41 43 45 28 28 69 6e 74 29 28 70 49  R_TRACE((int)(pI
17880 6e 31 2d 61 4d 65 6d 29 2c 20 70 49 6e 31 29 3b  n1-aMem), pIn1);
17890 0a 20 20 20 20 7a 41 66 66 69 6e 69 74 79 2b 2b  .    zAffinity++
178a0 3b 0a 20 20 20 20 69 66 28 20 7a 41 66 66 69 6e  ;.    if( zAffin
178b0 69 74 79 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61  ity[0]==0 ) brea
178c0 6b 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  k;.    pIn1++;. 
178d0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
178e0 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65 52 65  * Opcode: MakeRe
178f0 63 6f 72 64 20 50 31 20 50 32 20 50 33 20 50 34  cord P1 P2 P3 P4
17900 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
17910 72 5b 50 33 5d 3d 6d 6b 72 65 63 28 72 5b 50 31  r[P3]=mkrec(r[P1
17920 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76  @P2]).**.** Conv
17930 65 72 74 20 50 32 20 72 65 67 69 73 74 65 72 73  ert P2 registers
17940 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
17950 50 31 20 69 6e 74 6f 20 74 68 65 20 5b 72 65 63  P1 into the [rec
17960 6f 72 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20 75  ord format].** u
17970 73 65 20 61 73 20 61 20 64 61 74 61 20 72 65 63  se as a data rec
17980 6f 72 64 20 69 6e 20 61 20 64 61 74 61 62 61 73  ord in a databas
17990 65 20 74 61 62 6c 65 20 6f 72 20 61 73 20 61 20  e table or as a 
179a0 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 64  key.** in an ind
179b0 65 78 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75  ex.  The OP_Colu
179c0 6d 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20 64 65  mn opcode can de
179d0 63 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64 20  code the record 
179e0 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  later..**.** P4 
179f0 6d 61 79 20 62 65 20 61 20 73 74 72 69 6e 67 20  may be a string 
17a00 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72 61  that is P2 chara
17a10 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68 65  cters long.  The
17a20 20 4e 2d 74 68 20 63 68 61 72 61 63 74 65 72 20   N-th character 
17a30 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  of the.** string
17a40 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63   indicates the c
17a50 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74  olumn affinity t
17a60 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
17a70 65 64 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 0a  ed for the N-th.
17a80 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
17a90 69 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  index key..**.**
17aa0 20 54 68 65 20 6d 61 70 70 69 6e 67 20 66 72 6f   The mapping fro
17ab0 6d 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61  m character to a
17ac0 66 66 69 6e 69 74 79 20 69 73 20 67 69 76 65 6e  ffinity is given
17ad0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 41   by the SQLITE_A
17ae0 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65  FF_.** macros de
17af0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
17b00 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  nt.h..**.** If P
17b10 34 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  4 is NULL then a
17b20 6c 6c 20 69 6e 64 65 78 20 66 69 65 6c 64 73 20  ll index fields 
17b30 68 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74  have the affinit
17b40 79 20 42 4c 4f 42 2e 0a 2a 2f 0a 63 61 73 65 20  y BLOB..*/.case 
17b50 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b  OP_MakeRecord: {
17b60 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20  .  Mem *pRec;   
17b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17b80 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
17b90 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20 20 20   u64 nData;     
17ba0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17bb0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
17bc0 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e  ta space */.  in
17bd0 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20  t nHdr;         
17be0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17bf0 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64 65  f bytes of heade
17c00 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 36 34  r space */.  i64
17c10 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
17c20 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70 61 63      /* Data spac
17c30 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
17c40 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  his record */.  
17c50 69 36 34 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20  i64 nZero;      
17c60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17c70 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61   of zero bytes a
17c80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
17c90 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
17ca0 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20 20 20   nVarint;       
17cb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17cc0 20 62 79 74 65 73 20 69 6e 20 61 20 76 61 72 69   bytes in a vari
17cd0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  nt */.  u32 seri
17ce0 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20 20 2f  al_type;       /
17cf0 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a  * Type field */.
17d00 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20 20    Mem *pData0;  
17d10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
17d20 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 63 6f  t field to be co
17d30 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20  mbined into the 
17d40 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20  record */.  Mem 
17d50 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  *pLast;         
17d60 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64     /* Last field
17d70 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
17d80 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
17d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17da0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
17db0 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  n the record */.
17dc0 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74    char *zAffinit
17dd0 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  y;       /* The 
17de0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
17df0 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a  for the record *
17e00 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  /.  int file_for
17e10 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20 46 69  mat;       /* Fi
17e20 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65  le format to use
17e30 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f   for encoding */
17e40 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
17e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
17e60 67 74 68 20 6f 66 20 61 20 66 69 65 6c 64 20 2a  gth of a field *
17e70 2f 0a 20 20 75 38 20 2a 7a 48 64 72 3b 20 20 20  /.  u8 *zHdr;   
17e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
17e90 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 78  ere to write nex
17ea0 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
17eb0 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 50  ader */.  u8 *zP
17ec0 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
17ed0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
17ee0 74 65 20 6e 65 78 74 20 62 79 74 65 20 6f 66 20  te next byte of 
17ef0 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a  the payload */..
17f00 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 74 68    /* Assuming th
17f10 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e  e record contain
17f20 73 20 4e 20 66 69 65 6c 64 73 2c 20 74 68 65 20  s N fields, the 
17f30 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 6c 6f  record format lo
17f40 6f 6b 73 0a 20 20 2a 2a 20 6c 69 6b 65 20 74 68  oks.  ** like th
17f50 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d 2d  is:.  **.  ** --
17f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17fa0 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68 64  ------.  ** | hd
17fb0 72 2d 73 69 7a 65 20 7c 20 74 79 70 65 20 30 20  r-size | type 0 
17fc0 7c 20 74 79 70 65 20 31 20 7c 20 2e 2e 2e 20 7c  | type 1 | ... |
17fd0 20 74 79 70 65 20 4e 2d 31 20 7c 20 64 61 74 61   type N-1 | data
17fe0 30 20 7c 20 2e 2e 2e 20 7c 20 64 61 74 61 20 4e  0 | ... | data N
17ff0 2d 31 20 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d  -1 | .  ** -----
18000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18040 2d 2d 2d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 61  ---.  **.  ** Da
18050 74 61 28 30 29 20 69 73 20 74 61 6b 65 6e 20 66  ta(0) is taken f
18060 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31 2e  rom register P1.
18070 20 20 44 61 74 61 28 31 29 20 63 6f 6d 65 73 20    Data(1) comes 
18080 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31  from register P1
18090 2b 31 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 66  +1.  ** and so f
180a0 6f 72 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  orth..  **.  ** 
180b0 45 61 63 68 20 74 79 70 65 20 66 69 65 6c 64 20  Each type field 
180c0 69 73 20 61 20 76 61 72 69 6e 74 20 72 65 70 72  is a varint repr
180d0 65 73 65 6e 74 69 6e 67 20 74 68 65 20 73 65 72  esenting the ser
180e0 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
180f0 0a 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  .  ** correspond
18100 69 6e 67 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ing data element
18110 20 28 73 65 65 20 73 71 6c 69 74 65 33 56 64 62   (see sqlite3Vdb
18120 65 53 65 72 69 61 6c 54 79 70 65 28 29 29 2e 20  eSerialType()). 
18130 54 68 65 0a 20 20 2a 2a 20 68 64 72 2d 73 69 7a  The.  ** hdr-siz
18140 65 20 66 69 65 6c 64 20 69 73 20 61 6c 73 6f 20  e field is also 
18150 61 20 76 61 72 69 6e 74 20 77 68 69 63 68 20 69  a varint which i
18160 73 20 74 68 65 20 6f 66 66 73 65 74 20 66 72 6f  s the offset fro
18170 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  m the beginning.
18180 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f    ** of the reco
18190 72 64 20 74 6f 20 64 61 74 61 30 2e 0a 20 20 2a  rd to data0..  *
181a0 2f 0a 20 20 6e 44 61 74 61 20 3d 20 30 3b 20 20  /.  nData = 0;  
181b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
181c0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
181d0 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 48 64  a space */.  nHd
181e0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
181f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
18200 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70 61  es of header spa
18210 63 65 20 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d 20  ce */.  nZero = 
18220 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
18230 6d 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74  mber of zero byt
18240 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  es at the end of
18250 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
18260 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70   nField = pOp->p
18270 31 3b 0a 20 20 7a 41 66 66 69 6e 69 74 79 20 3d  1;.  zAffinity =
18280 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73   pOp->p4.z;.  as
18290 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 26  sert( nField>0 &
182a0 26 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70  & pOp->p2>0 && p
182b0 4f 70 2d 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d 28  Op->p2+nField<=(
182c0 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
182d0 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 70  Cursor)+1 );.  p
182e0 44 61 74 61 30 20 3d 20 26 61 4d 65 6d 5b 6e 46  Data0 = &aMem[nF
182f0 69 65 6c 64 5d 3b 0a 20 20 6e 46 69 65 6c 64 20  ield];.  nField 
18300 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c 61  = pOp->p2;.  pLa
18310 73 74 20 3d 20 26 70 44 61 74 61 30 5b 6e 46 69  st = &pData0[nFi
18320 65 6c 64 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f 66  eld-1];.  file_f
18330 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d 69 6e 57 72  ormat = p->minWr
18340 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 3b 0a 0a  iteFileFormat;..
18350 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 74 68    /* Identify th
18360 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65  e output registe
18370 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  r */.  assert( p
18380 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 31 20 7c  Op->p3<pOp->p1 |
18390 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e  | pOp->p3>=pOp->
183a0 70 31 2b 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20  p1+pOp->p2 );.  
183b0 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
183c0 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75  ->p3];.  memAbou
183d0 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
183e0 74 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 6c 79 20  t);..  /* Apply 
183f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 61 66  the requested af
18400 66 69 6e 69 74 79 20 74 6f 20 61 6c 6c 20 69 6e  finity to all in
18410 70 75 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  puts.  */.  asse
18420 72 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61 73  rt( pData0<=pLas
18430 74 20 29 3b 0a 20 20 69 66 28 20 7a 41 66 66 69  t );.  if( zAffi
18440 6e 69 74 79 20 29 7b 0a 20 20 20 20 70 52 65 63  nity ){.    pRec
18450 20 3d 20 70 44 61 74 61 30 3b 0a 20 20 20 20 64   = pData0;.    d
18460 6f 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66  o{.      applyAf
18470 66 69 6e 69 74 79 28 70 52 65 63 2c 20 7a 41 66  finity(pRec, zAf
18480 66 69 6e 69 74 79 5b 30 5d 2c 20 65 6e 63 6f 64  finity[0], encod
18490 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ing);.      if( 
184a0 7a 41 66 66 69 6e 69 74 79 5b 30 5d 3d 3d 53 51  zAffinity[0]==SQ
184b0 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 26 26  LITE_AFF_REAL &&
184c0 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20   (pRec->flags & 
184d0 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20  MEM_Int) ){.    
184e0 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20      pRec->flags 
184f0 7c 3d 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 3b 0a  |= MEM_IntReal;.
18500 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 66 6c          pRec->fl
18510 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74  ags &= ~(MEM_Int
18520 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18530 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
18540 28 69 6e 74 29 28 70 52 65 63 2d 61 4d 65 6d 29  (int)(pRec-aMem)
18550 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 20 20 7a  , pRec);.      z
18560 41 66 66 69 6e 69 74 79 2b 2b 3b 0a 20 20 20 20  Affinity++;.    
18570 20 20 70 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20    pRec++;.      
18580 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74  assert( zAffinit
18590 79 5b 30 5d 3d 3d 30 20 7c 7c 20 70 52 65 63 3c  y[0]==0 || pRec<
185a0 3d 70 4c 61 73 74 20 29 3b 0a 20 20 20 20 7d 77  =pLast );.    }w
185b0 68 69 6c 65 28 20 7a 41 66 66 69 6e 69 74 79 5b  hile( zAffinity[
185c0 30 5d 20 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  0] );.  }..#ifde
185d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
185e0 4e 55 4c 4c 5f 54 52 49 4d 0a 20 20 2f 2a 20 4e  NULL_TRIM.  /* N
185f0 55 4c 4c 73 20 63 61 6e 20 62 65 20 73 61 66 65  ULLs can be safe
18600 6c 79 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20  ly trimmed from 
18610 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
18620 65 63 6f 72 64 2c 20 61 73 20 6c 6f 6e 67 20 61  ecord, as long a
18630 73 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 73 63  s.  ** as the sc
18640 68 65 6d 61 20 66 6f 72 6d 61 74 20 69 73 20 32  hema format is 2
18650 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 6e 6f 6e   or more and non
18660 65 20 6f 66 20 74 68 65 20 6f 6d 69 74 74 65 64  e of the omitted
18670 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2a 20 68 61   columns.  ** ha
18680 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65  ve a non-NULL de
18690 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 20 41 6c  fault value.  Al
186a0 73 6f 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6d  so, the record m
186b0 75 73 74 20 62 65 20 6c 65 66 74 20 77 69 74 68  ust be left with
186c0 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  .  ** at least o
186d0 6e 65 20 66 69 65 6c 64 2e 20 20 49 66 20 50 35  ne field.  If P5
186e0 3e 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  >0 then it will 
186f0 62 65 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  be one more than
18700 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
18710 6f 66 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  of the right-mos
18720 74 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20  t column with a 
18730 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74  non-NULL default
18740 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20   value */.  if( 
18750 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 77  pOp->p5 ){.    w
18760 68 69 6c 65 28 20 28 70 4c 61 73 74 2d 3e 66 6c  hile( (pLast->fl
18770 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21  ags & MEM_Null)!
18780 3d 30 20 26 26 20 6e 46 69 65 6c 64 3e 70 4f 70  =0 && nField>pOp
18790 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 70 4c  ->p5 ){.      pL
187a0 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 46 69  ast--;.      nFi
187b0 65 6c 64 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  eld--;.    }.  }
187c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f  .#endif..  /* Lo
187d0 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  op through the e
187e0 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 77 69 6c  lements that wil
187f0 6c 20 6d 61 6b 65 20 75 70 20 74 68 65 20 72 65  l make up the re
18800 63 6f 72 64 20 74 6f 20 66 69 67 75 72 65 0a 20  cord to figure. 
18810 20 2a 2a 20 6f 75 74 20 68 6f 77 20 6d 75 63 68   ** out how much
18820 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
18830 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72  ed for the new r
18840 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 70 52  ecord..  */.  pR
18850 65 63 20 3d 20 70 4c 61 73 74 3b 0a 20 20 64 6f  ec = pLast;.  do
18860 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  {.    assert( me
18870 6d 49 73 56 61 6c 69 64 28 70 52 65 63 29 20 29  mIsValid(pRec) )
18880 3b 0a 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70  ;.    serial_typ
18890 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
188a0 65 72 69 61 6c 54 79 70 65 28 70 52 65 63 2c 20  erialType(pRec, 
188b0 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 26 6c 65  file_format, &le
188c0 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63  n);.    if( pRec
188d0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
188e0 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ro ){.      if( 
188f0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
18900 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
18910 75 65 73 20 77 69 74 68 20 4d 45 4d 5f 4e 75 6c  ues with MEM_Nul
18920 6c 20 61 6e 64 20 4d 45 4d 5f 5a 65 72 6f 20 61  l and MEM_Zero a
18930 72 65 20 63 72 65 61 74 65 64 20 62 79 20 78 43  re created by xC
18940 6f 6c 75 6d 6e 20 76 69 72 74 75 61 6c 0a 20 20  olumn virtual.  
18950 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6d        ** table m
18960 65 74 68 6f 64 73 20 74 68 61 74 20 6e 65 76 65  ethods that neve
18970 72 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  r invoke sqlite3
18980 5f 72 65 73 75 6c 74 5f 78 78 78 78 78 28 29 20  _result_xxxxx() 
18990 77 68 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  while.        **
189a0 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 75 6e   computing an un
189b0 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75 6d 6e 20  changing column 
189c0 76 61 6c 75 65 20 69 6e 20 61 6e 20 55 50 44 41  value in an UPDA
189d0 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  TE statement..  
189e0 20 20 20 20 20 20 2a 2a 20 47 69 76 65 20 73 75        ** Give su
189f0 63 68 20 76 61 6c 75 65 73 20 61 20 73 70 65 63  ch values a spec
18a00 69 61 6c 20 69 6e 74 65 72 6e 61 6c 2d 75 73 65  ial internal-use
18a10 2d 6f 6e 6c 79 20 73 65 72 69 61 6c 2d 74 79 70  -only serial-typ
18a20 65 20 6f 66 20 31 30 0a 20 20 20 20 20 20 20 20  e of 10.        
18a30 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ** so that they 
18a40 63 61 6e 20 62 65 20 70 61 73 73 65 64 20 74 68  can be passed th
18a50 72 6f 75 67 68 20 74 6f 20 78 55 70 64 61 74 65  rough to xUpdate
18a60 20 61 6e 64 20 68 61 76 65 0a 20 20 20 20 20 20   and have.      
18a70 20 20 2a 2a 20 61 20 74 72 75 65 20 73 71 6c 69    ** a true sqli
18a80 74 65 33 5f 76 61 6c 75 65 5f 6e 6f 63 68 61 6e  te3_value_nochan
18a90 67 65 28 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ge(). */.       
18aa0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
18ab0 3d 3d 4f 50 46 4c 41 47 5f 4e 4f 43 48 4e 47 5f  ==OPFLAG_NOCHNG_
18ac0 4d 41 47 49 43 20 7c 7c 20 43 4f 52 52 55 50 54  MAGIC || CORRUPT
18ad0 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73  _DB );.        s
18ae0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 31 30 3b  erial_type = 10;
18af0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
18b00 20 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   nData ){.      
18b10 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
18b20 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70  eMemExpandBlob(p
18b30 52 65 63 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  Rec) ) goto no_m
18b40 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
18b50 0a 20 20 20 20 20 20 20 20 6e 5a 65 72 6f 20 2b  .        nZero +
18b60 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pRec->u.nZero;
18b70 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20  .        len -= 
18b80 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pRec->u.nZero;. 
18b90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18ba0 20 6e 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20   nData += len;. 
18bb0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
18bc0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 37 20 29 3b  ial_type==127 );
18bd0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
18be0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 38 20  erial_type==128 
18bf0 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 73  );.    nHdr += s
18c00 65 72 69 61 6c 5f 74 79 70 65 3c 3d 31 32 37 20  erial_type<=127 
18c10 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 56 61 72  ? 1 : sqlite3Var
18c20 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
18c30 70 65 29 3b 0a 20 20 20 20 70 52 65 63 2d 3e 75  pe);.    pRec->u
18c40 54 65 6d 70 20 3d 20 73 65 72 69 61 6c 5f 74 79  Temp = serial_ty
18c50 70 65 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63  pe;.    if( pRec
18c60 3d 3d 70 44 61 74 61 30 20 29 20 62 72 65 61 6b  ==pData0 ) break
18c70 3b 0a 20 20 20 20 70 52 65 63 2d 2d 3b 0a 20 20  ;.    pRec--;.  
18c80 7d 77 68 69 6c 65 28 31 29 3b 0a 0a 20 20 2f 2a  }while(1);..  /*
18c90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18ca0 32 32 35 36 34 2d 31 31 36 34 37 20 54 68 65 20  22564-11647 The 
18cb0 68 65 61 64 65 72 20 62 65 67 69 6e 73 20 77 69  header begins wi
18cc0 74 68 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69  th a single vari
18cd0 6e 74 0a 20 20 2a 2a 20 77 68 69 63 68 20 64 65  nt.  ** which de
18ce0 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 6f 74  termines the tot
18cf0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
18d00 65 73 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  es in the header
18d10 2e 20 54 68 65 20 76 61 72 69 6e 74 0a 20 20 2a  . The varint.  *
18d20 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  * value is the s
18d30 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
18d40 72 20 69 6e 20 62 79 74 65 73 20 69 6e 63 6c 75  r in bytes inclu
18d50 64 69 6e 67 20 74 68 65 20 73 69 7a 65 20 76 61  ding the size va
18d60 72 69 6e 74 0a 20 20 2a 2a 20 69 74 73 65 6c 66  rint.  ** itself
18d70 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
18d80 20 6e 48 64 72 3d 3d 31 32 36 20 29 3b 0a 20 20   nHdr==126 );.  
18d90 74 65 73 74 63 61 73 65 28 20 6e 48 64 72 3d 3d  testcase( nHdr==
18da0 31 32 37 20 29 3b 0a 20 20 69 66 28 20 6e 48 64  127 );.  if( nHd
18db0 72 3c 3d 31 32 36 20 29 7b 0a 20 20 20 20 2f 2a  r<=126 ){.    /*
18dc0 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
18dd0 20 2a 2f 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20   */.    nHdr += 
18de0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
18df0 2f 2a 20 52 61 72 65 20 63 61 73 65 20 6f 66 20  /* Rare case of 
18e00 61 20 72 65 61 6c 6c 79 20 6c 61 72 67 65 20 68  a really large h
18e10 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 6e 56 61  eader */.    nVa
18e20 72 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 61  rint = sqlite3Va
18e30 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b 0a 20  rintLen(nHdr);. 
18e40 20 20 20 6e 48 64 72 20 2b 3d 20 6e 56 61 72 69     nHdr += nVari
18e50 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e 56 61 72  nt;.    if( nVar
18e60 69 6e 74 3c 73 71 6c 69 74 65 33 56 61 72 69 6e  int<sqlite3Varin
18e70 74 4c 65 6e 28 6e 48 64 72 29 20 29 20 6e 48 64  tLen(nHdr) ) nHd
18e80 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  r++;.  }.  nByte
18e90 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61 3b 0a 0a   = nHdr+nData;..
18ea0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
18eb0 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
18ec0 65 72 20 68 61 73 20 61 20 62 75 66 66 65 72 20  er has a buffer 
18ed0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
18ee0 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65 20  store .  ** the 
18ef0 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68 65 20  new record. The 
18f00 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  output register 
18f10 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74  (pOp->p3) is not
18f20 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a   allowed to.  **
18f30 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   be one of the i
18f40 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20 28  nput registers (
18f50 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 6c 6c  because the foll
18f60 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20  owing call to.  
18f70 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ** sqlite3VdbeMe
18f80 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
18f90 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62 65 72 20  ) could clobber 
18fa0 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65  the value before
18fb0 20 69 74 20 69 73 20 75 73 65 64 29 2e 0a 20 20   it is used)..  
18fc0 2a 2f 0a 20 20 69 66 28 20 6e 42 79 74 65 2b 6e  */.  if( nByte+n
18fd0 5a 65 72 6f 3c 3d 70 4f 75 74 2d 3e 73 7a 4d 61  Zero<=pOut->szMa
18fe0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54  lloc ){.    /* T
18ff0 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
19000 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 6c 61  er is already la
19010 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
19020 6c 64 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20  ld the record.. 
19030 20 20 20 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63     ** No error c
19040 68 65 63 6b 73 20 6f 72 20 62 75 66 66 65 72 20  hecks or buffer 
19050 65 6e 6c 61 72 67 65 6d 65 6e 74 20 69 73 20 72  enlargement is r
19060 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 70  equired */.    p
19070 4f 75 74 2d 3e 7a 20 3d 20 70 4f 75 74 2d 3e 7a  Out->z = pOut->z
19080 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 65 6c 73 65 7b  Malloc;.  }else{
19090 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
190a0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
190b0 68 65 20 6f 75 74 70 75 74 20 69 73 20 6e 6f 74  he output is not
190c0 20 74 6f 6f 20 62 69 67 20 61 6e 64 20 74 68 65   too big and the
190d0 6e 20 65 6e 6c 61 72 67 65 0a 20 20 20 20 2a 2a  n enlarge.    **
190e0 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69   the output regi
190f0 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ster to hold the
19100 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 2a 2f 0a   full result */.
19110 20 20 20 20 69 66 28 20 6e 42 79 74 65 2b 6e 5a      if( nByte+nZ
19120 65 72 6f 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ero>db->aLimit[S
19130 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
19140 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  TH] ){.      got
19150 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 7d  o too_big;.    }
19160 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19170 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
19180 65 73 69 7a 65 28 70 4f 75 74 2c 20 28 69 6e 74  esize(pOut, (int
19190 29 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20  )nByte) ){.     
191a0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
191b0 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e    }.  }.  pOut->
191c0 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a  n = (int)nByte;.
191d0 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
191e0 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 69 66 28 20  MEM_Blob;.  if( 
191f0 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70 4f 75  nZero ){.    pOu
19200 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e 5a 65  t->u.nZero = nZe
19210 72 6f 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c  ro;.    pOut->fl
19220 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65 72 6f 3b  ags |= MEM_Zero;
19230 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41  .  }.  UPDATE_MA
19240 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
19250 3b 0a 20 20 7a 48 64 72 20 3d 20 28 75 38 20 2a  ;.  zHdr = (u8 *
19260 29 70 4f 75 74 2d 3e 7a 3b 0a 20 20 7a 50 61 79  )pOut->z;.  zPay
19270 6c 6f 61 64 20 3d 20 7a 48 64 72 20 2b 20 6e 48  load = zHdr + nH
19280 64 72 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dr;..  /* Write 
19290 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
192a0 7a 48 64 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  zHdr += putVarin
192b0 74 33 32 28 7a 48 64 72 2c 20 6e 48 64 72 29 3b  t32(zHdr, nHdr);
192c0 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
192d0 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 70 52  0<=pLast );.  pR
192e0 65 63 20 3d 20 70 44 61 74 61 30 3b 0a 20 20 64  ec = pData0;.  d
192f0 6f 7b 0a 20 20 20 20 73 65 72 69 61 6c 5f 74 79  o{.    serial_ty
19300 70 65 20 3d 20 70 52 65 63 2d 3e 75 54 65 6d 70  pe = pRec->uTemp
19310 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19320 45 2d 4f 46 3a 20 52 2d 30 36 35 32 39 2d 34 37  E-OF: R-06529-47
19330 33 36 32 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68  362 Following th
19340 65 20 73 69 7a 65 20 76 61 72 69 6e 74 20 61 72  e size varint ar
19350 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 20 20  e one or more.  
19360 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
19370 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 70 65 72  varints, one per
19380 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 20 20   column. */.    
19390 7a 48 64 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  zHdr += putVarin
193a0 74 33 32 28 7a 48 64 72 2c 20 73 65 72 69 61 6c  t32(zHdr, serial
193b0 5f 74 79 70 65 29 3b 20 20 20 20 20 20 20 20 20  _type);         
193c0 20 20 20 2f 2a 20 73 65 72 69 61 6c 20 74 79 70     /* serial typ
193d0 65 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44  e */.    /* EVID
193e0 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35 33 36  ENCE-OF: R-64536
193f0 2d 35 31 37 32 38 20 54 68 65 20 76 61 6c 75 65  -51728 The value
19400 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
19410 6e 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 0a  n in the record.
19420 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
19430 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 68 65  ly follow the he
19440 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 7a 50 61  ader. */.    zPa
19450 79 6c 6f 61 64 20 2b 3d 20 73 71 6c 69 74 65 33  yload += sqlite3
19460 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 7a 50  VdbeSerialPut(zP
19470 61 79 6c 6f 61 64 2c 20 70 52 65 63 2c 20 73 65  ayload, pRec, se
19480 72 69 61 6c 5f 74 79 70 65 29 3b 20 2f 2a 20 63  rial_type); /* c
19490 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 7d 77 68 69  ontent */.  }whi
194a0 6c 65 28 20 28 2b 2b 70 52 65 63 29 3c 3d 70 4c  le( (++pRec)<=pL
194b0 61 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ast );.  assert(
194c0 20 6e 48 64 72 3d 3d 28 69 6e 74 29 28 7a 48 64   nHdr==(int)(zHd
194d0 72 20 2d 20 28 75 38 2a 29 70 4f 75 74 2d 3e 7a  r - (u8*)pOut->z
194e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
194f0 42 79 74 65 3d 3d 28 69 6e 74 29 28 7a 50 61 79  Byte==(int)(zPay
19500 6c 6f 61 64 20 2d 20 28 75 38 2a 29 70 4f 75 74  load - (u8*)pOut
19510 2d 3e 7a 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  ->z) );..  asser
19520 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20  t( pOp->p3>0 && 
19530 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p3<=(p->nMe
19540 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
19550 29 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  ) );.  REGISTER_
19560 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
19570 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Out);.  break;.}
19580 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 75  ../* Opcode: Cou
19590 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nt P1 P2 * * *.*
195a0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
195b0 5d 3d 63 6f 75 6e 74 28 29 0a 2a 2a 0a 2a 2a 20  ]=count().**.** 
195c0 53 74 6f 72 65 20 74 68 65 20 6e 75 6d 62 65 72  Store the number
195d0 20 6f 66 20 65 6e 74 72 69 65 73 20 28 61 6e 20   of entries (an 
195e0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29 20 69  integer value) i
195f0 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  n the table or i
19600 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  ndex .** opened 
19610 62 79 20 63 75 72 73 6f 72 20 50 31 20 69 6e 20  by cursor P1 in 
19620 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2f 0a 23  register P2.*/.#
19630 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19640 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 63 61  IT_BTREECOUNT.ca
19650 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20 7b 20 20  se OP_Count: {  
19660 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
19670 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72 79 3b 0a  /.  i64 nEntry;.
19680 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
19690 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  r;..  assert( p-
196a0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d  >apCsr[pOp->p1]-
196b0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
196c0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43  PE_BTREE );.  pC
196d0 72 73 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  rsr = p->apCsr[p
196e0 4f 70 2d 3e 70 31 5d 2d 3e 75 63 2e 70 43 75 72  Op->p1]->uc.pCur
196f0 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  sor;.  assert( p
19700 43 72 73 72 20 29 3b 0a 20 20 6e 45 6e 74 72 79  Crsr );.  nEntry
19710 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65   = 0;  /* Not ne
19720 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64  eded.  Only used
19730 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61   to silence a wa
19740 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  rning. */.  rc =
19750 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 75   sqlite3BtreeCou
19760 6e 74 28 70 43 72 73 72 2c 20 26 6e 45 6e 74 72  nt(pCrsr, &nEntr
19770 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  y);.  if( rc ) g
19780 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
19790 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75 74 20 3d  _error;.  pOut =
197a0 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
197b0 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
197c0 3e 75 2e 69 20 3d 20 6e 45 6e 74 72 79 3b 0a 20  >u.i = nEntry;. 
197d0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
197e0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 61 76  ../* Opcode: Sav
197f0 65 70 6f 69 6e 74 20 50 31 20 2a 20 2a 20 50 34  epoint P1 * * P4
19800 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 2c 20 72   *.**.** Open, r
19810 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
19820 63 6b 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  ck the savepoint
19830 20 6e 61 6d 65 64 20 62 79 20 70 61 72 61 6d 65   named by parame
19840 74 65 72 20 50 34 2c 20 64 65 70 65 6e 64 69 6e  ter P4, dependin
19850 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 76 61 6c 75  g.** on the valu
19860 65 20 6f 66 20 50 31 2e 20 54 6f 20 6f 70 65 6e  e of P1. To open
19870 20 61 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74   a new savepoint
19880 20 73 65 74 20 50 31 3d 3d 30 20 28 53 41 56 45   set P1==0 (SAVE
19890 50 4f 49 4e 54 5f 42 45 47 49 4e 29 2e 0a 2a 2a  POINT_BEGIN)..**
198a0 20 54 6f 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   To release (com
198b0 6d 69 74 29 20 61 6e 20 65 78 69 73 74 69 6e 67  mit) an existing
198c0 20 73 61 76 65 70 6f 69 6e 74 20 73 65 74 20 50   savepoint set P
198d0 31 3d 3d 31 20 28 53 41 56 45 50 4f 49 4e 54 5f  1==1 (SAVEPOINT_
198e0 52 45 4c 45 41 53 45 29 2e 0a 2a 2a 20 54 6f 20  RELEASE)..** To 
198f0 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73  rollback an exis
19900 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 73  ting savepoint s
19910 65 74 20 50 31 3d 3d 32 20 28 53 41 56 45 50 4f  et P1==2 (SAVEPO
19920 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 2e 0a 2a  INT_ROLLBACK)..*
19930 2f 0a 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f  /.case OP_Savepo
19940 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b  int: {.  int p1;
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
19970 65 20 6f 66 20 50 31 20 6f 70 65 72 61 6e 64 20  e of P1 operand 
19980 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
19990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
199a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
199b0 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69  savepoint */.  i
199c0 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65  nt nName;.  Save
199d0 70 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53  point *pNew;.  S
199e0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
199f0 6f 69 6e 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e  oint;.  Savepoin
19a00 74 20 2a 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69  t *pTmp;.  int i
19a10 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74  Savepoint;.  int
19a20 20 69 69 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70   ii;..  p1 = pOp
19a30 2d 3e 70 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  ->p1;.  zName = 
19a40 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a  pOp->p4.z;..  /*
19a50 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
19a60 20 70 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   p1 parameter is
19a70 20 76 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61   valid. Also tha
19a80 74 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  t if there is no
19a90 20 6f 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   open.  ** trans
19aa0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  action, then the
19ab0 72 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79  re cannot be any
19ac0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20   savepoints. .  
19ad0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
19ae0 3e 70 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c  >pSavepoint==0 |
19af0 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
19b00 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
19b10 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42   p1==SAVEPOINT_B
19b20 45 47 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f  EGIN||p1==SAVEPO
19b30 49 4e 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d  INT_RELEASE||p1=
19b40 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
19b50 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ACK );.  assert(
19b60 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
19b70 7c 7c 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  || db->isTransac
19b80 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  tionSavepoint==0
19b90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68   );.  assert( ch
19ba0 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e  eckSavepointCoun
19bb0 74 28 64 62 29 20 29 3b 0a 20 20 61 73 73 65 72  t(db) );.  asser
19bc0 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
19bd0 29 3b 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53 41  );..  if( p1==SA
19be0 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b  VEPOINT_BEGIN ){
19bf0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
19c00 62 65 57 72 69 74 65 3e 30 20 29 7b 0a 20 20 20  beWrite>0 ){.   
19c10 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 61 76 65     /* A new save
19c20 70 6f 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  point cannot be 
19c30 63 72 65 61 74 65 64 20 69 66 20 74 68 65 72 65  created if there
19c40 20 61 72 65 20 61 63 74 69 76 65 20 77 72 69 74   are active writ
19c50 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  e .      ** stat
19c60 65 6d 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65  ements (i.e. ope
19c70 6e 20 72 65 61 64 2f 77 72 69 74 65 20 69 6e 63  n read/write inc
19c80 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61  remental blob ha
19c90 6e 64 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f  ndles)..      */
19ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19cb0 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e  beError(p, "cann
19cc0 6f 74 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ot open savepoin
19cd0 74 20 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  t - SQL statemen
19ce0 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29  ts in progress")
19cf0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
19d00 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
19d10 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  lse{.      nName
19d20 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
19d30 33 30 28 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e  30(zName);..#ifn
19d40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19d50 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
19d60 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
19d70 69 73 20 4f 6b 20 65 76 65 6e 20 69 66 20 74 68  is Ok even if th
19d80 69 73 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  is savepoint is 
19d90 61 63 74 75 61 6c 6c 79 20 61 20 74 72 61 6e 73  actually a trans
19da0 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
19db0 73 61 76 65 70 6f 69 6e 74 20 28 61 6e 64 20 74  savepoint (and t
19dc0 68 65 72 65 66 6f 72 65 20 73 68 6f 75 6c 64 20  herefore should 
19dd0 6e 6f 74 20 70 72 6f 6d 70 74 20 78 53 61 76 65  not prompt xSave
19de0 70 6f 69 6e 74 28 29 29 20 63 61 6c 6c 62 61 63  point()) callbac
19df0 6b 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ks..      ** If 
19e00 74 68 69 73 20 69 73 20 61 20 74 72 61 6e 73 61  this is a transa
19e10 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
19e20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74  being opened, it
19e30 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 20   is guaranteed. 
19e40 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65       ** that the
19e50 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61   db->aVTrans[] a
19e60 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 20  rray is empty.  
19e70 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
19e80 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
19e90 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e  =0 || db->nVTran
19ea0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  s==0 );.      rc
19eb0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
19ec0 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
19ed0 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20  POINT_BEGIN,.   
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
19f00 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
19f10 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
19f20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19f30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
19f40 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
19f50 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
19f60 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 61   Create a new sa
19f70 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
19f80 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  e. */.      pNew
19f90 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
19fa0 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
19fb0 6f 66 28 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e  of(Savepoint)+nN
19fc0 61 6d 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  ame+1);.      if
19fd0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
19fe0 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20    pNew->zName = 
19ff0 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d  (char *)&pNew[1]
1a000 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1a010 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  (pNew->zName, zN
1a020 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
1a030 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49     .        /* I
1a040 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  f there is no op
1a050 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
1a060 74 68 65 6e 20 6d 61 72 6b 20 74 68 69 73 20 61  then mark this a
1a070 73 20 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20  s a special.    
1a080 20 20 20 20 2a 2a 20 22 74 72 61 6e 73 61 63 74      ** "transact
1a090 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 22 2e 20  ion savepoint". 
1a0a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  */.        if( d
1a0b0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
1a0c0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
1a0d0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20  utoCommit = 0;. 
1a0e0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54           db->isT
1a0f0 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
1a100 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  int = 1;.       
1a110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a120 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
1a130 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ++;.        }.. 
1a140 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74         /* Link t
1a150 68 65 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74  he new savepoint
1a160 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1a170 73 65 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74  se handle's list
1a180 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
1a190 77 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  w->pNext = db->p
1a1a0 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20  Savepoint;.     
1a1b0 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
1a1c0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  t = pNew;.      
1a1d0 20 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65    pNew->nDeferre
1a1e0 64 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66  dCons = db->nDef
1a1f0 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20  erredCons;.     
1a200 20 20 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72     pNew->nDeferr
1a210 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e  edImmCons = db->
1a220 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
1a230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1a250 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50 4f 49  ert( p1==SAVEPOI
1a260 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 70 31  NT_RELEASE || p1
1a270 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1a280 42 41 43 4b 20 29 3b 0a 20 20 20 20 69 53 61 76  BACK );.    iSav
1a290 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  epoint = 0;..   
1a2a0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   /* Find the nam
1a2b0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  ed savepoint. If
1a2c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63   there is no suc
1a2d0 68 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65  h savepoint, the
1a2e0 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65  n an.    ** an e
1a2f0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1a300 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a   to the user.  *
1a310 2f 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20  /.    for(.     
1a320 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62   pSavepoint = db
1a330 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20  ->pSavepoint; . 
1a340 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20       pSavepoint 
1a350 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1a360 70 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e  p(pSavepoint->zN
1a370 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
1a380 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20     pSavepoint = 
1a390 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78  pSavepoint->pNex
1a3a0 74 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  t.    ){.      i
1a3b0 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20  Savepoint++;.   
1a3c0 20 7d 0a 20 20 20 20 69 66 28 20 21 70 53 61 76   }.    if( !pSav
1a3d0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
1a3e0 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
1a3f0 28 70 2c 20 22 6e 6f 20 73 75 63 68 20 73 61 76  (p, "no such sav
1a400 65 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61  epoint: %s", zNa
1a410 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  me);.      rc = 
1a420 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1a430 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
1a440 6e 56 64 62 65 57 72 69 74 65 3e 30 20 26 26 20  nVdbeWrite>0 && 
1a450 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  p1==SAVEPOINT_RE
1a460 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 2f  LEASE ){.      /
1a470 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
1a480 69 62 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20  ible to release 
1a490 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70  (commit) a savep
1a4a0 6f 69 6e 74 20 69 66 20 74 68 65 72 65 20 61 72  oint if there ar
1a4b0 65 20 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69  e .      ** acti
1a4c0 76 65 20 77 72 69 74 65 20 73 74 61 74 65 6d 65  ve write stateme
1a4d0 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nts..      */.  
1a4e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
1a4f0 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20  rror(p, "cannot 
1a500 72 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e  release savepoin
1a510 74 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20  t - ".          
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20  "SQL statements 
1a540 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20  in progress");. 
1a550 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a560 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
1a570 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65  {..      /* Dete
1a580 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
1a590 20 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20 74   not this is a t
1a5a0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1a5b0 6f 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20  oint. If so,.   
1a5c0 20 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69     ** and this i
1a5d0 73 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d  s a RELEASE comm
1a5e0 61 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  and, then the cu
1a5f0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1a600 6e 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63  n .      ** is c
1a610 6f 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20  ommitted. .     
1a620 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
1a630 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53  Transaction = pS
1a640 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d  avepoint->pNext=
1a650 3d 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e  =0 && db->isTran
1a660 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
1a670 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
1a680 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d  ansaction && p1=
1a690 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
1a6a0 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SE ){.        if
1a6b0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56  ( (rc = sqlite3V
1a6c0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
1a6d0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
1a6e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76            goto v
1a6f0 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
1a700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62      }.        db
1a710 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
1a720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1a730 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
1a740 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
1a750 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63  .          p->pc
1a760 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61   = (int)(pOp - a
1a770 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  Op);.          d
1a780 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
1a790 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
1a7a0 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45  rc = rc = SQLITE
1a7b0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
1a7c0 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
1a7d0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
1a7e0 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73       db->isTrans
1a7f0 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20  actionSavepoint 
1a800 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
1a810 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d  = p->rc;.      }
1a820 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1a830 74 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65  t isSchemaChange
1a840 3b 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70  ;.        iSavep
1a850 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65  oint = db->nSave
1a860 70 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69  point - iSavepoi
1a870 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt - 1;.        
1a880 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e  if( p1==SAVEPOIN
1a890 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
1a8a0 20 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61          isSchema
1a8b0 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44  Change = (db->mD
1a8c0 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f  bFlags & DBFLAG_
1a8d0 53 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30  SchemaChange)!=0
1a8e0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1a8f0 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62  ii=0; ii<db->nDb
1a900 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
1a910 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a920 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1a930 73 6f 72 73 28 64 62 2d 3e 61 44 62 5b 69 69 5d  sors(db->aDb[ii]
1a940 2e 70 42 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .pBt,.          
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1a970 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
1a980 43 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK,.            
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9a0 20 20 20 20 20 20 20 20 20 20 20 69 73 53 63 68             isSch
1a9b0 65 6d 61 43 68 61 6e 67 65 3d 3d 30 29 3b 0a 20  emaChange==0);. 
1a9c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1a9d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1a9e0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1a9f0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
1aa00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1aa10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
1aa20 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50 4f 49  ert( p1==SAVEPOI
1aa30 4e 54 5f 52 45 4c 45 41 53 45 20 29 3b 0a 20 20  NT_RELEASE );.  
1aa40 20 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61          isSchema
1aa50 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
1aa60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
1aa70 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=0; ii<db->n
1aa80 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
1aa90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1aaa0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1aab0 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
1aac0 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   p1, iSavepoint)
1aad0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1aae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1aaf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1ab00 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1ab10 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
1ab20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ab30 20 20 20 20 69 66 28 20 69 73 53 63 68 65 6d 61      if( isSchema
1ab40 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20  Change ){.      
1ab50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
1ab60 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
1ab70 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  nts(db, 0);.    
1ab80 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
1ab90 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
1aba0 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20  nnection(db);.  
1abb0 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46          db->mDbF
1abc0 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53  lags |= DBFLAG_S
1abd0 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20  chemaChange;.   
1abe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1abf0 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67 61 72   .      /* Regar
1ac00 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
1ac10 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45 41   this is a RELEA
1ac20 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c 20  SE or ROLLBACK, 
1ac30 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20 20  destroy all .   
1ac40 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73     ** savepoints
1ac50 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65 20 6f   nested inside o
1ac60 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
1ac70 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f  being operated o
1ac80 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  n. */.      whil
1ac90 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  e( db->pSavepoin
1aca0 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  t!=pSavepoint ){
1acb0 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20 3d 20  .        pTmp = 
1acc0 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
1acd0 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76          db->pSav
1ace0 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
1acf0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
1ad00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ad10 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 64  pTmp);.        d
1ad20 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b  b->nSavepoint--;
1ad30 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1ad40 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52 45  /* If it is a RE
1ad50 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73 74  LEASE, then dest
1ad60 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
1ad70 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64  t being operated
1ad80 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f   on .      ** to
1ad90 6f 2e 20 49 66 20 69 74 20 69 73 20 61 20 52 4f  o. If it is a RO
1ada0 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68 65 6e 20  LLBACK TO, then 
1adb0 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  set the number o
1adc0 66 20 64 65 66 65 72 72 65 64 20 0a 20 20 20 20  f deferred .    
1add0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
1ade0 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72 65 73 65  violations prese
1adf0 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
1ae00 73 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  se to the value 
1ae10 73 74 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a 20  stored.      ** 
1ae20 77 68 65 6e 20 74 68 65 20 73 61 76 65 70 6f 69  when the savepoi
1ae30 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 20  nt was created. 
1ae40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 31   */.      if( p1
1ae50 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
1ae60 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ASE ){.        a
1ae70 73 73 65 72 74 28 20 70 53 61 76 65 70 6f 69 6e  ssert( pSavepoin
1ae80 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  t==db->pSavepoin
1ae90 74 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  t );.        db-
1aea0 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 53  >pSavepoint = pS
1aeb0 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3b  avepoint->pNext;
1aec0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1aed0 44 62 46 72 65 65 28 64 62 2c 20 70 53 61 76 65  DbFree(db, pSave
1aee0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
1aef0 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74 69  if( !isTransacti
1af00 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
1af10 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d  db->nSavepoint--
1af20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1af30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1af40 20 61 73 73 65 72 74 28 20 70 31 3d 3d 53 41 56   assert( p1==SAV
1af50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
1af60 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  );.        db->n
1af70 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
1af80 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66 65  Savepoint->nDefe
1af90 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20  rredCons;.      
1afa0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
1afb0 6d 6d 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f  mmCons = pSavepo
1afc0 69 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d  int->nDeferredIm
1afd0 6d 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 0a  mCons;.      }..
1afe0 20 20 20 20 20 20 69 66 28 20 21 69 73 54 72 61        if( !isTra
1aff0 6e 73 61 63 74 69 6f 6e 20 7c 7c 20 70 31 3d 3d  nsaction || p1==
1b000 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1b010 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
1b020 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
1b030 76 65 70 6f 69 6e 74 28 64 62 2c 20 70 31 2c 20  vepoint(db, p1, 
1b040 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
1b050 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b060 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
1b070 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1b080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b090 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67    }.  if( rc ) g
1b0a0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1b0b0 5f 65 72 72 6f 72 3b 0a 0a 20 20 62 72 65 61 6b  _error;..  break
1b0c0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1b0d0 41 75 74 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32  AutoCommit P1 P2
1b0e0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74   * * *.**.** Set
1b0f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 75   the database au
1b100 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74  to-commit flag t
1b110 6f 20 50 31 20 28 31 20 6f 72 20 30 29 2e 20 49  o P1 (1 or 0). I
1b120 66 20 50 32 20 69 73 20 74 72 75 65 2c 20 72 6f  f P2 is true, ro
1b130 6c 6c 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ll.** back any c
1b140 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1b150 62 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  btree transactio
1b160 6e 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ns. If there are
1b170 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 56   any active.** V
1b180 4d 73 20 28 61 70 61 72 74 20 66 72 6f 6d 20 74  Ms (apart from t
1b190 68 69 73 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61  his one), then a
1b1a0 20 52 4f 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e   ROLLBACK fails.
1b1b0 20 20 41 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73    A COMMIT fails
1b1c0 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 72 65   if.** there are
1b1d0 20 61 63 74 69 76 65 20 77 72 69 74 69 6e 67 20   active writing 
1b1e0 56 4d 73 20 6f 72 20 61 63 74 69 76 65 20 56 4d  VMs or active VM
1b1f0 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
1b200 64 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  d cache..**.** T
1b210 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
1b220 63 61 75 73 65 73 20 74 68 65 20 56 4d 20 74 6f  causes the VM to
1b230 20 68 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f   halt..*/.case O
1b240 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a  P_AutoCommit: {.
1b250 20 20 69 6e 74 20 64 65 73 69 72 65 64 41 75 74    int desiredAut
1b260 6f 43 6f 6d 6d 69 74 3b 0a 20 20 69 6e 74 20 69  oCommit;.  int i
1b270 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 64 65 73  Rollback;..  des
1b280 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 3d  iredAutoCommit =
1b290 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c   pOp->p1;.  iRol
1b2a0 6c 62 61 63 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b  lback = pOp->p2;
1b2b0 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72  .  assert( desir
1b2c0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20  edAutoCommit==1 
1b2d0 7c 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  || desiredAutoCo
1b2e0 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  mmit==0 );.  ass
1b2f0 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f  ert( desiredAuto
1b300 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52 6f  Commit==1 || iRo
1b310 6c 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  llback==0 );.  a
1b320 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
1b330 41 63 74 69 76 65 3e 30 20 29 3b 20 20 2f 2a 20  Active>0 );  /* 
1b340 41 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f 6e  At least this on
1b350 65 20 56 4d 20 69 73 20 61 63 74 69 76 65 20 2a  e VM is active *
1b360 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  /.  assert( p->b
1b370 49 73 52 65 61 64 65 72 20 29 3b 0a 0a 20 20 69  IsReader );..  i
1b380 66 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  f( desiredAutoCo
1b390 6d 6d 69 74 21 3d 64 62 2d 3e 61 75 74 6f 43 6f  mmit!=db->autoCo
1b3a0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 69 66 28 20  mmit ){.    if( 
1b3b0 69 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  iRollback ){.   
1b3c0 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72     assert( desir
1b3d0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20  edAutoCommit==1 
1b3e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b3f0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
1b400 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
1b410 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 64 62  LBACK);.      db
1b420 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
1b430 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1b440 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
1b450 74 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72  t && db->nVdbeWr
1b460 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  ite>0 ){.      /
1b470 2a 20 49 66 20 74 68 69 73 20 69 6e 73 74 72 75  * If this instru
1b480 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73  ction implements
1b490 20 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20 6f 74   a COMMIT and ot
1b4a0 68 65 72 20 56 4d 73 20 61 72 65 20 77 72 69 74  her VMs are writ
1b4b0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 72 65 74  ing.      ** ret
1b4c0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64  urn an error ind
1b4d0 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
1b4e0 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20   other VMs must 
1b4f0 63 6f 6d 70 6c 65 74 65 20 66 69 72 73 74 2e 20  complete first. 
1b500 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b510 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
1b520 28 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d  (p, "cannot comm
1b530 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d  it transaction -
1b540 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51               "SQ
1b560 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  L statements in 
1b570 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20  progress");.    
1b580 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1b590 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  SY;.      goto a
1b5a0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1b5b0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
1b5c0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64   (rc = sqlite3Vd
1b5d0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29  beCheckFk(p, 1))
1b5e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b5f0 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72       goto vdbe_r
1b600 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
1b610 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f  {.      db->auto
1b620 43 6f 6d 6d 69 74 20 3d 20 28 75 38 29 64 65 73  Commit = (u8)des
1b630 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a  iredAutoCommit;.
1b640 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
1b650 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
1b660 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
1b670 0a 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 28  .      p->pc = (
1b680 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b  int)(pOp - aOp);
1b690 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43  .      db->autoC
1b6a0 6f 6d 6d 69 74 20 3d 20 28 75 38 29 28 31 2d 64  ommit = (u8)(1-d
1b6b0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
1b6c0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  );.      p->rc =
1b6d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1b6e0 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64  Y;.      goto vd
1b6f0 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d  be_return;.    }
1b700 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1b710 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
1b720 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f  ;.    sqlite3Clo
1b730 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
1b740 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
1b750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b760 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b770 44 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DONE;.    }else{
1b780 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b790 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
1b7a0 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65      goto vdbe_re
1b7b0 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  turn;.  }else{. 
1b7c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
1b7d0 72 6f 72 28 70 2c 0a 20 20 20 20 20 20 20 20 28  ror(p,.        (
1b7e0 21 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d  !desiredAutoComm
1b7f0 69 74 29 3f 22 63 61 6e 6e 6f 74 20 73 74 61 72  it)?"cannot star
1b800 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1b810 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1b820 74 69 6f 6e 22 3a 28 0a 20 20 20 20 20 20 20 20  tion":(.        
1b830 28 69 52 6f 6c 6c 62 61 63 6b 29 3f 22 63 61 6e  (iRollback)?"can
1b840 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e  not rollback - n
1b850 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  o transaction is
1b860 20 61 63 74 69 76 65 22 3a 0a 20 20 20 20 20 20   active":.      
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
1b880 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f  nnot commit - no
1b890 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1b8a0 61 63 74 69 76 65 22 29 29 3b 0a 20 20 20 20 20  active"));.     
1b8b0 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20 53 51      .    rc = SQ
1b8c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1b8d0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1b8e0 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62  o_error;.  }.  b
1b8f0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1b900 64 65 3a 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  de: Transaction 
1b910 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
1b920 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
1b930 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 64 61 74 61  nsaction on data
1b940 62 61 73 65 20 50 31 20 69 66 20 61 20 74 72 61  base P1 if a tra
1b950 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  nsaction is not 
1b960 61 6c 72 65 61 64 79 0a 2a 2a 20 61 63 74 69 76  already.** activ
1b970 65 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 6e  e..** If P2 is n
1b980 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
1b990 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1b9a0 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6f 72  n is started, or
1b9b0 20 69 66 20 61 20 0a 2a 2a 20 72 65 61 64 2d 74   if a .** read-t
1b9c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
1b9d0 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 69 74  ready active, it
1b9e0 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
1b9f0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1ba00 69 6f 6e 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73  ion..** If P2 is
1ba10 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 72 65   zero, then a re
1ba20 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
1ba30 73 20 73 74 61 72 74 65 64 2e 0a 2a 2a 0a 2a 2a  s started..**.**
1ba40 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78   P1 is the index
1ba50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ba60 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74   file on which t
1ba70 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
1ba80 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20 49  s.** started.  I
1ba90 6e 64 65 78 20 30 20 69 73 20 74 68 65 20 6d 61  ndex 0 is the ma
1baa0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1bab0 20 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73 20   and index 1 is 
1bac0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65 64  the.** file used
1bad0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74   for temporary t
1bae0 61 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73 20  ables.  Indices 
1baf0 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72 65  of 2 or more are
1bb00 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74 74   used for.** att
1bb10 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e  ached databases.
1bb20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74  .**.** If a writ
1bb30 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
1bb40 20 73 74 61 72 74 65 64 20 61 6e 64 20 74 68 65   started and the
1bb50 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f   Vdbe.usesStmtJo
1bb60 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a 2a  urnal flag is.**
1bb70 20 74 72 75 65 20 28 74 68 69 73 20 66 6c 61 67   true (this flag
1bb80 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 56   is set if the V
1bb90 64 62 65 20 6d 61 79 20 6d 6f 64 69 66 79 20 6d  dbe may modify m
1bba0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
1bbb0 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72 6f   and may.** thro
1bbc0 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
1bbd0 74 69 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d 65  tion), a stateme
1bbe0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  nt transaction m
1bbf0 61 79 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e 65  ay also be opene
1bc00 64 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  d..** More speci
1bc10 66 69 63 61 6c 6c 79 2c 20 61 20 73 74 61 74 65  fically, a state
1bc20 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1bc30 20 69 73 20 6f 70 65 6e 65 64 20 69 66 66 20 74   is opened iff t
1bc40 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
1bc50 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 75 72  onnection is cur
1bc60 72 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61 75  rently not in au
1bc70 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f  tocommit mode, o
1bc80 72 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  r if there are o
1bc90 74 68 65 72 0a 2a 2a 20 61 63 74 69 76 65 20 73  ther.** active s
1bca0 74 61 74 65 6d 65 6e 74 73 2e 20 41 20 73 74 61  tatements. A sta
1bcb0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1bcc0 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68  on allows the ch
1bcd0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1bce0 69 73 0a 2a 2a 20 56 44 42 45 20 74 6f 20 62 65  is.** VDBE to be
1bcf0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
1bd00 65 72 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68  er an error with
1bd10 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
1bd20 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65  ll back the.** e
1bd30 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1bd40 6e 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 69  n. If no error i
1bd50 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1bd60 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
1bd70 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1bd80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1bd90 6f 6d 6d 69 74 20 77 68 65 6e 20 74 68 65 20 56  ommit when the V
1bda0 44 42 45 20 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a  DBE halts..**.**
1bdb0 20 49 66 20 50 35 21 3d 30 20 74 68 65 6e 20 74   If P5!=0 then t
1bdc0 68 69 73 20 6f 70 63 6f 64 65 20 61 6c 73 6f 20  his opcode also 
1bdd0 63 68 65 63 6b 73 20 74 68 65 20 73 63 68 65 6d  checks the schem
1bde0 61 20 63 6f 6f 6b 69 65 20 61 67 61 69 6e 73 74  a cookie against
1bdf0 20 50 33 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73   P3.** and the s
1be00 63 68 65 6d 61 20 67 65 6e 65 72 61 74 69 6f 6e  chema generation
1be10 20 63 6f 75 6e 74 65 72 20 61 67 61 69 6e 73 74   counter against
1be20 20 50 34 2e 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b   P4..** The cook
1be30 69 65 20 63 68 61 6e 67 65 73 20 69 74 73 20 76  ie changes its v
1be40 61 6c 75 65 20 77 68 65 6e 65 76 65 72 20 74 68  alue whenever th
1be50 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1be60 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 20 54 68  a changes..** Th
1be70 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
1be80 75 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 77  used to detect w
1be90 68 65 6e 20 74 68 61 74 20 74 68 65 20 63 6f 6f  hen that the coo
1bea0 6b 69 65 20 68 61 73 20 63 68 61 6e 67 65 64 0a  kie has changed.
1beb0 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ** and that the 
1bec0 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
1bed0 6e 65 65 64 73 20 74 6f 20 72 65 72 65 61 64 20  needs to reread 
1bee0 74 68 65 20 73 63 68 65 6d 61 2e 20 20 49 66 20  the schema.  If 
1bef0 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 63 6f  the schema.** co
1bf00 6f 6b 69 65 20 69 6e 20 50 33 20 64 69 66 66 65  okie in P3 diffe
1bf10 72 73 20 66 72 6f 6d 20 74 68 65 20 73 63 68 65  rs from the sche
1bf20 6d 61 20 63 6f 6f 6b 69 65 20 69 6e 20 74 68 65  ma cookie in the
1bf30 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
1bf40 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 20 73 63   or.** if the sc
1bf50 68 65 6d 61 20 67 65 6e 65 72 61 74 69 6f 6e 20  hema generation 
1bf60 63 6f 75 6e 74 65 72 20 69 6e 20 50 34 20 64 69  counter in P4 di
1bf70 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63  ffers from the c
1bf80 75 72 72 65 6e 74 0a 2a 2a 20 67 65 6e 65 72 61  urrent.** genera
1bf90 74 69 6f 6e 20 63 6f 75 6e 74 65 72 2c 20 74 68  tion counter, th
1bfa0 65 6e 20 61 6e 20 53 51 4c 49 54 45 5f 53 43 48  en an SQLITE_SCH
1bfb0 45 4d 41 20 65 72 72 6f 72 20 69 73 20 72 61 69  EMA error is rai
1bfc0 73 65 64 20 61 6e 64 20 65 78 65 63 75 74 69 6f  sed and executio
1bfd0 6e 0a 2a 2a 20 68 61 6c 74 73 2e 20 20 54 68 65  n.** halts.  The
1bfe0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
1bff0 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
1c000 20 6d 69 67 68 74 20 74 68 65 6e 20 72 65 70 72   might then repr
1c010 65 70 61 72 65 20 74 68 65 0a 2a 2a 20 73 74 61  epare the.** sta
1c020 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 72 75 6e  tement and rerun
1c030 20 69 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67   it from the beg
1c040 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20  inning..*/.case 
1c050 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20  OP_Transaction: 
1c060 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  {.  Btree *pBt;.
1c070 20 20 69 6e 74 20 69 4d 65 74 61 20 3d 20 30 3b    int iMeta = 0;
1c080 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ..  assert( p->b
1c090 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 61 73  IsReader );.  as
1c0a0 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
1c0b0 79 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d  y==0 || pOp->p2=
1c0c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c0d0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1c0e0 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
1c0f0 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
1c100 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61  kTest(p->btreeMa
1c110 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a  sk, pOp->p1) );.
1c120 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 26    if( pOp->p2 &&
1c130 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1c140 4c 49 54 45 5f 51 75 65 72 79 4f 6e 6c 79 29 21  LITE_QueryOnly)!
1c150 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
1c160 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1c170 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
1c180 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
1c190 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
1c1a0 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a  [pOp->p1].pBt;..
1c1b0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
1c1c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1c1d0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74  eeBeginTrans(pBt
1c1e0 2c 20 70 4f 70 2d 3e 70 32 2c 20 26 69 4d 65 74  , pOp->p2, &iMet
1c1f0 61 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  a);.    testcase
1c200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1c210 59 5f 53 4e 41 50 53 48 4f 54 20 29 3b 0a 20 20  Y_SNAPSHOT );.  
1c220 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
1c230 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f  SQLITE_BUSY_RECO
1c240 56 45 52 59 20 29 3b 0a 20 20 20 20 69 66 28 20  VERY );.    if( 
1c250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c260 0a 20 20 20 20 20 20 69 66 28 20 28 72 63 26 30  .      if( (rc&0
1c270 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  xff)==SQLITE_BUS
1c280 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Y ){.        p->
1c290 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d  pc = (int)(pOp -
1c2a0 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 70   aOp);.        p
1c2b0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
1c2c0 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
1c2d0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
1c2e0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1c2f0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1c300 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  }..    if( pOp->
1c310 70 32 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  p2 && p->usesStm
1c320 74 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 20 26  tJournal .     &
1c330 26 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  & (db->autoCommi
1c340 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56 64 62  t==0 || db->nVdb
1c350 65 52 65 61 64 3e 31 29 20 0a 20 20 20 20 29 7b  eRead>1) .    ){
1c360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
1c370 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
1c380 72 61 6e 73 28 70 42 74 29 20 29 3b 0a 20 20 20  rans(pBt) );.   
1c390 20 20 20 69 66 28 20 70 2d 3e 69 53 74 61 74 65     if( p->iState
1c3a0 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ment==0 ){.     
1c3b0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
1c3c0 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20 26 26 20  Statement>=0 && 
1c3d0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 3d  db->nSavepoint>=
1c3e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  0 );.        db-
1c3f0 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b 3b 20 0a  >nStatement++; .
1c400 20 20 20 20 20 20 20 20 70 2d 3e 69 53 74 61 74          p->iStat
1c410 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76  ement = db->nSav
1c420 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 6e 53 74  epoint + db->nSt
1c430 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 20 20 7d  atement;.      }
1c440 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
1c450 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
1c460 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
1c470 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74 61 74 65  BEGIN, p->iState
1c480 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20 20 20 69  ment-1);.      i
1c490 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c4b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1c4c0 69 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e 69  inStmt(pBt, p->i
1c4d0 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  Statement);.    
1c4e0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 74    }..      /* St
1c4f0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
1c500 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
1c510 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
1c520 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
1c530 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74  t.      ** count
1c540 65 72 2e 20 49 66 20 74 68 65 20 73 74 61 74 65  er. If the state
1c550 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1c560 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1c570 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20 20 20 20  led back,.      
1c580 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1c590 74 68 69 73 20 63 6f 75 6e 74 65 72 20 6e 65 65  this counter nee
1c5a0 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
1c5b0 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20 20  d too.  */.     
1c5c0 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
1c5d0 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64   = db->nDeferred
1c5e0 43 6f 6e 73 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  Cons;.      p->n
1c5f0 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 20 3d  StmtDefImmCons =
1c600 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
1c610 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  mCons;.    }.  }
1c620 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1c630 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34  p5==0 || pOp->p4
1c640 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
1c650 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 0a  ;.  if( pOp->p5.
1c660 20 20 20 26 26 20 28 69 4d 65 74 61 21 3d 70 4f     && (iMeta!=pO
1c670 70 2d 3e 70 33 0a 20 20 20 20 20 20 7c 7c 20 64  p->p3.      || d
1c680 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
1c690 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
1c6a0 74 69 6f 6e 21 3d 70 4f 70 2d 3e 70 34 2e 69 29  tion!=pOp->p4.i)
1c6b0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  .  ){.    /*.   
1c6c0 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
1c6d0 4f 4e 2d 4f 46 3a 20 52 2d 30 33 31 38 39 2d 35  ON-OF: R-03189-5
1c6e0 31 31 33 35 20 41 73 20 65 61 63 68 20 53 51 4c  1135 As each SQL
1c6f0 20 73 74 61 74 65 6d 65 6e 74 20 72 75 6e 73 2c   statement runs,
1c700 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 20 20   the schema.    
1c710 2a 2a 20 76 65 72 73 69 6f 6e 20 69 73 20 63 68  ** version is ch
1c720 65 63 6b 65 64 20 74 6f 20 65 6e 73 75 72 65 20  ecked to ensure 
1c730 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20  that the schema 
1c740 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20  has not changed 
1c750 73 69 6e 63 65 20 74 68 65 0a 20 20 20 20 2a 2a  since the.    **
1c760 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 77   SQL statement w
1c770 61 73 20 70 72 65 70 61 72 65 64 2e 0a 20 20 20  as prepared..   
1c780 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 44   */.    sqlite3D
1c790 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
1c7a0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
1c7b0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
1c7c0 62 53 74 72 44 75 70 28 64 62 2c 20 22 64 61 74  bStrDup(db, "dat
1c7d0 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
1c7e0 20 63 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20   changed");.    
1c7f0 2f 2a 20 49 66 20 74 68 65 20 73 63 68 65 6d 61  /* If the schema
1c800 2d 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65  -cookie from the
1c810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
1c820 61 74 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69  atches the cooki
1c830 65 20 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  e .    ** stored
1c840 20 77 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d   with the in-mem
1c850 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
1c860 6f 6e 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  on of the schema
1c870 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  , do.    ** not 
1c880 72 65 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d  reload the schem
1c890 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
1c8a0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  ase file..    **
1c8b0 0a 20 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75  .    ** If virtu
1c8c0 61 6c 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e  al-tables are in
1c8d0 20 75 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f   use, this is no
1c8e0 74 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69  t just an optimi
1c8f0 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f  zation..    ** O
1c900 66 74 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73  ften, v-tables s
1c910 74 6f 72 65 20 74 68 65 69 72 20 64 61 74 61 20  tore their data 
1c920 69 6e 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  in other SQLite 
1c930 74 61 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20  tables, which.  
1c940 20 20 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64    ** are queried
1c950 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65   from within xNe
1c960 78 74 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76  xt() and other v
1c970 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75  -table methods u
1c980 73 69 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70  sing.    ** prep
1c990 61 72 65 64 20 71 75 65 72 69 65 73 2e 20 49 66  ared queries. If
1c9a0 20 73 75 63 68 20 61 20 71 75 65 72 79 20 69 73   such a query is
1c9b0 20 6f 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65   out-of-date, we
1c9c0 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a   do not want to.
1c9d0 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74      ** discard t
1c9e0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1c9f0 6d 61 2c 20 61 73 20 74 68 65 20 75 73 65 72 20  ma, as the user 
1ca00 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  code implementin
1ca10 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74  g the.    ** v-t
1ca20 61 62 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20  able would have 
1ca30 74 6f 20 62 65 20 72 65 61 64 79 20 66 6f 72 20  to be ready for 
1ca40 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  the sqlite3_vtab
1ca50 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
1ca60 66 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  f.    ** to be i
1ca70 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65  nvalidated whene
1ca80 76 65 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ver sqlite3_step
1ca90 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  () is called fro
1caa0 6d 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a  m within .    **
1cab0 20 61 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f   a v-table metho
1cac0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1cad0 28 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  ( db->aDb[pOp->p
1cae0 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  1].pSchema->sche
1caf0 6d 61 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61  ma_cookie!=iMeta
1cb00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1cb10 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28  3ResetOneSchema(
1cb20 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20  db, pOp->p1);.  
1cb30 20 20 7d 0a 20 20 20 20 70 2d 3e 65 78 70 69 72    }.    p->expir
1cb40 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  ed = 1;.    rc =
1cb50 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a   SQLITE_SCHEMA;.
1cb60 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67    }.  if( rc ) g
1cb70 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1cb80 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
1cb90 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
1cba0 65 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20  eadCookie P1 P2 
1cbb0 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61  P3 * *.**.** Rea
1cbc0 64 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20  d cookie number 
1cbd0 50 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  P3 from database
1cbe0 20 50 31 20 61 6e 64 20 77 72 69 74 65 20 69 74   P1 and write it
1cbf0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
1cc00 32 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74  2..** P3==1 is t
1cc10 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
1cc20 6e 2e 20 20 50 33 3d 3d 32 20 69 73 20 74 68 65  n.  P3==2 is the
1cc30 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74   database format
1cc40 2e 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 68  ..** P3==3 is th
1cc50 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61  e recommended pa
1cc60 67 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20  ger cache size, 
1cc70 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50  and so forth.  P
1cc80 31 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d  1==0 is.** the m
1cc90 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1cca0 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74  e and P1==1 is t
1ccb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ccc0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
1ccd0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1cce0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  es..**.** There 
1ccf0 6d 75 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c  must be a read-l
1cd00 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1cd10 61 73 65 20 28 65 69 74 68 65 72 20 61 20 74 72  ase (either a tr
1cd20 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73  ansaction.** mus
1cd30 74 20 62 65 20 73 74 61 72 74 65 64 20 6f 72 20  t be started or 
1cd40 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  there must be an
1cd50 20 6f 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65   open cursor) be
1cd60 66 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e  fore.** executin
1cd70 67 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  g this instructi
1cd80 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  on..*/.case OP_R
1cd90 65 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20  eadCookie: {    
1cda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
1cdb0 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 74  t2 */.  int iMet
1cdc0 61 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  a;.  int iDb;.  
1cdd0 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 0a 0a 20 20  int iCookie;..  
1cde0 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
1cdf0 61 64 65 72 20 29 3b 0a 20 20 69 44 62 20 3d 20  ader );.  iDb = 
1ce00 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b  pOp->p1;.  iCook
1ce10 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  ie = pOp->p3;.  
1ce20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
1ce30 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d  SQLITE_N_BTREE_M
1ce40 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ETA );.  assert(
1ce50 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
1ce60 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
1ce70 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
1ce80 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  .pBt!=0 );.  ass
1ce90 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28  ert( DbMaskTest(
1cea0 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44  p->btreeMask, iD
1ceb0 62 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  b) );..  sqlite3
1cec0 42 74 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d  BtreeGetMeta(db-
1ced0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 69  >aDb[iDb].pBt, i
1cee0 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29 26  Cookie, (u32 *)&
1cef0 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74 20 3d  iMeta);.  pOut =
1cf00 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
1cf10 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
1cf20 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20 20  >u.i = iMeta;.  
1cf30 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1cf40 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20 50  ode: SetCookie P
1cf50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
1cf60 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 74 65  * Write the inte
1cf70 67 65 72 20 76 61 6c 75 65 20 50 33 20 69 6e 74  ger value P3 int
1cf80 6f 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20  o cookie number 
1cf90 50 32 20 6f 66 20 64 61 74 61 62 61 73 65 20 50  P2 of database P
1cfa0 31 2e 0a 2a 2a 20 50 32 3d 3d 31 20 69 73 20 74  1..** P2==1 is t
1cfb0 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
1cfc0 6e 2e 20 20 50 32 3d 3d 32 20 69 73 20 74 68 65  n.  P2==2 is the
1cfd0 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74   database format
1cfe0 2e 0a 2a 2a 20 50 32 3d 3d 33 20 69 73 20 74 68  ..** P2==3 is th
1cff0 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61  e recommended pa
1d000 67 65 72 20 63 61 63 68 65 20 0a 2a 2a 20 73 69  ger cache .** si
1d010 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ze, and so forth
1d020 2e 20 20 50 31 3d 3d 30 20 69 73 20 74 68 65 20  .  P1==0 is the 
1d030 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1d040 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20  le and P1==1 is 
1d050 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1d060 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 73 74   file used to st
1d070 6f 72 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ore temporary ta
1d080 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  bles..**.** A tr
1d090 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1d0a0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1d0b0 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20   executing this 
1d0c0 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20  opcode..*/.case 
1d0d0 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 0a  OP_SetCookie: {.
1d0e0 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 73 71    Db *pDb;..  sq
1d0f0 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69  lite3VdbeIncrWri
1d100 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b  teCounter(p, 0);
1d110 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1d120 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45  p2<SQLITE_N_BTRE
1d130 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65  E_META );.  asse
1d140 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
1d150 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
1d160 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44  b );.  assert( D
1d170 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
1d180 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29  eeMask, pOp->p1)
1d190 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1d1a0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
1d1b0 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
1d1c0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
1d1d0 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30  ert( pDb->pBt!=0
1d1e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1d1f0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1d200 48 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31  Held(db, pOp->p1
1d210 2c 20 30 29 20 29 3b 0a 20 20 2f 2a 20 53 65 65  , 0) );.  /* See
1d220 20 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e 64 65   note about inde
1d230 78 20 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f 50  x shifting on OP
1d240 5f 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a 20  _ReadCookie */. 
1d250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1d260 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 44 62  eeUpdateMeta(pDb
1d270 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20  ->pBt, pOp->p2, 
1d280 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 69 66 28 20  pOp->p3);.  if( 
1d290 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 53  pOp->p2==BTREE_S
1d2a0 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29 7b  CHEMA_VERSION ){
1d2b0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
1d2c0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 63   schema cookie c
1d2d0 68 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20 74  hanges, record t
1d2e0 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69 6e  he new cookie in
1d2f0 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  ternally */.    
1d300 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  pDb->pSchema->sc
1d310 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 70 4f  hema_cookie = pO
1d320 70 2d 3e 70 33 3b 0a 20 20 20 20 64 62 2d 3e 6d  p->p3;.    db->m
1d330 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
1d340 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
1d350 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
1d360 3e 70 32 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f  >p2==BTREE_FILE_
1d370 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a  FORMAT ){.    /*
1d380 20 52 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20   Record changes 
1d390 69 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  in the file form
1d3a0 61 74 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70  at */.    pDb->p
1d3b0 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
1d3c0 6d 61 74 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  mat = pOp->p3;. 
1d3d0 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31   }.  if( pOp->p1
1d3e0 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ==1 ){.    /* In
1d3f0 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
1d400 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
1d410 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 54 45   whenever the TE
1d420 4d 50 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  MP database.    
1d430 2a 2a 20 73 63 68 65 6d 61 20 69 73 20 63 68 61  ** schema is cha
1d440 6e 67 65 64 2e 20 20 54 69 63 6b 65 74 20 23 31  nged.  Ticket #1
1d450 36 34 34 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  644 */.    sqlit
1d460 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
1d470 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30  Statements(db, 0
1d480 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  );.    p->expire
1d490 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  d = 0;.  }.  if(
1d4a0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
1d4b0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1d4c0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1d4d0 63 6f 64 65 3a 20 4f 70 65 6e 52 65 61 64 20 50  code: OpenRead P
1d4e0 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
1d4f0 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 6f 74 3d   Synopsis: root=
1d500 50 32 20 69 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20  P2 iDb=P3.**.** 
1d510 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
1d520 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1d530 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 77  database table w
1d540 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69  hose root page i
1d550 73 0a 2a 2a 20 50 32 20 69 6e 20 61 20 64 61 74  s.** P2 in a dat
1d560 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
1d570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1d580 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1d590 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65  P3. .** P3==0 me
1d5a0 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
1d5b0 61 62 61 73 65 2c 20 50 33 3d 3d 31 20 6d 65 61  abase, P3==1 mea
1d5c0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1d5d0 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 74 65 6d  used for .** tem
1d5e0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2c 20 61  porary tables, a
1d5f0 6e 64 20 50 33 3e 31 20 6d 65 61 6e 73 20 75 73  nd P3>1 means us
1d600 65 64 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ed the correspon
1d610 64 69 6e 67 20 61 74 74 61 63 68 65 64 0a 2a 2a  ding attached.**
1d620 20 64 61 74 61 62 61 73 65 2e 20 20 47 69 76 65   database.  Give
1d630 20 74 68 65 20 6e 65 77 20 63 75 72 73 6f 72 20   the new cursor 
1d640 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 66  an identifier of
1d650 20 50 31 2e 20 20 54 68 65 20 50 31 0a 2a 2a 20   P1.  The P1.** 
1d660 76 61 6c 75 65 73 20 6e 65 65 64 20 6e 6f 74 20  values need not 
1d670 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 75  be contiguous bu
1d680 74 20 61 6c 6c 20 50 31 20 76 61 6c 75 65 73 20  t all P1 values 
1d690 73 68 6f 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20  should be small 
1d6a0 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 49 74 20  integers..** It 
1d6b0 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  is an error for 
1d6c0 50 31 20 74 6f 20 62 65 20 6e 65 67 61 74 69 76  P1 to be negativ
1d6d0 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  e..**.** Allowed
1d6e0 20 50 35 20 62 69 74 73 3a 0a 2a 2a 20 3c 75 6c   P5 bits:.** <ul
1d6f0 3e 0a 2a 2a 20 3c 6c 69 3e 20 20 3c 62 3e 30 78  >.** <li>  <b>0x
1d700 30 32 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  02 OPFLAG_SEEKEQ
1d710 3c 2f 62 3e 3a 20 54 68 69 73 20 63 75 72 73 6f  </b>: This curso
1d720 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75  r will only be u
1d730 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20  sed for.**      
1d740 20 65 71 75 61 6c 69 74 79 20 6c 6f 6f 6b 75 70   equality lookup
1d750 73 20 28 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  s (implemented a
1d760 73 20 61 20 70 61 69 72 20 6f 66 20 6f 70 63 6f  s a pair of opco
1d770 64 65 73 20 4f 50 5f 53 65 65 6b 47 45 2f 4f 50  des OP_SeekGE/OP
1d780 5f 49 64 78 47 54 0a 2a 2a 20 20 20 20 20 20 20  _IdxGT.**       
1d790 6f 66 20 4f 50 5f 53 65 65 6b 4c 45 2f 4f 50 5f  of OP_SeekLE/OP_
1d7a0 49 64 78 47 54 29 0a 2a 2a 20 3c 2f 75 6c 3e 0a  IdxGT).** </ul>.
1d7b0 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c  **.** The P4 val
1d7c0 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  ue may be either
1d7d0 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34 5f   an integer (P4_
1d7e0 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69 6e  INT32) or a poin
1d7f0 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49  ter to.** a KeyI
1d800 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28 50  nfo structure (P
1d810 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20 69  4_KEYINFO). If i
1d820 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
1d830 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  o a KeyInfo .** 
1d840 6f 62 6a 65 63 74 2c 20 74 68 65 6e 20 74 61 62  object, then tab
1d850 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
1d860 6d 75 73 74 20 62 65 20 61 6e 20 5b 69 6e 64 65  must be an [inde
1d870 78 20 62 2d 74 72 65 65 5d 20 77 68 65 72 65 20  x b-tree] where 
1d880 74 68 65 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 6f  the.** KeyInfo o
1d890 62 6a 65 63 74 20 64 65 66 69 6e 65 73 20 74 68  bject defines th
1d8a0 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f  e content and co
1d8b0 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75  llating .** sequ
1d8c0 65 6e 63 65 20 6f 66 20 74 68 61 74 20 69 6e 64  ence of that ind
1d8d0 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
1d8e0 77 69 73 65 2c 20 69 66 20 50 34 20 69 73 20 61  wise, if P4 is a
1d8f0 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61  n integer .** va
1d900 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 61  lue, then the ta
1d910 62 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ble being opened
1d920 20 6d 75 73 74 20 62 65 20 61 20 5b 74 61 62 6c   must be a [tabl
1d930 65 20 62 2d 74 72 65 65 5d 20 77 69 74 68 20 61  e b-tree] with a
1d940 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  .** number of co
1d950 6c 75 6d 6e 73 20 6e 6f 20 6c 65 73 73 20 74 68  lumns no less th
1d960 61 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  an the value of 
1d970 50 34 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  P4..**.** See al
1d980 73 6f 3a 20 4f 70 65 6e 57 72 69 74 65 2c 20 52  so: OpenWrite, R
1d990 65 6f 70 65 6e 49 64 78 0a 2a 2f 0a 2f 2a 20 4f  eopenIdx.*/./* O
1d9a0 70 63 6f 64 65 3a 20 52 65 6f 70 65 6e 49 64 78  pcode: ReopenIdx
1d9b0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
1d9c0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 6f  ** Synopsis: roo
1d9d0 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a 0a 2a  t=P2 iDb=P3.**.*
1d9e0 2a 20 54 68 65 20 52 65 6f 70 65 6e 49 64 78 20  * The ReopenIdx 
1d9f0 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6c 69 6b  opcode works lik
1da00 65 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 65 78  e OP_OpenRead ex
1da10 63 65 70 74 20 74 68 61 74 20 69 74 20 66 69 72  cept that it fir
1da20 73 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20  st.** checks to 
1da30 73 65 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  see if the curso
1da40 72 20 6f 6e 20 50 31 20 69 73 20 61 6c 72 65 61  r on P1 is alrea
1da50 64 79 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  dy open on the s
1da60 61 6d 65 0a 2a 2a 20 62 2d 74 72 65 65 20 61 6e  ame.** b-tree an
1da70 64 20 69 66 20 69 74 20 69 73 20 74 68 69 73 20  d if it is this 
1da80 6f 70 63 6f 64 65 20 62 65 63 6f 6d 65 73 20 61  opcode becomes a
1da90 20 6e 6f 2d 6f 70 2e 20 20 49 6e 20 6f 74 68 65   no-op.  In othe
1daa0 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 69 66 20 74  r words,.** if t
1dab0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
1dac0 65 61 64 79 20 6f 70 65 6e 2c 20 64 6f 20 6e 6f  eady open, do no
1dad0 74 20 72 65 6f 70 65 6e 20 69 74 2e 0a 2a 2a 0a  t reopen it..**.
1dae0 2a 2a 20 54 68 65 20 52 65 6f 70 65 6e 49 64 78  ** The ReopenIdx
1daf0 20 6f 70 63 6f 64 65 20 6d 61 79 20 6f 6e 6c 79   opcode may only
1db00 20 62 65 20 75 73 65 64 20 77 69 74 68 20 50 35   be used with P5
1db10 3d 3d 30 20 6f 72 20 50 35 3d 3d 4f 50 46 4c 41  ==0 or P5==OPFLA
1db20 47 5f 53 45 45 4b 45 51 0a 2a 2a 20 61 6e 64 20  G_SEEKEQ.** and 
1db30 77 69 74 68 20 50 34 20 62 65 69 6e 67 20 61 20  with P4 being a 
1db40 50 34 5f 4b 45 59 49 4e 46 4f 20 6f 62 6a 65 63  P4_KEYINFO objec
1db50 74 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  t.  Furthermore,
1db60 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 6d 75   the P3 value mu
1db70 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73 61 6d  st.** be the sam
1db80 65 20 61 73 20 65 76 65 72 79 20 6f 74 68 65 72  e as every other
1db90 20 52 65 6f 70 65 6e 49 64 78 20 6f 72 20 4f 70   ReopenIdx or Op
1dba0 65 6e 52 65 61 64 20 66 6f 72 20 74 68 65 20 73  enRead for the s
1dbb0 61 6d 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ame cursor.** nu
1dbc0 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f  mber..**.** Allo
1dbd0 77 65 64 20 50 35 20 62 69 74 73 3a 0a 2a 2a 20  wed P5 bits:.** 
1dbe0 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 20 3c 62  <ul>.** <li>  <b
1dbf0 3e 30 78 30 32 20 4f 50 46 4c 41 47 5f 53 45 45  >0x02 OPFLAG_SEE
1dc00 4b 45 51 3c 2f 62 3e 3a 20 54 68 69 73 20 63 75  KEQ</b>: This cu
1dc10 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62  rsor will only b
1dc20 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20  e used for.**   
1dc30 20 20 20 20 65 71 75 61 6c 69 74 79 20 6c 6f 6f      equality loo
1dc40 6b 75 70 73 20 28 69 6d 70 6c 65 6d 65 6e 74 65  kups (implemente
1dc50 64 20 61 73 20 61 20 70 61 69 72 20 6f 66 20 6f  d as a pair of o
1dc60 70 63 6f 64 65 73 20 4f 50 5f 53 65 65 6b 47 45  pcodes OP_SeekGE
1dc70 2f 4f 50 5f 49 64 78 47 54 0a 2a 2a 20 20 20 20  /OP_IdxGT.**    
1dc80 20 20 20 6f 66 20 4f 50 5f 53 65 65 6b 4c 45 2f     of OP_SeekLE/
1dc90 4f 50 5f 49 64 78 47 54 29 0a 2a 2a 20 3c 2f 75  OP_IdxGT).** </u
1dca0 6c 3e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  l>.**.** See als
1dcb0 6f 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  o: OP_OpenRead, 
1dcc0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 0a 2a 2f 0a  OP_OpenWrite.*/.
1dcd0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57  /* Opcode: OpenW
1dce0 72 69 74 65 20 50 31 20 50 32 20 50 33 20 50 34  rite P1 P2 P3 P4
1dcf0 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
1dd00 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a   root=P2 iDb=P3.
1dd10 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61  **.** Open a rea
1dd20 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 6e  d/write cursor n
1dd30 61 6d 65 64 20 50 31 20 6f 6e 20 74 68 65 20 74  amed P1 on the t
1dd40 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68  able or index wh
1dd50 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ose root.** page
1dd60 20 69 73 20 50 32 20 28 6f 72 20 77 68 6f 73 65   is P2 (or whose
1dd70 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 68 65   root page is he
1dd80 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ld in register P
1dd90 32 20 69 66 20 74 68 65 0a 2a 2a 20 4f 50 46 4c  2 if the.** OPFL
1dda0 41 47 5f 50 32 49 53 52 45 47 20 62 69 74 20 69  AG_P2ISREG bit i
1ddb0 73 20 73 65 74 20 69 6e 20 50 35 20 2d 20 73 65  s set in P5 - se
1ddc0 65 20 62 65 6c 6f 77 29 2e 0a 2a 2a 0a 2a 2a 20  e below)..**.** 
1ddd0 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61 79  The P4 value may
1dde0 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 69 6e   be either an in
1ddf0 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32 29  teger (P4_INT32)
1de00 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
1de10 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  .** a KeyInfo st
1de20 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59 49  ructure (P4_KEYI
1de30 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20 61  NFO). If it is a
1de40 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
1de50 79 49 6e 66 6f 20 0a 2a 2a 20 6f 62 6a 65 63 74  yInfo .** object
1de60 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 62 65 69  , then table bei
1de70 6e 67 20 6f 70 65 6e 65 64 20 6d 75 73 74 20 62  ng opened must b
1de80 65 20 61 6e 20 5b 69 6e 64 65 78 20 62 2d 74 72  e an [index b-tr
1de90 65 65 5d 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ee] where the.**
1dea0 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
1deb0 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74  defines the cont
1dec0 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ent and collatin
1ded0 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  g .** sequence o
1dee0 66 20 74 68 61 74 20 69 6e 64 65 78 20 62 2d 74  f that index b-t
1def0 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
1df00 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65  if P4 is an inte
1df10 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 74  ger .** value, t
1df20 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65  hen the table be
1df30 69 6e 67 20 6f 70 65 6e 65 64 20 6d 75 73 74 20  ing opened must 
1df40 62 65 20 61 20 5b 74 61 62 6c 65 20 62 2d 74 72  be a [table b-tr
1df50 65 65 5d 20 77 69 74 68 20 61 0a 2a 2a 20 6e 75  ee] with a.** nu
1df60 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1df70 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  no less than the
1df80 20 76 61 6c 75 65 20 6f 66 20 50 34 2e 0a 2a 2a   value of P4..**
1df90 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 50 35 20 62  .** Allowed P5 b
1dfa0 69 74 73 3a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20  its:.** <ul>.** 
1dfb0 3c 6c 69 3e 20 20 3c 62 3e 30 78 30 32 20 4f 50  <li>  <b>0x02 OP
1dfc0 46 4c 41 47 5f 53 45 45 4b 45 51 3c 2f 62 3e 3a  FLAG_SEEKEQ</b>:
1dfd0 20 54 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c   This cursor wil
1dfe0 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  l only be used f
1dff0 6f 72 0a 2a 2a 20 20 20 20 20 20 20 65 71 75 61  or.**       equa
1e000 6c 69 74 79 20 6c 6f 6f 6b 75 70 73 20 28 69 6d  lity lookups (im
1e010 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 70  plemented as a p
1e020 61 69 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 4f  air of opcodes O
1e030 50 5f 53 65 65 6b 47 45 2f 4f 50 5f 49 64 78 47  P_SeekGE/OP_IdxG
1e040 54 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 4f 50  T.**       of OP
1e050 5f 53 65 65 6b 4c 45 2f 4f 50 5f 49 64 78 47 54  _SeekLE/OP_IdxGT
1e060 29 0a 2a 2a 20 3c 6c 69 3e 20 20 3c 62 3e 30 78  ).** <li>  <b>0x
1e070 30 38 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c  08 OPFLAG_FORDEL
1e080 45 54 45 3c 2f 62 3e 3a 20 54 68 69 73 20 63 75  ETE</b>: This cu
1e090 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
1e0a0 79 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 20 20 20  y to seek.**    
1e0b0 20 20 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e     and subsequen
1e0c0 74 6c 79 20 64 65 6c 65 74 65 20 65 6e 74 72 69  tly delete entri
1e0d0 65 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 20 62  es in an index b
1e0e0 74 72 65 65 2e 20 20 54 68 69 73 20 69 73 20 61  tree.  This is a
1e0f0 0a 2a 2a 20 20 20 20 20 20 20 68 69 6e 74 20 74  .**       hint t
1e100 6f 20 74 68 65 20 73 74 6f 72 61 67 65 20 65 6e  o the storage en
1e110 67 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 74  gine that the st
1e120 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 69 73 20  orage engine is 
1e130 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 20 20  allowed to.**   
1e140 20 20 20 20 69 67 6e 6f 72 65 2e 20 20 54 68 65      ignore.  The
1e150 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65   hint is not use
1e160 64 20 62 79 20 74 68 65 20 6f 66 66 69 63 69 61  d by the officia
1e170 6c 20 53 51 4c 69 74 65 20 62 2a 74 72 65 65 20  l SQLite b*tree 
1e180 73 74 6f 72 61 67 65 0a 2a 2a 20 20 20 20 20 20  storage.**      
1e190 20 65 6e 67 69 6e 65 2c 20 62 75 74 20 69 73 20   engine, but is 
1e1a0 75 73 65 64 20 62 79 20 43 4f 4d 44 42 32 2e 0a  used by COMDB2..
1e1b0 2a 2a 20 3c 6c 69 3e 20 20 3c 62 3e 30 78 31 30  ** <li>  <b>0x10
1e1c0 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3c   OPFLAG_P2ISREG<
1e1d0 2f 62 3e 3a 20 55 73 65 20 74 68 65 20 63 6f 6e  /b>: Use the con
1e1e0 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
1e1f0 20 50 32 0a 2a 2a 20 20 20 20 20 20 20 61 73 20   P2.**       as 
1e200 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6e  the root page, n
1e210 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ot the value of 
1e220 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 3c 2f  P2 itself..** </
1e230 75 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ul>.**.** This i
1e240 6e 73 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73  nstruction works
1e250 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61 64 20 65   like OpenRead e
1e260 78 63 65 70 74 20 74 68 61 74 20 69 74 20 6f 70  xcept that it op
1e270 65 6e 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ens the cursor.*
1e280 2a 20 69 6e 20 72 65 61 64 2f 77 72 69 74 65 20  * in read/write 
1e290 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mode..**.** See 
1e2a0 61 6c 73 6f 3a 20 4f 50 5f 4f 70 65 6e 52 65 61  also: OP_OpenRea
1e2b0 64 2c 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 0a  d, OP_ReopenIdx.
1e2c0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6f 70 65  */.case OP_Reope
1e2d0 6e 49 64 78 3a 20 7b 0a 20 20 69 6e 74 20 6e 46  nIdx: {.  int nF
1e2e0 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ield;.  KeyInfo 
1e2f0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74  *pKeyInfo;.  int
1e300 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a   p2;.  int iDb;.
1e310 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a 20 20    int wrFlag;.  
1e320 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56 64 62  Btree *pX;.  Vdb
1e330 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  eCursor *pCur;. 
1e340 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
1e350 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ert( pOp->p5==0 
1e360 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c  || pOp->p5==OPFL
1e370 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20 61  AG_SEEKEQ );.  a
1e380 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
1e390 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29  pe==P4_KEYINFO )
1e3a0 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70  ;.  pCur = p->ap
1e3b0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1e3c0 69 66 28 20 70 43 75 72 20 26 26 20 70 43 75 72  if( pCur && pCur
1e3d0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 75 33 32  ->pgnoRoot==(u32
1e3e0 29 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20 20  )pOp->p2 ){.    
1e3f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 44  assert( pCur->iD
1e400 62 3d 3d 70 4f 70 2d 3e 70 33 20 29 3b 20 20 20  b==pOp->p3 );   
1e410 20 20 20 2f 2a 20 47 75 61 72 61 6e 74 65 65 64     /* Guaranteed
1e420 20 62 79 20 74 68 65 20 63 6f 64 65 20 67 65 6e   by the code gen
1e430 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 67 6f  erator */.    go
1e440 74 6f 20 6f 70 65 6e 5f 63 75 72 73 6f 72 5f 73  to open_cursor_s
1e450 65 74 5f 68 69 6e 74 73 3b 0a 20 20 7d 0a 20 20  et_hints;.  }.  
1e460 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
1e470 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
1e480 79 20 6f 70 65 6e 20 6f 72 20 69 73 20 6f 70 65  y open or is ope
1e490 6e 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n on a different
1e4a0 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
1e4b0 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  n fall through i
1e4c0 6e 74 6f 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  nto OP_OpenRead 
1e4d0 74 6f 20 66 6f 72 63 65 20 61 20 72 65 6f 70 65  to force a reope
1e4e0 6e 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65  n */.case OP_Ope
1e4f0 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f  nRead:.case OP_O
1e500 70 65 6e 57 72 69 74 65 3a 0a 0a 20 20 61 73 73  penWrite:..  ass
1e510 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
1e520 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 7c  ==OP_OpenWrite |
1e530 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20  | pOp->p5==0 || 
1e540 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f  pOp->p5==OPFLAG_
1e550 53 45 45 4b 45 51 20 29 3b 0a 20 20 61 73 73 65  SEEKEQ );.  asse
1e560 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
1e570 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1e580 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70  p->opcode==OP_Op
1e590 65 6e 52 65 61 64 20 7c 7c 20 70 4f 70 2d 3e 6f  enRead || pOp->o
1e5a0 70 63 6f 64 65 3d 3d 4f 50 5f 52 65 6f 70 65 6e  pcode==OP_Reopen
1e5b0 49 64 78 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  Idx.          ||
1e5c0 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
1e5d0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  );..  if( p->exp
1e5e0 69 72 65 64 3d 3d 31 20 29 7b 0a 20 20 20 20 72  ired==1 ){.    r
1e5f0 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  c = SQLITE_ABORT
1e600 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 67  _ROLLBACK;.    g
1e610 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1e620 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 6e  _error;.  }..  n
1e630 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 70 4b 65  Field = 0;.  pKe
1e640 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 70 32 20  yInfo = 0;.  p2 
1e650 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 44 62  = pOp->p2;.  iDb
1e660 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73   = pOp->p3;.  as
1e670 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
1e680 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
1e690 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
1e6a0 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
1e6b0 2c 20 69 44 62 29 20 29 3b 0a 20 20 70 44 62 20  , iDb) );.  pDb 
1e6c0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
1e6d0 0a 20 20 70 58 20 3d 20 70 44 62 2d 3e 70 42 74  .  pX = pDb->pBt
1e6e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 58 21 3d  ;.  assert( pX!=
1e6f0 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  0 );.  if( pOp->
1e700 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57  opcode==OP_OpenW
1e710 72 69 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65  rite ){.    asse
1e720 72 74 28 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45  rt( OPFLAG_FORDE
1e730 4c 45 54 45 3d 3d 42 54 52 45 45 5f 46 4f 52 44  LETE==BTREE_FORD
1e740 45 4c 45 54 45 20 29 3b 0a 20 20 20 20 77 72 46  ELETE );.    wrF
1e750 6c 61 67 20 3d 20 42 54 52 45 45 5f 57 52 43 53  lag = BTREE_WRCS
1e760 52 20 7c 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f  R | (pOp->p5 & O
1e770 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 29  PFLAG_FORDELETE)
1e780 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1e790 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1e7a0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
1e7b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d   );.    if( pDb-
1e7c0 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
1e7d0 6f 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72  ormat < p->minWr
1e7e0 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b  iteFileFormat ){
1e7f0 0a 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69  .      p->minWri
1e800 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70  teFileFormat = p
1e810 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
1e820 65 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a  e_format;.    }.
1e830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72 46    }else{.    wrF
1e840 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  lag = 0;.  }.  i
1e850 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  f( pOp->p5 & OPF
1e860 4c 41 47 5f 50 32 49 53 52 45 47 20 29 7b 0a 20  LAG_P2ISREG ){. 
1e870 20 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20     assert( p2>0 
1e880 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e890 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  2<=(p->nMem+1 - 
1e8a0 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
1e8b0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
1e8c0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57  opcode==OP_OpenW
1e8d0 72 69 74 65 20 29 3b 0a 20 20 20 20 70 49 6e 32  rite );.    pIn2
1e8e0 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20   = &aMem[p2];.  
1e8f0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
1e900 61 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a 20 20  alid(pIn2) );.  
1e910 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d    assert( (pIn2-
1e920 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1e930 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  )!=0 );.    sqli
1e940 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
1e950 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 20 20  rify(pIn2);.    
1e960 70 32 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e  p2 = (int)pIn2->
1e970 75 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  u.i;.    /* The 
1e980 70 32 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20  p2 value always 
1e990 63 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70 72 69  comes from a pri
1e9a0 6f 72 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  or OP_CreateBtre
1e9b0 65 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20 20 20  e opcode and.   
1e9c0 20 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64 65 20   ** that opcode 
1e9d0 77 69 6c 6c 20 61 6c 77 61 79 73 20 73 65 74 20  will always set 
1e9e0 74 68 65 20 70 32 20 76 61 6c 75 65 20 74 6f 20  the p2 value to 
1e9f0 32 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73  2 or more or els
1ea00 65 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49  e fail..    ** I
1ea10 66 20 74 68 65 72 65 20 77 65 72 65 20 61 20 66  f there were a f
1ea20 61 69 6c 75 72 65 2c 20 74 68 65 20 70 72 65 70  ailure, the prep
1ea30 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  ared statement w
1ea40 6f 75 6c 64 20 68 61 76 65 20 68 61 6c 74 65 64  ould have halted
1ea50 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72  .    ** before r
1ea60 65 61 63 68 69 6e 67 20 74 68 69 73 20 69 6e 73  eaching this ins
1ea70 74 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  truction. */.   
1ea80 20 61 73 73 65 72 74 28 20 70 32 3e 3d 32 20 29   assert( p2>=2 )
1ea90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
1eaa0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49  >p4type==P4_KEYI
1eab0 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49  NFO ){.    pKeyI
1eac0 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
1ead0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65  eyInfo;.    asse
1eae0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  rt( pKeyInfo->en
1eaf0 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20  c==ENC(db) );.  
1eb00 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1eb10 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  fo->db==db );.  
1eb20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49    nField = pKeyI
1eb30 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3b 0a  nfo->nAllField;.
1eb40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
1eb50 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
1eb60 32 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64 20  2 ){.    nField 
1eb70 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d  = pOp->p4.i;.  }
1eb80 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1eb90 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  p1>=0 );.  asser
1eba0 74 28 20 6e 46 69 65 6c 64 3e 3d 30 20 29 3b 0a  t( nField>=0 );.
1ebb0 20 20 74 65 73 74 63 61 73 65 28 20 6e 46 69 65    testcase( nFie
1ebc0 6c 64 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 61 62  ld==0 );  /* Tab
1ebd0 6c 65 20 77 69 74 68 20 49 4e 54 45 47 45 52 20  le with INTEGER 
1ebe0 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20  PRIMARY KEY and 
1ebf0 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 2a 2f 0a  nothing else */.
1ec00 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74    pCur = allocat
1ec10 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
1ec20 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62 2c  p1, nField, iDb,
1ec30 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b   CURTYPE_BTREE);
1ec40 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
1ec50 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
1ec60 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20  pCur->nullRow = 
1ec70 31 3b 0a 20 20 70 43 75 72 2d 3e 69 73 4f 72 64  1;.  pCur->isOrd
1ec80 65 72 65 64 20 3d 20 31 3b 0a 20 20 70 43 75 72  ered = 1;.  pCur
1ec90 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 70 32 3b  ->pgnoRoot = p2;
1eca0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ecb0 45 42 55 47 0a 20 20 70 43 75 72 2d 3e 77 72 46  EBUG.  pCur->wrF
1ecc0 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 23 65  lag = wrFlag;.#e
1ecd0 6e 64 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69  ndif.  rc = sqli
1ece0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70  te3BtreeCursor(p
1ecf0 58 2c 20 70 32 2c 20 77 72 46 6c 61 67 2c 20 70  X, p2, wrFlag, p
1ed00 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 2d 3e 75  KeyInfo, pCur->u
1ed10 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 70 43  c.pCursor);.  pC
1ed20 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1ed30 4b 65 79 49 6e 66 6f 3b 0a 20 20 2f 2a 20 53 65  KeyInfo;.  /* Se
1ed40 74 20 74 68 65 20 56 64 62 65 43 75 72 73 6f 72  t the VdbeCursor
1ed50 2e 69 73 54 61 62 6c 65 20 76 61 72 69 61 62 6c  .isTable variabl
1ed60 65 2e 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  e. Previous vers
1ed70 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51 4c  ions of.  ** SQL
1ed80 69 74 65 20 75 73 65 64 20 74 6f 20 63 68 65 63  ite used to chec
1ed90 6b 20 69 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  k if the root-pa
1eda0 67 65 20 66 6c 61 67 73 20 77 65 72 65 20 73 61  ge flags were sa
1edb0 6e 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ne at this point
1edc0 0a 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74  .  ** and report
1edd0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1ede0 74 69 6f 6e 20 69 66 20 74 68 65 79 20 77 65 72  tion if they wer
1edf0 65 20 6e 6f 74 2c 20 62 75 74 20 74 68 69 73 20  e not, but this 
1ee00 63 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20 73  check has.  ** s
1ee10 69 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20  ince moved into 
1ee20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
1ee30 20 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e 69    */  .  pCur->i
1ee40 73 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70 34  sTable = pOp->p4
1ee50 74 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f  type!=P4_KEYINFO
1ee60 3b 0a 0a 6f 70 65 6e 5f 63 75 72 73 6f 72 5f 73  ;..open_cursor_s
1ee70 65 74 5f 68 69 6e 74 73 3a 0a 20 20 61 73 73 65  et_hints:.  asse
1ee80 72 74 28 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43  rt( OPFLAG_BULKC
1ee90 53 52 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f  SR==BTREE_BULKLO
1eea0 41 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AD );.  assert( 
1eeb0 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 3d 3d 42  OPFLAG_SEEKEQ==B
1eec0 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 29 3b 0a  TREE_SEEK_EQ );.
1eed0 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d    testcase( pOp-
1eee0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 42 55 4c  >p5 & OPFLAG_BUL
1eef0 4b 43 53 52 20 29 3b 0a 23 69 66 64 65 66 20 53  KCSR );.#ifdef S
1ef00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
1ef10 53 4f 52 5f 48 49 4e 54 53 0a 20 20 74 65 73 74  SOR_HINTS.  test
1ef20 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 20 26 20  case( pOp->p2 & 
1ef30 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b  OPFLAG_SEEKEQ );
1ef40 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1ef50 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
1ef60 46 6c 61 67 73 28 70 43 75 72 2d 3e 75 63 2e 70  Flags(pCur->uc.p
1ef70 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20  Cursor,.        
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20         (pOp->p5 
1efa0 26 20 28 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  & (OPFLAG_BULKCS
1efb0 52 7c 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29  R|OPFLAG_SEEKEQ)
1efc0 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  ));.  if( rc ) g
1efd0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1efe0 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
1eff0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
1f000 70 65 6e 44 75 70 20 50 31 20 50 32 20 2a 20 2a  penDup P1 P2 * *
1f010 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20   *.**.** Open a 
1f020 6e 65 77 20 63 75 72 73 6f 72 20 50 31 20 74 68  new cursor P1 th
1f030 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  at points to the
1f040 20 73 61 6d 65 20 65 70 68 65 6d 65 72 61 6c 20   same ephemeral 
1f050 74 61 62 6c 65 20 61 73 0a 2a 2a 20 63 75 72 73  table as.** curs
1f060 6f 72 20 50 32 2e 20 20 54 68 65 20 50 32 20 63  or P2.  The P2 c
1f070 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1f080 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61  been opened by a
1f090 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
1f0a0 68 65 6d 65 72 61 6c 0a 2a 2a 20 6f 70 63 6f 64  hemeral.** opcod
1f0b0 65 2e 20 20 4f 6e 6c 79 20 65 70 68 65 6d 65 72  e.  Only ephemer
1f0c0 61 6c 20 63 75 72 73 6f 72 73 20 6d 61 79 20 62  al cursors may b
1f0d0 65 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  e duplicated..**
1f0e0 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 65 70  .** Duplicate ep
1f0f0 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73 20  hemeral cursors 
1f100 61 72 65 20 75 73 65 64 20 66 6f 72 20 73 65 6c  are used for sel
1f110 66 2d 6a 6f 69 6e 73 20 6f 66 20 6d 61 74 65 72  f-joins of mater
1f120 69 61 6c 69 7a 65 64 20 76 69 65 77 73 2e 0a 2a  ialized views..*
1f130 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 44 75  /.case OP_OpenDu
1f140 70 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  p: {.  VdbeCurso
1f150 72 20 2a 70 4f 72 69 67 3b 20 20 20 20 2f 2a 20  r *pOrig;    /* 
1f160 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 75 72  The original cur
1f170 73 6f 72 20 74 6f 20 62 65 20 64 75 70 6c 69 63  sor to be duplic
1f180 61 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 43 75  ated */.  VdbeCu
1f190 72 73 6f 72 20 2a 70 43 78 3b 20 20 20 20 20 20  rsor *pCx;      
1f1a0 2f 2a 20 54 68 65 20 6e 65 77 20 63 75 72 73 6f  /* The new curso
1f1b0 72 20 2a 2f 0a 0a 20 20 70 4f 72 69 67 20 3d 20  r */..  pOrig = 
1f1c0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 32  p->apCsr[pOp->p2
1f1d0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  ];.  assert( pOr
1f1e0 69 67 2d 3e 70 42 74 78 21 3d 30 20 29 3b 20 20  ig->pBtx!=0 );  
1f1f0 2f 2a 20 4f 6e 6c 79 20 65 70 68 65 6d 65 72 61  /* Only ephemera
1f200 6c 20 63 75 72 73 6f 72 73 20 63 61 6e 20 62 65  l cursors can be
1f210 20 64 75 70 6c 69 63 61 74 65 64 20 2a 2f 0a 0a   duplicated */..
1f220 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
1f230 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1f240 31 2c 20 70 4f 72 69 67 2d 3e 6e 46 69 65 6c 64  1, pOrig->nField
1f250 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 42 54  , -1, CURTYPE_BT
1f260 52 45 45 29 3b 0a 20 20 69 66 28 20 70 43 78 3d  REE);.  if( pCx=
1f270 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
1f280 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77  ;.  pCx->nullRow
1f290 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73 45   = 1;.  pCx->isE
1f2a0 70 68 65 6d 65 72 61 6c 20 3d 20 31 3b 0a 20 20  phemeral = 1;.  
1f2b0 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  pCx->pKeyInfo = 
1f2c0 70 4f 72 69 67 2d 3e 70 4b 65 79 49 6e 66 6f 3b  pOrig->pKeyInfo;
1f2d0 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20  .  pCx->isTable 
1f2e0 3d 20 70 4f 72 69 67 2d 3e 69 73 54 61 62 6c 65  = pOrig->isTable
1f2f0 3b 0a 20 20 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f  ;.  pCx->pgnoRoo
1f300 74 20 3d 20 70 4f 72 69 67 2d 3e 70 67 6e 6f 52  t = pOrig->pgnoR
1f310 6f 6f 74 3b 0a 20 20 70 43 78 2d 3e 69 73 4f 72  oot;.  pCx->isOr
1f320 64 65 72 65 64 20 3d 20 70 4f 72 69 67 2d 3e 69  dered = pOrig->i
1f330 73 4f 72 64 65 72 65 64 3b 0a 20 20 72 63 20 3d  sOrdered;.  rc =
1f340 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1f350 73 6f 72 28 70 4f 72 69 67 2d 3e 70 42 74 78 2c  sor(pOrig->pBtx,
1f360 20 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20   pCx->pgnoRoot, 
1f370 42 54 52 45 45 5f 57 52 43 53 52 2c 0a 20 20 20  BTREE_WRCSR,.   
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f390 20 20 20 20 20 20 20 70 43 78 2d 3e 70 4b 65 79         pCx->pKey
1f3a0 49 6e 66 6f 2c 20 70 43 78 2d 3e 75 63 2e 70 43  Info, pCx->uc.pC
1f3b0 75 72 73 6f 72 29 3b 0a 20 20 2f 2a 20 54 68 65  ursor);.  /* The
1f3c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1f3d0 73 6f 72 28 29 20 72 6f 75 74 69 6e 65 20 63 61  sor() routine ca
1f3e0 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 66 6f 72 20  n only fail for 
1f3f0 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  the first cursor
1f400 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 20 66 6f 72  .  ** opened for
1f410 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 53 69   a database.  Si
1f420 6e 63 65 20 74 68 65 72 65 20 69 73 20 61 6c 72  nce there is alr
1f430 65 61 64 79 20 61 6e 20 6f 70 65 6e 20 63 75 72  eady an open cur
1f440 73 6f 72 20 77 68 65 6e 20 74 68 69 73 0a 20 20  sor when this.  
1f450 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20 72 75 6e  ** opcode is run
1f460 2c 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  , the sqlite3Btr
1f470 65 65 43 75 72 73 6f 72 28 29 20 63 61 6e 6e 6f  eeCursor() canno
1f480 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65  t fail */.  asse
1f490 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1f4a0 4b 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  K );.  break;.}.
1f4b0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  ../* Opcode: Ope
1f4c0 6e 45 70 68 65 6d 65 72 61 6c 20 50 31 20 50 32  nEphemeral P1 P2
1f4d0 20 2a 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f   * P4 P5.** Syno
1f4e0 70 73 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32  psis: nColumn=P2
1f4f0 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  .**.** Open a ne
1f500 77 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20 61  w cursor P1 to a
1f510 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
1f520 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  ..** The cursor 
1f530 69 73 20 61 6c 77 61 79 73 20 6f 70 65 6e 65 64  is always opened
1f540 20 72 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e   read/write even
1f550 20 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e   if .** the main
1f560 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
1f570 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70 68  d-only.  The eph
1f580 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20  emeral.** table 
1f590 69 73 20 64 65 6c 65 74 65 64 20 61 75 74 6f 6d  is deleted autom
1f5a0 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
1f5b0 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  e cursor is clos
1f5c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1f5d0 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 61 6c   cursor P1 is al
1f5e0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 6f 6e 20  ready opened on 
1f5f0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
1f600 6c 65 2c 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  le, the table.**
1f610 20 69 73 20 63 6c 65 61 72 65 64 20 28 61 6c 6c   is cleared (all
1f620 20 63 6f 6e 74 65 6e 74 20 69 73 20 65 72 61 73   content is eras
1f630 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73  ed)..**.** P2 is
1f640 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1f650 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 65 70  olumns in the ep
1f660 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a  hemeral table..*
1f670 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1f680 6e 74 73 20 74 6f 20 61 20 42 54 72 65 65 20 74  nts to a BTree t
1f690 61 62 6c 65 20 69 66 20 50 34 3d 3d 30 20 61 6e  able if P4==0 an
1f6a0 64 20 74 6f 20 61 20 42 54 72 65 65 20 69 6e 64  d to a BTree ind
1f6b0 65 78 0a 2a 2a 20 69 66 20 50 34 20 69 73 20 6e  ex.** if P4 is n
1f6c0 6f 74 20 30 2e 20 20 49 66 20 50 34 20 69 73 20  ot 0.  If P4 is 
1f6d0 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
1f6e0 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
1f6f0 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
1f700 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  at defines the f
1f710 6f 72 6d 61 74 20 6f 66 20 6b 65 79 73 20 69 6e  ormat of keys in
1f720 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a   the index..**.*
1f730 2a 20 54 68 65 20 50 35 20 70 61 72 61 6d 65 74  * The P5 paramet
1f740 65 72 20 63 61 6e 20 62 65 20 61 20 6d 61 73 6b  er can be a mask
1f750 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f 2a 20   of the BTREE_* 
1f760 66 6c 61 67 73 20 64 65 66 69 6e 65 64 0a 2a 2a  flags defined.**
1f770 20 69 6e 20 62 74 72 65 65 2e 68 2e 20 20 54 68   in btree.h.  Th
1f780 65 73 65 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f  ese flags contro
1f790 6c 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 65  l aspects of the
1f7a0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a   operation of.**
1f7b0 20 74 68 65 20 62 74 72 65 65 2e 20 20 54 68 65   the btree.  The
1f7c0 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
1f7d0 4e 41 4c 20 61 6e 64 20 42 54 52 45 45 5f 53 49  NAL and BTREE_SI
1f7e0 4e 47 4c 45 20 66 6c 61 67 73 20 61 72 65 0a 2a  NGLE flags are.*
1f7f0 2a 20 61 64 64 65 64 20 61 75 74 6f 6d 61 74 69  * added automati
1f800 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  cally..*/./* Opc
1f810 6f 64 65 3a 20 4f 70 65 6e 41 75 74 6f 69 6e 64  ode: OpenAutoind
1f820 65 78 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  ex P1 P2 * P4 *.
1f830 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f  ** Synopsis: nCo
1f840 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 54 68  lumn=P2.**.** Th
1f850 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  is opcode works 
1f860 74 68 65 20 73 61 6d 65 20 61 73 20 4f 50 5f 4f  the same as OP_O
1f870 70 65 6e 45 70 68 65 6d 65 72 61 6c 2e 20 20 49  penEphemeral.  I
1f880 74 20 68 61 73 20 61 0a 2a 2a 20 64 69 66 66 65  t has a.** diffe
1f890 72 65 6e 74 20 6e 61 6d 65 20 74 6f 20 64 69 73  rent name to dis
1f8a0 74 69 6e 67 75 69 73 68 20 69 74 73 20 75 73 65  tinguish its use
1f8b0 2e 20 20 54 61 62 6c 65 73 20 63 72 65 61 74 65  .  Tables create
1f8c0 64 20 75 73 69 6e 67 0a 2a 2a 20 62 79 20 74 68  d using.** by th
1f8d0 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62  is opcode will b
1f8e0 65 20 75 73 65 64 20 66 6f 72 20 61 75 74 6f 6d  e used for autom
1f8f0 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1f900 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 69 6e   transient.** in
1f910 64 69 63 65 73 20 69 6e 20 6a 6f 69 6e 73 2e 0a  dices in joins..
1f920 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 41  */.case OP_OpenA
1f930 75 74 6f 69 6e 64 65 78 3a 20 0a 63 61 73 65 20  utoindex: .case 
1f940 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1f950 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1f960 20 2a 70 43 78 3b 0a 20 20 4b 65 79 49 6e 66 6f   *pCx;.  KeyInfo
1f970 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 0a 20 20 73   *pKeyInfo;..  s
1f980 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
1f990 76 66 73 46 6c 61 67 73 20 3d 20 0a 20 20 20 20  vfsFlags = .    
1f9a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1f9b0 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20  ADWRITE |.      
1f9c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1f9d0 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  TE |.      SQLIT
1f9e0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1f9f0 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f   |.      SQLITE_
1fa00 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1fa10 53 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  SE |.      SQLIT
1fa20 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
1fa30 5f 44 42 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _DB;.  assert( p
1fa40 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61  Op->p1>=0 );.  a
1fa50 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d  ssert( pOp->p2>=
1fa60 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 70 2d 3e  0 );.  pCx = p->
1fa70 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1fa80 20 20 69 66 28 20 70 43 78 20 29 7b 0a 20 20 20    if( pCx ){.   
1fa90 20 2f 2a 20 49 66 20 74 68 65 20 65 70 68 65 72   /* If the epher
1faa0 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 61  meral table is a
1fab0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 65 72 61  lready open, era
1fac0 73 65 20 61 6c 6c 20 65 78 69 73 74 69 6e 67 20  se all existing 
1fad0 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 73  content.    ** s
1fae0 6f 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  o that the table
1faf0 20 69 73 20 65 6d 70 74 79 20 61 67 61 69 6e 2c   is empty again,
1fb00 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65   rather than cre
1fb10 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
1fb20 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
1fb30 28 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72  ( pCx->isEphemer
1fb40 61 6c 20 29 3b 0a 20 20 20 20 70 43 78 2d 3e 73  al );.    pCx->s
1fb50 65 71 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  eqCount = 0;.   
1fb60 20 70 43 78 2d 3e 63 61 63 68 65 53 74 61 74 75   pCx->cacheStatu
1fb70 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1fb80 0a 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42  .    if( pCx->pB
1fb90 74 78 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  tx ){.      rc =
1fba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1fbb0 61 72 54 61 62 6c 65 28 70 43 78 2d 3e 70 42 74  arTable(pCx->pBt
1fbc0 78 2c 20 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74  x, pCx->pgnoRoot
1fbd0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
1fbe0 6c 73 65 7b 0a 20 20 20 20 70 43 78 20 3d 20 61  lse{.    pCx = a
1fbf0 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c  llocateCursor(p,
1fc00 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
1fc10 32 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 42  2, -1, CURTYPE_B
1fc20 54 52 45 45 29 3b 0a 20 20 20 20 69 66 28 20 70  TREE);.    if( p
1fc30 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  Cx==0 ) goto no_
1fc40 6d 65 6d 3b 0a 20 20 20 20 70 43 78 2d 3e 69 73  mem;.    pCx->is
1fc50 45 70 68 65 6d 65 72 61 6c 20 3d 20 31 3b 0a 20  Ephemeral = 1;. 
1fc60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1fc70 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1fc80 73 2c 20 30 2c 20 64 62 2c 20 26 70 43 78 2d 3e  s, 0, db, &pCx->
1fc90 70 42 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20  pBtx, .         
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcb0 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
1fcc0 4e 41 4c 20 7c 20 42 54 52 45 45 5f 53 49 4e 47  NAL | BTREE_SING
1fcd0 4c 45 20 7c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  LE | pOp->p5,.  
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73          vfsFlags
1fd00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1fd10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fd20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1fd30 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 43  reeBeginTrans(pC
1fd40 78 2d 3e 70 42 74 78 2c 20 31 2c 20 30 29 3b 0a  x->pBtx, 1, 0);.
1fd50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1fd60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fd70 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72 61       /* If a tra
1fd80 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 69 73 20  nsient index is 
1fd90 72 65 71 75 69 72 65 64 2c 20 63 72 65 61 74 65  required, create
1fda0 20 69 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20   it by calling. 
1fdb0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42       ** sqlite3B
1fdc0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1fdd0 29 20 77 69 74 68 20 74 68 65 20 42 54 52 45 45  ) with the BTREE
1fde0 5f 42 4c 4f 42 4b 45 59 20 66 6c 61 67 20 62 65  _BLOBKEY flag be
1fdf0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 6f 70  fore.      ** op
1fe00 65 6e 69 6e 67 20 69 74 2e 20 49 66 20 61 20 74  ening it. If a t
1fe10 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 69  ransient table i
1fe20 73 20 72 65 71 75 69 72 65 64 2c 20 6a 75 73 74  s required, just
1fe30 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
1fe40 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1fe50 63 72 65 61 74 65 64 20 74 61 62 6c 65 20 77 69  created table wi
1fe60 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 31 20 28  th root-page 1 (
1fe70 61 6e 20 42 4c 4f 42 5f 49 4e 54 4b 45 59 20 74  an BLOB_INTKEY t
1fe80 61 62 6c 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  able)..      */.
1fe90 20 20 20 20 20 20 69 66 28 20 28 70 43 78 2d 3e        if( (pCx->
1fea0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1feb0 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
1fec0 65 79 49 6e 66 6f 29 21 3d 30 20 29 7b 0a 20 20  eyInfo)!=0 ){.  
1fed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1fee0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
1fef0 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20  YINFO );.       
1ff00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1ff10 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 43  eeCreateTable(pC
1ff20 78 2d 3e 70 42 74 78 2c 20 28 69 6e 74 2a 29 26  x->pBtx, (int*)&
1ff30 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 0a 20  pCx->pgnoRoot,. 
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 20 20 20 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45      BTREE_BLOBKE
1ff70 59 20 7c 20 70 4f 70 2d 3e 70 35 29 3b 20 0a 20  Y | pOp->p5); . 
1ff80 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1ff90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ffa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1ffb0 78 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 4d 41 53  x->pgnoRoot==MAS
1ffc0 54 45 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20  TER_ROOT+1 );.  
1ffd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ffe0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62  pKeyInfo->db==db
1fff0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
20000 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
20010 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a  enc==ENC(db) );.
20020 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
20030 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
20040 72 28 70 43 78 2d 3e 70 42 74 78 2c 20 70 43 78  r(pCx->pBtx, pCx
20050 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 42 54 52 45  ->pgnoRoot, BTRE
20060 45 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20  E_WRCSR,.       
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49             pKeyI
20090 6e 66 6f 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75  nfo, pCx->uc.pCu
200a0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  rsor);.        }
200b0 0a 20 20 20 20 20 20 20 20 70 43 78 2d 3e 69 73  .        pCx->is
200c0 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  Table = 0;.     
200d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
200e0 70 43 78 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  pCx->pgnoRoot = 
200f0 4d 41 53 54 45 52 5f 52 4f 4f 54 3b 0a 20 20 20  MASTER_ROOT;.   
20100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20110 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78  3BtreeCursor(pCx
20120 2d 3e 70 42 74 78 2c 20 4d 41 53 54 45 52 5f 52  ->pBtx, MASTER_R
20130 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52 43 53 52  OOT, BTREE_WRCSR
20140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20160 20 20 30 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75    0, pCx->uc.pCu
20170 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 70  rsor);.        p
20180 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b  Cx->isTable = 1;
20190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
201a0 20 20 20 70 43 78 2d 3e 69 73 4f 72 64 65 72 65     pCx->isOrdere
201b0 64 20 3d 20 28 70 4f 70 2d 3e 70 35 21 3d 42 54  d = (pOp->p5!=BT
201c0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
201d0 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67    }.  if( rc ) g
201e0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
201f0 5f 65 72 72 6f 72 3b 0a 20 20 70 43 78 2d 3e 6e  _error;.  pCx->n
20200 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 62 72  ullRow = 1;.  br
20210 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
20220 65 3a 20 53 6f 72 74 65 72 4f 70 65 6e 20 50 31  e: SorterOpen P1
20230 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
20240 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f  * This opcode wo
20250 72 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e  rks like OP_Open
20260 45 70 68 65 6d 65 72 61 6c 20 65 78 63 65 70 74  Ephemeral except
20270 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73 0a 2a   that it opens.*
20280 2a 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  * a transient in
20290 64 65 78 20 74 68 61 74 20 69 73 20 73 70 65 63  dex that is spec
202a0 69 66 69 63 61 6c 6c 79 20 64 65 73 69 67 6e 65  ifically designe
202b0 64 20 74 6f 20 73 6f 72 74 20 6c 61 72 67 65 0a  d to sort large.
202c0 2a 2a 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20  ** tables using 
202d0 61 6e 20 65 78 74 65 72 6e 61 6c 20 6d 65 72 67  an external merg
202e0 65 2d 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  e-sort algorithm
202f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
20300 65 6e 74 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65  ent P3 is non-ze
20310 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 6e 64 69  ro, then it indi
20320 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 73  cates that the s
20330 6f 72 74 65 72 20 6d 61 79 0a 2a 2a 20 61 73 73  orter may.** ass
20340 75 6d 65 20 74 68 61 74 20 61 20 73 74 61 62 6c  ume that a stabl
20350 65 20 73 6f 72 74 20 63 6f 6e 73 69 64 65 72 69  e sort consideri
20360 6e 67 20 74 68 65 20 66 69 72 73 74 20 50 33 20  ng the first P3 
20370 66 69 65 6c 64 73 20 6f 66 20 65 61 63 68 0a 2a  fields of each.*
20380 2a 20 6b 65 79 20 69 73 20 73 75 66 66 69 63 69  * key is suffici
20390 65 6e 74 20 74 6f 20 70 72 6f 64 75 63 65 20 74  ent to produce t
203a0 68 65 20 72 65 71 75 69 72 65 64 20 72 65 73 75  he required resu
203b0 6c 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lts..*/.case OP_
203c0 53 6f 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20 20  SorterOpen: {.  
203d0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b  VdbeCursor *pCx;
203e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
203f0 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  >p1>=0 );.  asse
20400 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
20410 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61  ;.  pCx = alloca
20420 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d  teCursor(p, pOp-
20430 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31  >p1, pOp->p2, -1
20440 2c 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52  , CURTYPE_SORTER
20450 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  );.  if( pCx==0 
20460 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
20470 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d   pCx->pKeyInfo =
20480 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
20490 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 78  o;.  assert( pCx
204a0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ->pKeyInfo->db==
204b0 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
204c0 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65  pCx->pKeyInfo->e
204d0 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20  nc==ENC(db) );. 
204e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
204f0 65 53 6f 72 74 65 72 49 6e 69 74 28 64 62 2c 20  eSorterInit(db, 
20500 70 4f 70 2d 3e 70 33 2c 20 70 43 78 29 3b 0a 20  pOp->p3, pCx);. 
20510 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
20520 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
20530 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  r;.  break;.}../
20540 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e  * Opcode: Sequen
20550 63 65 54 65 73 74 20 50 31 20 50 32 20 2a 20 2a  ceTest P1 P2 * *
20560 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
20570 69 66 28 20 63 75 72 73 6f 72 5b 50 31 5d 2e 63  if( cursor[P1].c
20580 74 72 2b 2b 20 29 20 70 63 20 3d 20 50 32 0a 2a  tr++ ) pc = P2.*
20590 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 73 6f 72  *.** P1 is a sor
205a0 74 65 72 20 63 75 72 73 6f 72 2e 20 49 66 20 74  ter cursor. If t
205b0 68 65 20 73 65 71 75 65 6e 63 65 20 63 6f 75 6e  he sequence coun
205c0 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
205d0 20 7a 65 72 6f 2c 20 6a 75 6d 70 0a 2a 2a 20 74   zero, jump.** t
205e0 6f 20 50 32 2e 20 52 65 67 61 72 64 6c 65 73 73  o P2. Regardless
205f0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
20600 6f 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  ot the jump is t
20610 61 6b 65 6e 2c 20 69 6e 63 72 65 6d 65 6e 74 20  aken, increment 
20620 74 68 65 0a 2a 2a 20 74 68 65 20 73 65 71 75 65  the.** the seque
20630 6e 63 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61  nce value..*/.ca
20640 73 65 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65  se OP_SequenceTe
20650 73 74 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  st: {.  VdbeCurs
20660 6f 72 20 2a 70 43 3b 0a 20 20 61 73 73 65 72 74  or *pC;.  assert
20670 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
20680 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
20690 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
206a0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
206b0 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74    assert( isSort
206c0 65 72 28 70 43 29 20 29 3b 0a 20 20 69 66 28 20  er(pC) );.  if( 
206d0 28 70 43 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 29  (pC->seqCount++)
206e0 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
206f0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
20700 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
20710 70 63 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75 64  pcode: OpenPseud
20720 6f 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  o P1 P2 P3 * *.*
20730 2a 20 53 79 6e 6f 70 73 69 73 3a 20 50 33 20 63  * Synopsis: P3 c
20740 6f 6c 75 6d 6e 73 20 69 6e 20 72 5b 50 32 5d 0a  olumns in r[P2].
20750 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  **.** Open a new
20760 20 63 75 72 73 6f 72 20 74 68 61 74 20 70 6f 69   cursor that poi
20770 6e 74 73 20 74 6f 20 61 20 66 61 6b 65 20 74 61  nts to a fake ta
20780 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ble that contain
20790 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f  s a single.** ro
207a0 77 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  w of data.  The 
207b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20  content of that 
207c0 6f 6e 65 20 72 6f 77 20 69 73 20 74 68 65 20 63  one row is the c
207d0 6f 6e 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  ontent of memory
207e0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e  .** register P2.
207f0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
20800 2c 20 63 75 72 73 6f 72 20 50 31 20 62 65 63 6f  , cursor P1 beco
20810 6d 65 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72  mes an alias for
20820 20 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c 6f   the .** MEM_Blo
20830 62 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69  b content contai
20840 6e 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  ned in register 
20850 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65 75  P2..**.** A pseu
20860 64 6f 2d 74 61 62 6c 65 20 63 72 65 61 74 65 64  do-table created
20870 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20   by this opcode 
20880 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  is used to hold 
20890 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20  a single.** row 
208a0 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20  output from the 
208b0 73 6f 72 74 65 72 20 73 6f 20 74 68 61 74 20 74  sorter so that t
208c0 68 65 20 72 6f 77 20 63 61 6e 20 62 65 20 64 65  he row can be de
208d0 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a  composed into.**
208e0 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c 75   individual colu
208f0 6d 6e 73 20 75 73 69 6e 67 20 74 68 65 20 4f 50  mns using the OP
20900 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e 20  _Column opcode. 
20910 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   The OP_Column o
20920 70 63 6f 64 65 0a 2a 2a 20 69 73 20 74 68 65 20  pcode.** is the 
20930 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 70 63 6f  only cursor opco
20940 64 65 20 74 68 61 74 20 77 6f 72 6b 73 20 77 69  de that works wi
20950 74 68 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c  th a pseudo-tabl
20960 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 74  e..**.** P3 is t
20970 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
20980 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  lds in the recor
20990 64 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ds that will be 
209a0 73 74 6f 72 65 64 20 62 79 0a 2a 2a 20 74 68 65  stored by.** the
209b0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a   pseudo-table..*
209c0 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 50 73  /.case OP_OpenPs
209d0 65 75 64 6f 3a 20 7b 0a 20 20 56 64 62 65 43 75  eudo: {.  VdbeCu
209e0 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73  rsor *pCx;..  as
209f0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
20a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
20a10 70 2d 3e 70 33 3e 3d 30 20 29 3b 0a 20 20 70 43  p->p3>=0 );.  pC
20a20 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  x = allocateCurs
20a30 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  or(p, pOp->p1, p
20a40 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20 43 55 52 54  Op->p3, -1, CURT
20a50 59 50 45 5f 50 53 45 55 44 4f 29 3b 0a 20 20 69  YPE_PSEUDO);.  i
20a60 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f  f( pCx==0 ) goto
20a70 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e   no_mem;.  pCx->
20a80 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70  nullRow = 1;.  p
20a90 43 78 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  Cx->seekResult =
20aa0 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 78 2d   pOp->p2;.  pCx-
20ab0 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  >isTable = 1;.  
20ac0 2f 2a 20 47 69 76 65 20 74 68 69 73 20 70 73 65  /* Give this pse
20ad0 75 64 6f 2d 63 75 72 73 6f 72 20 61 20 66 61 6b  udo-cursor a fak
20ae0 65 20 42 74 43 75 72 73 6f 72 20 70 6f 69 6e 74  e BtCursor point
20af0 65 72 20 73 6f 20 74 68 61 74 20 70 43 78 0a 20  er so that pCx. 
20b00 20 2a 2a 20 63 61 6e 20 62 65 20 73 61 66 65 6c   ** can be safel
20b10 79 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  y passed to sqli
20b20 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
20b30 65 74 6f 28 29 2e 20 20 54 68 69 73 20 61 76 6f  eto().  This avo
20b40 69 64 73 20 61 20 74 65 73 74 0a 20 20 2a 2a 20  ids a test.  ** 
20b50 66 6f 72 20 70 43 78 2d 3e 65 43 75 72 54 79 70  for pCx->eCurTyp
20b60 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
20b70 20 69 6e 73 69 64 65 20 6f 66 20 73 71 6c 69 74   inside of sqlit
20b80 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
20b90 74 6f 28 29 0a 20 20 2a 2a 20 77 68 69 63 68 20  to().  ** which 
20ba0 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  is a performance
20bb0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
20bc0 0a 20 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  .  pCx->uc.pCurs
20bd0 6f 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  or = sqlite3Btre
20be0 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73 6f 72  eFakeValidCursor
20bf0 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  ();.  assert( pO
20c00 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 62 72  p->p5==0 );.  br
20c10 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
20c20 65 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20  e: Close P1 * * 
20c30 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20  * *.**.** Close 
20c40 61 20 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75  a cursor previou
20c50 73 6c 79 20 6f 70 65 6e 65 64 20 61 73 20 50 31  sly opened as P1
20c60 2e 20 20 49 66 20 50 31 20 69 73 20 6e 6f 74 0a  .  If P1 is not.
20c70 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ** currently ope
20c80 6e 2c 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  n, this instruct
20c90 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
20ca0 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65  */.case OP_Close
20cb0 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  : {.  assert( pO
20cc0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
20cd0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
20ce0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46  ;.  sqlite3VdbeF
20cf0 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e  reeCursor(p, p->
20d00 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b  apCsr[pOp->p1]);
20d10 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  .  p->apCsr[pOp-
20d20 3e 70 31 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61  >p1] = 0;.  brea
20d30 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  k;.}..#ifdef SQL
20d40 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
20d50 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 2f 2a 20 4f  N_USED_MASK./* O
20d60 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 73 55 73  pcode: ColumnsUs
20d70 65 64 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  ed P1 * * P4 *.*
20d80 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
20d90 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 65 78 69   (which only exi
20da0 73 74 73 20 69 66 20 53 51 4c 69 74 65 20 77 61  sts if SQLite wa
20db0 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a  s compiled with.
20dc0 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
20dd0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
20de0 4b 29 20 69 64 65 6e 74 69 66 69 65 73 20 77 68  K) identifies wh
20df0 69 63 68 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ich columns of t
20e00 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
20e10 6e 64 65 78 20 66 6f 72 20 63 75 72 73 6f 72 20  ndex for cursor 
20e20 50 31 20 61 72 65 20 75 73 65 64 2e 20 20 50 34  P1 are used.  P4
20e30 20 69 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74   is a 64-bit int
20e40 65 67 65 72 0a 2a 2a 20 28 50 34 5f 49 4e 54 36  eger.** (P4_INT6
20e50 34 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  4) in which the 
20e60 66 69 72 73 74 20 36 33 20 62 69 74 73 20 61 72  first 63 bits ar
20e70 65 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 6f  e one for each o
20e80 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 36  f the.** first 6
20e90 33 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  3 columns of the
20ea0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
20eb0 74 68 61 74 20 61 72 65 20 61 63 74 75 61 6c 6c  that are actuall
20ec0 79 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65  y used.** by the
20ed0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 68 69   cursor.  The hi
20ee0 67 68 2d 6f 72 64 65 72 20 62 69 74 20 69 73 20  gh-order bit is 
20ef0 73 65 74 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  set if any colum
20f00 6e 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 36  n after.** the 6
20f10 34 74 68 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  4th is used..*/.
20f20 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55  case OP_ColumnsU
20f30 73 65 64 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  sed: {.  VdbeCur
20f40 73 6f 72 20 2a 70 43 3b 0a 20 20 70 43 20 3d 20  sor *pC;.  pC = 
20f50 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
20f60 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  ];.  assert( pC-
20f70 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
20f80 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43  PE_BTREE );.  pC
20f90 2d 3e 6d 61 73 6b 55 73 65 64 20 3d 20 2a 28 75  ->maskUsed = *(u
20fa0 36 34 2a 29 70 4f 70 2d 3e 70 34 2e 70 49 36 34  64*)pOp->p4.pI64
20fb0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
20fc0 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
20fd0 53 65 65 6b 47 45 20 50 31 20 50 32 20 50 33 20  SeekGE P1 P2 P3 
20fe0 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  P4 *.** Synopsis
20ff0 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a  : key=r[P3@P4].*
21000 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
21010 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
21020 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
21030 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
21040 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
21050 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
21060 65 67 69 73 74 65 72 20 50 33 20 61 73 20 74 68  egister P3 as th
21070 65 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f  e key.  If curso
21080 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20  r P1 refers .** 
21090 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c  to an SQL index,
210a0 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20   then P3 is the 
210b0 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
210c0 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  y of P4 register
210d0 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75  s .** that are u
210e0 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b  sed as an unpack
210f0 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a  ed index key. .*
21100 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20  *.** Reposition 
21110 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
21120 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  t  it points to 
21130 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74  the smallest ent
21140 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67  ry that .** is g
21150 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
21160 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
21170 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20  value. If there 
21180 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a  are no records .
21190 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
211a0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
211b0 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f  key and P2 is no
211c0 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d  t zero, then jum
211d0 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49  p to P2..**.** I
211e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20  f the cursor P1 
211f0 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  was opened using
21200 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b   the OPFLAG_SEEK
21210 45 51 20 66 6c 61 67 2c 20 74 68 65 6e 20 74 68  EQ flag, then th
21220 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c  is.** opcode wil
21230 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e  l always land on
21240 20 61 20 72 65 63 6f 72 64 20 74 68 61 74 20 65   a record that e
21250 71 75 61 6c 6c 79 20 65 71 75 61 6c 73 20 74 68  qually equals th
21260 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73  e key, or.** els
21270 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  e jump immediate
21280 6c 79 20 74 6f 20 50 32 2e 20 20 57 68 65 6e 20  ly to P2.  When 
21290 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 4f 50  the cursor is OP
212a0 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74 68 69  FLAG_SEEKEQ, thi
212b0 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74  s.** opcode must
212c0 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   be followed by 
212d0 61 6e 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20  an IdxLE opcode 
212e0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 72  with the same ar
212f0 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  guments..** The 
21300 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c  IdxLE opcode wil
21310 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 66 20  l be skipped if 
21320 74 68 69 73 20 6f 70 63 6f 64 65 20 73 75 63 63  this opcode succ
21330 65 65 64 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a  eeds, but the.**
21340 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69   IdxLE opcode wi
21350 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e 20 73 75  ll be used on su
21360 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74  bsequent loop it
21370 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
21380 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76  This opcode leav
21390 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  es the cursor co
213a0 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65  nfigured to move
213b0 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65   in forward orde
213c0 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62  r,.** from the b
213d0 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20  eginning toward 
213e0 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68  the end.  In oth
213f0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75  er words, the cu
21400 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69  rsor is.** confi
21410 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78  gured to use Nex
21420 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a  t, not Prev..**.
21430 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
21440 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65  nd, NotFound, Se
21450 65 6b 4c 74 2c 20 53 65 65 6b 47 74 2c 20 53 65  ekLt, SeekGt, Se
21460 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ekLe.*/./* Opcod
21470 65 3a 20 53 65 65 6b 47 54 20 50 31 20 50 32 20  e: SeekGT P1 P2 
21480 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
21490 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34  sis: key=r[P3@P4
214a0 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ].**.** If curso
214b0 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61  r P1 refers to a
214c0 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54  n SQL table (B-T
214d0 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e  ree that uses in
214e0 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a  teger keys), .**
214f0 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69   use the value i
21500 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73  n register P3 as
21510 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f   a key. If curso
21520 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20  r P1 refers .** 
21530 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c  to an SQL index,
21540 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20   then P3 is the 
21550 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
21560 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  y of P4 register
21570 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75  s .** that are u
21580 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b  sed as an unpack
21590 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a  ed index key. .*
215a0 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20  *.** Reposition 
215b0 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
215c0 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  t  it points to 
215d0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74  the smallest ent
215e0 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67  ry that .** is g
215f0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
21600 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68  key value. If th
21610 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72  ere are no recor
21620 64 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ds greater than 
21630 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20  .** the key and 
21640 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P2 is not zero, 
21650 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
21660 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
21670 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  de leaves the cu
21680 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20  rsor configured 
21690 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77 61  to move in forwa
216a0 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f  rd order,.** fro
216b0 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
216c0 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e 20  toward the end. 
216d0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
216e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a   the cursor is.*
216f0 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  * configured to 
21700 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50 72  use Next, not Pr
21710 65 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ev..**.** See al
21720 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f  so: Found, NotFo
21730 75 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65  und, SeekLt, See
21740 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f  kGe, SeekLe.*/./
21750 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 54  * Opcode: SeekLT
21760 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 20 0a   P1 P2 P3 P4 * .
21770 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
21780 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
21790 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66  If cursor P1 ref
217a0 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61  ers to an SQL ta
217b0 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74  ble (B-Tree that
217c0 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65   uses integer ke
217d0 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65  ys), .** use the
217e0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
217f0 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20  er P3 as a key. 
21800 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66  If cursor P1 ref
21810 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51  ers .** to an SQ
21820 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33  L index, then P3
21830 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
21840 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20   an array of P4 
21850 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68  registers .** th
21860 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61  at are used as a
21870 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
21880 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70   key. .**.** Rep
21890 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50  osition cursor P
218a0 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f  1 so that  it po
218b0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67  ints to the larg
218c0 65 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a  est entry that .
218d0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
218e0 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49  the key value. I
218f0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72  f there are no r
21900 65 63 6f 72 64 73 20 6c 65 73 73 20 74 68 61 6e  ecords less than
21910 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64   .** the key and
21920 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   P2 is not zero,
21930 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
21940 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
21950 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
21960 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64  ursor configured
21970 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 65   to move in reve
21980 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72  rse order,.** fr
21990 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61 72  om the end towar
219a0 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e  d the beginning.
219b0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
219c0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a  , the cursor is.
219d0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  ** configured to
219e0 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e   use Prev, not N
219f0 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ext..**.** See a
21a00 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46  lso: Found, NotF
21a10 6f 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53 65  ound, SeekGt, Se
21a20 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a  ekGe, SeekLe.*/.
21a30 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c  /* Opcode: SeekL
21a40 45 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  E P1 P2 P3 P4 *.
21a50 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
21a60 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
21a70 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66  If cursor P1 ref
21a80 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61  ers to an SQL ta
21a90 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74  ble (B-Tree that
21aa0 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65   uses integer ke
21ab0 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65  ys), .** use the
21ac0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
21ad0 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20  er P3 as a key. 
21ae0 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66  If cursor P1 ref
21af0 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51  ers .** to an SQ
21b00 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33  L index, then P3
21b10 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
21b20 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20   an array of P4 
21b30 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68  registers .** th
21b40 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61  at are used as a
21b50 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
21b60 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70   key. .**.** Rep
21b70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50  osition cursor P
21b80 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  1 so that it poi
21b90 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65  nts to the large
21ba0 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  st entry that .*
21bb0 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
21bc0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
21bd0 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65  ey value. If the
21be0 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64  re are no record
21bf0 73 20 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20  s .** less than 
21c00 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
21c10 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f  key and P2 is no
21c20 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d  t zero, then jum
21c30 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  p to P2..**.** T
21c40 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
21c50 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e  s the cursor con
21c60 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20  figured to move 
21c70 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
21c80 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e  ,.** from the en
21c90 64 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 67  d toward the beg
21ca0 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65  inning.  In othe
21cb0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72  r words, the cur
21cc0 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67  sor is.** config
21cd0 75 72 65 64 20 74 6f 20 75 73 65 20 50 72 65 76  ured to use Prev
21ce0 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a  , not Next..**.*
21cf0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
21d00 50 31 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73  P1 was opened us
21d10 69 6e 67 20 74 68 65 20 4f 50 46 4c 41 47 5f 53  ing the OPFLAG_S
21d20 45 45 4b 45 51 20 66 6c 61 67 2c 20 74 68 65 6e  EEKEQ flag, then
21d30 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20   this.** opcode 
21d40 77 69 6c 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64  will always land
21d50 20 6f 6e 20 61 20 72 65 63 6f 72 64 20 74 68 61   on a record tha
21d60 74 20 65 71 75 61 6c 6c 79 20 65 71 75 61 6c 73  t equally equals
21d70 20 74 68 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20   the key, or.** 
21d80 65 6c 73 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69  else jump immedi
21d90 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 57 68  ately to P2.  Wh
21da0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
21db0 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20   OPFLAG_SEEKEQ, 
21dc0 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d  this.** opcode m
21dd0 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20  ust be followed 
21de0 62 79 20 61 6e 20 49 64 78 47 45 20 6f 70 63 6f  by an IdxGE opco
21df0 64 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  de with the same
21e00 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54   arguments..** T
21e10 68 65 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20  he IdxGE opcode 
21e20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
21e30 69 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20 73  if this opcode s
21e40 75 63 63 65 65 64 73 2c 20 62 75 74 20 74 68 65  ucceeds, but the
21e50 0a 2a 2a 20 49 64 78 47 45 20 6f 70 63 6f 64 65  .** IdxGE opcode
21e60 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e   will be used on
21e70 20 73 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70   subsequent loop
21e80 20 69 74 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   iterations..**.
21e90 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
21ea0 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65  nd, NotFound, Se
21eb0 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65  ekGt, SeekGe, Se
21ec0 65 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ekLt.*/.case OP_
21ed0 53 65 65 6b 4c 54 3a 20 20 20 20 20 20 20 20 20  SeekLT:         
21ee0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 2c 20 67 72  /* jump, in3, gr
21ef0 6f 75 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  oup */.case OP_S
21f00 65 65 6b 4c 45 3a 20 20 20 20 20 20 20 20 20 2f  eekLE:         /
21f10 2a 20 6a 75 6d 70 2c 20 69 6e 33 2c 20 67 72 6f  * jump, in3, gro
21f20 75 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  up */.case OP_Se
21f30 65 6b 47 45 3a 20 20 20 20 20 20 20 20 20 2f 2a  ekGE:         /*
21f40 20 6a 75 6d 70 2c 20 69 6e 33 2c 20 67 72 6f 75   jump, in3, grou
21f50 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  p */.case OP_See
21f60 6b 47 54 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  kGT: {       /* 
21f70 6a 75 6d 70 2c 20 69 6e 33 2c 20 67 72 6f 75 70  jump, in3, group
21f80 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20   */.  int res;  
21f90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
21fa0 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 2a 2f  arison result */
21fb0 0a 20 20 69 6e 74 20 6f 63 3b 20 20 20 20 20 20  .  int oc;      
21fc0 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
21fd0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
21fe0 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 63  *pC;    /* The c
21ff0 75 72 73 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f  ursor to seek */
22000 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
22010 64 20 72 3b 20 20 2f 2a 20 54 68 65 20 6b 65 79  d r;  /* The key
22020 20 74 6f 20 73 65 65 6b 20 66 6f 72 20 2a 2f 0a   to seek for */.
22030 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20    int nField;   
22040 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22050 66 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 66 69 65  f columns or fie
22060 6c 64 73 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  lds in the key *
22070 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20 20  /.  i64 iKey;   
22080 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
22090 77 69 64 20 77 65 20 61 72 65 20 74 6f 20 73 65  wid we are to se
220a0 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 65  ek to */.  int e
220b0 71 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 2f 2a  qOnly;        /*
220c0 20 4f 6e 6c 79 20 69 6e 74 65 72 65 73 74 65 64   Only interested
220d0 20 69 6e 20 3d 3d 20 72 65 73 75 6c 74 73 20 2a   in == results *
220e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  /..  assert( pOp
220f0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
22100 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
22110 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
22120 70 32 21 3d 30 20 29 3b 0a 20 20 70 43 20 3d 20  p2!=0 );.  pC = 
22130 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
22140 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
22150 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22160 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
22170 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
22180 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b   assert( OP_Seek
22190 4c 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b  LE == OP_SeekLT+
221a0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  1 );.  assert( O
221b0 50 5f 53 65 65 6b 47 45 20 3d 3d 20 4f 50 5f 53  P_SeekGE == OP_S
221c0 65 65 6b 4c 54 2b 32 20 29 3b 0a 20 20 61 73 73  eekLT+2 );.  ass
221d0 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 20 3d  ert( OP_SeekGT =
221e0 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 33 20 29 3b  = OP_SeekLT+3 );
221f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
22200 73 4f 72 64 65 72 65 64 20 29 3b 0a 20 20 61 73  sOrdered );.  as
22210 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75  sert( pC->uc.pCu
22220 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 6f 63 20  rsor!=0 );.  oc 
22230 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
22240 20 65 71 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 70   eqOnly = 0;.  p
22250 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  C->nullRow = 0;.
22260 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
22270 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70  BUG.  pC->seekOp
22280 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
22290 23 65 6e 64 69 66 0a 0a 20 20 70 43 2d 3e 64 65  #endif..  pC->de
222a0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
222b0 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
222c0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
222d0 45 3b 0a 20 20 69 66 28 20 70 43 2d 3e 69 73 54  E;.  if( pC->isT
222e0 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
222f0 68 65 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51  he BTREE_SEEK_EQ
22300 20 66 6c 61 67 20 69 73 20 6f 6e 6c 79 20 73 65   flag is only se
22310 74 20 6f 6e 20 69 6e 64 65 78 20 63 75 72 73 6f  t on index curso
22320 72 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  rs */.    assert
22330 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
22340 72 73 6f 72 48 61 73 48 69 6e 74 28 70 43 2d 3e  rsorHasHint(pC->
22350 75 63 2e 70 43 75 72 73 6f 72 2c 20 42 54 52 45  uc.pCursor, BTRE
22360 45 5f 53 45 45 4b 5f 45 51 29 3d 3d 30 0a 20 20  E_SEEK_EQ)==0.  
22370 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43              || C
22380 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20  ORRUPT_DB );..  
22390 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 76    /* The input v
223a0 61 6c 75 65 20 69 6e 20 50 33 20 6d 69 67 68 74  alue in P3 might
223b0 20 62 65 20 6f 66 20 61 6e 79 20 74 79 70 65 3a   be of any type:
223c0 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20   integer, real, 
223d0 73 74 72 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 62  string,.    ** b
223e0 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 42  lob, or NULL.  B
223f0 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  ut it needs to b
22400 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 66  e an integer bef
22410 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a 20 20  ore we can do.  
22420 20 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c 20 73    ** the seek, s
22430 6f 20 63 6f 6e 76 65 72 74 20 69 74 2e 20 2a 2f  o convert it. */
22440 0a 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  .    pIn3 = &aMe
22450 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20  m[pOp->p3];.    
22460 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  if( (pIn3->flags
22470 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
22480 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c  Real|MEM_IntReal
22490 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f  |MEM_Str))==MEM_
224a0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 61 70 70  Str ){.      app
224b0 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
224c0 79 28 70 49 6e 33 2c 20 30 29 3b 0a 20 20 20 20  y(pIn3, 0);.    
224d0 7d 0a 20 20 20 20 69 4b 65 79 20 3d 20 73 71 6c  }.    iKey = sql
224e0 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
224f0 28 70 49 6e 33 29 3b 0a 0a 20 20 20 20 2f 2a 20  (pIn3);..    /* 
22500 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
22510 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e  could not be con
22520 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69  verted into an i
22530 6e 74 65 67 65 72 20 77 69 74 68 6f 75 74 0a 20  nteger without. 
22540 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69 6e     ** loss of in
22550 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20  formation, then 
22560 73 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  special processi
22570 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 2e  ng is required..
22580 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49  . */.    if( (pI
22590 6e 33 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  n3->flags & (MEM
225a0 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c  _Int|MEM_IntReal
225b0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))==0 ){.      i
225c0 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
225d0 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29  & MEM_Real)==0 )
225e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
225f0 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
22600 5f 4e 75 6c 6c 29 20 7c 7c 20 6f 63 3e 3d 4f 50  _Null) || oc>=OP
22610 5f 53 65 65 6b 47 45 20 29 7b 0a 20 20 20 20 20  _SeekGE ){.     
22620 20 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54       VdbeBranchT
22630 61 6b 65 6e 28 31 2c 32 29 3b 20 67 6f 74 6f 20  aken(1,2); goto 
22640 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20  jump_to_p2;.    
22650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22660 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22680 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 2d 3e  e3BtreeLast(pC->
22690 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  uc.pCursor, &res
226a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
226b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
226c0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
226d0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
226e0 20 20 20 20 67 6f 74 6f 20 73 65 65 6b 5f 6e 6f      goto seek_no
226f0 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 20 20 20  t_found;.       
22700 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a   }.      }else..
22710 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
22720 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 69 4b  approximation iK
22730 65 79 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ey is larger tha
22740 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 61  n the actual rea
22750 6c 20 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a  l search.      *
22760 2a 20 74 65 72 6d 2c 20 73 75 62 73 74 69 74 75  * term, substitu
22770 74 65 20 3e 3d 20 66 6f 72 20 3e 20 61 6e 64 20  te >= for > and 
22780 3c 20 66 6f 72 20 3c 3d 2e 20 65 2e 67 2e 20 69  < for <=. e.g. i
22790 66 20 74 68 65 20 73 65 61 72 63 68 20 74 65 72  f the search ter
227a0 6d 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 34 2e  m.      ** is 4.
227b0 39 20 61 6e 64 20 74 68 65 20 69 6e 74 65 67 65  9 and the intege
227c0 72 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  r approximation 
227d0 35 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  5:.      **.    
227e0 20 20 2a 2a 20 20 20 20 20 20 20 20 28 78 20 3e    **        (x >
227f0 20 20 34 2e 39 29 20 20 20 20 2d 3e 20 20 20 20    4.9)    ->    
22800 20 28 78 20 3e 3d 20 35 29 0a 20 20 20 20 20 20   (x >= 5).      
22810 2a 2a 20 20 20 20 20 20 20 20 28 78 20 3c 3d 20  **        (x <= 
22820 34 2e 39 29 20 20 20 20 2d 3e 20 20 20 20 20 28  4.9)    ->     (
22830 78 20 3c 20 20 35 29 0a 20 20 20 20 20 20 2a 2f  x <  5).      */
22840 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d  .      if( pIn3-
22850 3e 75 2e 72 3c 28 64 6f 75 62 6c 65 29 69 4b 65  >u.r<(double)iKe
22860 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
22870 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 45 3d 3d  ert( OP_SeekGE==
22880 28 4f 50 5f 53 65 65 6b 47 54 2d 31 29 20 29 3b  (OP_SeekGT-1) );
22890 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
228a0 20 4f 50 5f 53 65 65 6b 4c 54 3d 3d 28 4f 50 5f   OP_SeekLT==(OP_
228b0 53 65 65 6b 4c 45 2d 31 29 20 29 3b 0a 20 20 20  SeekLE-1) );.   
228c0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 4f 50       assert( (OP
228d0 5f 53 65 65 6b 4c 45 20 26 20 30 78 30 30 30 31  _SeekLE & 0x0001
228e0 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 20 26 20  )==(OP_SeekGT & 
228f0 30 78 30 30 30 31 29 20 29 3b 0a 20 20 20 20 20  0x0001) );.     
22900 20 20 20 69 66 28 20 28 6f 63 20 26 20 30 78 30     if( (oc & 0x0
22910 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 54  001)==(OP_SeekGT
22920 20 26 20 30 78 30 30 30 31 29 20 29 20 6f 63 2d   & 0x0001) ) oc-
22930 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  -;.      }..    
22940 20 20 2f 2a 20 49 66 20 74 68 65 20 61 70 70 72    /* If the appr
22950 6f 78 69 6d 61 74 69 6f 6e 20 69 4b 65 79 20 69  oximation iKey i
22960 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
22970 68 65 20 61 63 74 75 61 6c 20 72 65 61 6c 20 73  he actual real s
22980 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  earch.      ** t
22990 65 72 6d 2c 20 73 75 62 73 74 69 74 75 74 65 20  erm, substitute 
229a0 3c 3d 20 66 6f 72 20 3c 20 61 6e 64 20 3e 20 66  <= for < and > f
229b0 6f 72 20 3e 3d 2e 20 20 2a 2f 0a 20 20 20 20 20  or >=.  */.     
229c0 20 65 6c 73 65 20 69 66 28 20 70 49 6e 33 2d 3e   else if( pIn3->
229d0 75 2e 72 3e 28 64 6f 75 62 6c 65 29 69 4b 65 79  u.r>(double)iKey
229e0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
229f0 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 3d 3d 28  rt( OP_SeekLE==(
22a00 4f 50 5f 53 65 65 6b 4c 54 2b 31 29 20 29 3b 0a  OP_SeekLT+1) );.
22a10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22a20 4f 50 5f 53 65 65 6b 47 54 3d 3d 28 4f 50 5f 53  OP_SeekGT==(OP_S
22a30 65 65 6b 47 45 2b 31 29 20 29 3b 0a 20 20 20 20  eekGE+1) );.    
22a40 20 20 20 20 61 73 73 65 72 74 28 20 28 4f 50 5f      assert( (OP_
22a50 53 65 65 6b 4c 54 20 26 20 30 78 30 30 30 31 29  SeekLT & 0x0001)
22a60 3d 3d 28 4f 50 5f 53 65 65 6b 47 45 20 26 20 30  ==(OP_SeekGE & 0
22a70 78 30 30 30 31 29 20 29 3b 0a 20 20 20 20 20 20  x0001) );.      
22a80 20 20 69 66 28 20 28 6f 63 20 26 20 30 78 30 30    if( (oc & 0x00
22a90 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54 20  01)==(OP_SeekLT 
22aa0 26 20 30 78 30 30 30 31 29 20 29 20 6f 63 2b 2b  & 0x0001) ) oc++
22ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22ac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22ad0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
22ae0 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ked(pC->uc.pCurs
22af0 6f 72 2c 20 30 2c 20 28 75 36 34 29 69 4b 65 79  or, 0, (u64)iKey
22b00 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
22b10 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
22b20 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55 73 65   = iKey;  /* Use
22b30 64 20 62 79 20 4f 50 5f 44 65 6c 65 74 65 20 2a  d by OP_Delete *
22b40 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  /.    if( rc!=SQ
22b50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22b60 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
22b70 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
22b80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
22b90 46 6f 72 20 61 20 63 75 72 73 6f 72 20 77 69 74  For a cursor wit
22ba0 68 20 74 68 65 20 42 54 52 45 45 5f 53 45 45 4b  h the BTREE_SEEK
22bb0 5f 45 51 20 68 69 6e 74 2c 20 6f 6e 6c 79 20 74  _EQ hint, only t
22bc0 68 65 20 4f 50 5f 53 65 65 6b 47 45 20 61 6e 64  he OP_SeekGE and
22bd0 0a 20 20 20 20 2a 2a 20 4f 50 5f 53 65 65 6b 4c  .    ** OP_SeekL
22be0 45 20 6f 70 63 6f 64 65 73 20 61 72 65 20 61 6c  E opcodes are al
22bf0 6c 6f 77 65 64 2c 20 61 6e 64 20 74 68 65 73 65  lowed, and these
22c00 20 6d 75 73 74 20 62 65 20 69 6d 6d 65 64 69 61   must be immedia
22c10 74 65 6c 79 20 66 6f 6c 6c 6f 77 65 64 0a 20 20  tely followed.  
22c20 20 20 2a 2a 20 62 79 20 61 6e 20 4f 50 5f 49 64    ** by an OP_Id
22c30 78 47 54 20 6f 72 20 4f 50 5f 49 64 78 4c 54 20  xGT or OP_IdxLT 
22c40 6f 70 63 6f 64 65 2c 20 72 65 73 70 65 63 74 69  opcode, respecti
22c50 76 65 6c 79 2c 20 77 69 74 68 20 74 68 65 20 73  vely, with the s
22c60 61 6d 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  ame key..    */.
22c70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
22c80 74 72 65 65 43 75 72 73 6f 72 48 61 73 48 69 6e  treeCursorHasHin
22c90 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t(pC->uc.pCursor
22ca0 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 29  , BTREE_SEEK_EQ)
22cb0 20 29 7b 0a 20 20 20 20 20 20 65 71 4f 6e 6c 79   ){.      eqOnly
22cc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   = 1;.      asse
22cd0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
22ce0 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 70 4f  =OP_SeekGE || pO
22cf0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65  p->opcode==OP_Se
22d00 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73  ekLE );.      as
22d10 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 6f 70 63  sert( pOp[1].opc
22d20 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 7c 7c  ode==OP_IdxLT ||
22d30 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d   pOp[1].opcode==
22d40 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20  OP_IdxGT );.    
22d50 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d    assert( pOp[1]
22d60 2e 70 31 3d 3d 70 4f 70 5b 30 5d 2e 70 31 20 29  .p1==pOp[0].p1 )
22d70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22d80 70 4f 70 5b 31 5d 2e 70 32 3d 3d 70 4f 70 5b 30  pOp[1].p2==pOp[0
22d90 5d 2e 70 32 20 29 3b 0a 20 20 20 20 20 20 61 73  ].p2 );.      as
22da0 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 33 3d  sert( pOp[1].p3=
22db0 3d 70 4f 70 5b 30 5d 2e 70 33 20 29 3b 0a 20 20  =pOp[0].p3 );.  
22dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
22dd0 31 5d 2e 70 34 2e 69 3d 3d 70 4f 70 5b 30 5d 2e  1].p4.i==pOp[0].
22de0 70 34 2e 69 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  p4.i );.    }.. 
22df0 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d     nField = pOp-
22e00 3e 70 34 2e 69 3b 0a 20 20 20 20 61 73 73 65 72  >p4.i;.    asser
22e10 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
22e20 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20  P4_INT32 );.    
22e30 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30  assert( nField>0
22e40 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e   );.    r.pKeyIn
22e50 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66  fo = pC->pKeyInf
22e60 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20  o;.    r.nField 
22e70 3d 20 28 75 31 36 29 6e 46 69 65 6c 64 3b 0a 0a  = (u16)nField;..
22e80 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
22e90 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20 63 6f 6d  line of code com
22ea0 70 75 74 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73  putes as follows
22eb0 2c 20 6f 6e 6c 79 20 66 61 73 74 65 72 3a 0a 20  , only faster:. 
22ec0 20 20 20 2a 2a 20 20 20 69 66 28 20 6f 63 3d 3d     **   if( oc==
22ed0 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20 6f 63 3d  OP_SeekGT || oc=
22ee0 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 7b 0a 20 20  =OP_SeekLE ){.  
22ef0 20 20 2a 2a 20 20 20 20 20 72 2e 64 65 66 61 75    **     r.defau
22f00 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20  lt_rc = -1;.    
22f10 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  **   }else{.    
22f20 2a 2a 20 20 20 20 20 72 2e 64 65 66 61 75 6c 74  **     r.default
22f30 5f 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 2a 2a  _rc = +1;.    **
22f40 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
22f50 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 28  r.default_rc = (
22f60 28 31 20 26 20 28 6f 63 20 2d 20 4f 50 5f 53 65  (1 & (oc - OP_Se
22f70 65 6b 4c 54 29 29 20 3f 20 2d 31 20 3a 20 2b 31  ekLT)) ? -1 : +1
22f80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
22f90 63 21 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20  c!=OP_SeekGT || 
22fa0 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  r.default_rc==-1
22fb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22fc0 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 45 20 7c 7c  oc!=OP_SeekLE ||
22fd0 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d   r.default_rc==-
22fe0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
22ff0 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 45 20 7c   oc!=OP_SeekGE |
23000 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  | r.default_rc==
23010 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
23020 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 54 20  ( oc!=OP_SeekLT 
23030 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d  || r.default_rc=
23040 3d 2b 31 20 29 3b 0a 0a 20 20 20 20 72 2e 61 4d  =+1 );..    r.aM
23050 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
23060 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p3];.#ifdef SQLI
23070 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69  TE_DEBUG.    { i
23080 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69  nt i; for(i=0; i
23090 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20  <r.nField; i++) 
230a0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
230b0 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29  id(&r.aMem[i]) )
230c0 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  ; }.#endif.    r
230d0 2e 65 71 53 65 65 6e 20 3d 20 30 3b 0a 20 20 20  .eqSeen = 0;.   
230e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
230f0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
23100 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
23110 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29   &r, 0, 0, &res)
23120 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
23130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23140 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
23150 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
23160 20 20 20 20 69 66 28 20 65 71 4f 6e 6c 79 20 26      if( eqOnly &
23170 26 20 72 2e 65 71 53 65 65 6e 3d 3d 30 20 29 7b  & r.eqSeen==0 ){
23180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
23190 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 67  es!=0 );.      g
231a0 6f 74 6f 20 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75  oto seek_not_fou
231b0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  nd;.    }.  }.#i
231c0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
231d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
231e0 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
231f0 66 0a 20 20 69 66 28 20 6f 63 3e 3d 4f 50 5f 53  f.  if( oc>=OP_S
23200 65 65 6b 47 45 20 29 7b 20 20 61 73 73 65 72 74  eekGE ){  assert
23210 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 45 20  ( oc==OP_SeekGE 
23220 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54  || oc==OP_SeekGT
23230 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c   );.    if( res<
23240 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20  0 || (res==0 && 
23250 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 20 29  oc==OP_SeekGT) )
23260 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b  {.      res = 0;
23270 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23280 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 2d  te3BtreeNext(pC-
23290 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 29 3b  >uc.pCursor, 0);
232a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
232b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
232c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
232d0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
232e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
232f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  _OK;.          r
23300 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
23310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23320 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
23330 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
23340 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
23360 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
23370 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
23380 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c   oc==OP_SeekLT |
23390 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20  | oc==OP_SeekLE 
233a0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3e 30  );.    if( res>0
233b0 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f   || (res==0 && o
233c0 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 20 29 7b  c==OP_SeekLT) ){
233d0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a  .      res = 0;.
233e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
233f0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
23400 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
23410 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
23420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23430 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23440 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
23450 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23460 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
23470 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 20    res = 1;.     
23480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23490 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
234a0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
234b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
234c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
234d0 2f 2a 20 72 65 73 20 6d 69 67 68 74 20 62 65 20  /* res might be 
234e0 6e 65 67 61 74 69 76 65 20 62 65 63 61 75 73 65  negative because
234f0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
23500 70 74 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a 20  pty.  Check to. 
23510 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74       ** see if t
23520 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
23530 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23540 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74 72  res = sqlite3Btr
23550 65 65 45 6f 66 28 70 43 2d 3e 75 63 2e 70 43 75  eeEof(pC->uc.pCu
23560 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rsor);.    }.  }
23570 0a 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64 3a  .seek_not_found:
23580 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
23590 70 32 3e 30 20 29 3b 0a 20 20 56 64 62 65 42 72  p2>0 );.  VdbeBr
235a0 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30  anchTaken(res!=0
235b0 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20 29  ,2);.  if( res )
235c0 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f  {.    goto jump_
235d0 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 20 69  to_p2;.  }else i
235e0 66 28 20 65 71 4f 6e 6c 79 20 29 7b 0a 20 20 20  f( eqOnly ){.   
235f0 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e   assert( pOp[1].
23600 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54  opcode==OP_IdxLT
23610 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64   || pOp[1].opcod
23620 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20  e==OP_IdxGT );. 
23630 20 20 20 70 4f 70 2b 2b 3b 20 2f 2a 20 53 6b 69     pOp++; /* Ski
23640 70 20 74 68 65 20 4f 50 5f 49 64 78 4c 74 20 6f  p the OP_IdxLt o
23650 72 20 4f 50 5f 49 64 78 47 54 20 74 68 61 74 20  r OP_IdxGT that 
23660 66 6f 6c 6c 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20  follows */.  }. 
23670 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
23680 63 6f 64 65 3a 20 53 65 65 6b 48 69 74 20 50 31  code: SeekHit P1
23690 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
236a0 6f 70 73 69 73 3a 20 73 65 65 6b 48 69 74 3d 50  opsis: seekHit=P
236b0 32 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  2.**.** Set the 
236c0 73 65 65 6b 48 69 74 20 66 6c 61 67 20 6f 6e 20  seekHit flag on 
236d0 63 75 72 73 6f 72 20 50 31 20 74 6f 20 74 68 65  cursor P1 to the
236e0 20 76 61 6c 75 65 20 69 6e 20 50 32 2e 0a 2a 2a   value in P2..**
236f0 20 54 68 65 20 73 65 65 6b 48 69 74 20 66 6c 61   The seekHit fla
23700 67 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  g is used by the
23710 20 49 66 4e 6f 48 6f 70 65 20 6f 70 63 6f 64 65   IfNoHope opcode
23720 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74 20  ..**.** P1 must 
23730 62 65 20 61 20 76 61 6c 69 64 20 62 2d 74 72 65  be a valid b-tre
23740 65 20 63 75 72 73 6f 72 2e 20 20 50 32 20 6d 75  e cursor.  P2 mu
23750 73 74 20 62 65 20 61 20 62 6f 6f 6c 65 61 6e 20  st be a boolean 
23760 76 61 6c 75 65 2c 0a 2a 2a 20 65 69 74 68 65 72  value,.** either
23770 20 30 20 6f 72 20 31 2e 0a 2a 2f 0a 63 61 73 65   0 or 1..*/.case
23780 20 4f 50 5f 53 65 65 6b 48 69 74 3a 20 7b 0a 20   OP_SeekHit: {. 
23790 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
237a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
237b0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
237c0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
237d0 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
237e0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
237f0 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
23800 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 30  sert( pOp->p2==0
23810 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29   || pOp->p2==1 )
23820 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 48 69 74 20  ;.  pC->seekHit 
23830 3d 20 70 4f 70 2d 3e 70 32 20 26 20 31 3b 0a 20  = pOp->p2 & 1;. 
23840 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
23850 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31 20 50  code: Found P1 P
23860 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
23870 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
23880 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d  P4].**.** If P4=
23890 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  =0 then register
238a0 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
238b0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
238c0 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a  MakeRecord.  If.
238d0 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67  ** P4>0 then reg
238e0 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20  ister P3 is the 
238f0 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69  first of P4 regi
23900 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20  sters that form 
23910 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72  an unpacked.** r
23920 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43 75 72  ecord..**.** Cur
23930 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20  sor P1 is on an 
23940 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49 66  index btree.  If
23950 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e   the record iden
23960 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e 64  tified by P3 and
23970 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72 65 66   P4.** is a pref
23980 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20  ix of any entry 
23990 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d  in P1 then a jum
239a0 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20  p is made to P2 
239b0 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c 65 66  and.** P1 is lef
239c0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
239d0 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79  e matching entry
239e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65  ..**.** This ope
239f0 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 74 68  ration leaves th
23a00 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74  e cursor in a st
23a10 61 74 65 20 77 68 65 72 65 20 69 74 20 63 61 6e  ate where it can
23a20 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20   be.** advanced 
23a30 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20 64  in the forward d
23a40 69 72 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 4e  irection.  The N
23a50 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
23a60 77 69 6c 6c 20 77 6f 72 6b 2c 0a 2a 2a 20 62 75  will work,.** bu
23a70 74 20 6e 6f 74 20 74 68 65 20 50 72 65 76 20 69  t not the Prev i
23a80 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
23a90 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46  * See also: NotF
23aa0 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74  ound, NoConflict
23ab0 2c 20 4e 6f 74 45 78 69 73 74 73 2e 20 53 65 65  , NotExists. See
23ac0 6b 47 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  kGe.*/./* Opcode
23ad0 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20 50 32  : NotFound P1 P2
23ae0 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
23af0 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
23b00 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d  4].**.** If P4==
23b10 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  0 then register 
23b20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20  P3 holds a blob 
23b30 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 4d  constructed by M
23b40 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a  akeRecord.  If.*
23b50 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67 69  * P4>0 then regi
23b60 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20 66  ster P3 is the f
23b70 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69 73  irst of P4 regis
23b80 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20 61  ters that form a
23b90 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65  n unpacked.** re
23ba0 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72  cord..** .** Cur
23bb0 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20  sor P1 is on an 
23bc0 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49 66  index btree.  If
23bd0 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e   the record iden
23be0 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e 64  tified by P3 and
23bf0 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68   P4.** is not th
23c00 65 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79 20  e prefix of any 
23c10 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65 6e  entry in P1 then
23c20 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
23c30 74 6f 20 50 32 2e 20 20 49 66 20 50 31 20 0a 2a  to P2.  If P1 .*
23c40 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61  * does contain a
23c50 6e 20 65 6e 74 72 79 20 77 68 6f 73 65 20 70 72  n entry whose pr
23c60 65 66 69 78 20 6d 61 74 63 68 65 73 20 74 68 65  efix matches the
23c70 20 50 33 2f 50 34 20 72 65 63 6f 72 64 20 74 68   P3/P4 record th
23c80 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66 61  en control.** fa
23c90 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20 74  lls through to t
23ca0 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
23cb0 69 6f 6e 20 61 6e 64 20 50 31 20 69 73 20 6c 65  ion and P1 is le
23cc0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  ft pointing at t
23cd0 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20 65  he.** matching e
23ce0 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
23cf0 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65   operation leave
23d00 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20  s the cursor in 
23d10 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  a state where it
23d20 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61 64   cannot be.** ad
23d30 76 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65 72  vanced in either
23d40 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20   direction.  In 
23d50 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
23d60 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a 2a   Next and Prev.*
23d70 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f 74  * opcodes do not
23d80 20 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69 73   work after this
23d90 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
23da0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
23db0 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 4e 6f  d, NotExists, No
23dc0 43 6f 6e 66 6c 69 63 74 2c 20 49 66 4e 6f 48 6f  Conflict, IfNoHo
23dd0 70 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  pe.*/./* Opcode:
23de0 20 49 66 4e 6f 48 6f 70 65 20 50 31 20 50 32 20   IfNoHope P1 P2 
23df0 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
23e00 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34  sis: key=r[P3@P4
23e10 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ].**.** Register
23e20 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74   P3 is the first
23e30 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
23e40 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e   that form an un
23e50 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64  packed.** record
23e60 2e 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 50  ..**.** Cursor P
23e70 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78  1 is on an index
23e80 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
23e90 73 65 65 6b 48 69 74 20 66 6c 61 67 20 69 73 20  seekHit flag is 
23ea0 73 65 74 20 6f 6e 20 50 31 2c 20 74 68 65 6e 0a  set on P1, then.
23eb0 2a 2a 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  ** this opcode i
23ec0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  s a no-op.  But 
23ed0 69 66 20 74 68 65 20 73 65 65 6b 48 69 74 20 66  if the seekHit f
23ee0 6c 61 67 20 6f 66 20 50 31 20 69 73 20 63 6c 65  lag of P1 is cle
23ef0 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 63 68 65 63  ar, then.** chec
23f00 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
23f10 65 20 69 73 20 61 6e 79 20 65 6e 74 72 79 20 69  e is any entry i
23f20 6e 20 50 31 20 74 68 61 74 20 6d 61 74 63 68 65  n P1 that matche
23f30 73 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20  s the.** prefix 
23f40 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33  identified by P3
23f50 20 61 6e 64 20 50 34 2e 20 20 49 66 20 6e 6f 20   and P4.  If no 
23f60 65 6e 74 72 79 20 6d 61 74 63 68 65 73 20 74 68  entry matches th
23f70 65 20 70 72 65 66 69 78 2c 0a 2a 2a 20 6a 75 6d  e prefix,.** jum
23f80 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77  p to P2.  Otherw
23f90 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ise fall through
23fa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
23fb0 6f 64 65 20 62 65 68 61 76 65 73 20 6c 69 6b 65  ode behaves like
23fc0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 69 66 20   OP_NotFound if 
23fd0 74 68 65 20 73 65 65 6b 48 69 74 0a 2a 2a 20 66  the seekHit.** f
23fe0 6c 61 67 20 69 73 20 63 6c 65 61 72 20 61 6e 64  lag is clear and
23ff0 20 69 74 20 62 65 68 61 76 65 73 20 6c 69 6b 65   it behaves like
24000 20 4f 50 5f 4e 6f 6f 70 20 69 66 20 74 68 65 20   OP_Noop if the 
24010 73 65 65 6b 48 69 74 20 66 6c 61 67 20 69 73 20  seekHit flag is 
24020 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  set..**.** This 
24030 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 69  opcode is used i
24040 6e 20 49 4e 20 63 6c 61 75 73 65 20 70 72 6f 63  n IN clause proc
24050 65 73 73 69 6e 67 20 66 6f 72 20 61 20 6d 75 6c  essing for a mul
24060 74 69 2d 63 6f 6c 75 6d 6e 20 6b 65 79 2e 0a 2a  ti-column key..*
24070 2a 20 49 66 20 61 6e 20 49 4e 20 63 6c 61 75 73  * If an IN claus
24080 65 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  e is attached to
24090 20 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74   an element of t
240a0 68 65 20 6b 65 79 20 6f 74 68 65 72 20 74 68 61  he key other tha
240b0 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  n the.** left-mo
240c0 73 74 20 65 6c 65 6d 65 6e 74 2c 20 61 6e 64 20  st element, and 
240d0 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
240e0 6d 61 74 63 68 65 73 20 6f 6e 20 74 68 65 20 6d  matches on the m
240f0 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 73 65  ost recent.** se
24100 65 6b 20 6f 76 65 72 20 74 68 65 20 77 68 6f 6c  ek over the whol
24110 65 20 6b 65 79 2c 20 74 68 65 6e 20 69 74 20 6d  e key, then it m
24120 69 67 68 74 20 62 65 20 74 68 61 74 20 6f 6e 65  ight be that one
24130 20 6f 66 20 74 68 65 20 6b 65 79 20 65 6c 65 6d   of the key elem
24140 65 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 65  ent.** to the le
24150 66 74 20 69 73 20 70 72 6f 68 69 62 69 74 69 6e  ft is prohibitin
24160 67 20 61 20 6d 61 74 63 68 2c 20 61 6e 64 20 68  g a match, and h
24170 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 22 6e  ence there is "n
24180 6f 20 68 6f 70 65 22 20 6f 66 0a 2a 2a 20 61 6e  o hope" of.** an
24190 79 20 6d 61 74 63 68 20 72 65 67 61 72 64 6c 65  y match regardle
241a0 73 73 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 49  ss of how many I
241b0 4e 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  N clause element
241c0 73 20 61 72 65 20 63 68 65 63 6b 65 64 2e 0a 2a  s are checked..*
241d0 2a 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65  * In such a case
241e0 2c 20 77 65 20 61 62 61 6e 64 6f 6e 20 74 68 65  , we abandon the
241f0 20 49 4e 20 63 6c 61 75 73 65 20 73 65 61 72 63   IN clause searc
24200 68 20 65 61 72 6c 79 2c 20 75 73 69 6e 67 20 74  h early, using t
24210 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 2e 20 20  his.** opcode.  
24220 54 68 65 20 6f 70 63 6f 64 65 20 6e 61 6d 65 20  The opcode name 
24230 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 66  comes from the f
24240 61 63 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  act that the.** 
24250 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
24260 20 74 68 65 72 65 20 69 73 20 22 6e 6f 20 68 6f   there is "no ho
24270 70 65 22 20 6f 66 20 61 63 68 69 65 76 69 6e 67  pe" of achieving
24280 20 61 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20   a match..**.** 
24290 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75  See also: NotFou
242a0 6e 64 2c 20 53 65 65 6b 48 69 74 0a 2a 2f 0a 2f  nd, SeekHit.*/./
242b0 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 43 6f 6e 66  * Opcode: NoConf
242c0 6c 69 63 74 20 50 31 20 50 32 20 50 33 20 50 34  lict P1 P2 P3 P4
242d0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
242e0 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a  key=r[P3@P4].**.
242f0 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e  ** If P4==0 then
24300 20 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c   register P3 hol
24310 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72  ds a blob constr
24320 75 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63  ucted by MakeRec
24330 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30  ord.  If.** P4>0
24340 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50   then register P
24350 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  3 is the first o
24360 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74  f P4 registers t
24370 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61  hat form an unpa
24380 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a  cked.** record..
24390 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31  ** .** Cursor P1
243a0 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   is on an index 
243b0 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 72  btree.  If the r
243c0 65 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64  ecord identified
243d0 20 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a   by P3 and P4.**
243e0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
243f0 4c 4c 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20 69  LL value, jump i
24400 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
24410 2e 20 20 49 66 20 61 6c 6c 20 74 65 72 6d 73 20  .  If all terms 
24420 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  of the.** record
24430 20 61 72 65 20 6e 6f 74 2d 4e 55 4c 4c 20 74 68   are not-NULL th
24440 65 6e 20 61 20 63 68 65 63 6b 20 69 73 20 64 6f  en a check is do
24450 6e 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ne to determine 
24460 69 66 20 61 6e 79 20 72 6f 77 20 69 6e 20 74 68  if any row in th
24470 65 0a 2a 2a 20 50 31 20 69 6e 64 65 78 20 62 74  e.** P1 index bt
24480 72 65 65 20 68 61 73 20 61 20 6d 61 74 63 68 69  ree has a matchi
24490 6e 67 20 6b 65 79 20 70 72 65 66 69 78 2e 20 20  ng key prefix.  
244a0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
244b0 6d 61 74 63 68 65 73 2c 20 6a 75 6d 70 0a 2a 2a  matches, jump.**
244c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
244d0 50 32 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  P2.  If there is
244e0 20 61 20 6d 61 74 63 68 2c 20 66 61 6c 6c 20 74   a match, fall t
244f0 68 72 6f 75 67 68 20 61 6e 64 20 6c 65 61 76 65  hrough and leave
24500 20 74 68 65 20 50 31 0a 2a 2a 20 63 75 72 73 6f   the P1.** curso
24510 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
24520 65 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e 0a  e matching row..
24530 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
24540 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  e is similar to 
24550 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 77 69 74 68  OP_NotFound with
24560 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 73 20   the exceptions 
24570 74 68 61 74 20 74 68 65 0a 2a 2a 20 62 72 61 6e  that the.** bran
24580 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 61 6b  ch is always tak
24590 65 6e 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  en if any part o
245a0 66 20 74 68 65 20 73 65 61 72 63 68 20 6b 65 79  f the search key
245b0 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 0a   input is NULL..
245c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61  **.** This opera
245d0 74 69 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20  tion leaves the 
245e0 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74  cursor in a stat
245f0 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f  e where it canno
24600 74 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64  t be.** advanced
24610 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63   in either direc
24620 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
24630 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20  words, the Next 
24640 61 6e 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f  and Prev.** opco
24650 64 65 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20  des do not work 
24660 61 66 74 65 72 20 74 68 69 73 20 6f 70 65 72 61  after this opera
24670 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tion..**.** See 
24680 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20  also: NotFound, 
24690 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73  Found, NotExists
246a0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f  .*/.case OP_IfNo
246b0 48 6f 70 65 3a 20 7b 20 20 20 20 20 2f 2a 20 6a  Hope: {     /* j
246c0 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64  ump, in3 */.  Vd
246d0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
246e0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
246f0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
24700 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
24710 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
24720 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
24730 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  pC!=0 );.  if( p
24740 43 2d 3e 73 65 65 6b 48 69 74 20 29 20 62 72 65  C->seekHit ) bre
24750 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ak;.  /* Fall th
24760 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 4e 6f  rough into OP_No
24770 74 46 6f 75 6e 64 20 2a 2f 0a 7d 0a 63 61 73 65  tFound */.}.case
24780 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 3a 20   OP_NoConflict: 
24790 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
247a0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 46   */.case OP_NotF
247b0 6f 75 6e 64 3a 20 20 20 20 20 20 20 2f 2a 20 6a  ound:       /* j
247c0 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  ump, in3 */.case
247d0 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b 20 20 20 20   OP_Found: {    
247e0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
247f0 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 72 65 61 64   */.  int alread
24800 79 45 78 69 73 74 73 3b 0a 20 20 69 6e 74 20 74  yExists;.  int t
24810 61 6b 65 4a 75 6d 70 3b 0a 20 20 69 6e 74 20 69  akeJump;.  int i
24820 69 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  i;.  VdbeCursor 
24830 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  *pC;.  int res;.
24840 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
24850 20 2a 70 46 72 65 65 3b 0a 20 20 55 6e 70 61 63   *pFree;.  Unpac
24860 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
24870 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
24880 63 6f 72 64 20 72 3b 0a 0a 23 69 66 64 65 66 20  cord r;..#ifdef 
24890 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
248a0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
248b0 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 20 73  P_NoConflict ) s
248c0 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75  qlite3_found_cou
248d0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
248e0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
248f0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
24900 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
24910 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
24920 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20  e==P4_INT32 );. 
24930 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
24940 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
24950 74 28 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 64  t( pC!=0 );.#ifd
24960 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
24970 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70    pC->seekOp = p
24980 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64  Op->opcode;.#end
24990 69 66 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  if.  pIn3 = &aMe
249a0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73  m[pOp->p3];.  as
249b0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
249c0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
249d0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
249e0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
249f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24a00 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  ->isTable==0 );.
24a10 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3e    if( pOp->p4.i>
24a20 30 20 29 7b 0a 20 20 20 20 72 2e 70 4b 65 79 49  0 ){.    r.pKeyI
24a30 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
24a40 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64  fo;.    r.nField
24a50 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e   = (u16)pOp->p4.
24a60 69 3b 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20  i;.    r.aMem = 
24a70 70 49 6e 33 3b 0a 23 69 66 64 65 66 20 53 51 4c  pIn3;.#ifdef SQL
24a80 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f  ITE_DEBUG.    fo
24a90 72 28 69 69 3d 30 3b 20 69 69 3c 72 2e 6e 46 69  r(ii=0; ii<r.nFi
24aa0 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  eld; ii++){.    
24ab0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
24ac0 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 69 5d  alid(&r.aMem[ii]
24ad0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
24ae0 74 28 20 28 72 2e 61 4d 65 6d 5b 69 69 5d 2e 66  t( (r.aMem[ii].f
24af0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
24b00 3d 3d 30 20 7c 7c 20 72 2e 61 4d 65 6d 5b 69 69  ==0 || r.aMem[ii
24b10 5d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ].n==0 );.      
24b20 69 66 28 20 69 69 20 29 20 52 45 47 49 53 54 45  if( ii ) REGISTE
24b30 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2b  R_TRACE(pOp->p3+
24b40 69 69 2c 20 26 72 2e 61 4d 65 6d 5b 69 69 5d 29  ii, &r.aMem[ii])
24b50 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
24b60 20 20 20 70 49 64 78 4b 65 79 20 3d 20 26 72 3b     pIdxKey = &r;
24b70 0a 20 20 20 20 70 46 72 65 65 20 3d 20 30 3b 0a  .    pFree = 0;.
24b80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
24b90 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ert( pIn3->flags
24ba0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
24bb0 20 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c     rc = ExpandBl
24bc0 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 61 73  ob(pIn3);.    as
24bd0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
24be0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
24bf0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69  E_NOMEM );.    i
24c00 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6e 6f 5f  f( rc ) goto no_
24c10 6d 65 6d 3b 0a 20 20 20 20 70 46 72 65 65 20 3d  mem;.    pFree =
24c20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
24c30 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
24c40 6b 65 64 52 65 63 6f 72 64 28 70 43 2d 3e 70 4b  kedRecord(pC->pK
24c50 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  eyInfo);.    if(
24c60 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 67 6f   pIdxKey==0 ) go
24c70 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 73  to no_mem;.    s
24c80 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
24c90 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49  Unpack(pC->pKeyI
24ca0 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49  nfo, pIn3->n, pI
24cb0 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b  n3->z, pIdxKey);
24cc0 0a 20 20 7d 0a 20 20 70 49 64 78 4b 65 79 2d 3e  .  }.  pIdxKey->
24cd0 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a  default_rc = 0;.
24ce0 20 20 74 61 6b 65 4a 75 6d 70 20 3d 20 30 3b 0a    takeJump = 0;.
24cf0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
24d00 65 3d 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74  e==OP_NoConflict
24d10 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74   ){.    /* For t
24d20 68 65 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74  he OP_NoConflict
24d30 20 6f 70 63 6f 64 65 2c 20 74 61 6b 65 20 74 68   opcode, take th
24d40 65 20 6a 75 6d 70 20 69 66 20 61 6e 79 20 6f 66  e jump if any of
24d50 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 70 75   the.    ** inpu
24d60 74 20 66 69 65 6c 64 73 20 61 72 65 20 4e 55 4c  t fields are NUL
24d70 4c 2c 20 73 69 6e 63 65 20 61 6e 79 20 6b 65 79  L, since any key
24d80 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 77 69 6c   with a NULL wil
24d90 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  l not.    ** con
24da0 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 66 6f 72  flict */.    for
24db0 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78 4b 65  (ii=0; ii<pIdxKe
24dc0 79 2d 3e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29  y->nField; ii++)
24dd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  {.      if( pIdx
24de0 4b 65 79 2d 3e 61 4d 65 6d 5b 69 69 5d 2e 66 6c  Key->aMem[ii].fl
24df0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
24e00 7b 0a 20 20 20 20 20 20 20 20 74 61 6b 65 4a 75  {.        takeJu
24e10 6d 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  mp = 1;.        
24e20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
24e30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
24e40 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
24e50 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75  toUnpacked(pC->u
24e60 63 2e 70 43 75 72 73 6f 72 2c 20 70 49 64 78 4b  c.pCursor, pIdxK
24e70 65 79 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b  ey, 0, 0, &res);
24e80 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 20 73  .  if( pFree ) s
24e90 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
24ea0 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 69 66 28  b, pFree);.  if(
24eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24ec0 7b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  {.    goto abort
24ed0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
24ee0 20 7d 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73   }.  pC->seekRes
24ef0 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20 61 6c 72  ult = res;.  alr
24f00 65 61 64 79 45 78 69 73 74 73 20 3d 20 28 72 65  eadyExists = (re
24f10 73 3d 3d 30 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c  s==0);.  pC->nul
24f20 6c 52 6f 77 20 3d 20 31 2d 61 6c 72 65 61 64 79  lRow = 1-already
24f30 45 78 69 73 74 73 3b 0a 20 20 70 43 2d 3e 64 65  Exists;.  pC->de
24f40 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
24f50 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
24f60 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
24f70 45 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  E;.  if( pOp->op
24f80 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20 29  code==OP_Found )
24f90 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  {.    VdbeBranch
24fa0 54 61 6b 65 6e 28 61 6c 72 65 61 64 79 45 78 69  Taken(alreadyExi
24fb0 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69  sts!=0,2);.    i
24fc0 66 28 20 61 6c 72 65 61 64 79 45 78 69 73 74 73  f( alreadyExists
24fd0 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
24fe0 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p2;.  }else{.   
24ff0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
25000 28 74 61 6b 65 4a 75 6d 70 7c 7c 61 6c 72 65 61  (takeJump||alrea
25010 64 79 45 78 69 73 74 73 3d 3d 30 2c 32 29 3b 0a  dyExists==0,2);.
25020 20 20 20 20 69 66 28 20 74 61 6b 65 4a 75 6d 70      if( takeJump
25030 20 7c 7c 20 21 61 6c 72 65 61 64 79 45 78 69 73   || !alreadyExis
25040 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  ts ) goto jump_t
25050 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61  o_p2;.  }.  brea
25060 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
25070 20 53 65 65 6b 52 6f 77 69 64 20 50 31 20 50 32   SeekRowid P1 P2
25080 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
25090 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33  sis: intkey=r[P3
250a0 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68  ].**.** P1 is th
250b0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 75 72  e index of a cur
250c0 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 53  sor open on an S
250d0 51 4c 20 74 61 62 6c 65 20 62 74 72 65 65 20 28  QL table btree (
250e0 77 69 74 68 20 69 6e 74 65 67 65 72 0a 2a 2a 20  with integer.** 
250f0 6b 65 79 73 29 2e 20 20 49 66 20 72 65 67 69 73  keys).  If regis
25100 74 65 72 20 50 33 20 64 6f 65 73 20 6e 6f 74 20  ter P3 does not 
25110 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67  contain an integ
25120 65 72 20 6f 72 20 69 66 20 50 31 20 64 6f 65 73  er or if P1 does
25130 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20   not.** contain 
25140 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 72 6f  a record with ro
25150 77 69 64 20 50 33 20 74 68 65 6e 20 6a 75 6d 70  wid P3 then jump
25160 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
25170 50 32 2e 20 20 0a 2a 2a 20 4f 72 2c 20 69 66 20  P2.  .** Or, if 
25180 50 32 20 69 73 20 30 2c 20 72 61 69 73 65 20 61  P2 is 0, raise a
25190 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
251a0 20 65 72 72 6f 72 2e 20 49 66 20 50 31 20 64 6f   error. If P1 do
251b0 65 73 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20  es contain.** a 
251c0 72 65 63 6f 72 64 20 77 69 74 68 20 72 6f 77 69  record with rowi
251d0 64 20 50 33 20 74 68 65 6e 20 0a 2a 2a 20 6c 65  d P3 then .** le
251e0 61 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 70  ave the cursor p
251f0 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 61 74 20  ointing at that 
25200 72 65 63 6f 72 64 20 61 6e 64 20 66 61 6c 6c 20  record and fall 
25210 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
25220 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69  ext.** instructi
25230 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50  on..**.** The OP
25240 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70 63 6f 64  _NotExists opcod
25250 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73  e performs the s
25260 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 62  ame operation, b
25270 75 74 20 77 69 74 68 20 4f 50 5f 4e 6f 74 45 78  ut with OP_NotEx
25280 69 73 74 73 0a 2a 2a 20 74 68 65 20 50 33 20 72  ists.** the P3 r
25290 65 67 69 73 74 65 72 20 6d 75 73 74 20 62 65 20  egister must be 
252a0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 63 6f  guaranteed to co
252b0 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ntain an integer
252c0 20 76 61 6c 75 65 2e 20 20 57 69 74 68 20 74 68   value.  With th
252d0 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 2c 20 72 65  is.** opcode, re
252e0 67 69 73 74 65 72 20 50 33 20 6d 69 67 68 74 20  gister P3 might 
252f0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69  not contain an i
25300 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  nteger..**.** Th
25310 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70  e OP_NotFound op
25320 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68  code performs th
25330 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e  e same operation
25340 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65 65 73   on index btrees
25350 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69 74 72  .** (with arbitr
25360 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75 65 20  ary multi-value 
25370 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  keys)..**.** Thi
25380 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
25390 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20  the cursor in a 
253a0 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63  state where it c
253b0 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e 63 65  annot be advance
253c0 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72 20 64  d.** in either d
253d0 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74  irection.  In ot
253e0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 4e  her words, the N
253f0 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f 70 63  ext and Prev opc
25400 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74  odes will.** not
25410 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20   work following 
25420 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  this opcode..**.
25430 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
25440 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f  nd, NotFound, No
25450 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b 52 6f  Conflict, SeekRo
25460 77 69 64 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  wid.*/./* Opcode
25470 3a 20 4e 6f 74 45 78 69 73 74 73 20 50 31 20 50  : NotExists P1 P
25480 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
25490 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50  psis: intkey=r[P
254a0 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74  3].**.** P1 is t
254b0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 75  he index of a cu
254c0 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61 6e 20  rsor open on an 
254d0 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65 65 20  SQL table btree 
254e0 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a 2a 2a  (with integer.**
254f0 20 6b 65 79 73 29 2e 20 20 50 33 20 69 73 20 61   keys).  P3 is a
25500 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 2e  n integer rowid.
25510 20 20 49 66 20 50 31 20 64 6f 65 73 20 6e 6f 74    If P1 does not
25520 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f 72   contain a recor
25530 64 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20  d with.** rowid 
25540 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d  P3 then jump imm
25550 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20  ediately to P2. 
25560 20 4f 72 2c 20 69 66 20 50 32 20 69 73 20 30 2c   Or, if P2 is 0,
25570 20 72 61 69 73 65 20 61 6e 0a 2a 2a 20 53 51 4c   raise an.** SQL
25580 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
25590 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20 63 6f  r. If P1 does co
255a0 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20 77  ntain a record w
255b0 69 74 68 20 72 6f 77 69 64 20 50 33 20 74 68 65  ith rowid P3 the
255c0 6e 20 0a 2a 2a 20 6c 65 61 76 65 20 74 68 65 20  n .** leave the 
255d0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
255e0 61 74 20 74 68 61 74 20 72 65 63 6f 72 64 20 61  at that record a
255f0 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  nd fall through 
25600 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69  to the next.** i
25610 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
25620 2a 20 54 68 65 20 4f 50 5f 53 65 65 6b 52 6f 77  * The OP_SeekRow
25630 69 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f 72  id opcode perfor
25640 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65 72  ms the same oper
25650 61 74 69 6f 6e 20 62 75 74 20 61 6c 73 6f 20 61  ation but also a
25660 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 50 33 20  llows the.** P3 
25670 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
25680 61 69 6e 20 61 20 6e 6f 6e 2d 69 6e 74 65 67 65  ain a non-intege
25690 72 20 76 61 6c 75 65 2c 20 69 6e 20 77 68 69 63  r value, in whic
256a0 68 20 63 61 73 65 20 74 68 65 20 6a 75 6d 70 20  h case the jump 
256b0 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74 61 6b  is.** always tak
256c0 65 6e 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  en.  This opcode
256d0 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 50   requires that P
256e0 33 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e  3 always contain
256f0 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a   an integer..**.
25700 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 46 6f 75  ** The OP_NotFou
25710 6e 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f 72  nd opcode perfor
25720 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65 72  ms the same oper
25730 61 74 69 6f 6e 20 6f 6e 20 69 6e 64 65 78 20 62  ation on index b
25740 74 72 65 65 73 0a 2a 2a 20 28 77 69 74 68 20 61  trees.** (with a
25750 72 62 69 74 72 61 72 79 20 6d 75 6c 74 69 2d 76  rbitrary multi-v
25760 61 6c 75 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a  alue keys)..**.*
25770 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65  * This opcode le
25780 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  aves the cursor 
25790 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65  in a state where
257a0 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 61 64   it cannot be ad
257b0 76 61 6e 63 65 64 0a 2a 2a 20 69 6e 20 65 69 74  vanced.** in eit
257c0 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20  her direction.  
257d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
257e0 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65  the Next and Pre
257f0 76 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c 0a 2a  v opcodes will.*
25800 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f  * not work follo
25810 77 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64 65  wing this opcode
25820 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
25830 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e  : Found, NotFoun
25840 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20 53  d, NoConflict, S
25850 65 65 6b 52 6f 77 69 64 0a 2a 2f 0a 63 61 73 65  eekRowid.*/.case
25860 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 3a 20 7b   OP_SeekRowid: {
25870 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
25880 20 69 6e 33 20 2a 2f 0a 20 20 56 64 62 65 43 75   in3 */.  VdbeCu
25890 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
258a0 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69  rsor *pCrsr;.  i
258b0 6e 74 20 72 65 73 3b 0a 20 20 75 36 34 20 69 4b  nt res;.  u64 iK
258c0 65 79 3b 0a 0a 20 20 70 49 6e 33 20 3d 20 26 61  ey;..  pIn3 = &a
258d0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
258e0 74 65 73 74 63 61 73 65 28 20 70 49 6e 33 2d 3e  testcase( pIn3->
258f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
25900 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
25910 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
25920 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 69 66  _IntReal );.  if
25930 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
25940 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e   (MEM_Int|MEM_In
25950 74 52 65 61 6c 29 29 3d 3d 30 20 29 7b 0a 20 20  tReal))==0 ){.  
25960 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 70    /* Make sure p
25970 49 6e 33 2d 3e 75 2e 69 20 63 6f 6e 74 61 69 6e  In3->u.i contain
25980 73 20 61 20 76 61 6c 69 64 20 69 6e 74 65 67 65  s a valid intege
25990 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
259a0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 6b   of.    ** the k
259b0 65 79 20 76 61 6c 75 65 2c 20 62 75 74 20 64 6f  ey value, but do
259c0 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
259d0 64 61 74 61 74 79 70 65 20 6f 66 20 74 68 65 20  datatype of the 
259e0 72 65 67 69 73 74 65 72 2c 20 61 73 0a 20 20 20  register, as.   
259f0 20 2a 2a 20 6f 74 68 65 72 20 70 61 72 74 73 20   ** other parts 
25a00 6f 66 20 74 68 65 20 70 65 72 70 61 72 65 64 20  of the perpared 
25a10 73 74 61 74 65 6d 65 6e 74 20 6d 69 67 68 74 20  statement might 
25a20 62 65 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  be depending on 
25a30 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
25a40 6e 74 20 64 61 74 61 74 79 70 65 2e 20 2a 2f 0a  nt datatype. */.
25a50 20 20 20 20 75 31 36 20 6f 72 69 67 46 6c 61 67      u16 origFlag
25a60 73 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b  s = pIn3->flags;
25a70 0a 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 49 6e  .    int isNotIn
25a80 74 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69  t;.    applyAffi
25a90 6e 69 74 79 28 70 49 6e 33 2c 20 53 51 4c 49 54  nity(pIn3, SQLIT
25aa0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 65  E_AFF_NUMERIC, e
25ab0 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 69 73  ncoding);.    is
25ac0 4e 6f 74 49 6e 74 20 3d 20 28 70 49 6e 33 2d 3e  NotInt = (pIn3->
25ad0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
25ae0 3d 3d 30 3b 0a 20 20 20 20 70 49 6e 33 2d 3e 66  ==0;.    pIn3->f
25af0 6c 61 67 73 20 3d 20 6f 72 69 67 46 6c 61 67 73  lags = origFlags
25b00 3b 0a 20 20 20 20 69 66 28 20 69 73 4e 6f 74 49  ;.    if( isNotI
25b10 6e 74 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  nt ) goto jump_t
25b20 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46  o_p2;.  }.  /* F
25b30 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
25b40 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 2a 2f   OP_NotExists */
25b50 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 45 78 69 73  .case OP_NotExis
25b60 74 73 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ts:          /* 
25b70 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 70  jump, in3 */.  p
25b80 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
25b90 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
25ba0 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn3->flags & M
25bb0 45 4d 5f 49 6e 74 29 21 3d 30 20 7c 7c 20 70 4f  EM_Int)!=0 || pO
25bc0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65  p->opcode==OP_Se
25bd0 65 6b 52 6f 77 69 64 20 29 3b 0a 20 20 61 73 73  ekRowid );.  ass
25be0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
25bf0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
25c00 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
25c10 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
25c20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
25c30 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  =0 );.#ifdef SQL
25c40 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
25c50 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
25c60 53 65 65 6b 52 6f 77 69 64 20 29 20 70 43 2d 3e  SeekRowid ) pC->
25c70 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 53 65 65 6b  seekOp = OP_Seek
25c80 52 6f 77 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Rowid;.#endif.  
25c90 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
25ca0 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
25cb0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
25cc0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
25cd0 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63    pCrsr = pC->uc
25ce0 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65  .pCursor;.  asse
25cf0 72 74 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a  rt( pCrsr!=0 );.
25d00 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 4b 65    res = 0;.  iKe
25d10 79 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20  y = pIn3->u.i;. 
25d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
25d30 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
25d40 28 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c  (pCrsr, 0, iKey,
25d50 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 61 73 73   0, &res);.  ass
25d60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
25d70 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 3b 0a  OK || res==0 );.
25d80 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67    pC->movetoTarg
25d90 65 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55  et = iKey;  /* U
25da0 73 65 64 20 62 79 20 4f 50 5f 44 65 6c 65 74 65  sed by OP_Delete
25db0 20 2a 2f 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f   */.  pC->nullRo
25dc0 77 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63  w = 0;.  pC->cac
25dd0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
25de0 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 64 65  _STALE;.  pC->de
25df0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
25e00 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
25e10 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20  ken(res!=0,2);. 
25e20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
25e30 3d 20 72 65 73 3b 0a 20 20 69 66 28 20 72 65 73  = res;.  if( res
25e40 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
25e50 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
25e60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   );.    if( pOp-
25e70 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >p2==0 ){.      
25e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
25e90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
25ea0 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
25eb0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20  jump_to_p2;.    
25ec0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  }.  }.  if( rc )
25ed0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
25ee0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
25ef0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
25f00 20 53 65 71 75 65 6e 63 65 20 50 31 20 50 32 20   Sequence P1 P2 
25f10 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
25f20 73 3a 20 72 5b 50 32 5d 3d 63 75 72 73 6f 72 5b  s: r[P2]=cursor[
25f30 50 31 5d 2e 63 74 72 2b 2b 0a 2a 2a 0a 2a 2a 20  P1].ctr++.**.** 
25f40 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 61 76  Find the next av
25f50 61 69 6c 61 62 6c 65 20 73 65 71 75 65 6e 63 65  ailable sequence
25f60 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 73   number for curs
25f70 6f 72 20 50 31 2e 0a 2a 2a 20 57 72 69 74 65 20  or P1..** Write 
25f80 74 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  the sequence num
25f90 62 65 72 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ber into registe
25fa0 72 20 50 32 2e 0a 2a 2a 20 54 68 65 20 73 65 71  r P2..** The seq
25fb0 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f 6e 20  uence number on 
25fc0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
25fd0 63 72 65 6d 65 6e 74 65 64 20 61 66 74 65 72 20  cremented after 
25fe0 74 68 69 73 0a 2a 2a 20 69 6e 73 74 72 75 63 74  this.** instruct
25ff0 69 6f 6e 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f  ion.  .*/.case O
26000 50 5f 53 65 71 75 65 6e 63 65 3a 20 7b 20 20 20  P_Sequence: {   
26010 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
26020 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
26030 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
26040 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
26050 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  .  assert( p->ap
26060 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d 30 20  Csr[pOp->p1]!=0 
26070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
26080 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e  apCsr[pOp->p1]->
26090 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50  eCurType!=CURTYP
260a0 45 5f 56 54 41 42 20 29 3b 0a 20 20 70 4f 75 74  E_VTAB );.  pOut
260b0 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
260c0 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
260d0 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73  t->u.i = p->apCs
260e0 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71 43  r[pOp->p1]->seqC
260f0 6f 75 6e 74 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b  ount++;.  break;
26100 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  .}.../* Opcode: 
26110 4e 65 77 52 6f 77 69 64 20 50 31 20 50 32 20 50  NewRowid P1 P2 P
26120 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
26130 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a  s: r[P2]=rowid.*
26140 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77 20 69  *.** Get a new i
26150 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75  nteger record nu
26160 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22 72 6f 77  mber (a.k.a "row
26170 69 64 22 29 20 75 73 65 64 20 61 73 20 74 68 65  id") used as the
26180 20 6b 65 79 20 74 6f 20 61 20 74 61 62 6c 65 2e   key to a table.
26190 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 6e  .** The record n
261a0 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 70 72 65  umber is not pre
261b0 76 69 6f 75 73 6c 79 20 75 73 65 64 20 61 73 20  viously used as 
261c0 61 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74  a key in the dat
261d0 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 74  abase.** table t
261e0 68 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f  hat cursor P1 po
261f0 69 6e 74 73 20 74 6f 2e 20 20 54 68 65 20 6e 65  ints to.  The ne
26200 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  w record number 
26210 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 77 72  is written.** wr
26220 69 74 74 65 6e 20 74 6f 20 72 65 67 69 73 74 65  itten to registe
26230 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  r P2..**.** If P
26240 33 3e 30 20 74 68 65 6e 20 50 33 20 69 73 20 61  3>0 then P3 is a
26250 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
26260 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 74   root frame of t
26270 68 69 73 20 56 44 42 45 20 74 68 61 74 20 68 6f  his VDBE that ho
26280 6c 64 73 20 0a 2a 2a 20 74 68 65 20 6c 61 72 67  lds .** the larg
26290 65 73 74 20 70 72 65 76 69 6f 75 73 6c 79 20 67  est previously g
262a0 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64 20  enerated record 
262b0 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e 65 77 20 72  number. No new r
262c0 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20 61 72  ecord numbers ar
262d0 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e.** allowed to 
262e0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 69  be less than thi
262f0 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 20 74 68  s value. When th
26300 69 73 20 76 61 6c 75 65 20 72 65 61 63 68 65 73  is value reaches
26310 20 69 74 73 20 6d 61 78 69 6d 75 6d 2c 20 0a 2a   its maximum, .*
26320 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  * an SQLITE_FULL
26330 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61   error is genera
26340 74 65 64 2e 20 54 68 65 20 50 33 20 72 65 67 69  ted. The P3 regi
26350 73 74 65 72 20 69 73 20 75 70 64 61 74 65 64 20  ster is updated 
26360 77 69 74 68 20 74 68 65 20 27 0a 2a 2a 20 67 65  with the '.** ge
26370 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64 20 6e  nerated record n
26380 75 6d 62 65 72 2e 20 54 68 69 73 20 50 33 20 6d  umber. This P3 m
26390 65 63 68 61 6e 69 73 6d 20 69 73 20 75 73 65 64  echanism is used
263a0 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d 65   to help impleme
263b0 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54 4f 49 4e  nt the.** AUTOIN
263c0 43 52 45 4d 45 4e 54 20 66 65 61 74 75 72 65 2e  CREMENT feature.
263d0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 77 52  .*/.case OP_NewR
263e0 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
263f0 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69    /* out2 */.  i
26400 36 34 20 76 3b 20 20 20 20 20 20 20 20 20 20 20  64 v;           
26410 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
26420 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62 65   rowid */.  Vdbe
26430 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 20  Cursor *pC;     
26440 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
26450 74 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65  table to get the
26460 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20   new rowid */.  
26470 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
26480 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
26490 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 42 74   of an sqlite3Bt
264a0 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20 69  reeLast() */.  i
264b0 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
264c0 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
264d0 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
264e0 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 65 73  mber of searches
264f0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   */.  Mem *pMem;
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26510 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
26520 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66   largest rowid f
26530 6f 72 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  or AUTOINCREMENT
26540 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20   */.  VdbeFrame 
26550 2a 70 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a 20  *pFrame;     /* 
26560 52 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 56 44  Root frame of VD
26570 42 45 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b 0a  BE */..  v = 0;.
26580 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 70 4f 75    res = 0;.  pOu
26590 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
265a0 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73  se(p, pOp);.  as
265b0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
265c0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
265d0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
265e0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
265f0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
26600 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
26610 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
26620 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
26630 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
26640 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
26650 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
26660 72 21 3d 30 20 29 3b 0a 20 20 7b 0a 20 20 20 20  r!=0 );.  {.    
26670 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69  /* The next rowi
26680 64 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62  d or record numb
26690 65 72 20 28 64 69 66 66 65 72 65 6e 74 20 74 65  er (different te
266a0 72 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  rms for the same
266b0 0a 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69  .    ** thing) i
266c0 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20  s obtained in a 
266d0 74 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74  two-step algorit
266e0 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  hm..    **.    *
266f0 2a 20 46 69 72 73 74 20 77 65 20 61 74 74 65 6d  * First we attem
26700 70 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  pt to find the l
26710 61 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20  argest existing 
26720 72 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e  rowid and add on
26730 65 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74  e.    ** to that
26740 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6c 61  .  But if the la
26750 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72  rgest existing r
26760 6f 77 69 64 20 69 73 20 61 6c 72 65 61 64 79 20  owid is already 
26770 74 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20  the maximum.    
26780 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  ** positive inte
26790 67 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ger, we have to 
267a0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
267b0 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
267c0 2a 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20  * probabilistic 
267d0 61 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a  algorithm.    **
267e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
267f0 6e 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  nd algorithm is 
26800 74 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69  to select a rowi
26810 64 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20  d at random and 
26820 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74  see if.    ** it
26830 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
26840 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
26850 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
26860 69 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20  ist, we have.   
26870 20 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20   ** succeeded.  
26880 49 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f  If the random ro
26890 77 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20  wid does exist, 
268a0 77 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20  we select a new 
268b0 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  one.    ** and t
268c0 72 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20  ry again, up to 
268d0 31 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a  100 times..    *
268e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  /.    assert( pC
268f0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69  ->isTable );..#i
26900 66 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49  fdef SQLITE_32BI
26910 54 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69  T_ROWID.#   defi
26920 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37  ne MAX_ROWID 0x7
26930 66 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20  fffffff.#else.  
26940 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c    /* Some compil
26950 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f  ers complain abo
26960 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20  ut constants of 
26970 74 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66  the form 0x7ffff
26980 66 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20  fffffffffff..   
26990 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c   ** Others compl
269a0 61 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66  ain about 0x7fff
269b0 66 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e  fffffffffffffLL.
269c0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
269d0 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20  macro seems.    
269e0 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ** to provide th
269f0 65 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65  e constant while
26a00 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70   making all comp
26a10 69 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20  ilers happy..   
26a20 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
26a30 41 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28  AX_ROWID  (i64)(
26a40 20 28 28 28 75 36 34 29 30 78 37 66 66 66 66 66   (((u64)0x7fffff
26a50 66 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29  ff)<<32) | (u64)
26a60 30 78 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e  0xffffffff ).#en
26a70 64 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43  dif..    if( !pC
26a80 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
26a90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
26aa0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
26ab0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
26ac0 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
26ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26ae0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  {.        goto a
26af0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
26b00 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
26b10 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
26b20 20 20 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20      v = 1;   /* 
26b30 49 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30  IMP: R-61914-480
26b40 37 34 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  74 */.      }els
26b50 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
26b60 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
26b70 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d  ursorIsValid(pC-
26b80 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a  >uc.pCursor) );.
26b90 20 20 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69          v = sqli
26ba0 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
26bb0 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ey(pC->uc.pCurso
26bc0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
26bd0 76 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a  v>=MAX_ROWID ){.
26be0 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73            pC->us
26bf0 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31  eRandomRowid = 1
26c00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26c10 0a 20 20 20 20 20 20 20 20 20 20 76 2b 2b 3b 20  .          v++; 
26c20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 39 35 33    /* IMP: R-2953
26c30 38 2d 33 34 39 38 37 20 2a 2f 0a 20 20 20 20 20  8-34987 */.     
26c40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26c50 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
26c60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
26c70 45 4d 45 4e 54 0a 20 20 20 20 69 66 28 20 70 4f  EMENT.    if( pO
26c80 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 2f  p->p3 ){.      /
26c90 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33  * Assert that P3
26ca0 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f   is a valid memo
26cb0 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  ry cell. */.    
26cc0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
26cd0 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  3>0 );.      if(
26ce0 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
26cf0 20 20 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65        for(pFrame
26d00 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
26d10 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
26d20 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
26d30 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ent);.        /*
26d40 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20   Assert that P3 
26d50 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72  is a valid memor
26d60 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  y cell. */.     
26d70 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
26d80 70 33 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  p3<=pFrame->nMem
26d90 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   );.        pMem
26da0 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d   = &pFrame->aMem
26db0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20  [pOp->p3];.     
26dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26dd0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50  /* Assert that P
26de0 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d  3 is a valid mem
26df0 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  ory cell. */.   
26e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
26e10 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
26e20 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
26e30 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  ;.        pMem =
26e40 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
26e50 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75  .        memAbou
26e60 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d 65  tToChange(p, pMe
26e70 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
26e80 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
26e90 61 6c 69 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20  alid(pMem) );.. 
26ea0 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
26eb0 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65  ACE(pOp->p3, pMe
26ec0 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
26ed0 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
26ee0 66 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  fy(pMem);.      
26ef0 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
26f00 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
26f10 3d 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33  =0 );  /* mem(P3
26f20 29 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67  ) holds an integ
26f30 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  er */.      if( 
26f40 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52  pMem->u.i==MAX_R
26f50 4f 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52  OWID || pC->useR
26f60 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20  andomRowid ){.  
26f70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26f80 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50  E_FULL;   /* IMP
26f90 3a 20 52 2d 31 37 38 31 37 2d 30 30 36 33 30 20  : R-17817-00630 
26fa0 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
26fb0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
26fc0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
26fd0 20 20 69 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e    if( v<pMem->u.
26fe0 69 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20 76  i+1 ){.        v
26ff0 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31   = pMem->u.i + 1
27000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27010 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20  pMem->u.i = v;. 
27020 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
27030 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f  if( pC->useRando
27040 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  mRowid ){.      
27050 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  /* IMPLEMENTATIO
27060 4e 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31  N-OF: R-07677-41
27070 38 38 31 20 49 66 20 74 68 65 20 6c 61 72 67 65  881 If the large
27080 73 74 20 52 4f 57 49 44 20 69 73 20 65 71 75 61  st ROWID is equa
27090 6c 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  l to the.      *
270a0 2a 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * largest possib
270b0 6c 65 20 69 6e 74 65 67 65 72 20 28 39 32 32 33  le integer (9223
270c0 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29  372036854775807)
270d0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
270e0 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69  se.      ** engi
270f0 6e 65 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e  ne starts pickin
27100 67 20 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69  g positive candi
27110 64 61 74 65 20 52 4f 57 49 44 73 20 61 74 20 72  date ROWIDs at r
27120 61 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20  andom until.    
27130 20 20 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e    ** it finds on
27140 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72  e that is not pr
27150 65 76 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a  eviously used. *
27160 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
27170 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f  pOp->p3==0 );  /
27180 2a 20 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69  * We cannot be i
27190 6e 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d  n random rowid m
271a0 6f 64 65 20 69 66 20 74 68 69 73 20 69 73 0a 20  ode if this is. 
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
271d0 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  n AUTOINCREMENT 
271e0 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
271f0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  cnt = 0;.      d
27200 6f 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o{.        sqlit
27210 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
27220 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20  zeof(v), &v);.  
27230 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f        v &= (MAX_
27240 52 4f 57 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b 20  ROWID>>1); v++; 
27250 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20   /* Ensure that 
27260 76 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  v is greater tha
27270 6e 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n zero */.      
27280 7d 77 68 69 6c 65 28 20 20 28 28 72 63 20 3d 20  }while(  ((rc = 
27290 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
272a0 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75  toUnpacked(pC->u
272b0 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  c.pCursor, 0, (u
272c0 36 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20  64)v,.          
272d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272f0 20 20 20 20 20 20 20 30 2c 20 26 72 65 73 29 29         0, &res))
27300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  ==SQLITE_OK).   
27310 20 20 20 20 20 20 20 20 20 26 26 20 28 72 65 73           && (res
27320 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
27330 20 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29   && (++cnt<100))
27340 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
27350 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
27360 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
27370 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
27380 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27390 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50  E_FULL;   /* IMP
273a0 3a 20 52 2d 33 38 32 31 39 2d 35 33 30 30 32 20  : R-38219-53002 
273b0 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
273c0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
273d0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
273e0 20 20 61 73 73 65 72 74 28 20 76 3e 30 20 29 3b    assert( v>0 );
273f0 20 20 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31 32    /* EV: R-40812
27400 2d 30 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a  -03570 */.    }.
27410 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64      pC->deferred
27420 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
27430 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
27440 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
27450 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d   }.  pOut->u.i =
27460 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   v;.  break;.}..
27470 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72  /* Opcode: Inser
27480 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
27490 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e  .** Synopsis: in
274a0 74 6b 65 79 3d 72 5b 50 33 5d 20 64 61 74 61 3d  tkey=r[P3] data=
274b0 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 57 72 69 74  r[P2].**.** Writ
274c0 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
274d0 74 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72  the table of cur
274e0 73 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65  sor P1.  A new e
274f0 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74  ntry is.** creat
27500 65 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  ed if it doesn't
27510 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f   already exist o
27520 72 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 61  r the data for a
27530 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e  n existing.** en
27540 74 72 79 20 69 73 20 6f 76 65 72 77 72 69 74 74  try is overwritt
27550 65 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69 73  en.  The data is
27560 20 74 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42   the value MEM_B
27570 6c 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lob stored in re
27580 67 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72  gister.** number
27590 20 50 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20   P2. The key is 
275a0 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
275b0 65 72 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d  er P3. The key m
275c0 75 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f  ust.** be a MEM_
275d0 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  Int..**.** If th
275e0 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  e OPFLAG_NCHANGE
275f0 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73   flag of P5 is s
27600 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  et, then the row
27610 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73   change count is
27620 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  .** incremented 
27630 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e  (otherwise not).
27640 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f    If the OPFLAG_
27650 4c 41 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f  LASTROWID flag o
27660 66 20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20  f P5 is set,.** 
27670 74 68 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74  then rowid is st
27680 6f 72 65 64 20 66 6f 72 20 73 75 62 73 65 71 75  ored for subsequ
27690 65 6e 74 20 72 65 74 75 72 6e 20 62 79 20 74 68  ent return by th
276a0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73  e.** sqlite3_las
276b0 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
276c0 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72   function (other
276d0 77 69 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64  wise it is unmod
276e0 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ified)..**.** If
276f0 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
27700 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f  EEKRESULT flag o
27710 66 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65  f P5 is set, the
27720 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
27730 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73  might.** run fas
27740 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20  ter by avoiding 
27750 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  an unnecessary s
27760 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50 31  eek on cursor P1
27770 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74  .  However,.** t
27780 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  he OPFLAG_USESEE
27790 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d 75 73  KRESULT flag mus
277a0 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66  t only be set if
277b0 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
277c0 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65   no prior.** see
277d0 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ks on the cursor
277e0 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73 74 20   or if the most 
277f0 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73 65 64  recent seek used
27800 20 61 20 6b 65 79 20 65 71 75 61 6c 20 74 6f 20   a key equal to 
27810 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P3..**.** If the
27820 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45   OPFLAG_ISUPDATE
27830 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
27840 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  en this opcode i
27850 73 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20  s part of an.** 
27860 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
27870 2e 20 20 4f 74 68 65 72 77 69 73 65 20 28 69 66  .  Otherwise (if
27880 20 74 68 65 20 66 6c 61 67 20 69 73 20 63 6c 65   the flag is cle
27890 61 72 29 20 74 68 65 6e 20 74 68 69 73 20 6f 70  ar) then this op
278a0 63 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72 74 20  code.** is part 
278b0 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65  of an INSERT ope
278c0 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 69 66  ration.  The dif
278d0 66 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20  ference is only 
278e0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20  important to.** 
278f0 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e  the update hook.
27900 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
27910 20 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   P4 may point to
27920 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
27930 72 65 2c 20 6f 72 20 6d 61 79 20 62 65 20 4e 55  re, or may be NU
27940 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 0a 2a 2a  LL. If it is .**
27950 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
27960 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
27970 28 73 71 6c 69 74 65 33 2e 78 55 70 64 61 74 65  (sqlite3.xUpdate
27980 43 61 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e 76  Callback) is inv
27990 6f 6b 65 64 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  oked .** followi
279a0 6e 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ng a successful 
279b0 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57  insert..**.** (W
279c0 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20  ARNING/TODO: If 
279d0 50 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63  P1 is a pseudo-c
279e0 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20  ursor and P2 is 
279f0 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
27a00 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f  llocated, then o
27a10 77 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20 69  wnership of P2 i
27a20 73 20 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f  s transferred to
27a30 20 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73   the pseudo-curs
27a40 6f 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74  or.** and regist
27a50 65 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70  er P2 becomes ep
27a60 68 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65  hemeral.  If the
27a70 20 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67   cursor is chang
27a80 65 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ed, the.** value
27a90 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20   of register P2 
27aa0 77 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65  will then change
27ab0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .  Make sure thi
27ac0 73 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61  s does not.** ca
27ad0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
27ae0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  .).**.** This in
27af0 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77  struction only w
27b00 6f 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20  orks on tables. 
27b10 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   The equivalent 
27b20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66  instruction.** f
27b30 6f 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50  or indices is OP
27b40 5f 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 63  _IdxInsert..*/.c
27b50 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a 20 7b  ase OP_Insert: {
27b60 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 3b 20 20  .  Mem *pData;  
27b70 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c       /* MEM cell
27b80 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 66 6f   holding data fo
27b90 72 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  r the record to 
27ba0 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  be inserted */. 
27bb0 20 4d 65 6d 20 2a 70 4b 65 79 3b 20 20 20 20 20   Mem *pKey;     
27bc0 20 20 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20 68     /* MEM cell h
27bd0 6f 6c 64 69 6e 67 20 6b 65 79 20 20 66 6f 72 20  olding key  for 
27be0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
27bf0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20  VdbeCursor *pC; 
27c00 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 74    /* Cursor to t
27c10 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
27c20 69 6e 73 65 72 74 20 69 73 20 77 72 69 74 74 65  insert is writte
27c30 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52  n */.  int seekR
27c40 65 73 75 6c 74 3b 20 20 20 2f 2a 20 52 65 73 75  esult;   /* Resu
27c50 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 65 65 6b  lt of prior seek
27c60 20 6f 72 20 30 20 69 66 20 6e 6f 20 55 53 45 53   or 0 if no USES
27c70 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 2a  EEKRESULT flag *
27c80 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
27c90 7a 44 62 3b 20 20 2f 2a 20 64 61 74 61 62 61 73  zDb;  /* databas
27ca0 65 20 6e 61 6d 65 20 2d 20 75 73 65 64 20 62 79  e name - used by
27cb0 20 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b   the update hook
27cc0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
27cd0 62 3b 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  b;      /* Table
27ce0 20 73 74 72 75 63 74 75 72 65 20 2d 20 75 73 65   structure - use
27cf0 64 20 62 79 20 75 70 64 61 74 65 20 61 6e 64 20  d by update and 
27d00 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 73  pre-update hooks
27d10 20 2a 2f 0a 20 20 42 74 72 65 65 50 61 79 6c 6f   */.  BtreePaylo
27d20 61 64 20 78 3b 20 20 20 2f 2a 20 50 61 79 6c 6f  ad x;   /* Paylo
27d30 61 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  ad to be inserte
27d40 64 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20 3d 20  d */..  pData = 
27d50 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
27d60 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
27d70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
27d80 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
27d90 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
27da0 69 64 28 70 44 61 74 61 29 20 29 3b 0a 20 20 70  id(pData) );.  p
27db0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
27dc0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
27dd0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
27de0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
27df0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
27e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
27e10 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
27e20 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4f 70  ;.  assert( (pOp
27e30 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53  ->p5 & OPFLAG_IS
27e40 4e 4f 4f 50 29 20 7c 7c 20 70 43 2d 3e 69 73 54  NOOP) || pC->isT
27e50 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
27e60 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
27e70 34 5f 54 41 42 4c 45 20 7c 7c 20 70 4f 70 2d 3e  4_TABLE || pOp->
27e80 70 34 74 79 70 65 3e 3d 50 34 5f 53 54 41 54 49  p4type>=P4_STATI
27e90 43 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  C );.  REGISTER_
27ea0 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70  TRACE(pOp->p2, p
27eb0 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
27ec0 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75  VdbeIncrWriteCou
27ed0 6e 74 65 72 28 70 2c 20 70 43 29 3b 0a 0a 20 20  nter(p, pC);..  
27ee0 70 4b 65 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pKey = &aMem[pOp
27ef0 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
27f00 20 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26 20 4d   pKey->flags & M
27f10 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65  EM_Int );.  asse
27f20 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
27f30 4b 65 79 29 20 29 3b 0a 20 20 52 45 47 49 53 54  Key) );.  REGIST
27f40 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
27f50 2c 20 70 4b 65 79 29 3b 0a 20 20 78 2e 6e 4b 65  , pKey);.  x.nKe
27f60 79 20 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a 0a  y = pKey->u.i;..
27f70 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
27f80 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26 26 20 48  e==P4_TABLE && H
27f90 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 28 64  AS_UPDATE_HOOK(d
27fa0 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b) ){.    assert
27fb0 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a  ( pC->iDb>=0 );.
27fc0 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44      zDb = db->aD
27fd0 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e  b[pC->iDb].zDbSN
27fe0 61 6d 65 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  ame;.    pTab = 
27ff0 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20 20  pOp->p4.pTab;.  
28000 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 2d 3e    assert( (pOp->
28010 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f  p5 & OPFLAG_ISNO
28020 4f 50 29 20 7c 7c 20 48 61 73 52 6f 77 69 64 28  OP) || HasRowid(
28030 70 54 61 62 29 20 29 3b 0a 20 20 7d 65 6c 73 65  pTab) );.  }else
28040 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a  {.    pTab = 0;.
28050 20 20 20 20 7a 44 62 20 3d 20 30 3b 20 20 2f 2a      zDb = 0;  /*
28060 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 69   Not needed.  Si
28070 6c 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65 72  lence a compiler
28080 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 7d   warning. */.  }
28090 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
280a0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
280b0 5f 48 4f 4f 4b 0a 20 20 2f 2a 20 49 6e 76 6f 6b  _HOOK.  /* Invok
280c0 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  e the pre-update
280d0 20 68 6f 6f 6b 2c 20 69 66 20 61 6e 79 20 2a 2f   hook, if any */
280e0 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
280f0 20 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65 55     if( db->xPreU
28100 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26  pdateCallback &&
28110 20 21 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46   !(pOp->p5 & OPF
28120 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 29 7b  LAG_ISUPDATE) ){
28130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28140 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28  bePreUpdateHook(
28150 70 2c 20 70 43 2c 20 53 51 4c 49 54 45 5f 49 4e  p, pC, SQLITE_IN
28160 53 45 52 54 2c 20 7a 44 62 2c 20 70 54 61 62 2c  SERT, zDb, pTab,
28170 20 78 2e 6e 4b 65 79 2c 70 4f 70 2d 3e 70 32 29   x.nKey,pOp->p2)
28180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28190 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
281a0 61 63 6b 3d 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  ack==0 || pTab->
281b0 61 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aCol==0 ){.     
281c0 20 2f 2a 20 50 72 65 76 65 6e 74 20 70 6f 73 74   /* Prevent post
281d0 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 66 72 6f  -update hook fro
281e0 6d 20 72 75 6e 6e 69 6e 67 20 69 6e 20 63 61 73  m running in cas
281f0 65 73 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c  es when it shoul
28200 64 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 70  d not */.      p
28210 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Tab = 0;.    }. 
28220 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35   }.  if( pOp->p5
28230 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50   & OPFLAG_ISNOOP
28240 20 29 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66   ) break;.#endif
28250 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  ..  if( pOp->p5 
28260 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  & OPFLAG_NCHANGE
28270 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b   ) p->nChange++;
28280 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26  .  if( pOp->p5 &
28290 20 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49   OPFLAG_LASTROWI
282a0 44 20 29 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  D ) db->lastRowi
282b0 64 20 3d 20 78 2e 6e 4b 65 79 3b 0a 20 20 61 73  d = x.nKey;.  as
282c0 73 65 72 74 28 20 70 44 61 74 61 2d 3e 66 6c 61  sert( pData->fla
282d0 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d  gs & (MEM_Blob|M
282e0 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 78 2e 70  EM_Str) );.  x.p
282f0 44 61 74 61 20 3d 20 70 44 61 74 61 2d 3e 7a 3b  Data = pData->z;
28300 0a 20 20 78 2e 6e 44 61 74 61 20 3d 20 70 44 61  .  x.nData = pDa
28310 74 61 2d 3e 6e 3b 0a 20 20 73 65 65 6b 52 65 73  ta->n;.  seekRes
28320 75 6c 74 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20  ult = ((pOp->p5 
28330 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  & OPFLAG_USESEEK
28340 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73 65  RESULT) ? pC->se
28350 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 3b 0a 20  ekResult : 0);. 
28360 20 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61 67   if( pData->flag
28370 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
28380 20 20 20 20 78 2e 6e 5a 65 72 6f 20 3d 20 70 44      x.nZero = pD
28390 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  ata->u.nZero;.  
283a0 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 6e 5a 65  }else{.    x.nZe
283b0 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 78 2e  ro = 0;.  }.  x.
283c0 70 4b 65 79 20 3d 20 30 3b 0a 20 20 72 63 20 3d  pKey = 0;.  rc =
283d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
283e0 65 72 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ert(pC->uc.pCurs
283f0 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20 20 28 70  or, &x,.      (p
28400 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47  Op->p5 & (OPFLAG
28410 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41 47 5f 53  _APPEND|OPFLAG_S
28420 41 56 45 50 4f 53 49 54 49 4f 4e 29 29 2c 20 73  AVEPOSITION)), s
28430 65 65 6b 52 65 73 75 6c 74 0a 20 20 29 3b 0a 20  eekResult.  );. 
28440 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
28450 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63  eto = 0;.  pC->c
28460 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
28470 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20  HE_STALE;..  /* 
28480 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61 74  Invoke the updat
28490 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69 72  e-hook if requir
284a0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ed. */.  if( rc 
284b0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
284c0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  _to_error;.  if(
284d0 20 70 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73   pTab ){.    ass
284e0 65 72 74 28 20 64 62 2d 3e 78 55 70 64 61 74 65  ert( db->xUpdate
284f0 43 61 6c 6c 62 61 63 6b 21 3d 30 20 29 3b 0a 20  Callback!=0 );. 
28500 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
28510 3e 61 43 6f 6c 21 3d 30 20 29 3b 0a 20 20 20 20  >aCol!=0 );.    
28520 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
28530 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41  ack(db->pUpdateA
28540 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  rg,.           (
28550 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
28560 5f 49 53 55 50 44 41 54 45 29 20 3f 20 53 51 4c  _ISUPDATE) ? SQL
28570 49 54 45 5f 55 50 44 41 54 45 20 3a 20 53 51 4c  ITE_UPDATE : SQL
28580 49 54 45 5f 49 4e 53 45 52 54 2c 0a 20 20 20 20  ITE_INSERT,.    
28590 20 20 20 20 20 20 20 7a 44 62 2c 20 70 54 61 62         zDb, pTab
285a0 2d 3e 7a 4e 61 6d 65 2c 20 78 2e 6e 4b 65 79 29  ->zName, x.nKey)
285b0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
285c0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 6c  ../* Opcode: Del
285d0 65 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20  ete P1 P2 P3 P4 
285e0 50 35 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  P5.**.** Delete 
285f0 74 68 65 20 72 65 63 6f 72 64 20 61 74 20 77 68  the record at wh
28600 69 63 68 20 74 68 65 20 50 31 20 63 75 72 73 6f  ich the P1 curso
28610 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  r is currently p
28620 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  ointing..**.** I
28630 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 41 56  f the OPFLAG_SAV
28640 45 50 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f 66  EPOSITION bit of
28650 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
28660 72 20 69 73 20 73 65 74 2c 20 74 68 65 6e 0a 2a  r is set, then.*
28670 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c  * the cursor wil
28680 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
28690 6e 67 20 61 74 20 20 65 69 74 68 65 72 20 74 68  ng at  either th
286a0 65 20 6e 65 78 74 20 6f 72 20 74 68 65 20 70 72  e next or the pr
286b0 65 76 69 6f 75 73 0a 2a 2a 20 72 65 63 6f 72 64  evious.** record
286c0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49   in the table. I
286d0 66 20 69 74 20 69 73 20 6c 65 66 74 20 70 6f 69  f it is left poi
286e0 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78  nting at the nex
286f0 74 20 72 65 63 6f 72 64 2c 20 74 68 65 6e 0a 2a  t record, then.*
28700 2a 20 74 68 65 20 6e 65 78 74 20 4e 65 78 74 20  * the next Next 
28710 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
28720 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 41 73 20   be a no-op. As 
28730 61 20 72 65 73 75 6c 74 2c 20 69 6e 20 74 68 69  a result, in thi
28740 73 20 63 61 73 65 0a 2a 2a 20 69 74 20 69 73 20  s case.** it is 
28750 6f 6b 20 74 6f 20 64 65 6c 65 74 65 20 61 20 72  ok to delete a r
28760 65 63 6f 72 64 20 66 72 6f 6d 20 77 69 74 68 69  ecord from withi
28770 6e 20 61 20 4e 65 78 74 20 6c 6f 6f 70 2e 20 49  n a Next loop. I
28780 66 20 0a 2a 2a 20 4f 50 46 4c 41 47 5f 53 41 56  f .** OPFLAG_SAV
28790 45 50 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f 66  EPOSITION bit of
287a0 20 50 35 20 69 73 20 63 6c 65 61 72 2c 20 74 68   P5 is clear, th
287b0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77 69  en the cursor wi
287c0 6c 6c 20 62 65 0a 2a 2a 20 6c 65 66 74 20 69 6e  ll be.** left in
287d0 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 73 74   an undefined st
287e0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
287f0 65 20 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45  e OPFLAG_AUXDELE
28800 54 45 20 62 69 74 20 69 73 20 73 65 74 20 6f 6e  TE bit is set on
28810 20 50 35 2c 20 74 68 61 74 20 69 6e 64 69 63 61   P5, that indica
28820 74 65 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a  tes that this.**
28830 20 64 65 6c 65 74 65 20 6f 6e 65 20 6f 66 20 73   delete one of s
28840 65 76 65 72 61 6c 20 61 73 73 6f 63 69 61 74 65  everal associate
28850 64 20 77 69 74 68 20 64 65 6c 65 74 69 6e 67 20  d with deleting 
28860 61 20 74 61 62 6c 65 20 72 6f 77 20 61 6e 64 20  a table row and 
28870 61 6c 6c 20 69 74 73 0a 2a 2a 20 61 73 73 6f 63  all its.** assoc
28880 69 61 74 65 64 20 69 6e 64 65 78 20 65 6e 74 72  iated index entr
28890 69 65 73 2e 20 20 45 78 61 63 74 6c 79 20 6f 6e  ies.  Exactly on
288a0 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
288b0 65 73 20 69 73 20 74 68 65 20 22 70 72 69 6d 61  es is the "prima
288c0 72 79 22 0a 2a 2a 20 64 65 6c 65 74 65 2e 20 20  ry".** delete.  
288d0 54 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 61  The others are a
288e0 6c 6c 20 6f 6e 20 4f 50 46 4c 41 47 5f 46 4f 52  ll on OPFLAG_FOR
288f0 44 45 4c 45 54 45 20 63 75 72 73 6f 72 73 20 6f  DELETE cursors o
28900 72 20 65 6c 73 65 20 61 72 65 0a 2a 2a 20 6d 61  r else are.** ma
28910 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 41 55  rked with the AU
28920 58 44 45 4c 45 54 45 20 66 6c 61 67 2e 0a 2a 2a  XDELETE flag..**
28930 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
28940 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20 6f  G_NCHANGE flag o
28950 66 20 50 32 20 28 4e 42 3a 20 50 32 20 6e 6f 74  f P2 (NB: P2 not
28960 20 50 35 29 20 69 73 20 73 65 74 2c 20 74 68 65   P5) is set, the
28970 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 63 68 61  n the row.** cha
28980 6e 67 65 20 63 6f 75 6e 74 20 69 73 20 69 6e 63  nge count is inc
28990 72 65 6d 65 6e 74 65 64 20 28 6f 74 68 65 72 77  remented (otherw
289a0 69 73 65 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20  ise not)..**.** 
289b0 50 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 70  P1 must not be p
289c0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49 74  seudo-table.  It
289d0 20 68 61 73 20 74 6f 20 62 65 20 61 20 72 65 61   has to be a rea
289e0 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20  l table with.** 
289f0 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e 0a 2a  multiple rows..*
28a00 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f  *.** If P4 is no
28a10 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 70  t NULL then it p
28a20 6f 69 6e 74 73 20 74 6f 20 61 20 54 61 62 6c 65  oints to a Table
28a30 20 6f 62 6a 65 63 74 2e 20 49 6e 20 74 68 69 73   object. In this
28a40 20 63 61 73 65 20 65 69 74 68 65 72 20 0a 2a 2a   case either .**
28a50 20 74 68 65 20 75 70 64 61 74 65 20 6f 72 20 70   the update or p
28a60 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20  re-update hook, 
28a70 6f 72 20 62 6f 74 68 2c 20 6d 61 79 20 62 65 20  or both, may be 
28a80 69 6e 76 6f 6b 65 64 2e 20 54 68 65 20 50 31 20  invoked. The P1 
28a90 63 75 72 73 6f 72 20 6d 75 73 74 0a 2a 2a 20 68  cursor must.** h
28aa0 61 76 65 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  ave been positio
28ab0 6e 65 64 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74  ned using OP_Not
28ac0 46 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 69  Found prior to i
28ad0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 63  nvoking this opc
28ae0 6f 64 65 20 69 6e 20 0a 2a 2a 20 74 68 69 73 20  ode in .** this 
28af0 63 61 73 65 2e 20 53 70 65 63 69 66 69 63 61 6c  case. Specifical
28b00 6c 79 2c 20 69 66 20 6f 6e 65 20 69 73 20 63 6f  ly, if one is co
28b10 6e 66 69 67 75 72 65 64 2c 20 74 68 65 20 70 72  nfigured, the pr
28b20 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73  e-update hook is
28b30 20 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 69 66 20   .** invoked if 
28b40 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20  P4 is not NULL. 
28b50 54 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  The update-hook 
28b60 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 6f 6e  is invoked if on
28b70 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 2c  e is configured,
28b80 20 0a 2a 2a 20 50 34 20 69 73 20 6e 6f 74 20 4e   .** P4 is not N
28b90 55 4c 4c 2c 20 61 6e 64 20 74 68 65 20 4f 50 46  ULL, and the OPF
28ba0 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67  LAG_NCHANGE flag
28bb0 20 69 73 20 73 65 74 20 69 6e 20 50 32 2e 0a 2a   is set in P2..*
28bc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
28bd0 41 47 5f 49 53 55 50 44 41 54 45 20 66 6c 61 67  AG_ISUPDATE flag
28be0 20 69 73 20 73 65 74 20 69 6e 20 50 32 2c 20 74   is set in P2, t
28bf0 68 65 6e 20 50 33 20 63 6f 6e 74 61 69 6e 73 20  hen P3 contains 
28c00 74 68 65 20 61 64 64 72 65 73 73 0a 2a 2a 20 6f  the address.** o
28c10 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
28c20 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  l that contains 
28c30 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 74  the value that t
28c40 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
28c50 72 6f 77 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  row will.** be s
28c60 65 74 20 74 6f 20 62 79 20 74 68 65 20 75 70 64  et to by the upd
28c70 61 74 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ate..*/.case OP_
28c80 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62 65  Delete: {.  Vdbe
28c90 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 63 6f  Cursor *pC;.  co
28ca0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
28cb0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
28cc0 69 6e 74 20 6f 70 66 6c 61 67 73 3b 0a 0a 20 20  int opflags;..  
28cd0 6f 70 66 6c 61 67 73 20 3d 20 70 4f 70 2d 3e 70  opflags = pOp->p
28ce0 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  2;.  assert( pOp
28cf0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
28d00 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
28d10 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
28d20 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
28d30 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
28d40 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
28d50 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
28d60 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
28d70 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
28d80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28d90 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
28da0 74 6f 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  to==0 );.  sqlit
28db0 65 33 56 64 62 65 49 6e 63 72 57 72 69 74 65 43  e3VdbeIncrWriteC
28dc0 6f 75 6e 74 65 72 28 70 2c 20 70 43 29 3b 0a 0a  ounter(p, pC);..
28dd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28de0 42 55 47 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  BUG.  if( pOp->p
28df0 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20  4type==P4_TABLE 
28e00 26 26 20 48 61 73 52 6f 77 69 64 28 70 4f 70 2d  && HasRowid(pOp-
28e10 3e 70 34 2e 70 54 61 62 29 20 26 26 20 70 4f 70  >p4.pTab) && pOp
28e20 2d 3e 70 35 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ->p5==0 ){.    /
28e30 2a 20 49 66 20 70 35 20 69 73 20 7a 65 72 6f 2c  * If p5 is zero,
28e40 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72 61 74   the seek operat
28e50 69 6f 6e 20 74 68 61 74 20 70 6f 73 69 74 69 6f  ion that positio
28e60 6e 65 64 20 74 68 65 20 63 75 72 73 6f 72 20 70  ned the cursor p
28e70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 4f  rior to.    ** O
28e80 50 5f 44 65 6c 65 74 65 20 77 69 6c 6c 20 68 61  P_Delete will ha
28e90 76 65 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20  ve also set the 
28ea0 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
28eb0 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 72 6f   field to the ro
28ec0 77 69 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  wid of.    ** th
28ed0 65 20 72 6f 77 20 74 68 61 74 20 69 73 20 62 65  e row that is be
28ee0 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
28ef0 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20 73 71     i64 iKey = sq
28f00 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
28f10 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72  rKey(pC->uc.pCur
28f20 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  sor);.    assert
28f30 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
28f40 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
28f50 3d 3d 69 4b 65 79 20 29 3b 0a 20 20 7d 0a 23 65  ==iKey );.  }.#e
28f60 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
28f70 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 6f 72  e update-hook or
28f80 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b   pre-update-hook
28f90 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64   will be invoked
28fa0 2c 20 73 65 74 20 7a 44 62 20 74 6f 0a 20 20 2a  , set zDb to.  *
28fb0 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
28fc0 65 20 64 62 20 74 6f 20 70 61 73 73 20 61 73 20  e db to pass as 
28fd0 74 6f 20 69 74 2e 20 41 6c 73 6f 20 73 65 74 20  to it. Also set 
28fe0 6c 6f 63 61 6c 20 70 54 61 62 20 74 6f 20 61 20  local pTab to a 
28ff0 63 6f 70 79 0a 20 20 2a 2a 20 6f 66 20 70 34 2e  copy.  ** of p4.
29000 70 54 61 62 2e 20 46 69 6e 61 6c 6c 79 2c 20 69  pTab. Finally, i
29010 66 20 70 35 20 69 73 20 74 72 75 65 2c 20 69 6e  f p5 is true, in
29020 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
29030 69 73 20 63 75 72 73 6f 72 20 77 61 73 0a 20 20  is cursor was.  
29040 2a 2a 20 6c 61 73 74 20 6d 6f 76 65 64 20 77 69  ** last moved wi
29050 74 68 20 4f 50 5f 4e 65 78 74 20 6f 72 20 4f 50  th OP_Next or OP
29060 5f 50 72 65 76 2c 20 6e 6f 74 20 53 65 65 6b 20  _Prev, not Seek 
29070 6f 72 20 4e 6f 74 46 6f 75 6e 64 2c 20 73 65 74  or NotFound, set
29080 20 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f   .  ** VdbeCurso
29090 72 2e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 74  r.movetoTarget t
290a0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  o the current ro
290b0 77 69 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  wid.  */.  if( p
290c0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54  Op->p4type==P4_T
290d0 41 42 4c 45 20 26 26 20 48 41 53 5f 55 50 44 41  ABLE && HAS_UPDA
290e0 54 45 5f 48 4f 4f 4b 28 64 62 29 20 29 7b 0a 20  TE_HOOK(db) ){. 
290f0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
29100 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  Db>=0 );.    ass
29110 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70 54 61  ert( pOp->p4.pTa
29120 62 21 3d 30 20 29 3b 0a 20 20 20 20 7a 44 62 20  b!=0 );.    zDb 
29130 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44  = db->aDb[pC->iD
29140 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
29150 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e   pTab = pOp->p4.
29160 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 28 70  pTab;.    if( (p
29170 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
29180 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 21 3d 30  SAVEPOSITION)!=0
29190 20 26 26 20 70 43 2d 3e 69 73 54 61 62 6c 65 20   && pC->isTable 
291a0 29 7b 0a 20 20 20 20 20 20 70 43 2d 3e 6d 6f 76  ){.      pC->mov
291b0 65 74 6f 54 61 72 67 65 74 20 3d 20 73 71 6c 69  etoTarget = sqli
291c0 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
291d0 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ey(pC->uc.pCurso
291e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  r);.    }.  }els
291f0 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 30 3b 20  e{.    zDb = 0; 
29200 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e    /* Not needed.
29210 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d 70    Silence a comp
29220 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f  iler warning. */
29230 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 20 20  .    pTab = 0;  
29240 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
29250 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c  Silence a compil
29260 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20  er warning. */. 
29270 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
29280 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
29290 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20 49 6e 76  TE_HOOK.  /* Inv
292a0 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61  oke the pre-upda
292b0 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69  te-hook if requi
292c0 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62  red. */.  if( db
292d0 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
292e0 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e  back && pOp->p4.
292f0 70 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  pTab ){.    asse
29300 72 74 28 20 21 28 6f 70 66 6c 61 67 73 20 26 20  rt( !(opflags & 
29310 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29  OPFLAG_ISUPDATE)
29320 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 48 61   .         || Ha
29330 73 52 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20  sRowid(pTab)==0 
29340 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 61 4d  .         || (aM
29350 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 66 6c 61 67  em[pOp->p3].flag
29360 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 0a 20 20  s & MEM_Int) .  
29370 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
29380 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f  VdbePreUpdateHoo
29390 6b 28 70 2c 20 70 43 2c 0a 20 20 20 20 20 20 20  k(p, pC,.       
293a0 20 28 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c   (opflags & OPFL
293b0 41 47 5f 49 53 55 50 44 41 54 45 29 20 3f 20 53  AG_ISUPDATE) ? S
293c0 51 4c 49 54 45 5f 55 50 44 41 54 45 20 3a 20 53  QLITE_UPDATE : S
293d0 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 0a 20  QLITE_DELETE, . 
293e0 20 20 20 20 20 20 20 7a 44 62 2c 20 70 54 61 62         zDb, pTab
293f0 2c 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  , pC->movetoTarg
29400 65 74 2c 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  et,.        pOp-
29410 3e 70 33 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  >p3.    );.  }. 
29420 20 69 66 28 20 6f 70 66 6c 61 67 73 20 26 20 4f   if( opflags & O
29430 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 20 29 20 62  PFLAG_ISNOOP ) b
29440 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 0a 20  reak;.#endif. . 
29450 20 2f 2a 20 4f 6e 6c 79 20 66 6c 61 67 73 20 74   /* Only flags t
29460 68 61 74 20 63 61 6e 20 62 65 20 73 65 74 20 61  hat can be set a
29470 72 65 20 53 41 56 45 50 4f 49 53 54 49 4f 4e 20  re SAVEPOISTION 
29480 61 6e 64 20 41 55 58 44 45 4c 45 54 45 20 2a 2f  and AUXDELETE */
29490 20 0a 20 20 61 73 73 65 72 74 28 20 28 70 4f 70   .  assert( (pOp
294a0 2d 3e 70 35 20 26 20 7e 28 4f 50 46 4c 41 47 5f  ->p5 & ~(OPFLAG_
294b0 53 41 56 45 50 4f 53 49 54 49 4f 4e 7c 4f 50 46  SAVEPOSITION|OPF
294c0 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 29 29 3d  LAG_AUXDELETE))=
294d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
294e0 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
294f0 49 4f 4e 3d 3d 42 54 52 45 45 5f 53 41 56 45 50  ION==BTREE_SAVEP
29500 4f 53 49 54 49 4f 4e 20 29 3b 0a 20 20 61 73 73  OSITION );.  ass
29510 65 72 74 28 20 4f 50 46 4c 41 47 5f 41 55 58 44  ert( OPFLAG_AUXD
29520 45 4c 45 54 45 3d 3d 42 54 52 45 45 5f 41 55 58  ELETE==BTREE_AUX
29530 44 45 4c 45 54 45 20 29 3b 0a 0a 23 69 66 64 65  DELETE );..#ifde
29540 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
29550 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 3d 3d   if( p->pFrame==
29560 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 2d  0 ){.    if( pC-
29570 3e 69 73 45 70 68 65 6d 65 72 61 6c 3d 3d 30 0a  >isEphemeral==0.
29580 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 2d          && (pOp-
29590 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 41 55 58  >p5 & OPFLAG_AUX
295a0 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20 20 20  DELETE)==0.     
295b0 20 20 20 26 26 20 28 70 43 2d 3e 77 72 46 6c 61     && (pC->wrFla
295c0 67 20 26 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45  g & OPFLAG_FORDE
295d0 4c 45 54 45 29 3d 3d 30 0a 20 20 20 20 20 20 29  LETE)==0.      )
295e0 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 44 65  {.      nExtraDe
295f0 6c 65 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  lete++;.    }.  
29600 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 20    if( pOp->p2 & 
29610 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29  OPFLAG_NCHANGE )
29620 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 44 65  {.      nExtraDe
29630 6c 65 74 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  lete--;.    }.  
29640 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 63 20 3d  }.#endif..  rc =
29650 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
29660 65 74 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ete(pC->uc.pCurs
29670 6f 72 2c 20 70 4f 70 2d 3e 70 35 29 3b 0a 20 20  or, pOp->p5);.  
29680 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
29690 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
296a0 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
296b0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 20 29 20  = 0;.  if( rc ) 
296c0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
296d0 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49  o_error;..  /* I
296e0 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65  nvoke the update
296f0 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65  -hook if require
29700 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 70 66 6c  d. */.  if( opfl
29710 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48  ags & OPFLAG_NCH
29720 41 4e 47 45 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  ANGE ){.    p->n
29730 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20 69 66  Change++;.    if
29740 28 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c  ( db->xUpdateCal
29750 6c 62 61 63 6b 20 26 26 20 48 61 73 52 6f 77 69  lback && HasRowi
29760 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
29770 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
29780 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65  back(db->pUpdate
29790 41 72 67 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  Arg, SQLITE_DELE
297a0 54 45 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a  TE, zDb, pTab->z
297b0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
297c0 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
297d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
297e0 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20   pC->iDb>=0 );. 
297f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 72 65 61     }.  }..  brea
29800 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  k;.}./* Opcode: 
29810 52 65 73 65 74 43 6f 75 6e 74 20 2a 20 2a 20 2a  ResetCount * * *
29820 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76   * *.**.** The v
29830 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e  alue of the chan
29840 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 63 6f  ge counter is co
29850 70 69 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  pied to the data
29860 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 63  base handle.** c
29870 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 28 72  hange counter (r
29880 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
29890 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
298a0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
298b0 29 2e 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 56  )..** Then the V
298c0 4d 73 20 69 6e 74 65 72 6e 61 6c 20 63 68 61 6e  Ms internal chan
298d0 67 65 20 63 6f 75 6e 74 65 72 20 72 65 73 65 74  ge counter reset
298e0 73 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 69 73 20  s to 0..** This 
298f0 69 73 20 75 73 65 64 20 62 79 20 74 72 69 67 67  is used by trigg
29900 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 2a 2f 0a  er programs..*/.
29910 63 61 73 65 20 4f 50 5f 52 65 73 65 74 43 6f 75  case OP_ResetCou
29920 6e 74 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 56  nt: {.  sqlite3V
29930 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
29940 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
29950 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
29960 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
29970 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 43 6f  Opcode: SorterCo
29980 6d 70 61 72 65 20 50 31 20 50 32 20 50 33 20 50  mpare P1 P2 P3 P
29990 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  4.** Synopsis: i
299a0 66 20 6b 65 79 28 50 31 29 21 3d 74 72 69 6d 28  f key(P1)!=trim(
299b0 72 5b 50 33 5d 2c 50 34 29 20 67 6f 74 6f 20 50  r[P3],P4) goto P
299c0 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  2.**.** P1 is a 
299d0 73 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 20 54  sorter cursor. T
299e0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
299f0 63 6f 6d 70 61 72 65 73 20 61 20 70 72 65 66 69  compares a prefi
29a00 78 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f  x of the.** reco
29a10 72 64 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73  rd blob in regis
29a20 74 65 72 20 50 33 20 61 67 61 69 6e 73 74 20 61  ter P3 against a
29a30 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 65   prefix of the e
29a40 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 74 68  ntry that .** th
29a50 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20  e sorter cursor 
29a60 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
29a70 20 74 6f 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66   to.  Only the f
29a80 69 72 73 74 20 50 34 20 66 69 65 6c 64 73 0a 2a  irst P4 fields.*
29a90 2a 20 6f 66 20 72 5b 50 33 5d 20 61 6e 64 20 74  * of r[P3] and t
29aa0 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  he sorter record
29ab0 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 0a 2a   are compared..*
29ac0 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50  *.** If either P
29ad0 33 20 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20  3 or the sorter 
29ae0 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20  contains a NULL 
29af0 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 69 72 20  in one of their 
29b00 73 69 67 6e 69 66 69 63 61 6e 74 0a 2a 2a 20 66  significant.** f
29b10 69 65 6c 64 73 20 28 6e 6f 74 20 63 6f 75 6e 74  ields (not count
29b20 69 6e 67 20 74 68 65 20 50 34 20 66 69 65 6c 64  ing the P4 field
29b30 73 20 61 74 20 74 68 65 20 65 6e 64 20 77 68 69  s at the end whi
29b40 63 68 20 61 72 65 20 69 67 6e 6f 72 65 64 29 20  ch are ignored) 
29b50 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  then.** the comp
29b60 61 72 69 73 6f 6e 20 69 73 20 61 73 73 75 6d 65  arison is assume
29b70 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 0a 2a  d to be equal..*
29b80 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67  *.** Fall throug
29b90 68 20 74 6f 20 6e 65 78 74 20 69 6e 73 74 72 75  h to next instru
29ba0 63 74 69 6f 6e 20 69 66 20 74 68 65 20 74 77 6f  ction if the two
29bb0 20 72 65 63 6f 72 64 73 20 63 6f 6d 70 61 72 65   records compare
29bc0 20 65 71 75 61 6c 20 74 6f 0a 2a 2a 20 65 61 63   equal to.** eac
29bd0 68 20 6f 74 68 65 72 2e 20 20 4a 75 6d 70 20 74  h other.  Jump t
29be0 6f 20 50 32 20 69 66 20 74 68 65 79 20 61 72 65  o P2 if they are
29bf0 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a 2f 0a 63   different..*/.c
29c00 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d  ase OP_SorterCom
29c10 70 61 72 65 3a 20 7b 0a 20 20 56 64 62 65 43 75  pare: {.  VdbeCu
29c20 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20  rsor *pC;.  int 
29c30 72 65 73 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 43  res;.  int nKeyC
29c40 6f 6c 3b 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61  ol;..  pC = p->a
29c50 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
29c60 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65   assert( isSorte
29c70 72 28 70 43 29 20 29 3b 0a 20 20 61 73 73 65 72  r(pC) );.  asser
29c80 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
29c90 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 49  P4_INT32 );.  pI
29ca0 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
29cb0 70 33 5d 3b 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d  p3];.  nKeyCol =
29cc0 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65   pOp->p4.i;.  re
29cd0 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  s = 0;.  rc = sq
29ce0 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43  lite3VdbeSorterC
29cf0 6f 6d 70 61 72 65 28 70 43 2c 20 70 49 6e 33 2c  ompare(pC, pIn3,
29d00 20 6e 4b 65 79 43 6f 6c 2c 20 26 72 65 73 29 3b   nKeyCol, &res);
29d10 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
29d20 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20  en(res!=0,2);.  
29d30 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
29d40 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
29d50 3b 0a 20 20 69 66 28 20 72 65 73 20 29 20 67 6f  ;.  if( res ) go
29d60 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
29d70 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f 2a 20 4f   break;.};../* O
29d80 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 44 61 74  pcode: SorterDat
29d90 61 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  a P1 P2 P3 * *.*
29da0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
29db0 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69  ]=data.**.** Wri
29dc0 74 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  te into register
29dd0 20 50 32 20 74 68 65 20 63 75 72 72 65 6e 74 20   P2 the current 
29de0 73 6f 72 74 65 72 20 64 61 74 61 20 66 6f 72 20  sorter data for 
29df0 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20 50 31  sorter cursor P1
29e00 2e 0a 2a 2a 20 54 68 65 6e 20 63 6c 65 61 72 20  ..** Then clear 
29e10 74 68 65 20 63 6f 6c 75 6d 6e 20 68 65 61 64 65  the column heade
29e20 72 20 63 61 63 68 65 20 6f 6e 20 63 75 72 73 6f  r cache on curso
29e30 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r P3..**.** This
29e40 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61   opcode is norma
29e50 6c 6c 79 20 75 73 65 20 74 6f 20 6d 6f 76 65 20  lly use to move 
29e60 61 20 72 65 63 6f 72 64 20 6f 75 74 20 6f 66 20  a record out of 
29e70 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 69  the sorter and i
29e80 6e 74 6f 0a 2a 2a 20 61 20 72 65 67 69 73 74 65  nto.** a registe
29e90 72 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6f  r that is the so
29ea0 75 72 63 65 20 66 6f 72 20 61 20 70 73 65 75 64  urce for a pseud
29eb0 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 20 63  o-table cursor c
29ec0 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  reated using.** 
29ed0 4f 70 65 6e 50 73 65 75 64 6f 2e 20 20 54 68 61  OpenPseudo.  Tha
29ee0 74 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63  t pseudo-table c
29ef0 75 72 73 6f 72 20 69 73 20 74 68 65 20 6f 6e 65  ursor is the one
29f00 20 74 68 61 74 20 69 73 20 69 64 65 6e 74 69 66   that is identif
29f10 69 65 64 20 62 79 0a 2a 2a 20 70 61 72 61 6d 65  ied by.** parame
29f20 74 65 72 20 50 33 2e 20 20 43 6c 65 61 72 69 6e  ter P3.  Clearin
29f30 67 20 74 68 65 20 50 33 20 63 6f 6c 75 6d 6e 20  g the P3 column 
29f40 63 61 63 68 65 20 61 73 20 70 61 72 74 20 6f 66  cache as part of
29f50 20 74 68 69 73 20 6f 70 63 6f 64 65 20 73 61 76   this opcode sav
29f60 65 73 0a 2a 2a 20 75 73 20 66 72 6f 6d 20 68 61  es.** us from ha
29f70 76 69 6e 67 20 74 6f 20 69 73 73 75 65 20 61 20  ving to issue a 
29f80 73 65 70 61 72 61 74 65 20 4e 75 6c 6c 52 6f 77  separate NullRow
29f90 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
29fa0 63 6c 65 61 72 20 74 68 61 74 20 63 61 63 68 65  clear that cache
29fb0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
29fc0 74 65 72 44 61 74 61 3a 20 7b 0a 20 20 56 64 62  terData: {.  Vdb
29fd0 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20  eCursor *pC;..  
29fe0 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
29ff0 2d 3e 70 32 5d 3b 0a 20 20 70 43 20 3d 20 70 2d  ->p2];.  pC = p-
2a000 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
2a010 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72  .  assert( isSor
2a020 74 65 72 28 70 43 29 20 29 3b 0a 20 20 72 63 20  ter(pC) );.  rc 
2a030 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
2a040 74 65 72 52 6f 77 6b 65 79 28 70 43 2c 20 70 4f  terRowkey(pC, pO
2a050 75 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ut);.  assert( r
2a060 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2a070 28 70 4f 75 74 2d 3e 66 6c 61 67 73 20 26 20 4d  (pOut->flags & M
2a080 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73  EM_Blob) );.  as
2a090 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2a0a0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2a0b0 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28 20  Cursor );.  if( 
2a0c0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2a0d0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2a0e0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 33  p->apCsr[pOp->p3
2a0f0 5d 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  ]->cacheStatus =
2a100 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
2a110 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2a120 6f 64 65 3a 20 52 6f 77 44 61 74 61 20 50 31 20  ode: RowData P1 
2a130 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
2a140 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 64 61 74  opsis: r[P2]=dat
2a150 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e  a.**.** Write in
2a160 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74  to register P2 t
2a170 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20  he complete row 
2a180 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20  content for the 
2a190 72 6f 77 20 61 74 20 0a 2a 2a 20 77 68 69 63 68  row at .** which
2a1a0 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 63 75   cursor P1 is cu
2a1b0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2a1c0 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f  ..** There is no
2a1d0 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20   interpretation 
2a1e0 6f 66 20 74 68 65 20 64 61 74 61 2e 20 20 0a 2a  of the data.  .*
2a1f0 2a 20 49 74 20 69 73 20 6a 75 73 74 20 63 6f 70  * It is just cop
2a200 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 50 32 20  ied onto the P2 
2a210 72 65 67 69 73 74 65 72 20 65 78 61 63 74 6c 79  register exactly
2a220 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 20 66 6f   as .** it is fo
2a230 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
2a240 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2a250 49 66 20 63 75 72 73 6f 72 20 50 31 20 69 73 20  If cursor P1 is 
2a260 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 74  an index, then t
2a270 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 74 68  he content is th
2a280 65 20 6b 65 79 20 6f 66 20 74 68 65 20 72 6f 77  e key of the row
2a290 2e 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  ..** If cursor P
2a2a0 32 20 69 73 20 61 20 74 61 62 6c 65 2c 20 74 68  2 is a table, th
2a2b0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 65  en the content e
2a2c0 78 74 72 61 63 74 65 64 20 69 73 20 74 68 65 20  xtracted is the 
2a2d0 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  data..**.** If t
2a2e0 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
2a2f0 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
2a300 20 61 20 76 61 6c 69 64 20 72 6f 77 20 28 6e 6f   a valid row (no
2a310 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a  t a NULL row).**
2a320 20 6f 66 20 61 20 72 65 61 6c 20 74 61 62 6c 65   of a real table
2a330 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74  , not a pseudo-t
2a340 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  able..**.** If P
2a350 33 21 3d 30 20 74 68 65 6e 20 74 68 69 73 20 6f  3!=0 then this o
2a360 70 63 6f 64 65 20 69 73 20 61 6c 6c 6f 77 65 64  pcode is allowed
2a370 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 70 68 65   to make an ephe
2a380 6d 65 72 61 6c 20 70 6f 69 6e 74 65 72 0a 2a 2a  meral pointer.**
2a390 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
2a3a0 73 65 20 70 61 67 65 2e 20 20 54 68 61 74 20 6d  se page.  That m
2a3b0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
2a3c0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6f 75 74  ntent of the out
2a3d0 70 75 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  put.** register 
2a3e0 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
2a3f0 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
2a400 68 65 20 63 75 72 73 6f 72 20 6d 6f 76 65 73 20  he cursor moves 
2a410 2d 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 6d  - including.** m
2a420 6f 76 65 73 20 63 61 75 73 65 64 20 62 79 20 6f  oves caused by o
2a430 74 68 65 72 20 63 75 72 73 6f 72 73 20 74 68 61  ther cursors tha
2a440 74 20 22 73 61 76 65 22 20 74 68 65 20 63 75 72  t "save" the cur
2a450 72 65 6e 74 20 63 75 72 73 6f 72 73 0a 2a 2a 20  rent cursors.** 
2a460 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6f 72 64 65  position in orde
2a470 72 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  r that they can 
2a480 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 61 6d  write to the sam
2a490 65 20 74 61 62 6c 65 2e 20 20 49 66 20 50 33 3d  e table.  If P3=
2a4a0 3d 30 0a 2a 2a 20 74 68 65 6e 20 61 20 63 6f 70  =0.** then a cop
2a4b0 79 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  y of the data is
2a4c0 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
2a4d0 79 2e 20 20 50 33 21 3d 30 20 69 73 20 66 61 73  y.  P3!=0 is fas
2a4e0 74 65 72 2c 20 62 75 74 0a 2a 2a 20 50 33 3d 3d  ter, but.** P3==
2a4f0 30 20 69 73 20 73 61 66 65 72 2e 0a 2a 2a 0a 2a  0 is safer..**.*
2a500 2a 20 49 66 20 50 33 21 3d 30 20 74 68 65 6e 20  * If P3!=0 then 
2a510 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2a520 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20 69  he P2 register i
2a530 73 20 75 6e 73 75 69 74 61 62 6c 65 20 66 6f 72  s unsuitable for
2a540 20 75 73 65 0a 2a 2a 20 69 6e 20 4f 50 5f 52 65   use.** in OP_Re
2a550 73 75 6c 74 20 61 6e 64 20 61 6e 79 20 4f 50 5f  sult and any OP_
2a560 52 65 73 75 6c 74 20 77 69 6c 6c 20 69 6e 76 61  Result will inva
2a570 6c 69 64 61 74 65 20 74 68 65 20 50 32 20 72 65  lidate the P2 re
2a580 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 2e 0a  gister content..
2a590 2a 2a 20 54 68 65 20 50 32 20 72 65 67 69 73 74  ** The P2 regist
2a5a0 65 72 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e  er content is in
2a5b0 76 61 6c 69 64 61 74 65 64 20 62 79 20 6f 70 63  validated by opc
2a5c0 6f 64 65 73 20 6c 69 6b 65 20 4f 50 5f 46 75 6e  odes like OP_Fun
2a5d0 63 74 69 6f 6e 20 6f 72 0a 2a 2a 20 62 79 20 61  ction or.** by a
2a5e0 6e 79 20 75 73 65 20 6f 66 20 61 6e 6f 74 68 65  ny use of anothe
2a5f0 72 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  r cursor pointin
2a600 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  g to the same ta
2a610 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ble..*/.case OP_
2a620 52 6f 77 44 61 74 61 3a 20 7b 0a 20 20 56 64 62  RowData: {.  Vdb
2a630 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
2a640 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
2a650 20 20 75 33 32 20 6e 3b 0a 0a 20 20 70 4f 75 74    u32 n;..  pOut
2a660 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
2a670 65 28 70 2c 20 70 4f 70 29 3b 0a 0a 20 20 61 73  e(p, pOp);..  as
2a680 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2a690 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2a6a0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2a6b0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2a6c0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2a6d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2a6e0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
2a6f0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
2a700 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74    assert( isSort
2a710 65 72 28 70 43 29 3d 3d 30 20 29 3b 0a 20 20 61  er(pC)==0 );.  a
2a720 73 73 65 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52  ssert( pC->nullR
2a730 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
2a740 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
2a750 72 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20  r!=0 );.  pCrsr 
2a760 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
2a770 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f 52  ;..  /* The OP_R
2a780 6f 77 44 61 74 61 20 6f 70 63 6f 64 65 73 20 61  owData opcodes a
2a790 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 20 4f 50 5f  lways follow OP_
2a7a0 4e 6f 74 45 78 69 73 74 73 20 6f 72 0a 20 20 2a  NotExists or.  *
2a7b0 2a 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20 6f  * OP_SeekRowid o
2a7c0 72 20 4f 50 5f 52 65 77 69 6e 64 2f 4f 70 5f 4e  r OP_Rewind/Op_N
2a7d0 65 78 74 20 77 69 74 68 20 6e 6f 20 69 6e 74 65  ext with no inte
2a7e0 72 76 65 6e 69 6e 67 20 69 6e 73 74 72 75 63 74  rvening instruct
2a7f0 69 6f 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ions.  ** that m
2a800 69 67 68 74 20 69 6e 76 61 6c 69 64 61 74 65 20  ight invalidate 
2a810 74 68 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2a  the cursor..  **
2a820 20 49 66 20 74 68 69 73 20 77 68 65 72 65 20 6e   If this where n
2a830 6f 74 20 74 68 65 20 63 61 73 65 2c 20 6f 6e 20  ot the case, on 
2a840 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2a850 20 61 73 73 65 72 74 28 29 73 0a 20 20 2a 2a 20   assert()s.  ** 
2a860 77 6f 75 6c 64 20 66 61 69 6c 2e 20 20 53 68 6f  would fail.  Sho
2a870 75 6c 64 20 74 68 69 73 20 65 76 65 72 20 63 68  uld this ever ch
2a880 61 6e 67 65 20 28 62 65 63 61 75 73 65 20 6f 66  ange (because of
2a890 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   changes in the 
2a8a0 63 6f 64 65 0a 20 20 2a 2a 20 67 65 6e 65 72 61  code.  ** genera
2a8b0 74 6f 72 29 20 74 68 65 6e 20 74 68 65 20 66 69  tor) then the fi
2a8c0 78 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 69 6e  x would be to in
2a8d0 73 65 72 74 20 61 20 63 61 6c 6c 20 74 6f 0a 20  sert a call to. 
2a8e0 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43   ** sqlite3VdbeC
2a8f0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 2e 0a 20  ursorMoveto().. 
2a900 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
2a910 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
2a920 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2a930 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
2a940 73 6f 72 49 73 56 61 6c 69 64 28 70 43 72 73 72  sorIsValid(pCrsr
2a950 29 20 29 3b 0a 23 69 66 20 30 20 20 2f 2a 20 4e  ) );.#if 0  /* N
2a960 6f 74 20 72 65 71 75 69 72 65 64 20 64 75 65 20  ot required due 
2a970 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2a980 74 6f 20 61 73 73 65 72 74 28 29 20 73 74 61 74  to assert() stat
2a990 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 72 63 20 3d  ements */.  rc =
2a9a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
2a9b0 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20  orMoveto(pC);.  
2a9c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a9d0 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  K ) goto abort_d
2a9e0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e  ue_to_error;.#en
2a9f0 64 69 66 0a 0a 20 20 6e 20 3d 20 73 71 6c 69 74  dif..  n = sqlit
2aa00 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
2aa10 7a 65 28 70 43 72 73 72 29 3b 0a 20 20 69 66 28  ze(pCrsr);.  if(
2aa20 20 6e 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d   n>(u32)db->aLim
2aa30 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
2aa40 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
2aa50 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
2aa60 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
2aa70 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
2aa80 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
2aa90 72 65 65 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c  ree(pCrsr, 0, n,
2aaa0 20 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 72 63   pOut);.  if( rc
2aab0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2aac0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
2aad0 28 20 21 70 4f 70 2d 3e 70 33 20 29 20 44 65 65  ( !pOp->p3 ) Dee
2aae0 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74  phemeralize(pOut
2aaf0 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
2ab00 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
2ab10 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
2ab20 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b  (pOp->p2, pOut);
2ab30 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2ab40 4f 70 63 6f 64 65 3a 20 52 6f 77 69 64 20 50 31  Opcode: Rowid P1
2ab50 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
2ab60 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77  opsis: r[P2]=row
2ab70 69 64 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69  id.**.** Store i
2ab80 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  n register P2 an
2ab90 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
2aba0 73 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  s the key of the
2abb0 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74 68 61   table entry tha
2abc0 74 0a 2a 2a 20 50 31 20 69 73 20 63 75 72 72 65  t.** P1 is curre
2abd0 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a  ntly point to..*
2abe0 2a 0a 2a 2a 20 50 31 20 63 61 6e 20 62 65 20 65  *.** P1 can be e
2abf0 69 74 68 65 72 20 61 6e 20 6f 72 64 69 6e 61 72  ither an ordinar
2ac00 79 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72  y table or a vir
2ac10 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
2ac20 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65  re used to.** be
2ac30 20 61 20 73 65 70 61 72 61 74 65 20 4f 50 5f 56   a separate OP_V
2ac40 52 6f 77 69 64 20 6f 70 63 6f 64 65 20 66 6f 72  Rowid opcode for
2ac50 20 75 73 65 20 77 69 74 68 20 76 69 72 74 75 61   use with virtua
2ac60 6c 20 74 61 62 6c 65 73 2c 20 62 75 74 20 74 68  l tables, but th
2ac70 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63 6f 64 65  is.** one opcode
2ac80 20 6e 6f 77 20 77 6f 72 6b 73 20 66 6f 72 20 62   now works for b
2ac90 6f 74 68 20 74 61 62 6c 65 20 74 79 70 65 73 2e  oth table types.
2aca0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 69  .*/.case OP_Rowi
2acb0 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  d: {            
2acc0 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
2acd0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2ace0 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 73 71 6c  ;.  i64 v;.  sql
2acf0 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
2ad00 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  ;.  const sqlite
2ad10 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
2ad20 65 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  e;..  pOut = out
2ad30 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
2ad40 4f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Op);.  assert( p
2ad50 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
2ad60 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
2ad70 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
2ad80 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
2ad90 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
2ada0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
2adb0 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f  urType!=CURTYPE_
2adc0 50 53 45 55 44 4f 20 7c 7c 20 70 43 2d 3e 6e 75  PSEUDO || pC->nu
2add0 6c 6c 52 6f 77 20 29 3b 0a 20 20 69 66 28 20 70  llRow );.  if( p
2ade0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  C->nullRow ){.  
2adf0 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
2ae00 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 62 72  MEM_Null;.    br
2ae10 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eak;.  }else if(
2ae20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
2ae30 65 74 6f 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  eto ){.    v = p
2ae40 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b  C->movetoTarget;
2ae50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ae60 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ae70 45 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  E.  }else if( pC
2ae80 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
2ae90 59 50 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  YPE_VTAB ){.    
2aea0 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
2aeb0 56 43 75 72 21 3d 30 20 29 3b 0a 20 20 20 20 70  VCur!=0 );.    p
2aec0 56 74 61 62 20 3d 20 70 43 2d 3e 75 63 2e 70 56  Vtab = pC->uc.pV
2aed0 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  Cur->pVtab;.    
2aee0 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
2aef0 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73  >pModule;.    as
2af00 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78  sert( pModule->x
2af10 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 72 63 20  Rowid );.    rc 
2af20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69  = pModule->xRowi
2af30 64 28 70 43 2d 3e 75 63 2e 70 56 43 75 72 2c 20  d(pC->uc.pVCur, 
2af40 26 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  &v);.    sqlite3
2af50 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
2af60 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20  (p, pVtab);.    
2af70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2af80 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2af90 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
2afa0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2afb0 41 42 4c 45 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  ABLE */.  }else{
2afc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
2afd0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
2afe0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  PE_BTREE );.    
2aff0 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
2b000 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
2b010 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
2b020 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70  eCursorRestore(p
2b030 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  C);.    if( rc )
2b040 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2b050 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66  to_error;.    if
2b060 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  ( pC->nullRow ){
2b070 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  .      pOut->fla
2b080 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
2b090 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b0a0 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  }.    v = sqlite
2b0b0 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79  3BtreeIntegerKey
2b0c0 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  (pC->uc.pCursor)
2b0d0 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e  ;.  }.  pOut->u.
2b0e0 69 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a  i = v;.  break;.
2b0f0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75  }../* Opcode: Nu
2b100 6c 6c 52 6f 77 20 50 31 20 2a 20 2a 20 2a 20 2a  llRow P1 * * * *
2b110 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  .**.** Move the 
2b120 63 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20 6e  cursor P1 to a n
2b130 75 6c 6c 20 72 6f 77 2e 20 20 41 6e 79 20 4f 50  ull row.  Any OP
2b140 5f 43 6f 6c 75 6d 6e 20 6f 70 65 72 61 74 69 6f  _Column operatio
2b150 6e 73 0a 2a 2a 20 74 68 61 74 20 6f 63 63 75 72  ns.** that occur
2b160 20 77 68 69 6c 65 20 74 68 65 20 63 75 72 73 6f   while the curso
2b170 72 20 69 73 20 6f 6e 20 74 68 65 20 6e 75 6c 6c  r is on the null
2b180 20 72 6f 77 20 77 69 6c 6c 20 61 6c 77 61 79 73   row will always
2b190 0a 2a 2a 20 77 72 69 74 65 20 61 20 4e 55 4c 4c  .** write a NULL
2b1a0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c  ..*/.case OP_Nul
2b1b0 6c 52 6f 77 3a 20 7b 0a 20 20 56 64 62 65 43 75  lRow: {.  VdbeCu
2b1c0 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73  rsor *pC;..  ass
2b1d0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
2b1e0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
2b1f0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
2b200 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
2b210 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
2b220 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c  =0 );.  pC->null
2b230 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 2d 3e 63  Row = 1;.  pC->c
2b240 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
2b250 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
2b260 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
2b270 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20  RTYPE_BTREE ){. 
2b280 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75     assert( pC->u
2b290 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
2b2a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2b2b0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e  ClearCursor(pC->
2b2c0 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  uc.pCursor);.  }
2b2d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2b2e0 45 42 55 47 0a 20 20 69 66 28 20 70 43 2d 3e 73  EBUG.  if( pC->s
2b2f0 65 65 6b 4f 70 3d 3d 30 20 29 20 70 43 2d 3e 73  eekOp==0 ) pC->s
2b300 65 65 6b 4f 70 20 3d 20 4f 50 5f 4e 75 6c 6c 52  eekOp = OP_NullR
2b310 6f 77 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72 65  ow;.#endif.  bre
2b320 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2b330 3a 20 53 65 65 6b 45 6e 64 20 50 31 20 2a 20 2a  : SeekEnd P1 * *
2b340 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 6f 73 69 74   * *.**.** Posit
2b350 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 61 74  ion cursor P1 at
2b360 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2b370 62 74 72 65 65 20 66 6f 72 20 74 68 65 20 70 75  btree for the pu
2b380 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 61 70 70 65  rpose of.** appe
2b390 6e 64 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  nding a new entr
2b3a0 79 20 6f 6e 74 6f 20 74 68 65 20 62 74 72 65 65  y onto the btree
2b3b0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
2b3c0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
2b3d0 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e  ursor is used on
2b3e0 6c 79 20 66 6f 72 20 61 70 70 65 6e 64 69 6e 67  ly for appending
2b3f0 20 61 6e 64 20 73 6f 0a 2a 2a 20 69 66 20 74 68   and so.** if th
2b400 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
2b410 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
2b420 6f 72 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  or must already 
2b430 62 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  be pointing.** a
2b440 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2b450 20 62 74 72 65 65 20 61 6e 64 20 73 6f 20 6e 6f   btree and so no
2b460 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
2b470 65 20 74 6f 0a 2a 2a 20 74 68 65 20 63 75 72 73  e to.** the curs
2b480 6f 72 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  or..*/./* Opcode
2b490 3a 20 4c 61 73 74 20 50 31 20 50 32 20 2a 20 2a  : Last P1 P2 * *
2b4a0 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78   *.**.** The nex
2b4b0 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77  t use of the Row
2b4c0 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20  id or Column or 
2b4d0 50 72 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e  Prev instruction
2b4e0 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c   for P1 .** will
2b4f0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61   refer to the la
2b500 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2b510 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
2b520 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74  r index..** If t
2b530 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
2b540 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50  x is empty and P
2b550 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69  2>0, then jump i
2b560 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
2b570 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20  ..** If P2 is 0 
2b580 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2b590 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  or index is not 
2b5a0 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f  empty, fall thro
2b5b0 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f  ugh.** to the fo
2b5c0 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74  llowing instruct
2b5d0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
2b5e0 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68  opcode leaves th
2b5f0 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75  e cursor configu
2b600 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72  red to move in r
2b610 65 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a  everse order,.**
2b620 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f   from the end to
2b630 77 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69  ward the beginni
2b640 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ng.  In other wo
2b650 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20  rds, the cursor 
2b660 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  is.** configured
2b670 20 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f   to use Prev, no
2b680 74 20 4e 65 78 74 2e 0a 2a 2f 0a 63 61 73 65 20  t Next..*/.case 
2b690 4f 50 5f 53 65 65 6b 45 6e 64 3a 0a 63 61 73 65  OP_SeekEnd:.case
2b6a0 20 4f 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20   OP_Last: {     
2b6b0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
2b6c0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
2b6d0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
2b6e0 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  r;.  int res;.. 
2b6f0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2b700 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2b710 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
2b720 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2b730 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2b740 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
2b750 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2b760 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2b770 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d  );.  pCrsr = pC-
2b780 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 72  >uc.pCursor;.  r
2b790 65 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  es = 0;.  assert
2b7a0 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 23 69  ( pCrsr!=0 );.#i
2b7b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2b7c0 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d  G.  pC->seekOp =
2b7d0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65   pOp->opcode;.#e
2b7e0 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ndif.  if( pOp->
2b7f0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 45  opcode==OP_SeekE
2b800 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nd ){.    assert
2b810 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a  ( pOp->p2==0 );.
2b820 20 20 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75      pC->seekResu
2b830 6c 74 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  lt = -1;.    if(
2b840 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
2b850 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 70 43 72  sorIsValidNN(pCr
2b860 73 72 29 20 29 7b 0a 20 20 20 20 20 20 62 72 65  sr) ){.      bre
2b870 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
2b880 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2b890 65 4c 61 73 74 28 70 43 72 73 72 2c 20 26 72 65  eLast(pCrsr, &re
2b8a0 73 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f  s);.  pC->nullRo
2b8b0 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70  w = (u8)res;.  p
2b8c0 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
2b8d0 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63  o = 0;.  pC->cac
2b8e0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
2b8f0 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 72 63  _STALE;.  if( rc
2b900 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2b910 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
2b920 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20  ( pOp->p2>0 ){. 
2b930 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
2b940 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20  en(res!=0,2);.  
2b950 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f    if( res ) goto
2b960 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
2b970 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2b980 4f 70 63 6f 64 65 3a 20 49 66 53 6d 61 6c 6c 65  Opcode: IfSmalle
2b990 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  r P1 P2 P3 * *.*
2b9a0 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
2b9b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2b9c0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 50 31   in the table P1
2b9d0 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  .  Jump to P2 if
2b9e0 20 74 68 61 74 0a 2a 2a 20 65 73 74 69 6d 61 74   that.** estimat
2b9f0 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 61  e is less than a
2ba00 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 32 2a 2a  pproximately 2**
2ba10 28 30 2e 31 2a 50 33 29 2e 0a 2a 2f 0a 63 61 73  (0.1*P3)..*/.cas
2ba20 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 3a 20  e OP_IfSmaller: 
2ba30 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
2ba40 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
2ba50 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
2ba60 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
2ba70 65 73 3b 0a 20 20 69 36 34 20 73 7a 3b 0a 0a 20  es;.  i64 sz;.. 
2ba80 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2ba90 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2baa0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
2bab0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2bac0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2bad0 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73   pC!=0 );.  pCrs
2bae0 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
2baf0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  or;.  assert( pC
2bb00 72 73 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  rsr );.  rc = sq
2bb10 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
2bb20 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20  pCrsr, &res);.  
2bb30 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2bb40 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2bb50 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ;.  if( res==0 )
2bb60 7b 0a 20 20 20 20 73 7a 20 3d 20 73 71 6c 69 74  {.    sz = sqlit
2bb70 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45  e3BtreeRowCountE
2bb80 73 74 28 70 43 72 73 72 29 3b 0a 20 20 20 20 69  st(pCrsr);.    i
2bb90 66 28 20 41 4c 57 41 59 53 28 73 7a 3e 3d 30 29  f( ALWAYS(sz>=0)
2bba0 20 26 26 20 73 71 6c 69 74 65 33 4c 6f 67 45 73   && sqlite3LogEs
2bbb0 74 28 28 75 36 34 29 73 7a 29 3c 70 4f 70 2d 3e  t((u64)sz)<pOp->
2bbc0 70 33 20 29 20 72 65 73 20 3d 20 31 3b 0a 20 20  p3 ) res = 1;.  
2bbd0 7d 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  }.  VdbeBranchTa
2bbe0 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20  ken(res!=0,2);. 
2bbf0 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20   if( res ) goto 
2bc00 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72  jump_to_p2;.  br
2bc10 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f  eak;.}.../* Opco
2bc20 64 65 3a 20 53 6f 72 74 65 72 53 6f 72 74 20 50  de: SorterSort P
2bc30 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
2bc40 20 41 66 74 65 72 20 61 6c 6c 20 72 65 63 6f 72   After all recor
2bc50 64 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  ds have been ins
2bc60 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 53  erted into the S
2bc70 6f 72 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  orter object.** 
2bc80 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 31  identified by P1
2bc90 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70  , invoke this op
2bca0 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
2bcb0 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
2bcc0 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
2bcd0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72  f there are no r
2bce0 65 63 6f 72 64 73 20 74 6f 20 62 65 20 73 6f 72  ecords to be sor
2bcf0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
2bd00 6f 70 63 6f 64 65 20 69 73 20 61 6e 20 61 6c 69  opcode is an ali
2bd10 61 73 20 66 6f 72 20 4f 50 5f 53 6f 72 74 20 61  as for OP_Sort a
2bd20 6e 64 20 4f 50 5f 52 65 77 69 6e 64 20 74 68 61  nd OP_Rewind tha
2bd30 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 66 6f 72  t is used.** for
2bd40 20 53 6f 72 74 65 72 20 6f 62 6a 65 63 74 73 2e   Sorter objects.
2bd50 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
2bd60 6f 72 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ort P1 P2 * * *.
2bd70 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
2bd80 65 20 64 6f 65 73 20 65 78 61 63 74 6c 79 20 74  e does exactly t
2bd90 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
2bda0 20 4f 50 5f 52 65 77 69 6e 64 20 65 78 63 65 70   OP_Rewind excep
2bdb0 74 20 74 68 61 74 0a 2a 2a 20 69 74 20 69 6e 63  t that.** it inc
2bdc0 72 65 6d 65 6e 74 73 20 61 6e 20 75 6e 64 6f 63  rements an undoc
2bdd0 75 6d 65 6e 74 65 64 20 67 6c 6f 62 61 6c 20 76  umented global v
2bde0 61 72 69 61 62 6c 65 20 75 73 65 64 20 66 6f 72  ariable used for
2bdf0 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   testing..**.** 
2be00 53 6f 72 74 69 6e 67 20 69 73 20 61 63 63 6f 6d  Sorting is accom
2be10 70 6c 69 73 68 65 64 20 62 79 20 77 72 69 74 69  plished by writi
2be20 6e 67 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20  ng records into 
2be30 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
2be40 0a 2a 2a 20 74 68 65 6e 20 72 65 77 69 6e 64 69  .** then rewindi
2be50 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 61 6e  ng that index an
2be60 64 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  d playing it bac
2be70 6b 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  k from beginning
2be80 20 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57 65 20   to.** end.  We 
2be90 75 73 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 20  use the OP_Sort 
2bea0 6f 70 63 6f 64 65 20 69 6e 73 74 65 61 64 20 6f  opcode instead o
2beb0 66 20 4f 50 5f 52 65 77 69 6e 64 20 74 6f 20 64  f OP_Rewind to d
2bec0 6f 20 74 68 65 0a 2a 2a 20 72 65 77 69 6e 64 69  o the.** rewindi
2bed0 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65 20 67  ng so that the g
2bee0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 77  lobal variable w
2bef0 69 6c 6c 20 62 65 20 69 6e 63 72 65 6d 65 6e 74  ill be increment
2bf00 65 64 20 61 6e 64 0a 2a 2a 20 72 65 67 72 65 73  ed and.** regres
2bf10 73 69 6f 6e 20 74 65 73 74 73 20 63 61 6e 20 64  sion tests can d
2bf20 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2bf30 20 6f 72 20 6e 6f 74 20 74 68 65 20 6f 70 74 69   or not the opti
2bf40 6d 69 7a 65 72 20 69 73 0a 2a 2a 20 63 6f 72 72  mizer is.** corr
2bf50 65 63 74 6c 79 20 6f 70 74 69 6d 69 7a 69 6e 67  ectly optimizing
2bf60 20 6f 75 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a 63   out sorts..*/.c
2bf70 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  ase OP_SorterSor
2bf80 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f  t:    /* jump */
2bf90 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20 7b  .case OP_Sort: {
2bfa0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
2bfb0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2bfc0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
2bfd0 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sort_count++;.  
2bfe0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
2bff0 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  ount--;.#endif. 
2c000 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c   p->aCounter[SQL
2c010 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53  ITE_STMTSTATUS_S
2c020 4f 52 54 5d 2b 2b 3b 0a 20 20 2f 2a 20 46 61 6c  ORT]++;.  /* Fal
2c030 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f  l through into O
2c040 50 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a  P_Rewind */.}./*
2c050 20 4f 70 63 6f 64 65 3a 20 52 65 77 69 6e 64 20   Opcode: Rewind 
2c060 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
2c070 2a 20 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f  * The next use o
2c080 66 20 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43  f the Rowid or C
2c090 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e  olumn or Next in
2c0a0 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31  struction for P1
2c0b0 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20   .** will refer 
2c0c0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
2c0d0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2c0e0 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  se table or inde
2c0f0 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  x..** If the tab
2c100 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65  le or index is e
2c110 6d 70 74 79 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  mpty, jump immed
2c120 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
2c130 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   If the table or
2c140 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d   index is not em
2c150 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  pty, fall throug
2c160 68 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h to the followi
2c170 6e 67 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69  ng .** instructi
2c180 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  on..**.** This o
2c190 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65  pcode leaves the
2c1a0 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72   cursor configur
2c1b0 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f  ed to move in fo
2c1c0 72 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20  rward order,.** 
2c1d0 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
2c1e0 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e  ng toward the en
2c1f0 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  d.  In other wor
2c200 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  ds, the cursor i
2c210 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  s.** configured 
2c220 74 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74  to use Next, not
2c230 20 50 72 65 76 2e 0a 2a 2f 0a 63 61 73 65 20 4f   Prev..*/.case O
2c240 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20 20 20 20  P_Rewind: {     
2c250 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
2c260 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
2c270 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
2c280 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  r;.  int res;.. 
2c290 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2c2a0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2c2b0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
2c2c0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d  ssert( pOp->p5==
2c2d0 30 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  0 );.  pC = p->a
2c2e0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
2c2f0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
2c300 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
2c310 72 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e  rter(pC)==(pOp->
2c320 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65  opcode==OP_Sorte
2c330 72 53 6f 72 74 29 20 29 3b 0a 20 20 72 65 73 20  rSort) );.  res 
2c340 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
2c350 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73  TE_DEBUG.  pC->s
2c360 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e  eekOp = OP_Rewin
2c370 64 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  d;.#endif.  if( 
2c380 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a  isSorter(pC) ){.
2c390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c3a0 56 64 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64  VdbeSorterRewind
2c3b0 28 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65  (pC, &res);.  }e
2c3c0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2c3d0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
2c3e0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
2c3f0 20 20 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e      pCrsr = pC->
2c400 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  uc.pCursor;.    
2c410 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b  assert( pCrsr );
2c420 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c430 33 42 74 72 65 65 46 69 72 73 74 28 70 43 72 73  3BtreeFirst(pCrs
2c440 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43  r, &res);.    pC
2c450 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
2c460 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61   = 0;.    pC->ca
2c470 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
2c480 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69  E_STALE;.  }.  i
2c490 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
2c4a0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2c4b0 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  .  pC->nullRow =
2c4c0 20 28 75 38 29 72 65 73 3b 0a 20 20 61 73 73 65   (u8)res;.  asse
2c4d0 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26  rt( pOp->p2>0 &&
2c4e0 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20   pOp->p2<p->nOp 
2c4f0 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
2c500 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a  aken(res!=0,2);.
2c510 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f    if( res ) goto
2c520 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62   jump_to_p2;.  b
2c530 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2c540 64 65 3a 20 4e 65 78 74 20 50 31 20 50 32 20 50  de: Next P1 P2 P
2c550 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 41 64  3 P4 P5.**.** Ad
2c560 76 61 6e 63 65 20 63 75 72 73 6f 72 20 50 31 20  vance cursor P1 
2c570 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2c580 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6b 65  s to the next ke
2c590 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e 20 69  y/data pair in i
2c5a0 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  ts.** table or i
2c5b0 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72 65 20  ndex.  If there 
2c5c0 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6b 65 79 2f  are no more key/
2c5d0 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65 6e  value pairs then
2c5e0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a   fall through.**
2c5f0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2c600 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  g instruction.  
2c610 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  But if the curso
2c620 72 20 61 64 76 61 6e 63 65 20 77 61 73 20 73 75  r advance was su
2c630 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d  ccessful,.** jum
2c640 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
2c650 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4e   P2..**.** The N
2c660 65 78 74 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e  ext opcode is on
2c670 6c 79 20 76 61 6c 69 64 20 66 6f 6c 6c 6f 77 69  ly valid followi
2c680 6e 67 20 61 6e 20 53 65 65 6b 47 54 2c 20 53 65  ng an SeekGT, Se
2c690 65 6b 47 45 2c 20 6f 72 0a 2a 2a 20 4f 50 5f 52  ekGE, or.** OP_R
2c6a0 65 77 69 6e 64 20 6f 70 63 6f 64 65 20 75 73 65  ewind opcode use
2c6b0 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
2c6c0 65 20 63 75 72 73 6f 72 2e 20 20 4e 65 78 74 20  e cursor.  Next 
2c6d0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 2a  is not allowed.*
2c6e0 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53 65 65 6b  * to follow Seek
2c6f0 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72 20 4f  LT, SeekLE, or O
2c700 50 5f 4c 61 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  P_Last..**.** Th
2c710 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74  e P1 cursor must
2c720 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20 74   be for a real t
2c730 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75  able, not a pseu
2c740 64 6f 2d 74 61 62 6c 65 2e 20 20 50 31 20 6d 75  do-table.  P1 mu
2c750 73 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  st have.** been 
2c760 6f 70 65 6e 65 64 20 70 72 69 6f 72 20 74 6f 20  opened prior to 
2c770 74 68 69 73 20 6f 70 63 6f 64 65 20 6f 72 20 74  this opcode or t
2c780 68 65 20 70 72 6f 67 72 61 6d 20 77 69 6c 6c 20  he program will 
2c790 73 65 67 66 61 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  segfault..**.** 
2c7a0 54 68 65 20 50 33 20 76 61 6c 75 65 20 69 73 20  The P3 value is 
2c7b0 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62 74  a hint to the bt
2c7c0 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2c7d0 6f 6e 2e 20 49 66 20 50 33 3d 3d 31 2c 20 74 68  on. If P3==1, th
2c7e0 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69  at.** means P1 i
2c7f0 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  s an SQL index a
2c800 6e 64 20 74 68 61 74 20 74 68 69 73 20 69 6e 73  nd that this ins
2c810 74 72 75 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68  truction could h
2c820 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74  ave been.** omit
2c830 74 65 64 20 69 66 20 74 68 61 74 20 69 6e 64 65  ted if that inde
2c840 78 20 68 61 64 20 62 65 65 6e 20 75 6e 69 71 75  x had been uniqu
2c850 65 2e 20 20 50 33 20 69 73 20 75 73 75 61 6c 6c  e.  P3 is usuall
2c860 79 20 30 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61  y 0.  P3 is.** a
2c870 6c 77 61 79 73 20 65 69 74 68 65 72 20 30 20 6f  lways either 0 o
2c880 72 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  r 1..**.** P4 is
2c890 20 61 6c 77 61 79 73 20 6f 66 20 74 79 70 65 20   always of type 
2c8a0 50 34 5f 41 44 56 41 4e 43 45 2e 20 54 68 65 20  P4_ADVANCE. The 
2c8b0 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
2c8c0 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71   points to.** sq
2c8d0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2c8e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73  ..**.** If P5 is
2c8f0 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74 68   positive and th
2c900 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c  e jump is taken,
2c910 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e   then event coun
2c920 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35  ter.** number P5
2c930 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  -1 in the prepar
2c940 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ed statement is 
2c950 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
2c960 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 50 72 65  ** See also: Pre
2c970 76 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  v.*/./* Opcode: 
2c980 50 72 65 76 20 50 31 20 50 32 20 50 33 20 50 34  Prev P1 P2 P3 P4
2c990 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75   P5.**.** Back u
2c9a0 70 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  p cursor P1 so t
2c9b0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
2c9c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65   the previous ke
2c9d0 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e 20 69  y/data pair in i
2c9e0 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  ts.** table or i
2c9f0 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72 65 20  ndex.  If there 
2ca00 69 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b  is no previous k
2ca10 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74  ey/value pairs t
2ca20 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
2ca30 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  .** to the follo
2ca40 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  wing instruction
2ca50 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 63 75  .  But if the cu
2ca60 72 73 6f 72 20 62 61 63 6b 75 70 20 77 61 73 20  rsor backup was 
2ca70 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a  successful,.** j
2ca80 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
2ca90 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  to P2..**.**.** 
2caa0 54 68 65 20 50 72 65 76 20 6f 70 63 6f 64 65 20  The Prev opcode 
2cab0 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  is only valid fo
2cac0 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65 6b 4c  llowing an SeekL
2cad0 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72 0a 2a 2a  T, SeekLE, or.**
2cae0 20 4f 50 5f 4c 61 73 74 20 6f 70 63 6f 64 65 20   OP_Last opcode 
2caf0 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
2cb00 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 50 72   the cursor.  Pr
2cb10 65 76 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ev is not allowe
2cb20 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53  d.** to follow S
2cb30 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f  eekGT, SeekGE, o
2cb40 72 20 4f 50 5f 52 65 77 69 6e 64 2e 0a 2a 2a 0a  r OP_Rewind..**.
2cb50 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f 72  ** The P1 cursor
2cb60 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20 72   must be for a r
2cb70 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  eal table, not a
2cb80 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20   pseudo-table.  
2cb90 49 66 20 50 31 20 69 73 0a 2a 2a 20 6e 6f 74 20  If P1 is.** not 
2cba0 6f 70 65 6e 20 74 68 65 6e 20 74 68 65 20 62 65  open then the be
2cbb0 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65 66 69  havior is undefi
2cbc0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ned..**.** The P
2cbd0 33 20 76 61 6c 75 65 20 69 73 20 61 20 68 69 6e  3 value is a hin
2cbe0 74 20 74 6f 20 74 68 65 20 62 74 72 65 65 20 69  t to the btree i
2cbf0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49  mplementation. I
2cc00 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a  f P3==1, that.**
2cc10 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61 6e 20   means P1 is an 
2cc20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
2cc30 61 74 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  at this instruct
2cc40 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
2cc50 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69  een.** omitted i
2cc60 66 20 74 68 61 74 20 69 6e 64 65 78 20 68 61 64  f that index had
2cc70 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20 20 50   been unique.  P
2cc80 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30 2e 20  3 is usually 0. 
2cc90 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73   P3 is.** always
2cca0 20 65 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a   either 0 or 1..
2ccb0 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61  **.** P4 is alwa
2ccc0 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44  ys of type P4_AD
2ccd0 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74  VANCE. The funct
2cce0 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ion pointer poin
2ccf0 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ts to.** sqlite3
2cd00 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
2cd10 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
2cd20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74 68 65  positive and the
2cd30 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20   jump is taken, 
2cd40 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74  then event count
2cd50 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d  er.** number P5-
2cd60 31 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  1 in the prepare
2cd70 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69  d statement is i
2cd80 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 2f  ncremented..*/./
2cd90 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72  * Opcode: Sorter
2cda0 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a 20 50  Next P1 P2 * * P
2cdb0 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  5.**.** This opc
2cdc0 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ode works just l
2cdd0 69 6b 65 20 4f 50 5f 4e 65 78 74 20 65 78 63 65  ike OP_Next exce
2cde0 70 74 20 74 68 61 74 20 50 31 20 6d 75 73 74 20  pt that P1 must 
2cdf0 62 65 20 61 0a 2a 2a 20 73 6f 72 74 65 72 20 6f  be a.** sorter o
2ce00 62 6a 65 63 74 20 66 6f 72 20 77 68 69 63 68 20  bject for which 
2ce10 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  the OP_SorterSor
2ce20 74 20 6f 70 63 6f 64 65 20 68 61 73 20 62 65 65  t opcode has bee
2ce30 6e 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 54  n.** invoked.  T
2ce40 68 69 73 20 6f 70 63 6f 64 65 20 61 64 76 61 6e  his opcode advan
2ce50 63 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 74  ces the cursor t
2ce60 6f 20 74 68 65 20 6e 65 78 74 20 73 6f 72 74 65  o the next sorte
2ce70 64 0a 2a 2a 20 72 65 63 6f 72 64 2c 20 6f 72 20  d.** record, or 
2ce80 6a 75 6d 70 73 20 74 6f 20 50 32 20 69 66 20 74  jumps to P2 if t
2ce90 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
2cea0 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64 73 2e   sorted records.
2ceb0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74  .*/.case OP_Sort
2cec0 65 72 4e 65 78 74 3a 20 7b 20 20 2f 2a 20 6a 75  erNext: {  /* ju
2ced0 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  mp */.  VdbeCurs
2cee0 6f 72 20 2a 70 43 3b 0a 0a 20 20 70 43 20 3d 20  or *pC;..  pC = 
2cef0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
2cf00 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  ];.  assert( isS
2cf10 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 72  orter(pC) );.  r
2cf20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
2cf30 6f 72 74 65 72 4e 65 78 74 28 64 62 2c 20 70 43  orterNext(db, pC
2cf40 29 3b 0a 20 20 67 6f 74 6f 20 6e 65 78 74 5f 74  );.  goto next_t
2cf50 61 69 6c 3b 0a 63 61 73 65 20 4f 50 5f 50 72 65  ail;.case OP_Pre
2cf60 76 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  v:          /* j
2cf70 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  ump */.case OP_N
2cf80 65 78 74 3a 20 20 20 20 20 20 20 20 20 20 2f 2a  ext:          /*
2cf90 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72   jump */.  asser
2cfa0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
2cfb0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
2cfc0 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
2cfd0 20 70 4f 70 2d 3e 70 35 3c 41 72 72 61 79 53 69   pOp->p5<ArraySi
2cfe0 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 72 29 20  ze(p->aCounter) 
2cff0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
2d000 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
2d010 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
2d020 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
2d030 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
2d040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2d050 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
2d060 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
2d070 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2d080 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 70 4f  e!=OP_Next || pO
2d090 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d  p->p4.xAdvance==
2d0a0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2d0b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2d0c0 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72  p->opcode!=OP_Pr
2d0d0 65 76 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41  ev || pOp->p4.xA
2d0e0 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42  dvance==sqlite3B
2d0f0 74 72 65 65 50 72 65 76 69 6f 75 73 20 29 3b 0a  treePrevious );.
2d100 0a 20 20 2f 2a 20 54 68 65 20 4e 65 78 74 20 6f  .  /* The Next o
2d110 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 75 73  pcode is only us
2d120 65 64 20 61 66 74 65 72 20 53 65 65 6b 47 54 2c  ed after SeekGT,
2d130 20 53 65 65 6b 47 45 2c 20 52 65 77 69 6e 64 2c   SeekGE, Rewind,
2d140 20 61 6e 64 20 46 6f 75 6e 64 2e 0a 20 20 2a 2a   and Found..  **
2d150 20 54 68 65 20 50 72 65 76 20 6f 70 63 6f 64 65   The Prev opcode
2d160 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 66   is only used af
2d170 74 65 72 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b  ter SeekLT, Seek
2d180 4c 45 2c 20 61 6e 64 20 4c 61 73 74 2e 20 2a 2f  LE, and Last. */
2d190 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2d1a0 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 0a  opcode!=OP_Next.
2d1b0 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65         || pC->se
2d1c0 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20  ekOp==OP_SeekGT 
2d1d0 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2d1e0 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20 20 20  P_SeekGE.       
2d1f0 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2d200 50 5f 52 65 77 69 6e 64 20 7c 7c 20 70 43 2d 3e  P_Rewind || pC->
2d210 73 65 65 6b 4f 70 3d 3d 4f 50 5f 46 6f 75 6e 64  seekOp==OP_Found
2d220 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e   .       || pC->
2d230 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4e 75 6c 6c 52  seekOp==OP_NullR
2d240 6f 77 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d  ow|| pC->seekOp=
2d250 3d 4f 50 5f 53 65 65 6b 52 6f 77 69 64 29 3b 0a  =OP_SeekRowid);.
2d260 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
2d270 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 0a 20  pcode!=OP_Prev. 
2d280 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65        || pC->see
2d290 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c  kOp==OP_SeekLT |
2d2a0 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50  | pC->seekOp==OP
2d2b0 5f 53 65 65 6b 4c 45 0a 20 20 20 20 20 20 20 7c  _SeekLE.       |
2d2c0 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50  | pC->seekOp==OP
2d2d0 5f 4c 61 73 74 20 0a 20 20 20 20 20 20 20 7c 7c  _Last .       ||
2d2e0 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f   pC->seekOp==OP_
2d2f0 4e 75 6c 6c 52 6f 77 29 3b 0a 0a 20 20 72 63 20  NullRow);..  rc 
2d300 3d 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e  = pOp->p4.xAdvan
2d310 63 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ce(pC->uc.pCurso
2d320 72 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 6e 65 78  r, pOp->p3);.nex
2d330 74 5f 74 61 69 6c 3a 0a 20 20 70 43 2d 3e 63 61  t_tail:.  pC->ca
2d340 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
2d350 45 5f 53 54 41 4c 45 3b 0a 20 20 56 64 62 65 42  E_STALE;.  VdbeB
2d360 72 61 6e 63 68 54 61 6b 65 6e 28 72 63 3d 3d 53  ranchTaken(rc==S
2d370 51 4c 49 54 45 5f 4f 4b 2c 32 29 3b 0a 20 20 69  QLITE_OK,2);.  i
2d380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d390 20 29 7b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c   ){.    pC->null
2d3a0 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Row = 0;.    p->
2d3b0 61 43 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e 70 35  aCounter[pOp->p5
2d3c0 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ]++;.#ifdef SQLI
2d3d0 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
2d3e0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
2d3f0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 67  ++;.#endif.    g
2d400 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61  oto jump_to_p2_a
2d410 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  nd_check_for_int
2d420 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20 69 66  errupt;.  }.  if
2d430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
2d440 45 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  E ) goto abort_d
2d450 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 72  ue_to_error;.  r
2d460 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d470 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31   pC->nullRow = 1
2d480 3b 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66  ;.  goto check_f
2d490 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a  or_interrupt;.}.
2d4a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 49  ./* Opcode: IdxI
2d4b0 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20 50  nsert P1 P2 P3 P
2d4c0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
2d4d0 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a  : key=r[P2].**.*
2d4e0 2a 20 52 65 67 69 73 74 65 72 20 50 32 20 68 6f  * Register P2 ho
2d4f0 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78  lds an SQL index
2d500 20 6b 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20   key made using 
2d510 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72  the.** MakeRecor
2d520 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  d instructions. 
2d530 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69   This opcode wri
2d540 74 65 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20  tes that key.** 
2d550 69 6e 74 6f 20 74 68 65 20 69 6e 64 65 78 20 50  into the index P
2d560 31 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68 65  1.  Data for the
2d570 20 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a   entry is nil..*
2d580 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f  *.** If P4 is no
2d590 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  t zero, then it 
2d5a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2d5b0 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 75   values in the u
2d5c0 6e 70 61 63 6b 65 64 0a 2a 2a 20 6b 65 79 20 6f  npacked.** key o
2d5d0 66 20 72 65 67 28 50 32 29 2e 20 20 49 6e 20 74  f reg(P2).  In t
2d5e0 68 61 74 20 63 61 73 65 2c 20 50 33 20 69 73 20  hat case, P3 is 
2d5f0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
2d600 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 0a   first register.
2d610 2a 2a 20 66 6f 72 20 74 68 65 20 75 6e 70 61 63  ** for the unpac
2d620 6b 65 64 20 6b 65 79 2e 20 20 54 68 65 20 61 76  ked key.  The av
2d630 61 69 6c 61 62 69 6c 69 74 79 20 6f 66 20 74 68  ailability of th
2d640 65 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 63  e unpacked key c
2d650 61 6e 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  an sometimes.** 
2d660 62 65 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  be an optimizati
2d670 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  on..**.** If P5 
2d680 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 41  has the OPFLAG_A
2d690 50 50 45 4e 44 20 62 69 74 20 73 65 74 2c 20 74  PPEND bit set, t
2d6a0 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f  hat is a hint to
2d6b0 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
2d6c0 72 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  r.** that this i
2d6d0 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20  nsert is likely 
2d6e0 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e  to be an append.
2d6f0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73  .**.** If P5 has
2d700 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
2d710 4e 47 45 20 62 69 74 20 73 65 74 2c 20 74 68 65  NGE bit set, the
2d720 6e 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  n the change cou
2d730 6e 74 65 72 20 69 73 0a 2a 2a 20 69 6e 63 72 65  nter is.** incre
2d740 6d 65 6e 74 65 64 20 62 79 20 74 68 69 73 20 69  mented by this i
2d750 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
2d760 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
2d770 47 45 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c  GE bit is clear,
2d780 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 68 61  .** then the cha
2d790 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 75  nge counter is u
2d7a0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
2d7b0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  If the OPFLAG_US
2d7c0 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
2d7d0 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c 20 74   of P5 is set, t
2d7e0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2d7f0 6e 20 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66  n might.** run f
2d800 61 73 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e  aster by avoidin
2d810 67 20 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79  g an unnecessary
2d820 20 73 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20   seek on cursor 
2d830 50 31 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  P1.  However,.**
2d840 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
2d850 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d  EEKRESULT flag m
2d860 75 73 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  ust only be set 
2d870 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
2d880 65 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73  en no prior.** s
2d890 65 65 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73  eeks on the curs
2d8a0 6f 72 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73  or or if the mos
2d8b0 74 20 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73  t recent seek us
2d8c0 65 64 20 61 20 6b 65 79 20 65 71 75 69 76 61 6c  ed a key equival
2d8d0 65 6e 74 0a 2a 2a 20 74 6f 20 50 32 2e 20 0a 2a  ent.** to P2. .*
2d8e0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
2d8f0 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73  ction only works
2d900 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 54   for indices.  T
2d910 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e  he equivalent in
2d920 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72  struction.** for
2d930 20 74 61 62 6c 65 73 20 69 73 20 4f 50 5f 49 6e   tables is OP_In
2d940 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  sert..*/./* Opco
2d950 64 65 3a 20 53 6f 72 74 65 72 49 6e 73 65 72 74  de: SorterInsert
2d960 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
2d970 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2d980 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74  P2].**.** Regist
2d990 65 72 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53  er P2 holds an S
2d9a0 51 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64  QL index key mad
2d9b0 65 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d  e using the.** M
2d9c0 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75  akeRecord instru
2d9d0 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70  ctions.  This op
2d9e0 63 6f 64 65 20 77 72 69 74 65 73 20 74 68 61 74  code writes that
2d9f0 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65   key.** into the
2da00 20 73 6f 72 74 65 72 20 50 31 2e 20 20 44 61 74   sorter P1.  Dat
2da10 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  a for the entry 
2da20 69 73 20 6e 69 6c 2e 0a 2a 2f 0a 63 61 73 65 20  is nil..*/.case 
2da30 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3a  OP_SorterInsert:
2da40 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f         /* in2 */
2da50 0a 63 61 73 65 20 4f 50 5f 49 64 78 49 6e 73 65  .case OP_IdxInse
2da60 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  rt: {        /* 
2da70 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  in2 */.  VdbeCur
2da80 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 72 65 65  sor *pC;.  Btree
2da90 50 61 79 6c 6f 61 64 20 78 3b 0a 0a 20 20 61 73  Payload x;..  as
2daa0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2dab0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2dac0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2dad0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2dae0 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1];.  sqlite3Vdb
2daf0 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65  eIncrWriteCounte
2db00 72 28 70 2c 20 70 43 29 3b 0a 20 20 61 73 73 65  r(p, pC);.  asse
2db10 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
2db20 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
2db30 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64  pC)==(pOp->opcod
2db40 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  e==OP_SorterInse
2db50 72 74 29 20 29 3b 0a 20 20 70 49 6e 32 20 3d 20  rt) );.  pIn2 = 
2db60 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
2db70 20 20 61 73 73 65 72 74 28 20 70 49 6e 32 2d 3e    assert( pIn2->
2db80 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
2db90 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
2dba0 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  5 & OPFLAG_NCHAN
2dbb0 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b  GE ) p->nChange+
2dbc0 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  +;.  assert( pC-
2dbd0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
2dbe0 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 4f 70 2d  PE_BTREE || pOp-
2dbf0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74  >opcode==OP_Sort
2dc00 65 72 49 6e 73 65 72 74 20 29 3b 0a 20 20 61 73  erInsert );.  as
2dc10 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
2dc20 65 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 45  e==0 );.  rc = E
2dc30 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b  xpandBlob(pIn2);
2dc40 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2dc50 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2dc60 72 6f 72 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ror;.  if( pOp->
2dc70 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65  opcode==OP_Sorte
2dc80 72 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 72  rInsert ){.    r
2dc90 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
2dca0 6f 72 74 65 72 57 72 69 74 65 28 70 43 2c 20 70  orterWrite(pC, p
2dcb0 49 6e 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  In2);.  }else{. 
2dcc0 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70 49 6e 32     x.nKey = pIn2
2dcd0 2d 3e 6e 3b 0a 20 20 20 20 78 2e 70 4b 65 79 20  ->n;.    x.pKey 
2dce0 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20 20 20 20 78  = pIn2->z;.    x
2dcf0 2e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 2b 20 70  .aMem = aMem + p
2dd00 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 78 2e 6e 4d  Op->p3;.    x.nM
2dd10 65 6d 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70  em = (u16)pOp->p
2dd20 34 2e 69 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  4.i;.    rc = sq
2dd30 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
2dd40 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
2dd50 20 26 78 2c 0a 20 20 20 20 20 20 20 20 20 28 70   &x,.         (p
2dd60 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47  Op->p5 & (OPFLAG
2dd70 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41 47 5f 53  _APPEND|OPFLAG_S
2dd80 41 56 45 50 4f 53 49 54 49 4f 4e 29 29 2c 20 0a  AVEPOSITION)), .
2dd90 20 20 20 20 20 20 20 20 28 28 70 4f 70 2d 3e 70          ((pOp->p
2dda0 35 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  5 & OPFLAG_USESE
2ddb0 45 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e  EKRESULT) ? pC->
2ddc0 73 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 0a  seekResult : 0).
2ddd0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 61          );.    a
2dde0 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72  ssert( pC->defer
2ddf0 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a  redMoveto==0 );.
2de00 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61      pC->cacheSta
2de10 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
2de20 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 29  E;.  }.  if( rc)
2de30 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2de40 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
2de50 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2de60 20 49 64 78 44 65 6c 65 74 65 20 50 31 20 50 32   IdxDelete P1 P2
2de70 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
2de80 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 40 50 33  sis: key=r[P2@P3
2de90 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ].**.** The cont
2dea0 65 6e 74 20 6f 66 20 50 33 20 72 65 67 69 73 74  ent of P3 regist
2deb0 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
2dec0 72 65 67 69 73 74 65 72 20 50 32 20 66 6f 72 6d  register P2 form
2ded0 0a 2a 2a 20 61 6e 20 75 6e 70 61 63 6b 65 64 20  .** an unpacked 
2dee0 69 6e 64 65 78 20 6b 65 79 2e 20 54 68 69 73 20  index key. This 
2def0 6f 70 63 6f 64 65 20 72 65 6d 6f 76 65 73 20 74  opcode removes t
2df00 68 61 74 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  hat entry from t
2df10 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f 70 65  he .** index ope
2df20 6e 65 64 20 62 79 20 63 75 72 73 6f 72 20 50 31  ned by cursor P1
2df30 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  ..*/.case OP_Idx
2df40 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62 65  Delete: {.  Vdbe
2df50 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
2df60 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
2df70 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61   int res;.  Unpa
2df80 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20  ckedRecord r;.. 
2df90 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
2dfa0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2dfb0 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70  pOp->p2>0 && pOp
2dfc0 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 3c 3d 28 70  ->p2+pOp->p3<=(p
2dfd0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
2dfe0 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 61 73  ursor)+1 );.  as
2dff0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2e000 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2e010 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2e020 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2e030 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2e040 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2e050 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
2e060 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
2e070 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63    sqlite3VdbeInc
2e080 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c  rWriteCounter(p,
2e090 20 70 43 29 3b 0a 20 20 70 43 72 73 72 20 3d 20   pC);.  pCrsr = 
2e0a0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
2e0b0 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72 21    assert( pCrsr!
2e0c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2e0d0 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  pOp->p5==0 );.  
2e0e0 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d  r.pKeyInfo = pC-
2e0f0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e  >pKeyInfo;.  r.n
2e100 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70  Field = (u16)pOp
2e110 2d 3e 70 33 3b 0a 20 20 72 2e 64 65 66 61 75 6c  ->p3;.  r.defaul
2e120 74 5f 72 63 20 3d 20 30 3b 0a 20 20 72 2e 61 4d  t_rc = 0;.  r.aM
2e130 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
2e140 70 32 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  p2];.  rc = sqli
2e150 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
2e160 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72  packed(pCrsr, &r
2e170 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
2e180 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2e190 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2e1a0 72 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  r;.  if( res==0 
2e1b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2e1c0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70  te3BtreeDelete(p
2e1d0 43 72 73 72 2c 20 42 54 52 45 45 5f 41 55 58 44  Crsr, BTREE_AUXD
2e1e0 45 4c 45 54 45 29 3b 0a 20 20 20 20 69 66 28 20  ELETE);.    if( 
2e1f0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2e200 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2e210 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  }.  assert( pC->
2e220 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
2e230 30 20 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65  0 );.  pC->cache
2e240 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
2e250 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 73 65 65 6b  TALE;.  pC->seek
2e260 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 62 72  Result = 0;.  br
2e270 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2e280 65 3a 20 44 65 66 65 72 72 65 64 53 65 65 6b 20  e: DeferredSeek 
2e290 50 31 20 2a 20 50 33 20 50 34 20 2a 0a 2a 2a 20  P1 * P3 P4 *.** 
2e2a0 53 79 6e 6f 70 73 69 73 3a 20 4d 6f 76 65 20 50  Synopsis: Move P
2e2b0 33 20 74 6f 20 50 31 2e 72 6f 77 69 64 20 69 66  3 to P1.rowid if
2e2c0 20 6e 65 65 64 65 64 0a 2a 2a 0a 2a 2a 20 50 31   needed.**.** P1
2e2d0 20 69 73 20 61 6e 20 6f 70 65 6e 20 69 6e 64 65   is an open inde
2e2e0 78 20 63 75 72 73 6f 72 20 61 6e 64 20 50 33 20  x cursor and P3 
2e2f0 69 73 20 61 20 63 75 72 73 6f 72 20 6f 6e 20 74  is a cursor on t
2e300 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2e310 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 69 73  .** table.  This
2e320 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 61 20 64   opcode does a d
2e330 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f 66 20  eferred seek of 
2e340 74 68 65 20 50 33 20 74 61 62 6c 65 20 63 75 72  the P3 table cur
2e350 73 6f 72 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f  sor.** to the ro
2e360 77 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  w that correspon
2e370 64 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ds to the curren
2e380 74 20 72 6f 77 20 6f 66 20 50 31 2e 0a 2a 2a 0a  t row of P1..**.
2e390 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 66  ** This is a def
2e3a0 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e 6f 74  erred seek.  Not
2e3b0 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20 68 61  hing actually ha
2e3c0 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a 20 74  ppens until.** t
2e3d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
2e3e0 64 20 74 6f 20 72 65 61 64 20 61 20 72 65 63 6f  d to read a reco
2e3f0 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  rd.  That way, i
2e400 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20 6f 63  f no reads.** oc
2e410 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65 73 73  cur, no unnecess
2e420 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e 73 2e  ary I/O happens.
2e430 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65  .**.** P4 may be
2e440 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
2e450 65 67 65 72 73 20 28 74 79 70 65 20 50 34 5f 49  egers (type P4_I
2e460 4e 54 41 52 52 41 59 29 20 63 6f 6e 74 61 69 6e  NTARRAY) contain
2e470 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6e 74 72 79  ing.** one entry
2e480 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
2e490 20 69 6e 20 74 68 65 20 50 33 20 74 61 62 6c 65   in the P3 table
2e4a0 2e 20 20 49 66 20 61 72 72 61 79 20 65 6e 74 72  .  If array entr
2e4b0 79 20 61 28 69 29 0a 2a 2a 20 69 73 20 6e 6f 6e  y a(i).** is non
2e4c0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72 65 61 64  -zero, then read
2e4d0 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 28 69 29 2d  ing column a(i)-
2e4e0 31 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 50 33  1 from cursor P3
2e4f0 20 69 73 20 0a 2a 2a 20 65 71 75 69 76 61 6c 65   is .** equivale
2e500 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 69 6e 67  nt to performing
2e510 20 74 68 65 20 64 65 66 65 72 72 65 64 20 73 65   the deferred se
2e520 65 6b 20 61 6e 64 20 74 68 65 6e 20 72 65 61 64  ek and then read
2e530 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 20 0a 2a 2a  ing column i .**
2e540 20 66 72 6f 6d 20 50 31 2e 20 20 54 68 69 73 20   from P1.  This 
2e550 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 73  information is s
2e560 74 6f 72 65 64 20 69 6e 20 50 33 20 61 6e 64 20  tored in P3 and 
2e570 75 73 65 64 20 74 6f 20 72 65 64 69 72 65 63 74  used to redirect
2e580 0a 2a 2a 20 72 65 61 64 73 20 61 67 61 69 6e 73  .** reads agains
2e590 74 20 50 33 20 6f 76 65 72 20 74 6f 20 50 31 2c  t P3 over to P1,
2e5a0 20 74 68 75 73 20 70 6f 73 73 69 62 6c 79 20 61   thus possibly a
2e5b0 76 6f 69 64 69 6e 67 20 74 68 65 20 6e 65 65 64  voiding the need
2e5c0 20 74 6f 0a 2a 2a 20 73 65 65 6b 20 61 6e 64 20   to.** seek and 
2e5d0 72 65 61 64 20 63 75 72 73 6f 72 20 50 33 2e 0a  read cursor P3..
2e5e0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64  */./* Opcode: Id
2e5f0 78 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a  xRowid P1 P2 * *
2e600 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
2e610 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a  r[P2]=rowid.**.*
2e620 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67  * Write into reg
2e630 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e 74 65  ister P2 an inte
2e640 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
2e650 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2e660 68 65 20 72 65 63 6f 72 64 20 61 74 0a 2a 2a 20  he record at.** 
2e670 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
2e680 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e 74 65 64  ndex key pointed
2e690 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20 50 31   to by cursor P1
2e6a0 2e 20 20 54 68 69 73 20 69 6e 74 65 67 65 72 20  .  This integer 
2e6b0 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68 65  should be.** the
2e6c0 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 74 61   rowid of the ta
2e6d0 62 6c 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  ble entry to whi
2e6e0 63 68 20 74 68 69 73 20 69 6e 64 65 78 20 65 6e  ch this index en
2e6f0 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a 0a 2a  try points..**.*
2e700 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f 77 69  * See also: Rowi
2e710 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 2a  d, MakeRecord..*
2e720 2f 0a 63 61 73 65 20 4f 50 5f 44 65 66 65 72 72  /.case OP_Deferr
2e730 65 64 53 65 65 6b 3a 0a 63 61 73 65 20 4f 50 5f  edSeek:.case OP_
2e740 49 64 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20  IdxRowid: {     
2e750 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
2e760 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2e770 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  C;             /
2e780 2a 20 54 68 65 20 50 31 20 69 6e 64 65 78 20 63  * The P1 index c
2e790 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64 62 65 43  ursor */.  VdbeC
2e7a0 75 72 73 6f 72 20 2a 70 54 61 62 43 75 72 3b 20  ursor *pTabCur; 
2e7b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
2e7c0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 28 4f   table cursor (O
2e7d0 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b 20 6f  P_DeferredSeek o
2e7e0 6e 6c 79 29 20 2a 2f 0a 20 20 69 36 34 20 72 6f  nly) */.  i64 ro
2e7f0 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2e800 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74        /* Rowid t
2e810 68 61 74 20 50 31 20 63 75 72 72 65 6e 74 20 70  hat P1 current p
2e820 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  oints to */..  a
2e830 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
2e840 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
2e850 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
2e860 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
2e870 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
2e880 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
2e890 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
2e8a0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
2e8b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75  .  assert( pC->u
2e8c0 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
2e8d0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
2e8e0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 61 73  Table==0 );.  as
2e8f0 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
2e900 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
2e910 20 61 73 73 65 72 74 28 20 21 70 43 2d 3e 6e 75   assert( !pC->nu
2e920 6c 6c 52 6f 77 20 7c 7c 20 70 4f 70 2d 3e 6f 70  llRow || pOp->op
2e930 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f 77 69  code==OP_IdxRowi
2e940 64 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 49  d );..  /* The I
2e950 64 78 52 6f 77 69 64 20 61 6e 64 20 53 65 65 6b  dxRowid and Seek
2e960 20 6f 70 63 6f 64 65 73 20 61 72 65 20 63 6f 6d   opcodes are com
2e970 62 69 6e 65 64 20 62 65 63 61 75 73 65 20 6f 66  bined because of
2e980 20 74 68 65 20 63 6f 6d 6d 6f 6e 61 6c 69 74 79   the commonality
2e990 0a 20 20 2a 2a 20 6f 66 20 73 71 6c 69 74 65 33  .  ** of sqlite3
2e9a0 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
2e9b0 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 56  e() and sqlite3V
2e9c0 64 62 65 49 64 78 52 6f 77 69 64 28 29 2e 20 2a  dbeIdxRowid(). *
2e9d0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
2e9e0 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
2e9f0 65 28 70 43 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  e(pC);..  /* sql
2ea00 69 74 65 33 56 62 65 43 75 72 73 6f 72 52 65 73  ite3VbeCursorRes
2ea10 74 6f 72 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20  tore() can only 
2ea20 66 61 69 6c 20 69 66 20 74 68 65 20 72 65 63 6f  fail if the reco
2ea30 72 64 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  rd has been dele
2ea40 74 65 64 0a 20 20 2a 2a 20 6f 75 74 20 66 72 6f  ted.  ** out fro
2ea50 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
2ea60 6f 72 2e 20 20 54 68 61 74 20 77 69 6c 6c 20 6e  or.  That will n
2ea70 65 76 65 72 20 68 61 70 70 65 6e 73 20 66 6f 72  ever happens for
2ea80 20 61 6e 20 49 64 78 52 6f 77 69 64 0a 20 20 2a   an IdxRowid.  *
2ea90 2a 20 6f 72 20 53 65 65 6b 20 6f 70 63 6f 64 65  * or Seek opcode
2eaa0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2eab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  rc!=SQLITE_OK) )
2eac0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2ead0 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28  to_error;..  if(
2eae0 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b   !pC->nullRow ){
2eaf0 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 30 3b 20  .    rowid = 0; 
2eb00 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20   /* Not needed. 
2eb10 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69   Only used to si
2eb20 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e  lence a warning.
2eb30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2eb40 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
2eb50 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70 43 75 72  (db, pC->uc.pCur
2eb60 73 6f 72 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20  sor, &rowid);.  
2eb70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2eb80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2eb90 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
2eba0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
2ebb0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2ebc0 3d 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b  =OP_DeferredSeek
2ebd0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2ebe0 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26 26 20  ( pOp->p3>=0 && 
2ebf0 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 43 75 72 73  pOp->p3<p->nCurs
2ec00 6f 72 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  or );.      pTab
2ec10 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  Cur = p->apCsr[p
2ec20 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 61  Op->p3];.      a
2ec30 73 73 65 72 74 28 20 70 54 61 62 43 75 72 21 3d  ssert( pTabCur!=
2ec40 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2ec50 74 28 20 70 54 61 62 43 75 72 2d 3e 65 43 75 72  t( pTabCur->eCur
2ec60 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
2ec70 52 45 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REE );.      ass
2ec80 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e 75 63  ert( pTabCur->uc
2ec90 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
2eca0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2ecb0 62 43 75 72 2d 3e 69 73 54 61 62 6c 65 20 29 3b  bCur->isTable );
2ecc0 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e  .      pTabCur->
2ecd0 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20  nullRow = 0;.   
2ece0 20 20 20 70 54 61 62 43 75 72 2d 3e 6d 6f 76 65     pTabCur->move
2ecf0 74 6f 54 61 72 67 65 74 20 3d 20 72 6f 77 69 64  toTarget = rowid
2ed00 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d  ;.      pTabCur-
2ed10 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
2ed20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
2ed30 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
2ed40 50 34 5f 49 4e 54 41 52 52 41 59 20 7c 7c 20 70  P4_INTARRAY || p
2ed50 4f 70 2d 3e 70 34 2e 61 69 3d 3d 30 20 29 3b 0a  Op->p4.ai==0 );.
2ed60 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 61        pTabCur->a
2ed70 41 6c 74 4d 61 70 20 3d 20 70 4f 70 2d 3e 70 34  AltMap = pOp->p4
2ed80 2e 61 69 3b 0a 20 20 20 20 20 20 70 54 61 62 43  .ai;.      pTabC
2ed90 75 72 2d 3e 70 41 6c 74 43 75 72 73 6f 72 20 3d  ur->pAltCursor =
2eda0 20 70 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   pC;.    }else{.
2edb0 20 20 20 20 20 20 70 4f 75 74 20 3d 20 6f 75 74        pOut = out
2edc0 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
2edd0 4f 70 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  Op);.      pOut-
2ede0 3e 75 2e 69 20 3d 20 72 6f 77 69 64 3b 0a 20 20  >u.i = rowid;.  
2edf0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2ee00 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2ee10 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f 77 69  code==OP_IdxRowi
2ee20 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
2ee30 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 26  VdbeMemSetNull(&
2ee40 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
2ee50 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
2ee60 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 47 45  /* Opcode: IdxGE
2ee70 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2ee80 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2ee90 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
2eea0 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20  The P4 register 
2eeb0 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67  values beginning
2eec0 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e   with P3 form an
2eed0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
2eee0 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69  .** key that omi
2eef0 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ts the PRIMARY K
2ef00 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69  EY.  Compare thi
2ef10 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69  s key value agai
2ef20 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a 2a  nst the index .*
2ef30 2a 20 74 68 61 74 20 50 31 20 69 73 20 63 75 72  * that P1 is cur
2ef40 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
2ef50 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68 65  to, ignoring the
2ef60 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
2ef70 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c 64 73  ROWID .** fields
2ef80 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a   at the end..**.
2ef90 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64  ** If the P1 ind
2efa0 65 78 20 65 6e 74 72 79 20 69 73 20 67 72 65 61  ex entry is grea
2efb0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
2efc0 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
2efd0 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20  ue.** then jump 
2efe0 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73  to P2.  Otherwis
2eff0 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  e fall through t
2f000 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
2f010 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  uction..*/./* Op
2f020 63 6f 64 65 3a 20 49 64 78 47 54 20 50 31 20 50  code: IdxGT P1 P
2f030 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
2f040 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
2f050 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  @P4].**.** The P
2f060 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  4 register value
2f070 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
2f080 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61   P3 form an unpa
2f090 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b  cked index .** k
2f0a0 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  ey that omits th
2f0b0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  e PRIMARY KEY.  
2f0c0 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79  Compare this key
2f0d0 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74   value against t
2f0e0 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61  he index .** tha
2f0f0 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  t P1 is currentl
2f100 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69  y pointing to, i
2f110 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d  gnoring the PRIM
2f120 41 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44  ARY KEY or ROWID
2f130 20 0a 2a 2a 20 66 69 65 6c 64 73 20 61 74 20 74   .** fields at t
2f140 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  he end..**.** If
2f150 20 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e   the P1 index en
2f160 74 72 79 20 69 73 20 67 72 65 61 74 65 72 20 74  try is greater t
2f170 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  han the key valu
2f180 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20 74  e.** then jump t
2f190 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73 65  o P2.  Otherwise
2f1a0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
2f1b0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2f1c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ction..*/./* Opc
2f1d0 6f 64 65 3a 20 49 64 78 4c 54 20 50 31 20 50 32  ode: IdxLT P1 P2
2f1e0 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
2f1f0 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
2f200 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  P4].**.** The P4
2f210 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
2f220 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
2f230 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
2f240 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
2f250 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
2f260 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
2f270 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65 20  ROWID.  Compare 
2f280 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61  this key value a
2f290 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 69 6e  gainst.** the in
2f2a0 64 65 78 20 74 68 61 74 20 50 31 20 69 73 20 63  dex that P1 is c
2f2b0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2f2c0 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74  g to, ignoring t
2f2d0 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2f2e0 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20 74 68  r.** ROWID on th
2f2f0 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e P1 index..**.*
2f300 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
2f310 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20  x entry is less 
2f320 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
2f330 75 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ue then jump to 
2f340 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  P2..** Otherwise
2f350 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
2f360 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2f370 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ction..*/./* Opc
2f380 6f 64 65 3a 20 49 64 78 4c 45 20 50 31 20 50 32  ode: IdxLE P1 P2
2f390 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
2f3a0 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
2f3b0 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  P4].**.** The P4
2f3c0 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
2f3d0 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
2f3e0 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
2f3f0 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
2f400 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
2f410 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
2f420 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65 20  ROWID.  Compare 
2f430 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61  this key value a
2f440 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 69 6e  gainst.** the in
2f450 64 65 78 20 74 68 61 74 20 50 31 20 69 73 20 63  dex that P1 is c
2f460 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2f470 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74  g to, ignoring t
2f480 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2f490 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20 74 68  r.** ROWID on th
2f4a0 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e P1 index..**.*
2f4b0 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65  * If the P1 inde
2f4c0 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20  x entry is less 
2f4d0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2f4e0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74   the key value t
2f4f0 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20 50  hen jump.** to P
2f500 32 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  2. Otherwise fal
2f510 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
2f520 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2f530 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64  n..*/.case OP_Id
2f540 78 4c 45 3a 20 20 20 20 20 20 20 20 20 20 2f 2a  xLE:          /*
2f550 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50   jump */.case OP
2f560 5f 49 64 78 47 54 3a 20 20 20 20 20 20 20 20 20  _IdxGT:         
2f570 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65   /* jump */.case
2f580 20 4f 50 5f 49 64 78 4c 54 3a 20 20 20 20 20 20   OP_IdxLT:      
2f590 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
2f5a0 61 73 65 20 4f 50 5f 49 64 78 47 45 3a 20 20 7b  ase OP_IdxGE:  {
2f5b0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
2f5c0 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
2f5d0 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  pC;.  int res;. 
2f5e0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2f5f0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r;..  assert( pO
2f600 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2f610 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
2f620 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
2f630 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2f640 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
2f650 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f   assert( pC->isO
2f660 72 64 65 72 65 64 20 29 3b 0a 20 20 61 73 73 65  rdered );.  asse
2f670 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2f680 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2f690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2f6a0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 29 3b  >uc.pCursor!=0);
2f6b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64  .  assert( pC->d
2f6c0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
2f6d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2f6e0 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d  p->p5==0 || pOp-
2f6f0 3e 70 35 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  >p5==1 );.  asse
2f700 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
2f710 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 72  =P4_INT32 );.  r
2f720 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
2f730 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e 46  pKeyInfo;.  r.nF
2f740 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d  ield = (u16)pOp-
2f750 3e 70 34 2e 69 3b 0a 20 20 69 66 28 20 70 4f 70  >p4.i;.  if( pOp
2f760 2d 3e 6f 70 63 6f 64 65 3c 4f 50 5f 49 64 78 4c  ->opcode<OP_IdxL
2f770 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
2f780 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2f790 5f 49 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f  _IdxLE || pOp->o
2f7a0 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20  pcode==OP_IdxGT 
2f7b0 29 3b 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74  );.    r.default
2f7c0 5f 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  _rc = -1;.  }els
2f7d0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2f7e0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2f7f0 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  dxGE || pOp->opc
2f800 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b  ode==OP_IdxLT );
2f810 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72  .    r.default_r
2f820 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 2e 61  c = 0;.  }.  r.a
2f830 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
2f840 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  >p3];.#ifdef SQL
2f850 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20  ITE_DEBUG.  {.  
2f860 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
2f870 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64  (i=0; i<r.nField
2f880 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
2f890 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
2f8a0 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 0a  (&r.aMem[i]) );.
2f8b0 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54        REGISTER_T
2f8c0 52 41 43 45 28 70 4f 70 2d 3e 70 33 2b 69 2c 20  RACE(pOp->p3+i, 
2f8d0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 2b 69 5d  &aMem[pOp->p3+i]
2f8e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
2f8f0 64 69 66 0a 20 20 72 65 73 20 3d 20 30 3b 20 20  dif.  res = 0;  
2f900 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
2f910 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c  Only used to sil
2f920 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20  ence a warning. 
2f930 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2f940 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
2f950 72 65 28 64 62 2c 20 70 43 2c 20 26 72 2c 20 26  re(db, pC, &r, &
2f960 72 65 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20  res);.  assert( 
2f970 28 4f 50 5f 49 64 78 4c 45 26 31 29 3d 3d 28 4f  (OP_IdxLE&1)==(O
2f980 50 5f 49 64 78 4c 54 26 31 29 20 26 26 20 28 4f  P_IdxLT&1) && (O
2f990 50 5f 49 64 78 47 45 26 31 29 3d 3d 28 4f 50 5f  P_IdxGE&1)==(OP_
2f9a0 49 64 78 47 54 26 31 29 20 29 3b 0a 20 20 69 66  IdxGT&1) );.  if
2f9b0 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 26 31  ( (pOp->opcode&1
2f9c0 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26 31 29 20  )==(OP_IdxLT&1) 
2f9d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2f9e0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2f9f0 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  dxLE || pOp->opc
2fa00 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b  ode==OP_IdxLT );
2fa10 0a 20 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b  .    res = -res;
2fa20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2fa30 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2fa40 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20 70  e==OP_IdxGE || p
2fa50 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2fa60 64 78 47 54 20 29 3b 0a 20 20 20 20 72 65 73 2b  dxGT );.    res+
2fa70 2b 3b 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61  +;.  }.  VdbeBra
2fa80 6e 63 68 54 61 6b 65 6e 28 72 65 73 3e 30 2c 32  nchTaken(res>0,2
2fa90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2faa0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2fab0 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73  error;.  if( res
2fac0 3e 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  >0 ) goto jump_t
2fad0 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
2fae0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 73  ../* Opcode: Des
2faf0 74 72 6f 79 20 50 31 20 50 32 20 50 33 20 2a 20  troy P1 P2 P3 * 
2fb00 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  *.**.** Delete a
2fb10 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  n entire databas
2fb20 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
2fb30 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65   whose root page
2fb40 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fb50 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69 76 65  .** file is give
2fb60 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54  n by P1..**.** T
2fb70 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2fb80 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e 20 74  estroyed is in t
2fb90 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2fba0 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30 2e 20   file if P3==0. 
2fbb0 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74 68 65   If.** P3==1 the
2fbc0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  n the table to b
2fbd0 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  e clear is in th
2fbe0 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
2fbf0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61  base file.** tha
2fc00 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
2fc10 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65  re tables create
2fc20 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45   using CREATE TE
2fc30 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a  MPORARY TABLE..*
2fc40 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55  *.** If AUTOVACU
2fc50 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68  UM is enabled th
2fc60 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  en it is possibl
2fc70 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 72  e that another r
2fc80 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  oot page.** migh
2fc90 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20  t be moved into 
2fca0 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65 74 65  the newly delete
2fcb0 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 6f  d root page in o
2fcc0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61 6c 6c  rder to keep all
2fcd0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 63  .** root pages c
2fce0 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74 68 65  ontiguous at the
2fcf0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2fd00 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
2fd10 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c 75 65   former.** value
2fd20 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   of the root pag
2fd30 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d 20 69  e that moved - i
2fd40 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  ts value before 
2fd50 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72 72 65  the move occurre
2fd60 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  d -.** is stored
2fd70 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
2fd80 20 49 66 20 6e 6f 20 70 61 67 65 20 6d 6f 76 65   If no page move
2fd90 6d 65 6e 74 20 77 61 73 20 72 65 71 75 69 72 65  ment was require
2fda0 64 20 28 62 65 63 61 75 73 65 20 74 68 65 0a 2a  d (because the.*
2fdb0 2a 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  * table being dr
2fdc0 6f 70 70 65 64 20 77 61 73 20 61 6c 72 65 61 64  opped was alread
2fdd0 79 20 74 68 65 20 6c 61 73 74 20 6f 6e 65 20 69  y the last one i
2fde0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 29 20  n the database) 
2fdf0 74 68 65 6e 20 61 20 0a 2a 2a 20 7a 65 72 6f 20  then a .** zero 
2fe00 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
2fe10 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 41 55  ister P2.  If AU
2fe20 54 4f 56 41 43 55 55 4d 20 69 73 20 64 69 73 61  TOVACUUM is disa
2fe30 62 6c 65 64 20 74 68 65 6e 20 61 20 7a 65 72 6f  bled then a zero
2fe40 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69   .** is stored i
2fe50 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
2fe60 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
2fe70 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72   throws an error
2fe80 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2fe90 79 20 61 63 74 69 76 65 20 72 65 61 64 65 72 20  y active reader 
2fea0 56 4d 73 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  VMs when.** it i
2feb0 73 20 69 6e 76 6f 6b 65 64 2e 20 54 68 69 73 20  s invoked. This 
2fec0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
2fed0 20 74 68 65 20 64 69 66 66 69 63 75 6c 74 79 20   the difficulty 
2fee0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2fef0 0a 2a 2a 20 75 70 64 61 74 69 6e 67 20 65 78 69  .** updating exi
2ff00 73 74 69 6e 67 20 63 75 72 73 6f 72 73 20 77 68  sting cursors wh
2ff10 65 6e 20 61 20 72 6f 6f 74 20 70 61 67 65 20 69  en a root page i
2ff20 73 20 6d 6f 76 65 64 20 69 6e 20 61 6e 20 41 55  s moved in an AU
2ff30 54 4f 56 41 43 55 55 4d 20 0a 2a 2a 20 64 61 74  TOVACUUM .** dat
2ff40 61 62 61 73 65 2e 20 54 68 69 73 20 65 72 72 6f  abase. This erro
2ff50 72 20 69 73 20 74 68 72 6f 77 6e 20 65 76 65 6e  r is thrown even
2ff60 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2ff70 20 69 73 20 6e 6f 74 20 61 6e 20 41 55 54 4f 56   is not an AUTOV
2ff80 41 43 55 55 4d 20 0a 2a 2a 20 64 62 20 69 6e 20  ACUUM .** db in 
2ff90 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 69  order to avoid i
2ffa0 6e 74 72 6f 64 75 63 69 6e 67 20 61 6e 20 69 6e  ntroducing an in
2ffb0 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 62 65  compatibility be
2ffc0 74 77 65 65 6e 20 61 75 74 6f 76 61 63 75 75 6d  tween autovacuum
2ffd0 20 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 2d 61 75 74   .** and non-aut
2ffe0 6f 76 61 63 75 75 6d 20 6d 6f 64 65 73 2e 0a 2a  ovacuum modes..*
2fff0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43  *.** See also: C
30000 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lear.*/.case OP_
30010 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20 20 2f  Destroy: {     /
30020 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20  * out2 */.  int 
30030 69 4d 6f 76 65 64 3b 0a 20 20 69 6e 74 20 69 44  iMoved;.  int iD
30040 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b;..  sqlite3Vdb
30050 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65  eIncrWriteCounte
30060 72 28 70 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  r(p, 0);.  asser
30070 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  t( p->readOnly==
30080 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
30090 4f 70 2d 3e 70 31 3e 31 20 29 3b 0a 20 20 70 4f  Op->p1>1 );.  pO
300a0 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
300b0 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
300c0 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
300d0 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 64 62 2d  _Null;.  if( db-
300e0 3e 6e 56 64 62 65 52 65 61 64 20 3e 20 64 62 2d  >nVdbeRead > db-
300f0 3e 6e 56 44 65 73 74 72 6f 79 2b 31 20 29 7b 0a  >nVDestroy+1 ){.
30100 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30110 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 70 2d 3e 65  LOCKED;.    p->e
30120 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
30130 41 62 6f 72 74 3b 0a 20 20 20 20 67 6f 74 6f 20  Abort;.    goto 
30140 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
30150 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  or;.  }else{.   
30160 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a   iDb = pOp->p3;.
30170 20 20 20 20 61 73 73 65 72 74 28 20 44 62 4d 61      assert( DbMa
30180 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
30190 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a 20 20 20  ask, iDb) );.   
301a0 20 69 4d 6f 76 65 64 20 3d 20 30 3b 20 20 2f 2a   iMoved = 0;  /*
301b0 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f 6e   Not needed.  On
301c0 6c 79 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20  ly to silence a 
301d0 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  warning. */.    
301e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
301f0 65 44 72 6f 70 54 61 62 6c 65 28 64 62 2d 3e 61  eDropTable(db->a
30200 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 70 4f 70  Db[iDb].pBt, pOp
30210 2d 3e 70 31 2c 20 26 69 4d 6f 76 65 64 29 3b 0a  ->p1, &iMoved);.
30220 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20      pOut->flags 
30230 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
30240 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f 76 65  Out->u.i = iMove
30250 64 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  d;.    if( rc ) 
30260 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
30270 6f 5f 65 72 72 6f 72 3b 0a 23 69 66 6e 64 65 66  o_error;.#ifndef
30280 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30290 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
302a0 69 4d 6f 76 65 64 21 3d 30 20 29 7b 0a 20 20 20  iMoved!=0 ){.   
302b0 20 20 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61     sqlite3RootPa
302c0 67 65 4d 6f 76 65 64 28 64 62 2c 20 69 44 62 2c  geMoved(db, iDb,
302d0 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e 70 31   iMoved, pOp->p1
302e0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20  );.      /* All 
302f0 4f 50 5f 44 65 73 74 72 6f 79 20 6f 70 65 72 61  OP_Destroy opera
30300 74 69 6f 6e 73 20 6f 63 63 75 72 20 6f 6e 20 74  tions occur on t
30310 68 65 20 73 61 6d 65 20 62 74 72 65 65 20 2a 2f  he same btree */
30320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
30330 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c  esetSchemaOnFaul
30340 74 3d 3d 30 20 7c 7c 20 72 65 73 65 74 53 63 68  t==0 || resetSch
30350 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 69 44 62 2b  emaOnFault==iDb+
30360 31 20 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  1 );.      reset
30370 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20  SchemaOnFault = 
30380 69 44 62 2b 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  iDb+1;.    }.#en
30390 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  dif.  }.  break;
303a0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
303b0 6c 65 61 72 20 50 31 20 50 32 20 50 33 0a 2a 2a  lear P1 P2 P3.**
303c0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63  .** Delete all c
303d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
303e0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
303f0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f   index whose roo
30400 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20 74 68 65  t page.** in the
30410 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
30420 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 20 20  s given by P1.  
30430 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44 65 73 74  But, unlike Dest
30440 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72  roy, do not.** r
30450 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
30460 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  or index from th
30470 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30480 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
30490 20 62 65 69 6e 67 20 63 6c 65 61 72 20 69 73 20   being clear is 
304a0 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
304b0 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d  base file if P2=
304c0 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31  =0.  If.** P2==1
304d0 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   then the table 
304e0 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20 69  to be clear is i
304f0 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
30500 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
30510 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
30520 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72   store tables cr
30530 65 61 74 65 20 75 73 69 6e 67 20 43 52 45 41 54  eate using CREAT
30540 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c  E TEMPORARY TABL
30550 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
30560 50 33 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  P3 value is non-
30570 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 74  zero, then the t
30580 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
30590 20 6d 75 73 74 20 62 65 20 61 6e 0a 2a 2a 20 69   must be an.** i
305a0 6e 74 6b 65 79 20 74 61 62 6c 65 20 28 61 6e 20  ntkey table (an 
305b0 53 51 4c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  SQL table, not a
305c0 6e 20 69 6e 64 65 78 29 2e 20 49 6e 20 74 68 69  n index). In thi
305d0 73 20 63 61 73 65 20 74 68 65 20 72 6f 77 20 63  s case the row c
305e0 68 61 6e 67 65 20 0a 2a 2a 20 63 6f 75 6e 74 20  hange .** count 
305f0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
30600 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
30610 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
30620 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e  e being cleared.
30630 20 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 67 72   .** If P3 is gr
30640 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
30650 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
30660 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
30670 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 6c 73 6f  er P3 is.** also
30680 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
30690 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
306a0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
306b0 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e 0a 2a  being cleared..*
306c0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 44  *.** See also: D
306d0 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f  estroy.*/.case O
306e0 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20 69 6e 74  P_Clear: {.  int
306f0 20 6e 43 68 61 6e 67 65 3b 0a 20 0a 20 20 73 71   nChange;. .  sq
30700 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69  lite3VdbeIncrWri
30710 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b  teCounter(p, 0);
30720 0a 20 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  .  nChange = 0;.
30730 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
30740 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
30750 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
30760 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70  (p->btreeMask, p
30770 4f 70 2d 3e 70 32 29 20 29 3b 0a 20 20 72 63 20  Op->p2) );.  rc 
30780 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
30790 65 61 72 54 61 62 6c 65 28 0a 20 20 20 20 20 20  earTable(.      
307a0 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 32 5d  db->aDb[pOp->p2]
307b0 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 28  .pBt, pOp->p1, (
307c0 70 4f 70 2d 3e 70 33 20 3f 20 26 6e 43 68 61 6e  pOp->p3 ? &nChan
307d0 67 65 20 3a 20 30 29 0a 20 20 29 3b 0a 20 20 69  ge : 0).  );.  i
307e0 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20  f( pOp->p3 ){.  
307f0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 2b 3d 20    p->nChange += 
30800 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 69 66 28  nChange;.    if(
30810 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20 20   pOp->p3>0 ){.  
30820 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
30830 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70  sValid(&aMem[pOp
30840 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20  ->p3]) );.      
30850 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
30860 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  (p, &aMem[pOp->p
30870 33 5d 29 3b 0a 20 20 20 20 20 20 61 4d 65 6d 5b  3]);.      aMem[
30880 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b 3d 20  pOp->p3].u.i += 
30890 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 20  nChange;.    }. 
308a0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
308b0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
308c0 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
308d0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  }../* Opcode: Re
308e0 73 65 74 53 6f 72 74 65 72 20 50 31 20 2a 20 2a  setSorter P1 * *
308f0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74   * *.**.** Delet
30900 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 66  e all contents f
30910 72 6f 6d 20 74 68 65 20 65 70 68 65 6d 65 72 61  rom the ephemera
30920 6c 20 74 61 62 6c 65 20 6f 72 20 73 6f 72 74 65  l table or sorte
30930 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6f 70 65  r.** that is ope
30940 6e 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 0a  n on cursor P1..
30950 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
30960 65 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  e only works for
30970 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 66 6f   cursors used fo
30980 72 20 73 6f 72 74 69 6e 67 20 61 6e 64 0a 2a 2a  r sorting and.**
30990 20 6f 70 65 6e 65 64 20 77 69 74 68 20 4f 50 5f   opened with OP_
309a0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 72  OpenEphemeral or
309b0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2e 0a   OP_SorterOpen..
309c0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74  */.case OP_Reset
309d0 53 6f 72 74 65 72 3a 20 7b 0a 20 20 56 64 62 65  Sorter: {.  Vdbe
309e0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 0a 20 20  Cursor *pC;. .  
309f0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
30a00 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
30a10 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
30a20 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
30a30 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
30a40 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  pC!=0 );.  if( i
30a50 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20  sSorter(pC) ){. 
30a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
30a70 72 74 65 72 52 65 73 65 74 28 64 62 2c 20 70 43  rterReset(db, pC
30a80 2d 3e 75 63 2e 70 53 6f 72 74 65 72 29 3b 0a 20  ->uc.pSorter);. 
30a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
30aa0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
30ab0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
30ac0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
30ad0 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29  C->isEphemeral )
30ae0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
30af0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
30b00 65 4f 66 43 75 72 73 6f 72 28 70 43 2d 3e 75 63  eOfCursor(pC->uc
30b10 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  .pCursor);.    i
30b20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
30b30 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
30b40 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
30b50 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61  ./* Opcode: Crea
30b60 74 65 42 74 72 65 65 20 50 31 20 50 32 20 50 33  teBtree P1 P2 P3
30b70 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
30b80 3a 20 72 5b 50 32 5d 3d 72 6f 6f 74 20 69 44 62  : r[P2]=root iDb
30b90 3d 50 31 20 66 6c 61 67 73 3d 50 33 0a 2a 2a 0a  =P1 flags=P3.**.
30ba0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
30bb0 77 20 62 2d 74 72 65 65 20 69 6e 20 74 68 65 20  w b-tree in the 
30bc0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
30bd0 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69  le if P1==0 or i
30be0 6e 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 64 61  n the.** TEMP da
30bf0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
30c00 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74  1==1 or in an at
30c10 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
30c20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 54 68 65  if.** P1>1.  The
30c30 20 50 33 20 61 72 67 75 6d 65 6e 74 20 6d 75 73   P3 argument mus
30c40 74 20 62 65 20 31 20 28 42 54 52 45 45 5f 49 4e  t be 1 (BTREE_IN
30c50 54 4b 45 59 29 20 66 6f 72 20 61 20 72 6f 77 69  TKEY) for a rowi
30c60 64 20 74 61 62 6c 65 0a 2a 2a 20 69 74 20 6d 75  d table.** it mu
30c70 73 74 20 62 65 20 32 20 28 42 54 52 45 45 5f 42  st be 2 (BTREE_B
30c80 4c 4f 42 4b 45 59 29 20 66 6f 72 20 61 6e 20 69  LOBKEY) for an i
30c90 6e 64 65 78 20 6f 72 20 57 49 54 48 4f 55 54 20  ndex or WITHOUT 
30ca0 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 2a 2a 20  ROWID table..** 
30cb0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  The root page nu
30cc0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
30cd0 62 2d 74 72 65 65 20 69 73 20 73 74 6f 72 65 64  b-tree is stored
30ce0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
30cf0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65 61  .*/.case OP_Crea
30d00 74 65 42 74 72 65 65 3a 20 7b 20 20 20 20 20 20  teBtree: {      
30d10 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
30d20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 44 62 20   int pgno;.  Db 
30d30 2a 70 44 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33  *pDb;..  sqlite3
30d40 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75  VdbeIncrWriteCou
30d50 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20 20 70 4f  nter(p, 0);.  pO
30d60 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
30d70 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
30d80 67 6e 6f 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  gno = 0;.  asser
30d90 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45  t( pOp->p3==BTRE
30da0 45 5f 49 4e 54 4b 45 59 20 7c 7c 20 70 4f 70 2d  E_INTKEY || pOp-
30db0 3e 70 33 3d 3d 42 54 52 45 45 5f 42 4c 4f 42 4b  >p3==BTREE_BLOBK
30dc0 45 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EY );.  assert( 
30dd0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
30de0 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
30df0 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
30e00 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61  kTest(p->btreeMa
30e10 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a  sk, pOp->p1) );.
30e20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
30e30 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44  dOnly==0 );.  pD
30e40 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70  b = &db->aDb[pOp
30e50 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
30e60 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a   pDb->pBt!=0 );.
30e70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
30e80 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
30e90 44 62 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20  Db->pBt, &pgno, 
30ea0 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 69 66 28 20  pOp->p3);.  if( 
30eb0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
30ec0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
30ed0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f  pOut->u.i = pgno
30ee0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
30ef0 20 4f 70 63 6f 64 65 3a 20 53 71 6c 45 78 65 63   Opcode: SqlExec
30f00 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
30f10 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74  * Run the SQL st
30f20 61 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74 65  atement or state
30f30 6d 65 6e 74 73 20 73 70 65 63 69 66 69 65 64 20  ments specified 
30f40 69 6e 20 74 68 65 20 50 34 20 73 74 72 69 6e 67  in the P4 string
30f50 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 71 6c  ..*/.case OP_Sql
30f60 45 78 65 63 3a 20 7b 0a 20 20 73 71 6c 69 74 65  Exec: {.  sqlite
30f70 33 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f  3VdbeIncrWriteCo
30f80 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20 20 64  unter(p, 0);.  d
30f90 62 2d 3e 6e 53 71 6c 45 78 65 63 2b 2b 3b 0a 20  b->nSqlExec++;. 
30fa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
30fb0 65 63 28 64 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a  ec(db, pOp->p4.z
30fc0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62  , 0, 0, 0);.  db
30fd0 2d 3e 6e 53 71 6c 45 78 65 63 2d 2d 3b 0a 20 20  ->nSqlExec--;.  
30fe0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
30ff0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
31000 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
31010 20 4f 70 63 6f 64 65 3a 20 50 61 72 73 65 53 63   Opcode: ParseSc
31020 68 65 6d 61 20 50 31 20 2a 20 2a 20 50 34 20 2a  hema P1 * * P4 *
31030 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20  .**.** Read and 
31040 70 61 72 73 65 20 61 6c 6c 20 65 6e 74 72 69 65  parse all entrie
31050 73 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54  s from the SQLIT
31060 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
31070 66 20 64 61 74 61 62 61 73 65 20 50 31 0a 2a 2a  f database P1.**
31080 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
31090 57 48 45 52 45 20 63 6c 61 75 73 65 20 50 34 2e  WHERE clause P4.
310a0 20 20 49 66 20 50 34 20 69 73 20 61 20 4e 55 4c    If P4 is a NUL
310b0 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 6e 20  L pointer, then 
310c0 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 73 63  the.** entire sc
310d0 68 65 6d 61 20 66 6f 72 20 50 31 20 69 73 20 72  hema for P1 is r
310e0 65 70 61 72 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eparsed..**.** T
310f0 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b  his opcode invok
31100 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  es the parser to
31110 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
31120 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a  rtual machine,.*
31130 2a 20 74 68 65 6e 20 72 75 6e 73 20 74 68 65 20  * then runs the 
31140 6e 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68  new virtual mach
31150 69 6e 65 2e 20 20 49 74 20 69 73 20 74 68 75 73  ine.  It is thus
31160 20 61 20 72 65 2d 65 6e 74 72 61 6e 74 20 6f 70   a re-entrant op
31170 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  code..*/.case OP
31180 5f 50 61 72 73 65 53 63 68 65 6d 61 3a 20 7b 0a  _ParseSchema: {.
31190 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 63 6f 6e    int iDb;.  con
311a0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
311b0 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
311c0 20 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44    InitData initD
311d0 61 74 61 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 70  ata;..  /* Any p
311e0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
311f0 74 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 74  t that invokes t
31200 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  his opcode will 
31210 68 6f 6c 64 20 6d 75 74 65 78 65 73 0a 20 20 2a  hold mutexes.  *
31220 2a 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  * on every btree
31230 2e 20 20 54 68 69 73 20 69 73 20 61 20 70 72 65  .  This is a pre
31240 72 65 71 75 69 73 69 74 65 20 66 6f 72 20 69 6e  requisite for in
31250 76 6f 6b 69 6e 67 20 0a 20 20 2a 2a 20 73 71 6c  voking .  ** sql
31260 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b  ite3InitCallback
31270 28 29 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ()..  */.#ifdef 
31280 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
31290 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
312a0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
312b0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
312c0 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  1 || sqlite3Btre
312d0 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e  eHoldsMutex(db->
312e0 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b  aDb[iDb].pBt) );
312f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
31300 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  Db = pOp->p1;.  
31310 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
31320 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
31330 0a 20 20 61 73 73 65 72 74 28 20 44 62 48 61 73  .  assert( DbHas
31340 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
31350 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
31360 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  d) );..#ifndef S
31370 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
31380 54 41 42 4c 45 0a 20 20 69 66 28 20 70 4f 70 2d  TABLE.  if( pOp-
31390 3e 70 34 2e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  >p4.z==0 ){.    
313a0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
313b0 61 72 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ar(db->aDb[iDb].
313c0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 64 62  pSchema);.    db
313d0 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44  ->mDbFlags &= ~D
313e0 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77  BFLAG_SchemaKnow
313f0 6e 4f 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  nOk;.    rc = sq
31400 6c 69 74 65 33 49 6e 69 74 4f 6e 65 28 64 62 2c  lite3InitOne(db,
31410 20 69 44 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73   iDb, &p->zErrMs
31420 67 2c 20 49 4e 49 54 46 4c 41 47 5f 41 6c 74 65  g, INITFLAG_Alte
31430 72 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d  rTable);.    db-
31440 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
31450 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
31460 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  ;.    p->expired
31470 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 0a 23 65   = 0;.  }else.#e
31480 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 7a 4d 61  ndif.  {.    zMa
31490 73 74 65 72 20 3d 20 4d 41 53 54 45 52 5f 4e 41  ster = MASTER_NA
314a0 4d 45 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61  ME;.    initData
314b0 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 6e  .db = db;.    in
314c0 69 74 44 61 74 61 2e 69 44 62 20 3d 20 69 44 62  itData.iDb = iDb
314d0 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e 70  ;.    initData.p
314e0 7a 45 72 72 4d 73 67 20 3d 20 26 70 2d 3e 7a 45  zErrMsg = &p->zE
314f0 72 72 4d 73 67 3b 0a 20 20 20 20 69 6e 69 74 44  rrMsg;.    initD
31500 61 74 61 2e 6d 49 6e 69 74 46 6c 61 67 73 20 3d  ata.mInitFlags =
31510 20 30 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73   0;.    zSql = s
31520 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
31530 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
31540 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c   name, rootpage,
31550 20 73 71 6c 20 46 52 4f 4d 20 27 25 71 27 2e 25   sql FROM '%q'.%
31560 73 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52  s WHERE %s ORDER
31570 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
31580 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
31590 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61 73 74 65  zDbSName, zMaste
315a0 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  r, pOp->p4.z);. 
315b0 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
315c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
315d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
315e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
315f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
31600 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
31610 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79     db->init.busy
31620 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 69 74   = 1;.      init
31630 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49 54 45  Data.rc = SQLITE
31640 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 69 74 44  _OK;.      initD
31650 61 74 61 2e 6e 49 6e 69 74 52 6f 77 20 3d 20 30  ata.nInitRow = 0
31660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31670 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
31680 64 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  d );.      rc = 
31690 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
316a0 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e   zSql, sqlite3In
316b0 69 74 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69  itCallback, &ini
316c0 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20  tData, 0);.     
316d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
316e0 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44 61  OK ) rc = initDa
316f0 74 61 2e 72 63 3b 0a 20 20 20 20 20 20 69 66 28  ta.rc;.      if(
31700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31710 26 20 69 6e 69 74 44 61 74 61 2e 6e 49 6e 69 74  & initData.nInit
31720 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Row==0 ){.      
31730 20 20 2f 2a 20 54 68 65 20 4f 50 5f 50 61 72 73    /* The OP_Pars
31740 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 20 77  eSchema opcode w
31750 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 50  ith a non-NULL P
31760 34 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  4 argument shoul
31770 64 20 70 61 72 73 65 0a 20 20 20 20 20 20 20 20  d parse.        
31780 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
31790 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 41  SQL statement. A
317a0 6e 79 20 6c 65 73 73 20 74 68 61 6e 20 74 68 61  ny less than tha
317b0 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
317c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
317d0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
317e0 62 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ble is corrupt. 
317f0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
31800 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31810 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
31820 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
31830 4e 4e 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20  NN(db, zSql);.  
31840 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
31850 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 0;.    }.  }
31860 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
31870 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
31880 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
31890 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ion(db);.    if(
318a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
318b0 4d 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  M ){.      goto 
318c0 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
318d0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
318e0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
318f0 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 0a 23 69 66   break;  .}..#if
31900 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
31910 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 0a 2f  _OMIT_ANALYZE)./
31920 2a 20 4f 70 63 6f 64 65 3a 20 4c 6f 61 64 41 6e  * Opcode: LoadAn
31930 61 6c 79 73 69 73 20 50 31 20 2a 20 2a 20 2a 20  alysis P1 * * * 
31940 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  *.**.** Read the
31950 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
31960 62 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  ble for database
31970 20 50 31 20 61 6e 64 20 6c 6f 61 64 20 74 68 65   P1 and load the
31980 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74   content.** of t
31990 68 61 74 20 74 61 62 6c 65 20 69 6e 74 6f 20 74  hat table into t
319a0 68 65 20 69 6e 74 65 72 6e 61 6c 20 69 6e 64 65  he internal inde
319b0 78 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 54  x hash table.  T
319c0 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 2a  his will cause.*
319d0 2a 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 74  * the analysis t
319e0 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 70  o be used when p
319f0 72 65 70 61 72 69 6e 67 20 61 6c 6c 20 73 75 62  reparing all sub
31a00 73 65 71 75 65 6e 74 20 71 75 65 72 69 65 73 2e  sequent queries.
31a10 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 6f 61 64  .*/.case OP_Load
31a20 41 6e 61 6c 79 73 69 73 3a 20 7b 0a 20 20 61 73  Analysis: {.  as
31a30 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
31a40 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e   && pOp->p1<db->
31a50 6e 44 62 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  nDb );.  rc = sq
31a60 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61  lite3AnalysisLoa
31a70 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a  d(db, pOp->p1);.
31a80 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
31a90 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
31aa0 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d  or;.  break;  .}
31ab0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
31ac0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
31ad0 41 4e 41 4c 59 5a 45 29 20 2a 2f 0a 0a 2f 2a 20  ANALYZE) */../* 
31ae0 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 61 62 6c  Opcode: DropTabl
31af0 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  e P1 * * P4 *.**
31b00 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
31b10 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f  nternal (in-memo
31b20 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74 75  ry) data structu
31b30 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62  res that describ
31b40 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  e.** the table n
31b50 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61 62  amed P4 in datab
31b60 61 73 65 20 50 31 2e 20 20 54 68 69 73 20 69 73  ase P1.  This is
31b70 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
31b80 74 61 62 6c 65 0a 2a 2a 20 69 73 20 64 72 6f 70  table.** is drop
31b90 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 75  ped from disk (u
31ba0 73 69 6e 67 20 74 68 65 20 44 65 73 74 72 6f 79  sing the Destroy
31bb0 20 6f 70 63 6f 64 65 29 20 69 6e 20 6f 72 64 65   opcode) in orde
31bc0 72 20 74 6f 20 6b 65 65 70 20 0a 2a 2a 20 74 68  r to keep .** th
31bd0 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65  e internal repre
31be0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
31bf0 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69  .** schema consi
31c00 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74 20  stent with what 
31c10 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63  is on disk..*/.c
31c20 61 73 65 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  ase OP_DropTable
31c30 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  : {.  sqlite3Vdb
31c40 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65  eIncrWriteCounte
31c50 72 28 70 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  r(p, 0);.  sqlit
31c60 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
31c70 65 54 61 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e  eTable(db, pOp->
31c80 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
31c90 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
31ca0 70 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64 65 78  pcode: DropIndex
31cb0 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
31cc0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e  ** Remove the in
31cd0 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72  ternal (in-memor
31ce0 79 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72  y) data structur
31cf0 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  es that describe
31d00 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6e 61  .** the index na
31d10 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61  med P4 in databa
31d20 73 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20  se P1.  This is 
31d30 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
31d40 69 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70  index.** is drop
31d50 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 75  ped from disk (u
31d60 73 69 6e 67 20 74 68 65 20 44 65 73 74 72 6f 79  sing the Destroy
31d70 20 6f 70 63 6f 64 65 29 0a 2a 2a 20 69 6e 20 6f   opcode).** in o
31d80 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
31d90 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
31da0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
31db0 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73  ** schema consis
31dc0 74 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69  tent with what i
31dd0 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61  s on disk..*/.ca
31de0 73 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 3a  se OP_DropIndex:
31df0 20 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   {.  sqlite3Vdbe
31e00 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72  IncrWriteCounter
31e10 28 70 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  (p, 0);.  sqlite
31e20 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
31e30 49 6e 64 65 78 28 64 62 2c 20 70 4f 70 2d 3e 70  Index(db, pOp->p
31e40 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
31e50 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
31e60 63 6f 64 65 3a 20 44 72 6f 70 54 72 69 67 67 65  code: DropTrigge
31e70 72 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  r P1 * * P4 *.**
31e80 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
31e90 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f  nternal (in-memo
31ea0 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74 75  ry) data structu
31eb0 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62  res that describ
31ec0 65 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  e.** the trigger
31ed0 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74   named P4 in dat
31ee0 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20  abase P1.  This 
31ef0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
31f00 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69 73 20  a trigger.** is 
31f10 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73  dropped from dis
31f20 6b 20 28 75 73 69 6e 67 20 74 68 65 20 44 65 73  k (using the Des
31f30 74 72 6f 79 20 6f 70 63 6f 64 65 29 20 69 6e 20  troy opcode) in 
31f40 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a  order to keep .*
31f50 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  * the internal r
31f60 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
31f70 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63   the.** schema c
31f80 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77  onsistent with w
31f90 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a  hat is on disk..
31fa0 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54  */.case OP_DropT
31fb0 72 69 67 67 65 72 3a 20 7b 0a 20 20 73 71 6c 69  rigger: {.  sqli
31fc0 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74 65  te3VdbeIncrWrite
31fd0 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20  Counter(p, 0);. 
31fe0 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
31ff0 64 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64  dDeleteTrigger(d
32000 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  b, pOp->p1, pOp-
32010 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b  >p4.z);.  break;
32020 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
32030 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
32040 54 59 5f 43 48 45 43 4b 0a 2f 2a 20 4f 70 63 6f  TY_CHECK./* Opco
32050 64 65 3a 20 49 6e 74 65 67 72 69 74 79 43 6b 20  de: IntegrityCk 
32060 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
32070 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79  *.** Do an analy
32080 73 69 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  sis of the curre
32090 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61  ntly open databa
320a0 73 65 2e 20 20 53 74 6f 72 65 20 69 6e 0a 2a 2a  se.  Store in.**
320b0 20 72 65 67 69 73 74 65 72 20 50 31 20 74 68 65   register P1 the
320c0 20 74 65 78 74 20 6f 66 20 61 6e 20 65 72 72 6f   text of an erro
320d0 72 20 6d 65 73 73 61 67 65 20 64 65 73 63 72 69  r message descri
320e0 62 69 6e 67 20 61 6e 79 20 70 72 6f 62 6c 65 6d  bing any problem
320f0 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70 72 6f 62  s..** If no prob
32100 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2c 20  lems are found, 
32110 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20  store a NULL in 
32120 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a  register P1..**.
32130 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72 20  ** The register 
32140 50 33 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  P3 contains one 
32150 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6d 61  less than the ma
32160 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
32170 61 6c 6c 6f 77 65 64 20 65 72 72 6f 72 73 2e 0a  allowed errors..
32180 2a 2a 20 41 74 20 6d 6f 73 74 20 72 65 67 28 50  ** At most reg(P
32190 33 29 20 65 72 72 6f 72 73 20 77 69 6c 6c 20 62  3) errors will b
321a0 65 20 72 65 70 6f 72 74 65 64 2e 0a 2a 2a 20 49  e reported..** I
321b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
321c0 68 65 20 61 6e 61 6c 79 73 69 73 20 73 74 6f 70  he analysis stop
321d0 73 20 61 73 20 73 6f 6f 6e 20 61 73 20 72 65 67  s as soon as reg
321e0 28 50 31 29 20 65 72 72 6f 72 73 20 61 72 65 20  (P1) errors are 
321f0 0a 2a 2a 20 73 65 65 6e 2e 20 20 52 65 67 28 50  .** seen.  Reg(P
32200 31 29 20 69 73 20 75 70 64 61 74 65 64 20 77 69  1) is updated wi
32210 74 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  th the number of
32220 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e   errors remainin
32230 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f  g..**.** The roo
32240 74 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6f  t page numbers o
32250 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  f all tables in 
32260 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
32270 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 73 74 6f   integers.** sto
32280 72 65 64 20 69 6e 20 50 34 5f 49 4e 54 41 52 52  red in P4_INTARR
32290 41 59 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  AY argument..**.
322a0 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20  ** If P5 is not 
322b0 7a 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b 20  zero, the check 
322c0 69 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20 61  is done on the a
322d0 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
322e0 65 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20 74  e.** file, not t
322f0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
32300 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
32310 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  s opcode is used
32320 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
32330 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  e integrity_chec
32340 6b 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61 73  k pragma..*/.cas
32350 65 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b  e OP_IntegrityCk
32360 3a 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 3b  : {.  int nRoot;
32370 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
32380 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68 65  of tables to che
32390 63 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66 20  ck.  (Number of 
323a0 72 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f 0a  root pages.) */.
323b0 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20    int *aRoot;   
323c0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f    /* Array of ro
323d0 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20 66  otpage numbers f
323e0 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  or tables to be 
323f0 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  checked */.  int
32400 20 6e 45 72 72 3b 20 20 20 20 20 20 20 2f 2a 20   nErr;       /* 
32410 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
32420 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 63   reported */.  c
32430 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f  har *z;        /
32440 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 65 72  * Text of the er
32450 72 6f 72 20 72 65 70 6f 72 74 20 2a 2f 0a 20 20  ror report */.  
32460 4d 65 6d 20 2a 70 6e 45 72 72 3b 20 20 20 20 20  Mem *pnErr;     
32470 2f 2a 20 52 65 67 69 73 74 65 72 20 6b 65 65 70  /* Register keep
32480 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 65 72 72  ing track of err
32490 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f  ors remaining */
324a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ..  assert( p->b
324b0 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 6e 52  IsReader );.  nR
324c0 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  oot = pOp->p2;. 
324d0 20 61 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70 34   aRoot = pOp->p4
324e0 2e 61 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  .ai;.  assert( n
324f0 52 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  Root>0 );.  asse
32500 72 74 28 20 61 52 6f 6f 74 5b 30 5d 3d 3d 6e 52  rt( aRoot[0]==nR
32510 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oot );.  assert(
32520 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f   pOp->p3>0 && pO
32530 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p3<=(p->nMem+
32540 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
32550 29 3b 0a 20 20 70 6e 45 72 72 20 3d 20 26 61 4d  );.  pnErr = &aM
32560 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
32570 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66  ssert( (pnErr->f
32580 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
32590 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
325a0 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20  (pnErr->flags & 
325b0 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
325c0 62 29 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  b))==0 );.  pIn1
325d0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
325e0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ];.  assert( pOp
325f0 2d 3e 70 35 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p5<db->nDb );.
32600 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
32610 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  Test(p->btreeMas
32620 6b 2c 20 70 4f 70 2d 3e 70 35 29 20 29 3b 0a 20  k, pOp->p5) );. 
32630 20 7a 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   z = sqlite3Btre
32640 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  eIntegrityCheck(
32650 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 35 5d  db->aDb[pOp->p5]
32660 2e 70 42 74 2c 20 26 61 52 6f 6f 74 5b 31 5d 2c  .pBt, &aRoot[1],
32670 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20 20   nRoot,.        
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32690 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 6e           (int)pn
326a0 45 72 72 2d 3e 75 2e 69 2b 31 2c 20 26 6e 45 72  Err->u.i+1, &nEr
326b0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
326c0 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31  eMemSetNull(pIn1
326d0 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d 30  );.  if( nErr==0
326e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
326f0 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20  z==0 );.  }else 
32700 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
32710 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
32720 65 6c 73 65 7b 0a 20 20 20 20 70 6e 45 72 72 2d  else{.    pnErr-
32730 3e 75 2e 69 20 2d 3d 20 6e 45 72 72 2d 31 3b 0a  >u.i -= nErr-1;.
32740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
32750 65 6d 53 65 74 53 74 72 28 70 49 6e 31 2c 20 7a  emSetStr(pIn1, z
32760 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
32770 38 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  8, sqlite3_free)
32780 3b 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d  ;.  }.  UPDATE_M
32790 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31  AX_BLOBSIZE(pIn1
327a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
327b0 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
327c0 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  In1, encoding);.
327d0 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
327e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
327f0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
32800 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20   */../* Opcode: 
32810 52 6f 77 53 65 74 41 64 64 20 50 31 20 50 32 20  RowSetAdd P1 P2 
32820 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
32830 73 3a 20 72 6f 77 73 65 74 28 50 31 29 3d 72 5b  s: rowset(P1)=r[
32840 50 32 5d 0a 2a 2a 0a 2a 2a 20 49 6e 73 65 72 74  P2].**.** Insert
32850 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
32860 75 65 20 68 65 6c 64 20 62 79 20 72 65 67 69 73  ue held by regis
32870 74 65 72 20 50 32 20 69 6e 74 6f 20 61 20 52 6f  ter P2 into a Ro
32880 77 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 68  wSet object.** h
32890 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  eld in register 
328a0 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 73 73  P1..**.** An ass
328b0 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
328c0 50 32 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  P2 is not an int
328d0 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  eger..*/.case OP
328e0 5f 52 6f 77 53 65 74 41 64 64 3a 20 7b 20 20 20  _RowSetAdd: {   
328f0 20 20 20 20 2f 2a 20 69 6e 31 2c 20 69 6e 32 20      /* in1, in2 
32900 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
32910 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
32920 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
32930 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  p2];.  assert( (
32940 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn2->flags & ME
32950 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 69  M_Int)!=0 );.  i
32960 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
32970 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20 29  & MEM_Blob)==0 )
32980 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
32990 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53 65  3VdbeMemSetRowSe
329a0 74 28 70 49 6e 31 29 20 29 20 67 6f 74 6f 20 6e  t(pIn1) ) goto n
329b0 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73  o_mem;.  }.  ass
329c0 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
329d0 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 49 6e 31  MemIsRowSet(pIn1
329e0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 6f  ) );.  sqlite3Ro
329f0 77 53 65 74 49 6e 73 65 72 74 28 28 52 6f 77 53  wSetInsert((RowS
32a00 65 74 2a 29 70 49 6e 31 2d 3e 7a 2c 20 70 49 6e  et*)pIn1->z, pIn
32a10 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61 6b  2->u.i);.  break
32a20 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
32a30 52 6f 77 53 65 74 52 65 61 64 20 50 31 20 50 32  RowSetRead P1 P2
32a40 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
32a50 73 69 73 3a 20 72 5b 50 33 5d 3d 72 6f 77 73 65  sis: r[P3]=rowse
32a60 74 28 50 31 29 0a 2a 2a 0a 2a 2a 20 45 78 74 72  t(P1).**.** Extr
32a70 61 63 74 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  act the smallest
32a80 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
32a90 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 69 6e  RowSet object in
32aa0 20 50 31 0a 2a 2a 20 61 6e 64 20 70 75 74 20 74   P1.** and put t
32ab0 68 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72  hat value into r
32ac0 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 4f  egister P3..** O
32ad0 72 2c 20 69 66 20 52 6f 77 53 65 74 20 6f 62 6a  r, if RowSet obj
32ae0 65 63 74 20 50 31 20 69 73 20 69 6e 69 74 69 61  ect P1 is initia
32af0 6c 6c 79 20 65 6d 70 74 79 2c 20 6c 65 61 76 65  lly empty, leave
32b00 20 50 33 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   P3.** unchanged
32b10 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 69 6e 73   and jump to ins
32b20 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a  truction P2..*/.
32b30 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 52 65  case OP_RowSetRe
32b40 61 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a  ad: {       /* j
32b50 75 6d 70 2c 20 69 6e 31 2c 20 6f 75 74 33 20 2a  ump, in1, out3 *
32b60 2f 0a 20 20 69 36 34 20 76 61 6c 3b 0a 0a 20 20  /.  i64 val;..  
32b70 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
32b80 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
32b90 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
32ba0 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20 7c 7c 20  MEM_Blob)==0 || 
32bb0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73  sqlite3VdbeMemIs
32bc0 52 6f 77 53 65 74 28 70 49 6e 31 29 20 29 3b 0a  RowSet(pIn1) );.
32bd0 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
32be0 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d  gs & MEM_Blob)==
32bf0 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  0 .   || sqlite3
32c00 52 6f 77 53 65 74 4e 65 78 74 28 28 52 6f 77 53  RowSetNext((RowS
32c10 65 74 2a 29 70 49 6e 31 2d 3e 7a 2c 20 26 76 61  et*)pIn1->z, &va
32c20 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  l)==0.  ){.    /
32c30 2a 20 54 68 65 20 62 6f 6f 6c 65 61 6e 20 69 6e  * The boolean in
32c40 64 65 78 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  dex is empty */.
32c50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
32c60 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29 3b  emSetNull(pIn1);
32c70 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
32c80 61 6b 65 6e 28 31 2c 32 29 3b 0a 20 20 20 20 67  aken(1,2);.    g
32c90 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61  oto jump_to_p2_a
32ca0 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  nd_check_for_int
32cb0 65 72 72 75 70 74 3b 0a 20 20 7d 65 6c 73 65 7b  errupt;.  }else{
32cc0 0a 20 20 20 20 2f 2a 20 41 20 76 61 6c 75 65 20  .    /* A value 
32cd0 77 61 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20  was pulled from 
32ce0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
32cf0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
32d00 28 30 2c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  (0,2);.    sqlit
32d10 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
32d20 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  4(&aMem[pOp->p3]
32d30 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 67 6f  , val);.  }.  go
32d40 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  to check_for_int
32d50 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70  errupt;.}../* Op
32d60 63 6f 64 65 3a 20 52 6f 77 53 65 74 54 65 73 74  code: RowSetTest
32d70 20 50 31 20 50 32 20 50 33 20 50 34 0a 2a 2a 20   P1 P2 P3 P4.** 
32d80 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50  Synopsis: if r[P
32d90 33 5d 20 69 6e 20 72 6f 77 73 65 74 28 50 31 29  3] in rowset(P1)
32da0 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52   goto P2.**.** R
32db0 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61 73  egister P3 is as
32dc0 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61 20  sumed to hold a 
32dd0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  64-bit integer v
32de0 61 6c 75 65 2e 20 49 66 20 72 65 67 69 73 74 65  alue. If registe
32df0 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  r P1.** contains
32e00 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
32e10 20 61 6e 64 20 74 68 61 74 20 52 6f 77 53 65 74   and that RowSet
32e20 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
32e30 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 68 65  .** the value he
32e40 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74  ld in P3, jump t
32e50 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 4f  o register P2. O
32e60 74 68 65 72 77 69 73 65 2c 20 69 6e 73 65 72 74  therwise, insert
32e70 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   the.** integer 
32e80 69 6e 20 50 33 20 69 6e 74 6f 20 74 68 65 20 52  in P3 into the R
32e90 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  owSet and contin
32ea0 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ue on to the.** 
32eb0 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  next opcode..**.
32ec0 2a 2a 20 54 68 65 20 52 6f 77 53 65 74 20 6f 62  ** The RowSet ob
32ed0 6a 65 63 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  ject is optimize
32ee0 64 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  d for the case w
32ef0 68 65 72 65 20 73 65 74 73 20 6f 66 20 69 6e 74  here sets of int
32f00 65 67 65 72 73 0a 2a 2a 20 61 72 65 20 69 6e 73  egers.** are ins
32f10 65 72 74 65 64 20 69 6e 20 64 69 73 74 69 6e 63  erted in distinc
32f20 74 20 70 68 61 73 65 73 2c 20 77 68 69 63 68 20  t phases, which 
32f30 65 61 63 68 20 73 65 74 20 63 6f 6e 74 61 69 6e  each set contain
32f40 73 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 73 2e  s no duplicates.
32f50 0a 2a 2a 20 45 61 63 68 20 73 65 74 20 69 73 20  .** Each set is 
32f60 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20  identified by a 
32f70 75 6e 69 71 75 65 20 50 34 20 76 61 6c 75 65 2e  unique P4 value.
32f80 20 54 68 65 20 66 69 72 73 74 20 73 65 74 0a 2a   The first set.*
32f90 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34 3d 3d  * must have P4==
32fa0 30 2c 20 74 68 65 20 66 69 6e 61 6c 20 73 65 74  0, the final set
32fb0 20 6d 75 73 74 20 68 61 76 65 20 50 34 3d 3d 2d   must have P4==-
32fc0 31 2c 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 6f  1, and for all o
32fd0 74 68 65 72 20 73 65 74 73 0a 2a 2a 20 6d 75 73  ther sets.** mus
32fe0 74 20 68 61 76 65 20 50 34 3e 30 2e 0a 2a 2a 0a  t have P4>0..**.
32ff0 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 6f  ** This allows o
33000 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a 20 28 61  ptimizations: (a
33010 29 20 77 68 65 6e 20 50 34 3d 3d 30 20 74 68 65  ) when P4==0 the
33020 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
33030 20 74 65 73 74 0a 2a 2a 20 74 68 65 20 52 6f 77   test.** the Row
33040 53 65 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 50  Set object for P
33050 33 2c 20 61 73 20 69 74 20 69 73 20 67 75 61 72  3, as it is guar
33060 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 63 6f  anteed not to co
33070 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20 28 62 29  ntain it,.** (b)
33080 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20 74 68 65   when P4==-1 the
33090 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
330a0 20 69 6e 73 65 72 74 20 74 68 65 20 76 61 6c 75   insert the valu
330b0 65 2c 20 61 73 20 69 74 20 77 69 6c 6c 0a 2a 2a  e, as it will.**
330c0 20 6e 65 76 65 72 20 62 65 20 74 65 73 74 65 64   never be tested
330d0 20 66 6f 72 2c 20 61 6e 64 20 28 63 29 20 77 68   for, and (c) wh
330e0 65 6e 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  en a value that 
330f0 69 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  is part of set X
33100 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2c   is.** inserted,
33110 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
33120 64 20 74 6f 20 73 65 61 72 63 68 20 74 6f 20 73  d to search to s
33130 65 65 20 69 66 20 74 68 65 20 73 61 6d 65 20 76  ee if the same v
33140 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70 72 65 76  alue was.** prev
33150 69 6f 75 73 6c 79 20 69 6e 73 65 72 74 65 64 20  iously inserted 
33160 61 73 20 70 61 72 74 20 6f 66 20 73 65 74 20 58  as part of set X
33170 20 28 6f 6e 6c 79 20 69 66 20 69 74 20 77 61 73   (only if it was
33180 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 69   previously.** i
33190 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20  nserted as part 
331a0 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 65  of some other se
331b0 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  t)..*/.case OP_R
331c0 6f 77 53 65 74 54 65 73 74 3a 20 7b 20 20 20 20  owSetTest: {    
331d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331e0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69   /* jump, in1, i
331f0 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 74  n3 */.  int iSet
33200 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a  ;.  int exists;.
33210 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
33220 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33  pOp->p1];.  pIn3
33230 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
33240 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70 4f 70 2d  ];.  iSet = pOp-
33250 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65 72 74 28  >p4.i;.  assert(
33260 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn3->flags&MEM
33270 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  _Int );..  /* If
33280 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
33290 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
332a0 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 69 6e  rowset object in
332b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 31 2c   memory cell P1,
332c0 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 69 74 20  .  ** delete it 
332d0 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  now and initiali
332e0 7a 65 20 50 31 20 77 69 74 68 20 61 6e 20 65 6d  ze P1 with an em
332f0 70 74 79 20 72 6f 77 73 65 74 0a 20 20 2a 2f 0a  pty rowset.  */.
33300 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
33310 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d  gs & MEM_Blob)==
33320 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
33330 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f  ite3VdbeMemSetRo
33340 77 53 65 74 28 70 49 6e 31 29 20 29 20 67 6f 74  wSet(pIn1) ) got
33350 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
33360 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
33370 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70  dbeMemIsRowSet(p
33380 49 6e 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  In1) );.  assert
33390 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
333a0 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73  4_INT32 );.  ass
333b0 65 72 74 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c  ert( iSet==-1 ||
333c0 20 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66   iSet>=0 );.  if
333d0 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 65 78  ( iSet ){.    ex
333e0 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 52 6f  ists = sqlite3Ro
333f0 77 53 65 74 54 65 73 74 28 28 52 6f 77 53 65 74  wSetTest((RowSet
33400 2a 29 70 49 6e 31 2d 3e 7a 2c 20 69 53 65 74 2c  *)pIn1->z, iSet,
33410 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 20   pIn3->u.i);.   
33420 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
33430 28 65 78 69 73 74 73 21 3d 30 2c 32 29 3b 0a 20  (exists!=0,2);. 
33440 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 20     if( exists ) 
33450 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
33460 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 65 74 3e  .  }.  if( iSet>
33470 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
33480 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 28 52  3RowSetInsert((R
33490 6f 77 53 65 74 2a 29 70 49 6e 31 2d 3e 7a 2c 20  owSet*)pIn1->z, 
334a0 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a  pIn3->u.i);.  }.
334b0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66    break;.}...#if
334c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
334d0 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63  _TRIGGER../* Opc
334e0 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20 50 31 20  ode: Program P1 
334f0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
33500 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 74 72  * Execute the tr
33510 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61  igger program pa
33520 73 73 65 64 20 61 73 20 50 34 20 28 74 79 70 65  ssed as P4 (type
33530 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e   P4_SUBPROGRAM).
33540 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61   .**.** P1 conta
33550 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ins the address 
33560 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
33570 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ll that contains
33580 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
33590 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e  y .** cell in an
335a0 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73   array of values
335b0 20 75 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e   used as argumen
335c0 74 73 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72  ts to the sub-pr
335d0 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f  ogram. P2 .** co
335e0 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65  ntains the addre
335f0 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66  ss to jump to if
33600 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
33610 20 74 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52   throws an IGNOR
33620 45 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  E .** exception 
33630 75 73 69 6e 67 20 74 68 65 20 52 41 49 53 45 28  using the RAISE(
33640 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69  ) function. Regi
33650 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73  ster P3 contains
33660 20 74 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a   the address .**
33670 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   of a memory cel
33680 6c 20 69 6e 20 74 68 69 73 20 28 74 68 65 20 70  l in this (the p
33690 61 72 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69  arent) VM that i
336a0 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
336b0 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72  te the .** memor
336c0 79 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  y required by th
336d0 65 20 73 75 62 2d 76 64 62 65 20 61 74 20 72 75  e sub-vdbe at ru
336e0 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  ntime..**.** P4 
336f0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
33700 74 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e  the VM containin
33710 67 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  g the trigger pr
33720 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
33730 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P5 is non-zero, 
33740 74 68 65 6e 20 72 65 63 75 72 73 69 76 65 20 70  then recursive p
33750 72 6f 67 72 61 6d 20 69 6e 76 6f 63 61 74 69 6f  rogram invocatio
33760 6e 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f  n is enabled..*/
33770 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67 72 61 6d  .case OP_Program
33780 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
33790 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  mp */.  int nMem
337a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
337b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
337c0 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 66 6f  ory registers fo
337d0 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
337e0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
337f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
33800 74 65 73 20 6f 66 20 72 75 6e 74 69 6d 65 20 73  tes of runtime s
33810 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
33820 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
33830 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20 20 20 20  .  Mem *pRt;    
33840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
33850 67 69 73 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61  gister to alloca
33860 74 65 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65  te runtime space
33870 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   */.  Mem *pMem;
33880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33890 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
338a0 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f 72 79 20   through memory 
338b0 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  cells */.  Mem *
338c0 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
338d0 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65 6d 6f 72     /* Last memor
338e0 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77 20 61 72  y cell in new ar
338f0 72 61 79 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ray */.  VdbeFra
33900 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20  me *pFrame;     
33910 20 2f 2a 20 4e 65 77 20 76 64 62 65 20 66 72 61   /* New vdbe fra
33920 6d 65 20 74 6f 20 65 78 65 63 75 74 65 20 69 6e  me to execute in
33930 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
33940 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20 20 2f 2a   *pProgram;   /*
33950 20 53 75 62 2d 70 72 6f 67 72 61 6d 20 74 6f 20   Sub-program to 
33960 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 76 6f 69  execute */.  voi
33970 64 20 2a 74 3b 20 20 20 20 20 20 20 20 20 20 20  d *t;           
33980 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 69 64       /* Token id
33990 65 6e 74 69 66 79 69 6e 67 20 74 72 69 67 67 65  entifying trigge
339a0 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67 72 61 6d  r */..  pProgram
339b0 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
339c0 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20 26 61 4d  ram;.  pRt = &aM
339d0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
339e0 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
339f0 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 0a 20 20 2f  >nOp>0 );.  .  /
33a00 2a 20 49 66 20 74 68 65 20 70 35 20 66 6c 61 67  * If the p5 flag
33a10 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
33a20 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61  recursive invoca
33a30 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73  tion of triggers
33a40 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c   is .  ** disabl
33a50 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73  ed for backwards
33a60 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 28   compatibility (
33a70 70 35 20 69 73 20 73 65 74 20 69 66 20 74 68 69  p5 is set if thi
33a80 73 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 20 20  s sub-program.  
33a90 2a 2a 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74  ** is really a t
33aa0 72 69 67 67 65 72 2c 20 6e 6f 74 20 61 20 66 6f  rigger, not a fo
33ab0 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e  reign key action
33ac0 2c 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20 73  , and the flag s
33ad0 65 74 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61  et.  ** and clea
33ae0 72 65 64 20 62 79 20 74 68 65 20 22 50 52 41 47  red by the "PRAG
33af0 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  MA recursive_tri
33b00 67 67 65 72 73 22 20 63 6f 6d 6d 61 6e 64 20 69  ggers" command i
33b10 73 20 63 6c 65 61 72 29 2e 0a 20 20 2a 2a 20 0a  s clear)..  ** .
33b20 20 20 2a 2a 20 49 74 20 69 73 20 72 65 63 75 72    ** It is recur
33b30 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20  sive invocation 
33b40 6f 66 20 74 72 69 67 67 65 72 73 2c 20 61 74 20  of triggers, at 
33b50 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 74  the SQL level, t
33b60 68 61 74 20 69 73 20 0a 20 20 2a 2a 20 64 69 73  hat is .  ** dis
33b70 61 62 6c 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63  abled. In some c
33b80 61 73 65 73 20 61 20 73 69 6e 67 6c 65 20 74 72  ases a single tr
33b90 69 67 67 65 72 20 6d 61 79 20 67 65 6e 65 72 61  igger may genera
33ba0 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  te more than one
33bb0 20 0a 20 20 2a 2a 20 53 75 62 50 72 6f 67 72 61   .  ** SubProgra
33bc0 6d 20 28 69 66 20 74 68 65 20 74 72 69 67 67 65  m (if the trigge
33bd0 72 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  r may be execute
33be0 64 20 77 69 74 68 20 6d 6f 72 65 20 74 68 61 6e  d with more than
33bf0 20 6f 6e 65 20 64 69 66 66 65 72 65 6e 74 20 0a   one different .
33c00 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
33c10 20 61 6c 67 6f 72 69 74 68 6d 29 2e 20 53 75 62   algorithm). Sub
33c20 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72  Program structur
33c30 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
33c40 74 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65  th a.  ** single
33c50 20 74 72 69 67 67 65 72 20 61 6c 6c 20 68 61 76   trigger all hav
33c60 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
33c70 20 66 6f 72 20 74 68 65 20 53 75 62 50 72 6f 67   for the SubProg
33c80 72 61 6d 2e 74 6f 6b 65 6e 20 0a 20 20 2a 2a 20  ram.token .  ** 
33c90 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
33ca0 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20  if( pOp->p5 ){. 
33cb0 20 20 20 74 20 3d 20 70 50 72 6f 67 72 61 6d 2d     t = pProgram-
33cc0 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28  >token;.    for(
33cd0 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
33ce0 3b 20 70 46 72 61 6d 65 20 26 26 20 70 46 72 61  ; pFrame && pFra
33cf0 6d 65 2d 3e 74 6f 6b 65 6e 21 3d 74 3b 20 70 46  me->token!=t; pF
33d00 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
33d10 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  rent);.    if( p
33d20 46 72 61 6d 65 20 29 20 62 72 65 61 6b 3b 0a 20  Frame ) break;. 
33d30 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72   }..  if( p->nFr
33d40 61 6d 65 3e 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ame>=db->aLimit[
33d50 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
33d60 47 47 45 52 5f 44 45 50 54 48 5d 20 29 7b 0a 20  GGER_DEPTH] ){. 
33d70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
33d80 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
33d90 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 74  3VdbeError(p, "t
33da0 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
33db0 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
33dc0 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ion");.    goto 
33dd0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
33de0 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  or;.  }..  /* Re
33df0 67 69 73 74 65 72 20 70 52 74 20 69 73 20 75 73  gister pRt is us
33e00 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
33e10 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20  memory required 
33e20 74 6f 20 73 61 76 65 20 74 68 65 20 73 74 61 74  to save the stat
33e30 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75  e.  ** of the cu
33e40 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 2c 20 61  rrent program, a
33e50 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  nd the memory re
33e60 71 75 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d  quired at runtim
33e70 65 20 74 6f 20 65 78 65 63 75 74 65 0a 20 20 2a  e to execute.  *
33e80 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  * the trigger pr
33e90 6f 67 72 61 6d 2e 20 49 66 20 74 68 69 73 20 74  ogram. If this t
33ea0 72 69 67 67 65 72 20 68 61 73 20 62 65 65 6e 20  rigger has been 
33eb0 66 69 72 65 64 20 62 65 66 6f 72 65 2c 20 74 68  fired before, th
33ec0 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20 69 73 20  en pRt .  ** is 
33ed0 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
33ee0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
33ef0 20 6d 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c   must be initial
33f00 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ized.  */.  if( 
33f10 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  (pRt->flags&MEM_
33f20 42 6c 6f 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Blob)==0 ){.    
33f30 2f 2a 20 53 75 62 50 72 6f 67 72 61 6d 2e 6e 4d  /* SubProgram.nM
33f40 65 6d 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  em is set to the
33f50 20 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72   number of memor
33f60 79 20 63 65 6c 6c 73 20 75 73 65 64 20 62 79 20  y cells used by 
33f70 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f 67  the .    ** prog
33f80 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 53 75  ram stored in Su
33f90 62 50 72 6f 67 72 61 6d 2e 61 4f 70 2e 20 41 73  bProgram.aOp. As
33fa0 20 77 65 6c 6c 20 61 73 20 74 68 65 73 65 2c 20   well as these, 
33fb0 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a  one memory.    *
33fc0 2a 20 63 65 6c 6c 20 69 73 20 72 65 71 75 69 72  * cell is requir
33fd0 65 64 20 66 6f 72 20 65 61 63 68 20 63 75 72 73  ed for each curs
33fe0 6f 72 20 75 73 65 64 20 62 79 20 74 68 65 20 70  or used by the p
33ff0 72 6f 67 72 61 6d 2e 20 53 65 74 20 6c 6f 63 61  rogram. Set loca
34000 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
34010 65 20 6e 4d 65 6d 20 28 61 6e 64 20 6c 61 74 65  e nMem (and late
34020 72 2c 20 56 64 62 65 46 72 61 6d 65 2e 6e 43 68  r, VdbeFrame.nCh
34030 69 6c 64 4d 65 6d 29 20 74 6f 20 74 68 69 73 20  ildMem) to this 
34040 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  value..    */.  
34050 20 20 6e 4d 65 6d 20 3d 20 70 50 72 6f 67 72 61    nMem = pProgra
34060 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72 6f 67 72  m->nMem + pProgr
34070 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 61 73  am->nCsr;.    as
34080 73 65 72 74 28 20 6e 4d 65 6d 3e 30 20 29 3b 0a  sert( nMem>0 );.
34090 20 20 20 20 69 66 28 20 70 50 72 6f 67 72 61 6d      if( pProgram
340a0 2d 3e 6e 43 73 72 3d 3d 30 20 29 20 6e 4d 65 6d  ->nCsr==0 ) nMem
340b0 2b 2b 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  ++;.    nByte = 
340c0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56 64  ROUND8(sizeof(Vd
340d0 62 65 46 72 61 6d 65 29 29 0a 20 20 20 20 20 20  beFrame)).      
340e0 20 20 20 20 20 20 20 20 2b 20 6e 4d 65 6d 20 2a          + nMem *
340f0 20 73 69 7a 65 6f 66 28 4d 65 6d 29 0a 20 20 20   sizeof(Mem).   
34100 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50 72             + pPr
34110 6f 67 72 61 6d 2d 3e 6e 43 73 72 20 2a 20 73 69  ogram->nCsr * si
34120 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
34130 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
34140 2b 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70  + (pProgram->nOp
34150 20 2b 20 37 29 2f 38 3b 0a 20 20 20 20 70 46 72   + 7)/8;.    pFr
34160 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ame = sqlite3DbM
34170 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
34180 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  yte);.    if( !p
34190 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 67  Frame ){.      g
341a0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
341b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
341c0 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 74 29  eMemRelease(pRt)
341d0 3b 0a 20 20 20 20 70 52 74 2d 3e 66 6c 61 67 73  ;.    pRt->flags
341e0 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   = MEM_Blob|MEM_
341f0 44 79 6e 3b 0a 20 20 20 20 70 52 74 2d 3e 7a 20  Dyn;.    pRt->z 
34200 3d 20 28 63 68 61 72 2a 29 70 46 72 61 6d 65 3b  = (char*)pFrame;
34210 0a 20 20 20 20 70 52 74 2d 3e 6e 20 3d 20 6e 42  .    pRt->n = nB
34220 79 74 65 3b 0a 20 20 20 20 70 52 74 2d 3e 78 44  yte;.    pRt->xD
34230 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
34240 46 72 61 6d 65 4d 65 6d 44 65 6c 3b 0a 0a 20 20  FrameMemDel;..  
34250 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d 20 70 3b    pFrame->v = p;
34260 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68  .    pFrame->nCh
34270 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ildMem = nMem;. 
34280 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c     pFrame->nChil
34290 64 43 73 72 20 3d 20 70 50 72 6f 67 72 61 6d 2d  dCsr = pProgram-
342a0 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d  >nCsr;.    pFram
342b0 65 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f  e->pc = (int)(pO
342c0 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 70 46  p - aOp);.    pF
342d0 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20 70 2d 3e  rame->aMem = p->
342e0 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65  aMem;.    pFrame
342f0 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e 4d 65 6d  ->nMem = p->nMem
34300 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 70  ;.    pFrame->ap
34310 43 73 72 20 3d 20 70 2d 3e 61 70 43 73 72 3b 0a  Csr = p->apCsr;.
34320 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72      pFrame->nCur
34330 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72 73 6f 72  sor = p->nCursor
34340 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 4f  ;.    pFrame->aO
34350 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20  p = p->aOp;.    
34360 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d 20 70 2d  pFrame->nOp = p-
34370 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d 65  >nOp;.    pFrame
34380 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72 6f 67 72  ->token = pProgr
34390 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 23 69 66 64 65  am->token;.#ifde
343a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
343b0 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
343c0 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78      pFrame->anEx
343d0 65 63 20 3d 20 70 2d 3e 61 6e 45 78 65 63 3b 0a  ec = p->anExec;.
343e0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
343f0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
34400 46 72 61 6d 65 2d 3e 69 46 72 61 6d 65 4d 61 67  Frame->iFrameMag
34410 69 63 20 3d 20 53 51 4c 49 54 45 5f 46 52 41 4d  ic = SQLITE_FRAM
34420 45 5f 4d 41 47 49 43 3b 0a 23 65 6e 64 69 66 0a  E_MAGIC;.#endif.
34430 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 56 64 62  .    pEnd = &Vdb
34440 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65  eFrameMem(pFrame
34450 29 5b 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  )[pFrame->nChild
34460 4d 65 6d 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4d  Mem];.    for(pM
34470 65 6d 3d 56 64 62 65 46 72 61 6d 65 4d 65 6d 28  em=VdbeFrameMem(
34480 70 46 72 61 6d 65 29 3b 20 70 4d 65 6d 21 3d 70  pFrame); pMem!=p
34490 45 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  End; pMem++){.  
344a0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
344b0 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
344c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  .      pMem->db 
344d0 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  = db;.    }.  }e
344e0 6c 73 65 7b 0a 20 20 20 20 70 46 72 61 6d 65 20  lse{.    pFrame 
344f0 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29 70 52  = (VdbeFrame*)pR
34500 74 2d 3e 7a 3b 0a 20 20 20 20 61 73 73 65 72 74  t->z;.    assert
34510 28 20 70 52 74 2d 3e 78 44 65 6c 3d 3d 73 71 6c  ( pRt->xDel==sql
34520 69 74 65 33 56 64 62 65 46 72 61 6d 65 4d 65 6d  ite3VdbeFrameMem
34530 44 65 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Del );.    asser
34540 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65  t( pProgram->nMe
34550 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72  m+pProgram->nCsr
34560 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  ==pFrame->nChild
34570 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  Mem .        || 
34580 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d  (pProgram->nCsr=
34590 3d 30 20 26 26 20 70 50 72 6f 67 72 61 6d 2d 3e  =0 && pProgram->
345a0 6e 4d 65 6d 2b 31 3d 3d 70 46 72 61 6d 65 2d 3e  nMem+1==pFrame->
345b0 6e 43 68 69 6c 64 4d 65 6d 29 20 29 3b 0a 20 20  nChildMem) );.  
345c0 20 20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72    assert( pProgr
345d0 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65  am->nCsr==pFrame
345e0 2d 3e 6e 43 68 69 6c 64 43 73 72 20 29 3b 0a 20  ->nChildCsr );. 
345f0 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29     assert( (int)
34600 28 70 4f 70 20 2d 20 61 4f 70 29 3d 3d 70 46 72  (pOp - aOp)==pFr
34610 61 6d 65 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a  ame->pc );.  }..
34620 20 20 70 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20    p->nFrame++;. 
34630 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
34640 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20   = p->pFrame;.  
34650 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
34660 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  d = db->lastRowi
34670 64 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68  d;.  pFrame->nCh
34680 61 6e 67 65 20 3d 20 70 2d 3e 6e 43 68 61 6e 67  ange = p->nChang
34690 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 44 62  e;.  pFrame->nDb
346a0 43 68 61 6e 67 65 20 3d 20 70 2d 3e 64 62 2d 3e  Change = p->db->
346b0 6e 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72  nChange;.  asser
346c0 74 28 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44  t( pFrame->pAuxD
346d0 61 74 61 3d 3d 30 20 29 3b 0a 20 20 70 46 72 61  ata==0 );.  pFra
346e0 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70  me->pAuxData = p
346f0 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 2d  ->pAuxData;.  p-
34700 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20  >pAuxData = 0;. 
34710 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
34720 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70  .  p->pFrame = p
34730 46 72 61 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d  Frame;.  p->aMem
34740 20 3d 20 61 4d 65 6d 20 3d 20 56 64 62 65 46 72   = aMem = VdbeFr
34750 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 0a  ameMem(pFrame);.
34760 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    p->nMem = pFra
34770 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a 20  me->nChildMem;. 
34780 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
34790 31 36 29 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c  16)pFrame->nChil
347a0 64 43 73 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72  dCsr;.  p->apCsr
347b0 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
347c0 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d  *)&aMem[p->nMem]
347d0 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  ;.  pFrame->aOnc
347e0 65 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 70 43  e = (u8*)&p->apC
347f0 73 72 5b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73  sr[pProgram->nCs
34800 72 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 72  r];.  memset(pFr
34810 61 6d 65 2d 3e 61 4f 6e 63 65 2c 20 30 2c 20 28  ame->aOnce, 0, (
34820 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 20 2b 20  pProgram->nOp + 
34830 37 29 2f 38 29 3b 0a 20 20 70 2d 3e 61 4f 70 20  7)/8);.  p->aOp 
34840 3d 20 61 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d  = aOp = pProgram
34850 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20  ->aOp;.  p->nOp 
34860 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b  = pProgram->nOp;
34870 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
34880 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
34890 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65  TATUS.  p->anExe
348a0 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  c = 0;.#endif.#i
348b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
348c0 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
348d0 61 74 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  at second and su
348e0 62 73 65 71 75 65 6e 74 20 65 78 65 63 75 74 69  bsequent executi
348f0 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ons of the same 
34900 74 72 69 67 67 65 72 20 64 6f 20 6e 6f 74 0a 20  trigger do not. 
34910 20 2a 2a 20 74 72 79 20 74 6f 20 72 65 75 73 65   ** try to reuse
34920 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
34930 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
34940 75 73 65 2e 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  use. */.  {.    
34950 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
34960 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
34970 2b 2b 29 7b 0a 20 20 20 20 20 20 61 4d 65 6d 5b  ++){.      aMem[
34980 69 5d 2e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20  i].pScopyFrom = 
34990 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 66  0;  /* Prevent f
349a0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 41 62  alse-positive Ab
349b0 6f 75 74 54 6f 43 68 61 6e 67 65 28 29 20 65 72  outToChange() er
349c0 72 73 20 2a 2f 0a 20 20 20 20 20 20 61 4d 65 6d  rs */.      aMem
349d0 5b 69 5d 2e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  [i].flags |= MEM
349e0 5f 55 6e 64 65 66 69 6e 65 64 3b 20 2f 2a 20 43  _Undefined; /* C
349f0 61 75 73 65 20 61 20 66 61 75 6c 74 20 69 66 20  ause a fault if 
34a00 74 68 69 73 20 72 65 67 20 69 73 20 72 65 75 73  this reg is reus
34a10 65 64 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ed */.    }.  }.
34a20 23 65 6e 64 69 66 0a 20 20 70 4f 70 20 3d 20 26  #endif.  pOp = &
34a30 61 4f 70 5b 2d 31 5d 3b 0a 20 20 67 6f 74 6f 20  aOp[-1];.  goto 
34a40 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72  check_for_interr
34a50 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  upt;.}../* Opcod
34a60 65 3a 20 50 61 72 61 6d 20 50 31 20 50 32 20 2a  e: Param P1 P2 *
34a70 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   * *.**.** This 
34a80 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65  opcode is only e
34a90 76 65 72 20 70 72 65 73 65 6e 74 20 69 6e 20 73  ver present in s
34aa0 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 61 6c 6c  ub-programs call
34ab0 65 64 20 76 69 61 20 74 68 65 20 0a 2a 2a 20 4f  ed via the .** O
34ac0 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74 72 75  P_Program instru
34ad0 63 74 69 6f 6e 2e 20 43 6f 70 79 20 61 20 76 61  ction. Copy a va
34ae0 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  lue currently st
34af0 6f 72 65 64 20 69 6e 20 61 20 6d 65 6d 6f 72 79  ored in a memory
34b00 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66 20 74 68 65   .** cell of the
34b10 20 63 61 6c 6c 69 6e 67 20 28 70 61 72 65 6e 74   calling (parent
34b20 29 20 66 72 61 6d 65 20 74 6f 20 63 65 6c 6c 20  ) frame to cell 
34b30 50 32 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  P2 in the curren
34b40 74 20 66 72 61 6d 65 73 20 0a 2a 2a 20 61 64 64  t frames .** add
34b50 72 65 73 73 20 73 70 61 63 65 2e 20 54 68 69 73  ress space. This
34b60 20 69 73 20 75 73 65 64 20 62 79 20 74 72 69 67   is used by trig
34b70 67 65 72 20 70 72 6f 67 72 61 6d 73 20 74 6f 20  ger programs to 
34b80 61 63 63 65 73 73 20 74 68 65 20 6e 65 77 2e 2a  access the new.*
34b90 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64 2e 2a 20 76   .** and old.* v
34ba0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  alues..**.** The
34bb0 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
34bc0 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65  cell in the pare
34bd0 6e 74 20 66 72 61 6d 65 20 69 73 20 64 65 74 65  nt frame is dete
34be0 72 6d 69 6e 65 64 20 62 79 20 61 64 64 69 6e 67  rmined by adding
34bf0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
34c00 20 74 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74   the P1 argument
34c10 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
34c20 20 74 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74   the P1 argument
34c30 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69   to the.** calli
34c40 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e  ng OP_Program in
34c50 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
34c60 73 65 20 4f 50 5f 50 61 72 61 6d 3a 20 7b 20 20  se OP_Param: {  
34c70 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
34c80 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20   */.  VdbeFrame 
34c90 2a 70 46 72 61 6d 65 3b 0a 20 20 4d 65 6d 20 2a  *pFrame;.  Mem *
34ca0 70 49 6e 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75  pIn;.  pOut = ou
34cb0 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
34cc0 70 4f 70 29 3b 0a 20 20 70 46 72 61 6d 65 20 3d  pOp);.  pFrame =
34cd0 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 49   p->pFrame;.  pI
34ce0 6e 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65  n = &pFrame->aMe
34cf0 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20 70 46 72 61  m[pOp->p1 + pFra
34d00 6d 65 2d 3e 61 4f 70 5b 70 46 72 61 6d 65 2d 3e  me->aOp[pFrame->
34d10 70 63 5d 2e 70 31 5d 3b 20 20 20 0a 20 20 73 71  pc].p1];   .  sq
34d20 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
34d30 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49  lowCopy(pOut, pI
34d40 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  n, MEM_Ephem);. 
34d50 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e 64 69   break;.}..#endi
34d60 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
34d70 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
34d80 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
34d90 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
34da0 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  _KEY./* Opcode: 
34db0 46 6b 43 6f 75 6e 74 65 72 20 50 31 20 50 32 20  FkCounter P1 P2 
34dc0 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
34dd0 73 3a 20 66 6b 63 74 72 5b 50 31 5d 2b 3d 50 32  s: fkctr[P1]+=P2
34de0 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  .**.** Increment
34df0 20 61 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 63   a "constraint c
34e00 6f 75 6e 74 65 72 22 20 62 79 20 50 32 20 28 50  ounter" by P2 (P
34e10 32 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76  2 may be negativ
34e20 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29 2e 0a  e or positive)..
34e30 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d  ** If P1 is non-
34e40 7a 65 72 6f 2c 20 74 68 65 20 64 61 74 61 62 61  zero, the databa
34e50 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  se constraint co
34e60 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65  unter is increme
34e70 6e 74 65 64 20 0a 2a 2a 20 28 64 65 66 65 72 72  nted .** (deferr
34e80 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
34e90 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20 4f 74 68  onstraints). Oth
34ea0 65 72 77 69 73 65 2c 20 69 66 20 50 31 20 69 73  erwise, if P1 is
34eb0 20 7a 65 72 6f 2c 20 74 68 65 20 0a 2a 2a 20 73   zero, the .** s
34ec0 74 61 74 65 6d 65 6e 74 20 63 6f 75 6e 74 65 72  tatement counter
34ed0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
34ee0 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
34ef0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
34f00 74 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ts)..*/.case OP_
34f10 46 6b 43 6f 75 6e 74 65 72 3a 20 7b 0a 20 20 69  FkCounter: {.  i
34f20 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
34f30 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29  QLITE_DeferFKs )
34f40 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  {.    db->nDefer
34f50 72 65 64 49 6d 6d 43 6f 6e 73 20 2b 3d 20 70 4f  redImmCons += pO
34f60 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 20 69  p->p2;.  }else i
34f70 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  f( pOp->p1 ){.  
34f80 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
34f90 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  ons += pOp->p2;.
34fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
34fb0 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 2b 3d  nFkConstraint +=
34fc0 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 0a 20 20   pOp->p2;.  }.  
34fd0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
34fe0 6f 64 65 3a 20 46 6b 49 66 5a 65 72 6f 20 50 31  ode: FkIfZero P1
34ff0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
35000 6f 70 73 69 73 3a 20 69 66 20 66 6b 63 74 72 5b  opsis: if fkctr[
35010 50 31 5d 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a  P1]==0 goto P2.*
35020 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
35030 20 74 65 73 74 73 20 69 66 20 61 20 66 6f 72 65   tests if a fore
35040 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
35050 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73 20 63 75  nt-counter is cu
35060 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a 2a 2a  rrently zero..**
35070 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20 74 6f 20   If so, jump to 
35080 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20  instruction P2. 
35090 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
350a0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
350b0 65 78 74 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74  ext .** instruct
350c0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31  ion..**.** If P1
350d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
350e0 65 6e 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  en the jump is t
350f0 61 6b 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  aken if the data
35100 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d  base constraint-
35110 63 6f 75 6e 74 65 72 0a 2a 2a 20 69 73 20 7a 65  counter.** is ze
35120 72 6f 20 28 74 68 65 20 6f 6e 65 20 74 68 61 74  ro (the one that
35130 20 63 6f 75 6e 74 73 20 64 65 66 65 72 72 65 64   counts deferred
35140 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
35150 61 74 69 6f 6e 73 29 2e 20 49 66 20 50 31 20 69  ations). If P1 i
35160 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68 65 20 6a  s.** zero, the j
35170 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20  ump is taken if 
35180 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  the statement co
35190 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72  nstraint-counter
351a0 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 69 6d 6d   is zero.** (imm
351b0 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
351c0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ey constraint vi
351d0 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a 63 61  olations)..*/.ca
351e0 73 65 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 3a 20  se OP_FkIfZero: 
351f0 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  {         /* jum
35200 70 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e  p */.  if( pOp->
35210 70 31 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72  p1 ){.    VdbeBr
35220 61 6e 63 68 54 61 6b 65 6e 28 64 62 2d 3e 6e 44  anchTaken(db->nD
35230 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20 26  eferredCons==0 &
35240 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  & db->nDeferredI
35250 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20  mmCons==0, 2);. 
35260 20 20 20 69 66 28 20 64 62 2d 3e 6e 44 65 66 65     if( db->nDefe
35270 72 72 65 64 43 6f 6e 73 3d 3d 30 20 26 26 20 64  rredCons==0 && d
35280 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
35290 6f 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75  ons==0 ) goto ju
352a0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73  mp_to_p2;.  }els
352b0 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  e{.    VdbeBranc
352c0 68 54 61 6b 65 6e 28 70 2d 3e 6e 46 6b 43 6f 6e  hTaken(p->nFkCon
352d0 73 74 72 61 69 6e 74 3d 3d 30 20 26 26 20 64 62  straint==0 && db
352e0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
352f0 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69  ns==0, 2);.    i
35300 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  f( p->nFkConstra
35310 69 6e 74 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44  int==0 && db->nD
35320 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d  eferredImmCons==
35330 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  0 ) goto jump_to
35340 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
35350 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69  ;.}.#endif /* #i
35360 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35370 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 2a 2f  T_FOREIGN_KEY */
35380 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
35390 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
353a0 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  ENT./* Opcode: M
353b0 65 6d 4d 61 78 20 50 31 20 50 32 20 2a 20 2a 20  emMax P1 P2 * * 
353c0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
353d0 5b 50 31 5d 3d 6d 61 78 28 72 5b 50 31 5d 2c 72  [P1]=max(r[P1],r
353e0 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 50 31 20 69  [P2]).**.** P1 i
353f0 73 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20  s a register in 
35400 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f  the root frame o
35410 66 20 74 68 69 73 20 56 4d 20 28 74 68 65 20 72  f this VM (the r
35420 6f 6f 74 20 66 72 61 6d 65 20 69 73 0a 2a 2a 20  oot frame is.** 
35430 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
35440 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
35450 20 69 66 20 74 68 69 73 20 69 6e 73 74 72 75 63   if this instruc
35460 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 65 78  tion is being ex
35470 65 63 75 74 65 64 0a 2a 2a 20 77 69 74 68 69 6e  ecuted.** within
35480 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 29 2e   a sub-program).
35490 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
354a0 66 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  f register P1 to
354b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
354c0 0a 2a 2a 20 69 74 73 20 63 75 72 72 65 6e 74 20  .** its current 
354d0 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61  value and the va
354e0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
354f0 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
35500 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 72 6f 77  nstruction throw
35510 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  s an error if th
35520 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73  e memory cell is
35530 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 0a 2a   not initially.*
35540 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  * an integer..*/
35550 0a 63 61 73 65 20 4f 50 5f 4d 65 6d 4d 61 78 3a  .case OP_MemMax:
35560 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32   {        /* in2
35570 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20   */.  VdbeFrame 
35580 2a 70 46 72 61 6d 65 3b 0a 20 20 69 66 28 20 70  *pFrame;.  if( p
35590 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
355a0 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
355b0 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
355c0 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
355d0 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
355e0 20 20 20 20 70 49 6e 31 20 3d 20 26 70 46 72 61      pIn1 = &pFra
355f0 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31  me->aMem[pOp->p1
35600 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
35610 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
35620 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20 20 61 73 73  ->p1];.  }.  ass
35630 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
35640 70 49 6e 31 29 20 29 3b 0a 20 20 73 71 6c 69 74  pIn1) );.  sqlit
35650 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
35660 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e  ify(pIn1);.  pIn
35670 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
35680 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2];.  sqlite3Vdb
35690 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70  eMemIntegerify(p
356a0 49 6e 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31  In2);.  if( pIn1
356b0 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e 69 29  ->u.i<pIn2->u.i)
356c0 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20  {.    pIn1->u.i 
356d0 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 7d  = pIn2->u.i;.  }
356e0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
356f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35700 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  T_AUTOINCREMENT 
35710 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  */../* Opcode: I
35720 66 50 6f 73 20 50 31 20 50 32 20 50 33 20 2a 20  fPos P1 P2 P3 * 
35730 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
35740 66 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e 20 72  f r[P1]>0 then r
35750 5b 50 31 5d 2d 3d 50 33 2c 20 67 6f 74 6f 20 50  [P1]-=P3, goto P
35760 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  2.**.** Register
35770 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e   P1 must contain
35780 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20   an integer..** 
35790 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  If the value of 
357a0 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 31  register P1 is 1
357b0 20 6f 72 20 67 72 65 61 74 65 72 2c 20 73 75 62   or greater, sub
357c0 74 72 61 63 74 20 50 33 20 66 72 6f 6d 20 74 68  tract P3 from th
357d0 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 50 31  e.** value in P1
357e0 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 50 32 2e   and jump to P2.
357f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
35800 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 72  itial value of r
35810 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6c 65  egister P1 is le
35820 73 73 20 74 68 61 6e 20 31 2c 20 74 68 65 6e 20  ss than 1, then 
35830 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  the.** value is 
35840 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 63 6f  unchanged and co
35850 6e 74 72 6f 6c 20 70 61 73 73 65 73 20 74 68 72  ntrol passes thr
35860 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
35870 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
35880 0a 63 61 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20  .case OP_IfPos: 
35890 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
358a0 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
358b0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
358c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
358d0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
358e0 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
358f0 61 6b 65 6e 28 20 70 49 6e 31 2d 3e 75 2e 69 3e  aken( pIn1->u.i>
35900 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e  0, 2);.  if( pIn
35910 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a 20 20 20 20  1->u.i>0 ){.    
35920 70 49 6e 31 2d 3e 75 2e 69 20 2d 3d 20 70 4f 70  pIn1->u.i -= pOp
35930 2d 3e 70 33 3b 0a 20 20 20 20 67 6f 74 6f 20 6a  ->p3;.    goto j
35940 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
35950 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
35960 63 6f 64 65 3a 20 4f 66 66 73 65 74 4c 69 6d 69  code: OffsetLimi
35970 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
35980 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72  * Synopsis: if r
35990 5b 50 31 5d 3e 30 20 74 68 65 6e 20 72 5b 50 32  [P1]>0 then r[P2
359a0 5d 3d 72 5b 50 31 5d 2b 6d 61 78 28 30 2c 72 5b  ]=r[P1]+max(0,r[
359b0 50 33 5d 29 20 65 6c 73 65 20 72 5b 50 32 5d 3d  P3]) else r[P2]=
359c0 28 2d 31 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  (-1).**.** This 
359d0 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20  opcode performs 
359e0 61 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20  a commonly used 
359f0 63 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 6f  computation asso
35a00 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 4c  ciated with.** L
35a10 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
35a20 70 72 6f 63 65 73 73 2e 20 20 72 5b 50 31 5d 20  process.  r[P1] 
35a30 68 6f 6c 64 73 20 74 68 65 20 6c 69 6d 69 74 20  holds the limit 
35a40 63 6f 75 6e 74 65 72 2e 20 20 72 5b 50 33 5d 0a  counter.  r[P3].
35a50 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 6f 66 66  ** holds the off
35a60 73 65 74 20 63 6f 75 6e 74 65 72 2e 20 20 54 68  set counter.  Th
35a70 65 20 6f 70 63 6f 64 65 20 63 6f 6d 70 75 74 65  e opcode compute
35a80 73 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 76  s the combined v
35a90 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4c  alue.** of the L
35aa0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
35ab0 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74 20  and stores that 
35ac0 76 61 6c 75 65 20 69 6e 20 72 5b 50 32 5d 2e 20  value in r[P2]. 
35ad0 20 54 68 65 20 72 5b 50 32 5d 0a 2a 2a 20 76 61   The r[P2].** va
35ae0 6c 75 65 20 63 6f 6d 70 75 74 65 64 20 69 73 20  lue computed is 
35af0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
35b00 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
35b10 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ll need to be.**
35b20 20 76 69 73 69 74 65 64 20 69 6e 20 6f 72 64 65   visited in orde
35b30 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
35b40 65 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  e query..**.** I
35b50 66 20 72 5b 50 33 5d 20 69 73 20 7a 65 72 6f 20  f r[P3] is zero 
35b60 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68 61  or negative, tha
35b70 74 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  t means there is
35b80 20 6e 6f 20 4f 46 46 53 45 54 0a 2a 2a 20 61 6e   no OFFSET.** an
35b90 64 20 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74  d r[P2] is set t
35ba0 6f 20 62 65 20 74 68 65 20 76 61 6c 75 65 20 6f  o be the value o
35bb0 66 20 74 68 65 20 4c 49 4d 49 54 2c 20 72 5b 50  f the LIMIT, r[P
35bc0 31 5d 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 72 5b 50  1]..**.** if r[P
35bd0 31 5d 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  1] is zero or ne
35be0 67 61 74 69 76 65 2c 20 74 68 61 74 20 6d 65 61  gative, that mea
35bf0 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4c  ns there is no L
35c00 49 4d 49 54 0a 2a 2a 20 61 6e 64 20 72 5b 50 32  IMIT.** and r[P2
35c10 5d 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2e 20  ] is set to -1. 
35c20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
35c30 2c 20 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74  , r[P2] is set t
35c40 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 72 5b 50  o the sum of r[P
35c50 31 5d 20 61 6e 64 20 72 5b 50 33 5d 2e 0a 2a 2f  1] and r[P3]..*/
35c60 0a 63 61 73 65 20 4f 50 5f 4f 66 66 73 65 74 4c  .case OP_OffsetL
35c70 69 6d 69 74 3a 20 7b 20 20 20 20 2f 2a 20 69 6e  imit: {    /* in
35c80 31 2c 20 6f 75 74 32 2c 20 69 6e 33 20 2a 2f 0a  1, out2, in3 */.
35c90 20 20 69 36 34 20 78 3b 0a 20 20 70 49 6e 31 20    i64 x;.  pIn1 
35ca0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
35cb0 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ;.  pIn3 = &aMem
35cc0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4f 75  [pOp->p3];.  pOu
35cd0 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
35ce0 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73  se(p, pOp);.  as
35cf0 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67  sert( pIn1->flag
35d00 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
35d10 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
35d20 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
35d30 3b 0a 20 20 78 20 3d 20 70 49 6e 31 2d 3e 75 2e  ;.  x = pIn1->u.
35d40 69 3b 0a 20 20 69 66 28 20 78 3c 3d 30 20 7c 7c  i;.  if( x<=0 ||
35d50 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34   sqlite3AddInt64
35d60 28 26 78 2c 20 70 49 6e 33 2d 3e 75 2e 69 3e 30  (&x, pIn3->u.i>0
35d70 3f 70 49 6e 33 2d 3e 75 2e 69 3a 30 29 20 29 7b  ?pIn3->u.i:0) ){
35d80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c  .    /* If the L
35d90 49 4d 49 54 20 69 73 20 6c 65 73 73 20 74 68 61  IMIT is less tha
35da0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
35db0 72 6f 2c 20 6c 6f 6f 70 20 66 6f 72 65 76 65 72  ro, loop forever
35dc0 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  .  This.    ** i
35dd0 73 20 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 42  s documented.  B
35de0 75 74 20 61 6c 73 6f 2c 20 69 66 20 74 68 65 20  ut also, if the 
35df0 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 78 63  LIMIT+OFFSET exc
35e00 65 65 64 73 20 32 5e 36 33 20 74 68 65 6e 0a 20  eeds 2^63 then. 
35e10 20 20 20 2a 2a 20 61 6c 73 6f 20 6c 6f 6f 70 20     ** also loop 
35e20 66 6f 72 65 76 65 72 2e 20 20 54 68 69 73 20 69  forever.  This i
35e30 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20  s undocumented. 
35e40 20 49 6e 20 66 61 63 74 2c 20 6f 6e 65 20 63 6f   In fact, one co
35e50 75 6c 64 20 61 72 67 75 65 0a 20 20 20 20 2a 2a  uld argue.    **
35e60 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 20 73   that the loop s
35e70 68 6f 75 6c 64 20 74 65 72 6d 69 6e 61 74 65 2e  hould terminate.
35e80 20 20 42 75 74 20 61 73 73 75 6d 69 6e 67 20 31    But assuming 1
35e90 20 62 69 6c 6c 69 6f 6e 20 69 74 65 72 61 74 69   billion iterati
35ea0 6f 6e 73 0a 20 20 20 20 2a 2a 20 70 65 72 20 73  ons.    ** per s
35eb0 65 63 6f 6e 64 20 28 66 61 72 20 65 78 63 65 65  econd (far excee
35ec0 64 69 6e 67 20 74 68 65 20 63 61 70 61 62 69 6c  ding the capabil
35ed0 69 74 69 65 73 20 6f 66 20 61 6e 79 20 63 75 72  ities of any cur
35ee0 72 65 6e 74 20 68 61 72 64 77 61 72 65 29 0a 20  rent hardware). 
35ef0 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 74     ** it would t
35f00 61 6b 65 20 6e 65 61 72 6c 79 20 33 30 30 20 79  ake nearly 300 y
35f10 65 61 72 73 20 74 6f 20 61 63 74 75 61 6c 6c 79  ears to actually
35f20 20 72 65 61 63 68 20 74 68 65 20 6c 69 6d 69 74   reach the limit
35f30 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 6c 6f 6f  .  So.    ** loo
35f40 70 69 6e 67 20 66 6f 72 65 76 65 72 20 69 73 20  ping forever is 
35f50 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 61 70 70  a reasonable app
35f60 72 6f 78 69 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20  roximation. */. 
35f70 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2d     pOut->u.i = -
35f80 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
35f90 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 78 3b 0a 20  pOut->u.i = x;. 
35fa0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
35fb0 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74 5a  * Opcode: IfNotZ
35fc0 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ero P1 P2 * * *.
35fd0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20  ** Synopsis: if 
35fe0 72 5b 50 31 5d 21 3d 30 20 74 68 65 6e 20 72 5b  r[P1]!=0 then r[
35ff0 50 31 5d 2d 2d 2c 20 67 6f 74 6f 20 50 32 0a 2a  P1]--, goto P2.*
36000 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31  *.** Register P1
36010 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 6e   must contain an
36020 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68   integer.  If th
36030 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
36040 69 73 74 65 72 20 50 31 20 69 73 0a 2a 2a 20 69  ister P1 is.** i
36050 6e 69 74 69 61 6c 6c 79 20 67 72 65 61 74 65 72  nitially greater
36060 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
36070 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 76   decrement the v
36080 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
36090 20 50 31 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73   P1..** If it is
360a0 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 65 67 61 74   non-zero (negat
360b0 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29  ive or positive)
360c0 20 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 6a   and then also j
360d0 75 6d 70 20 74 6f 20 50 32 2e 20 20 0a 2a 2a 20  ump to P2.  .** 
360e0 49 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  If register P1 i
360f0 73 20 69 6e 69 74 69 61 6c 6c 79 20 7a 65 72 6f  s initially zero
36100 2c 20 6c 65 61 76 65 20 69 74 20 75 6e 63 68 61  , leave it uncha
36110 6e 67 65 64 20 61 6e 64 20 66 61 6c 6c 20 74 68  nged and fall th
36120 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f  rough..*/.case O
36130 50 5f 49 66 4e 6f 74 5a 65 72 6f 3a 20 7b 20 20  P_IfNotZero: {  
36140 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
36150 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
36160 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
36170 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
36180 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a  lags&MEM_Int );.
36190 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
361a0 6e 28 70 49 6e 31 2d 3e 75 2e 69 3c 30 2c 20 32  n(pIn1->u.i<0, 2
361b0 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
361c0 2e 69 20 29 7b 0a 20 20 20 20 20 69 66 28 20 70  .i ){.     if( p
361d0 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 20 70 49 6e  In1->u.i>0 ) pIn
361e0 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 20 20 20 67  1->u.i--;.     g
361f0 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
36200 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
36210 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 63 72 4a  /* Opcode: DecrJ
36220 75 6d 70 5a 65 72 6f 20 50 31 20 50 32 20 2a 20  umpZero P1 P2 * 
36230 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
36240 20 69 66 20 28 2d 2d 72 5b 50 31 5d 29 3d 3d 30   if (--r[P1])==0
36250 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52   goto P2.**.** R
36260 65 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 20  egister P1 must 
36270 68 6f 6c 64 20 61 6e 20 69 6e 74 65 67 65 72 2e  hold an integer.
36280 20 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20    Decrement the 
36290 76 61 6c 75 65 20 69 6e 20 50 31 0a 2a 2a 20 61  value in P1.** a
362a0 6e 64 20 6a 75 6d 70 20 74 6f 20 50 32 20 69 66  nd jump to P2 if
362b0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69   the new value i
362c0 73 20 65 78 61 63 74 6c 79 20 7a 65 72 6f 2e 0a  s exactly zero..
362d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 63 72 4a  */.case OP_DecrJ
362e0 75 6d 70 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20  umpZero: {      
362f0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
36300 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
36310 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
36320 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d  t( pIn1->flags&M
36330 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28 20  EM_Int );.  if( 
36340 70 49 6e 31 2d 3e 75 2e 69 3e 53 4d 41 4c 4c 45  pIn1->u.i>SMALLE
36350 53 54 5f 49 4e 54 36 34 20 29 20 70 49 6e 31 2d  ST_INT64 ) pIn1-
36360 3e 75 2e 69 2d 2d 3b 0a 20 20 56 64 62 65 42 72  >u.i--;.  VdbeBr
36370 61 6e 63 68 54 61 6b 65 6e 28 70 49 6e 31 2d 3e  anchTaken(pIn1->
36380 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66  u.i==0, 2);.  if
36390 28 20 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29  ( pIn1->u.i==0 )
363a0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
363b0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f  ;.  break;.}.../
363c0 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65  * Opcode: AggSte
363d0 70 20 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a  p * P2 P3 P4 P5.
363e0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63  ** Synopsis: acc
363f0 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b  um=r[P3] step(r[
36400 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78  P2@P5]).**.** Ex
36410 65 63 75 74 65 20 74 68 65 20 78 53 74 65 70 20  ecute the xStep 
36420 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20  function for an 
36430 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 20 54 68  aggregate..** Th
36440 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50  e function has P
36450 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 50 34  5 arguments.  P4
36460 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
36470 20 74 68 65 20 0a 2a 2a 20 46 75 6e 63 44 65 66   the .** FuncDef
36480 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
36490 73 70 65 63 69 66 69 65 73 20 74 68 65 20 66 75  specifies the fu
364a0 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69 73 74 65  nction.  Registe
364b0 72 20 50 33 20 69 73 20 74 68 65 0a 2a 2a 20 61  r P3 is the.** a
364c0 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
364d0 2a 20 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e  * The P5 argumen
364e0 74 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  ts are taken fro
364f0 6d 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  m register P2 an
36500 64 20 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73  d its.** success
36510 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ors..*/./* Opcod
36520 65 3a 20 41 67 67 49 6e 76 65 72 73 65 20 2a 20  e: AggInverse * 
36530 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
36540 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72  ynopsis: accum=r
36550 5b 50 33 5d 20 69 6e 76 65 72 73 65 28 72 5b 50  [P3] inverse(r[P
36560 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65  2@P5]).**.** Exe
36570 63 75 74 65 20 74 68 65 20 78 49 6e 76 65 72 73  cute the xInvers
36580 65 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  e function for a
36590 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 20  n aggregate..** 
365a0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  The function has
365b0 20 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   P5 arguments.  
365c0 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
365d0 74 6f 20 74 68 65 20 0a 2a 2a 20 46 75 6e 63 44  to the .** FuncD
365e0 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ef structure tha
365f0 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  t specifies the 
36600 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69 73  function.  Regis
36610 74 65 72 20 50 33 20 69 73 20 74 68 65 0a 2a 2a  ter P3 is the.**
36620 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
36630 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67 75 6d  .** The P5 argum
36640 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ents are taken f
36650 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32 20  rom register P2 
36660 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63 63 65  and its.** succe
36670 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ssors..*/./* Opc
36680 6f 64 65 3a 20 41 67 67 53 74 65 70 31 20 50 31  ode: AggStep1 P1
36690 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
366a0 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d  Synopsis: accum=
366b0 72 5b 50 33 5d 20 73 74 65 70 28 72 5b 50 32 40  r[P3] step(r[P2@
366c0 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75  P5]).**.** Execu
366d0 74 65 20 74 68 65 20 78 53 74 65 70 20 28 69 66  te the xStep (if
366e0 20 50 31 3d 3d 30 29 20 6f 72 20 78 49 6e 76 65   P1==0) or xInve
366f0 72 73 65 20 28 69 66 20 50 31 21 3d 30 29 20 66  rse (if P1!=0) f
36700 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 0a 2a  unction for an.*
36710 2a 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  * aggregate.  Th
36720 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50  e function has P
36730 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 50 34  5 arguments.  P4
36740 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
36750 20 74 68 65 20 0a 2a 2a 20 46 75 6e 63 44 65 66   the .** FuncDef
36760 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
36770 73 70 65 63 69 66 69 65 73 20 74 68 65 20 66 75  specifies the fu
36780 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69 73 74 65  nction.  Registe
36790 72 20 50 33 20 69 73 20 74 68 65 0a 2a 2a 20 61  r P3 is the.** a
367a0 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
367b0 2a 20 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e  * The P5 argumen
367c0 74 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  ts are taken fro
367d0 6d 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  m register P2 an
367e0 64 20 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73  d its.** success
367f0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ors..**.** This 
36800 6f 70 63 6f 64 65 20 69 73 20 69 6e 69 74 69 61  opcode is initia
36810 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 4f 50 5f  lly coded as OP_
36820 41 67 67 53 74 65 70 30 2e 20 20 4f 6e 20 66 69  AggStep0.  On fi
36830 72 73 74 20 65 76 61 6c 75 61 74 69 6f 6e 2c 0a  rst evaluation,.
36840 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 73  ** the FuncDef s
36850 74 6f 72 65 64 20 69 6e 20 50 34 20 69 73 20 63  tored in P4 is c
36860 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
36870 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
36880 20 61 6e 64 0a 2a 2a 20 74 68 65 20 6f 70 63 6f   and.** the opco
36890 64 65 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20  de is changed.  
368a0 49 6e 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  In this way, the
368b0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
368c0 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  of the.** sqlite
368d0 33 5f 63 6f 6e 74 65 78 74 20 6f 6e 6c 79 20 68  3_context only h
368e0 61 70 70 65 6e 73 20 6f 6e 63 65 2c 20 69 6e 73  appens once, ins
368f0 74 65 61 64 20 6f 66 20 6f 6e 20 65 61 63 68 20  tead of on each 
36900 63 61 6c 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 73  call to the.** s
36910 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  tep function..*/
36920 0a 63 61 73 65 20 4f 50 5f 41 67 67 49 6e 76 65  .case OP_AggInve
36930 72 73 65 3a 0a 63 61 73 65 20 4f 50 5f 41 67 67  rse:.case OP_Agg
36940 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b  Step: {.  int n;
36950 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
36960 78 74 20 2a 70 43 74 78 3b 0a 0a 20 20 61 73 73  xt *pCtx;..  ass
36970 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
36980 3d 3d 50 34 5f 46 55 4e 43 44 45 46 20 29 3b 0a  ==P4_FUNCDEF );.
36990 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20    n = pOp->p5;. 
369a0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
369b0 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28  >0 && pOp->p3<=(
369c0 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
369d0 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 61 73 73  Cursor) );.  ass
369e0 65 72 74 28 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f  ert( n==0 || (pO
369f0 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p2>0 && pOp->
36a00 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  p2+n<=(p->nMem+1
36a10 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31   - p->nCursor)+1
36a20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36a30 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 32 20 7c  Op->p3<pOp->p2 |
36a40 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e  | pOp->p3>=pOp->
36a50 70 32 2b 6e 20 29 3b 0a 20 20 70 43 74 78 20 3d  p2+n );.  pCtx =
36a60 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
36a70 52 61 77 4e 4e 28 64 62 2c 20 6e 2a 73 69 7a 65  RawNN(db, n*size
36a80 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  of(sqlite3_value
36a90 2a 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  *) +.           
36aa0 20 20 20 20 28 73 69 7a 65 6f 66 28 70 43 74 78      (sizeof(pCtx
36ab0 5b 30 5d 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  [0]) + sizeof(Me
36ac0 6d 29 20 2d 20 73 69 7a 65 6f 66 28 73 71 6c 69  m) - sizeof(sqli
36ad0 74 65 33 5f 76 61 6c 75 65 2a 29 29 29 3b 0a 20  te3_value*)));. 
36ae0 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 20 67   if( pCtx==0 ) g
36af0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
36b00 74 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b 0a 20 20  tx->pMem = 0;.  
36b10 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20 28 4d 65  pCtx->pOut = (Me
36b20 6d 2a 29 26 28 70 43 74 78 2d 3e 61 72 67 76 5b  m*)&(pCtx->argv[
36b30 6e 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  n]);.  sqlite3Vd
36b40 62 65 4d 65 6d 49 6e 69 74 28 70 43 74 78 2d 3e  beMemInit(pCtx->
36b50 70 4f 75 74 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75  pOut, db, MEM_Nu
36b60 6c 6c 29 3b 0a 20 20 70 43 74 78 2d 3e 70 46 75  ll);.  pCtx->pFu
36b70 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  nc = pOp->p4.pFu
36b80 6e 63 3b 0a 20 20 70 43 74 78 2d 3e 69 4f 70 20  nc;.  pCtx->iOp 
36b90 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  = (int)(pOp - aO
36ba0 70 29 3b 0a 20 20 70 43 74 78 2d 3e 70 56 64 62  p);.  pCtx->pVdb
36bb0 65 20 3d 20 70 3b 0a 20 20 70 43 74 78 2d 3e 73  e = p;.  pCtx->s
36bc0 6b 69 70 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  kipFlag = 0;.  p
36bd0 43 74 78 2d 3e 69 73 45 72 72 6f 72 20 3d 20 30  Ctx->isError = 0
36be0 3b 0a 20 20 70 43 74 78 2d 3e 61 72 67 63 20 3d  ;.  pCtx->argc =
36bf0 20 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70   n;.  pOp->p4typ
36c00 65 20 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b 0a  e = P4_FUNCCTX;.
36c10 20 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20 3d    pOp->p4.pCtx =
36c20 20 70 43 74 78 3b 0a 0a 20 20 2f 2a 20 4f 50 5f   pCtx;..  /* OP_
36c30 41 67 67 49 6e 76 65 72 73 65 20 6d 75 73 74 20  AggInverse must 
36c40 68 61 76 65 20 50 31 3d 3d 31 20 61 6e 64 20 4f  have P1==1 and O
36c50 50 5f 41 67 67 53 74 65 70 20 6d 75 73 74 20 68  P_AggStep must h
36c60 61 76 65 20 50 31 3d 3d 30 20 2a 2f 0a 20 20 61  ave P1==0 */.  a
36c70 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3d 3d  ssert( pOp->p1==
36c80 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  (pOp->opcode==OP
36c90 5f 41 67 67 49 6e 76 65 72 73 65 29 20 29 3b 0a  _AggInverse) );.
36ca0 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
36cb0 20 4f 50 5f 41 67 67 53 74 65 70 31 3b 0a 20 20   OP_AggStep1;.  
36cc0 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
36cd0 69 6e 74 6f 20 4f 50 5f 41 67 67 53 74 65 70 20  into OP_AggStep 
36ce0 2a 2f 0a 7d 0a 63 61 73 65 20 4f 50 5f 41 67 67  */.}.case OP_Agg
36cf0 53 74 65 70 31 3a 20 7b 0a 20 20 69 6e 74 20 69  Step1: {.  int i
36d00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ;.  sqlite3_cont
36d10 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 4d 65 6d  ext *pCtx;.  Mem
36d20 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72   *pMem;..  asser
36d30 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
36d40 50 34 5f 46 55 4e 43 43 54 58 20 29 3b 0a 20 20  P4_FUNCCTX );.  
36d50 70 43 74 78 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pCtx = pOp->p4.p
36d60 43 74 78 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61  Ctx;.  pMem = &a
36d70 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 0a 23  Mem[pOp->p3];..#
36d80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
36d90 55 47 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  UG.  if( pOp->p1
36da0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36db0 69 73 20 61 6e 20 4f 50 5f 41 67 67 49 6e 76 65  is an OP_AggInve
36dc0 72 73 65 20 63 61 6c 6c 2e 20 20 56 65 72 69 66  rse call.  Verif
36dd0 79 20 74 68 61 74 20 78 53 74 65 70 20 68 61 73  y that xStep has
36de0 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 62   always.    ** b
36df0 65 65 6e 20 63 61 6c 6c 65 64 20 61 74 20 6c 65  een called at le
36e00 61 73 74 20 6f 6e 63 65 20 70 72 69 6f 72 20 74  ast once prior t
36e10 6f 20 61 6e 79 20 78 49 6e 76 65 72 73 65 20 63  o any xInverse c
36e20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  all. */.    asse
36e30 72 74 28 20 70 4d 65 6d 2d 3e 75 54 65 6d 70 3d  rt( pMem->uTemp=
36e40 3d 30 78 31 31 32 32 65 30 65 33 20 29 3b 0a 20  =0x1122e0e3 );. 
36e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
36e60 68 69 73 20 69 73 20 61 6e 20 4f 50 5f 41 67 67  his is an OP_Agg
36e70 53 74 65 70 20 63 61 6c 6c 2e 20 20 4d 61 72 6b  Step call.  Mark
36e80 20 69 74 20 61 73 20 73 75 63 68 2e 20 2a 2f 0a   it as such. */.
36e90 20 20 20 20 70 4d 65 6d 2d 3e 75 54 65 6d 70 20      pMem->uTemp 
36ea0 3d 20 30 78 31 31 32 32 65 30 65 33 3b 0a 20 20  = 0x1122e0e3;.  
36eb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
36ec0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
36ed0 69 73 20 69 6e 73 69 64 65 20 6f 66 20 61 20 74  is inside of a t
36ee0 72 69 67 67 65 72 2c 20 74 68 65 20 72 65 67 69  rigger, the regi
36ef0 73 74 65 72 20 61 72 72 61 79 20 69 6e 20 61 4d  ster array in aM
36f00 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67 68 74 20  em[].  ** might 
36f10 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f 6e 65 20  change from one 
36f20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 74 68  evaluation to th
36f30 65 20 6e 65 78 74 2e 20 20 54 68 65 20 6e 65 78  e next.  The nex
36f40 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 0a  t block of code.
36f50 20 20 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20 73    ** checks to s
36f60 65 65 20 69 66 20 74 68 65 20 72 65 67 69 73 74  ee if the regist
36f70 65 72 20 61 72 72 61 79 20 68 61 73 20 63 68 61  er array has cha
36f80 6e 67 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nged, and if so 
36f90 69 74 0a 20 20 2a 2a 20 72 65 69 6e 69 74 69 61  it.  ** reinitia
36fa0 6c 69 7a 65 73 20 74 68 65 20 72 65 6c 61 76 61  lizes the relava
36fb0 6e 74 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  nt parts of the 
36fc0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
36fd0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 66 28 20  object */.  if( 
36fe0 70 43 74 78 2d 3e 70 4d 65 6d 20 21 3d 20 70 4d  pCtx->pMem != pM
36ff0 65 6d 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  em ){.    pCtx->
37000 70 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  pMem = pMem;.   
37010 20 66 6f 72 28 69 3d 70 43 74 78 2d 3e 61 72 67   for(i=pCtx->arg
37020 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  c-1; i>=0; i--) 
37030 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 20 3d 20  pCtx->argv[i] = 
37040 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69 5d  &aMem[pOp->p2+i]
37050 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
37060 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
37070 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d 3e 61 72  (i=0; i<pCtx->ar
37080 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  gc; i++){.    as
37090 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
370a0 28 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 20  (pCtx->argv[i]) 
370b0 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
370c0 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 69 2c  TRACE(pOp->p2+i,
370d0 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 3b   pCtx->argv[i]);
370e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
370f0 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 61 73 73 65  Mem->n++;.  asse
37100 72 74 28 20 70 43 74 78 2d 3e 70 4f 75 74 2d 3e  rt( pCtx->pOut->
37110 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20  flags==MEM_Null 
37120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 74  );.  assert( pCt
37130 78 2d 3e 69 73 45 72 72 6f 72 3d 3d 30 20 29 3b  x->isError==0 );
37140 0a 20 20 61 73 73 65 72 74 28 20 70 43 74 78 2d  .  assert( pCtx-
37150 3e 73 6b 69 70 46 6c 61 67 3d 3d 30 20 29 3b 0a  >skipFlag==0 );.
37160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37170 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
37180 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a   if( pOp->p1 ){.
37190 20 20 20 20 28 70 43 74 78 2d 3e 70 46 75 6e 63      (pCtx->pFunc
371a0 2d 3e 78 49 6e 76 65 72 73 65 29 28 70 43 74 78  ->xInverse)(pCtx
371b0 2c 70 43 74 78 2d 3e 61 72 67 63 2c 70 43 74 78  ,pCtx->argc,pCtx
371c0 2d 3e 61 72 67 76 29 3b 0a 20 20 7d 65 6c 73 65  ->argv);.  }else
371d0 0a 23 65 6e 64 69 66 0a 20 20 28 70 43 74 78 2d  .#endif.  (pCtx-
371e0 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 29 28  >pFunc->xSFunc)(
371f0 70 43 74 78 2c 70 43 74 78 2d 3e 61 72 67 63 2c  pCtx,pCtx->argc,
37200 70 43 74 78 2d 3e 61 72 67 76 29 3b 20 2f 2a 20  pCtx->argv); /* 
37210 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32  IMP: R-24505-232
37220 33 30 20 2a 2f 0a 0a 20 20 69 66 28 20 70 43 74  30 */..  if( pCt
37230 78 2d 3e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20  x->isError ){.  
37240 20 20 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72    if( pCtx->isEr
37250 72 6f 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ror>0 ){.      s
37260 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
37270 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  p, "%s", sqlite3
37280 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 43 74 78  _value_text(pCtx
37290 2d 3e 70 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ->pOut));.      
372a0 72 63 20 3d 20 70 43 74 78 2d 3e 69 73 45 72 72  rc = pCtx->isErr
372b0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
372c0 28 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67  ( pCtx->skipFlag
372d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
372e0 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
372f0 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a  ==OP_CollSeq );.
37300 20 20 20 20 20 20 69 20 3d 20 70 4f 70 5b 2d 31        i = pOp[-1
37310 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ].p1;.      if( 
37320 69 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  i ) sqlite3VdbeM
37330 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d  emSetInt64(&aMem
37340 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  [i], 1);.      p
37350 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20 3d 20  Ctx->skipFlag = 
37360 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
37370 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
37380 73 65 28 70 43 74 78 2d 3e 70 4f 75 74 29 3b 0a  se(pCtx->pOut);.
37390 20 20 20 20 70 43 74 78 2d 3e 70 4f 75 74 2d 3e      pCtx->pOut->
373a0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
373b0 3b 0a 20 20 20 20 70 43 74 78 2d 3e 69 73 45 72  ;.    pCtx->isEr
373c0 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ror = 0;.    if(
373d0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
373e0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
373f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 74   }.  assert( pCt
37400 78 2d 3e 70 4f 75 74 2d 3e 66 6c 61 67 73 3d 3d  x->pOut->flags==
37410 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  MEM_Null );.  as
37420 73 65 72 74 28 20 70 43 74 78 2d 3e 73 6b 69 70  sert( pCtx->skip
37430 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 62 72 65  Flag==0 );.  bre
37440 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
37450 3a 20 41 67 67 46 69 6e 61 6c 20 50 31 20 50 32  : AggFinal P1 P2
37460 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70   * P4 *.** Synop
37470 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50 31 5d  sis: accum=r[P1]
37480 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69   N=P2.**.** P1 i
37490 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  s the memory loc
374a0 61 74 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68  ation that is th
374b0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 66 6f  e accumulator fo
374c0 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a 2a  r an aggregate.*
374d0 2a 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63  * or window func
374e0 74 69 6f 6e 2e 20 20 45 78 65 63 75 74 65 20 74  tion.  Execute t
374f0 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e  he finalizer fun
37500 63 74 69 6f 6e 20 0a 2a 2a 20 66 6f 72 20 61 6e  ction .** for an
37510 20 61 67 67 72 65 67 61 74 65 20 61 6e 64 20 73   aggregate and s
37520 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
37530 69 6e 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 32 20  in P1..**.** P2 
37540 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
37550 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
37560 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
37570 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20 50  n takes and.** P
37580 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
37590 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 66 6f  o the FuncDef fo
375a0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  r this function.
375b0 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 67 75    The P2.** argu
375c0 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  ment is not used
375d0 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e   by this opcode.
375e0 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 68 65    It is only the
375f0 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67 75 61  re to disambigua
37600 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  te.** functions 
37610 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20 76 61  that can take va
37620 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66  rying numbers of
37630 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
37640 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e 74 20  .** P4 argument 
37650 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
37660 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72  or the case wher
37670 65 0a 2a 2a 20 74 68 65 20 73 74 65 70 20 66 75  e.** the step fu
37680 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 70  nction was not p
37690 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
376a0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
376b0 41 67 67 56 61 6c 75 65 20 2a 20 50 32 20 50 33  AggValue * P2 P3
376c0 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
376d0 73 3a 20 72 5b 50 33 5d 3d 76 61 6c 75 65 20 4e  s: r[P3]=value N
376e0 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  =P2.**.** Invoke
376f0 20 74 68 65 20 78 56 61 6c 75 65 28 29 20 66 75   the xValue() fu
37700 6e 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  nction and store
37710 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
37720 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a  egister P3..**.*
37730 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62  * P2 is the numb
37740 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
37750 74 68 61 74 20 74 68 65 20 73 74 65 70 20 66 75  that the step fu
37760 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e 64  nction takes and
37770 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
37780 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
37790 65 66 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  ef for this func
377a0 74 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a 2a 2a  tion.  The P2.**
377b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
377c0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f 70   used by this op
377d0 63 6f 64 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c  code.  It is onl
377e0 79 20 74 68 65 72 65 20 74 6f 20 64 69 73 61 6d  y there to disam
377f0 62 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e 63 74  biguate.** funct
37800 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 74 61  ions that can ta
37810 6b 65 20 76 61 72 79 69 6e 67 20 6e 75 6d 62 65  ke varying numbe
37820 72 73 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  rs of arguments.
37830 20 20 54 68 65 0a 2a 2a 20 50 34 20 61 72 67 75    The.** P4 argu
37840 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65  ment is only nee
37850 64 65 64 20 66 6f 72 20 74 68 65 20 63 61 73 65  ded for the case
37860 20 77 68 65 72 65 0a 2a 2a 20 74 68 65 20 73 74   where.** the st
37870 65 70 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ep function was 
37880 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  not previously c
37890 61 6c 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  alled..*/.case O
378a0 50 5f 41 67 67 56 61 6c 75 65 3a 0a 63 61 73 65  P_AggValue:.case
378b0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 3a 20 7b 0a   OP_AggFinal: {.
378c0 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 61    Mem *pMem;.  a
378d0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
378e0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d   && pOp->p1<=(p-
378f0 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
37900 72 73 6f 72 29 20 29 3b 0a 20 20 61 73 73 65 72  rsor) );.  asser
37910 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c  t( pOp->p3==0 ||
37920 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
37930 5f 41 67 67 56 61 6c 75 65 20 29 3b 0a 20 20 70  _AggValue );.  p
37940 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
37950 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
37960 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 7e  (pMem->flags & ~
37970 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67  (MEM_Null|MEM_Ag
37980 67 29 29 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  g))==0 );.#ifnde
37990 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
379a0 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70  NDOWFUNC.  if( p
379b0 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 6d 65  Op->p3 ){.    me
379c0 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
379d0 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  , &aMem[pOp->p3]
379e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
379f0 74 65 33 56 64 62 65 4d 65 6d 41 67 67 56 61 6c  te3VdbeMemAggVal
37a00 75 65 28 70 4d 65 6d 2c 20 26 61 4d 65 6d 5b 70  ue(pMem, &aMem[p
37a10 4f 70 2d 3e 70 33 5d 2c 20 70 4f 70 2d 3e 70 34  Op->p3], pOp->p4
37a20 2e 70 46 75 6e 63 29 3b 0a 20 20 20 20 70 4d 65  .pFunc);.    pMe
37a30 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
37a40 33 5d 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  3];.  }else.#end
37a50 69 66 0a 20 20 7b 0a 20 20 20 20 72 63 20 3d 20  if.  {.    rc = 
37a60 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 69  sqlite3VdbeMemFi
37a70 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70 4f 70  nalize(pMem, pOp
37a80 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20 20 7d  ->p4.pFunc);.  }
37a90 0a 20 20 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  .  .  if( rc ){.
37aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
37ab0 72 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71  rror(p, "%s", sq
37ac0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
37ad0 28 70 4d 65 6d 29 29 3b 0a 20 20 20 20 67 6f 74  (pMem));.    got
37ae0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
37af0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rror;.  }.  sqli
37b00 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
37b10 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63 6f  oding(pMem, enco
37b20 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f  ding);.  UPDATE_
37b30 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4d 65  MAX_BLOBSIZE(pMe
37b40 6d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  m);.  if( sqlite
37b50 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
37b60 4d 65 6d 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Mem) ){.    goto
37b70 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
37b80 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  break;.}..#ifnde
37b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
37ba0 4c 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 68 65  L./* Opcode: Che
37bb0 63 6b 70 6f 69 6e 74 20 50 31 20 50 32 20 50 33  ckpoint P1 P2 P3
37bc0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   * *.**.** Check
37bd0 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 50  point database P
37be0 31 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  1. This is a no-
37bf0 6f 70 20 69 66 20 50 31 20 69 73 20 6e 6f 74 20  op if P1 is not 
37c00 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
37c10 57 41 4c 20 6d 6f 64 65 2e 20 50 61 72 61 6d 65  WAL mode. Parame
37c20 74 65 72 20 50 32 20 69 73 20 6f 6e 65 20 6f 66  ter P2 is one of
37c30 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
37c40 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c  NT_PASSIVE, FULL
37c50 2c 0a 2a 2a 20 52 45 53 54 41 52 54 2c 20 6f 72  ,.** RESTART, or
37c60 20 54 52 55 4e 43 41 54 45 2e 20 20 57 72 69 74   TRUNCATE.  Writ
37c70 65 20 31 20 6f 72 20 30 20 69 6e 74 6f 20 6d 65  e 1 or 0 into me
37c80 6d 5b 50 33 5d 20 69 66 20 74 68 65 20 63 68 65  m[P3] if the che
37c90 63 6b 70 6f 69 6e 74 20 72 65 74 75 72 6e 73 0a  ckpoint returns.
37ca0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  ** SQLITE_BUSY o
37cb0 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76  r not, respectiv
37cc0 65 6c 79 2e 20 20 57 72 69 74 65 20 74 68 65 20  ely.  Write the 
37cd0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
37ce0 69 6e 20 74 68 65 0a 2a 2a 20 57 41 4c 20 61 66  in the.** WAL af
37cf0 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ter the checkpoi
37d00 6e 74 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31  nt into mem[P3+1
37d10 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ] and the number
37d20 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 20   of pages.** in 
37d30 74 68 65 20 57 41 4c 20 74 68 61 74 20 68 61 76  the WAL that hav
37d40 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e  e been checkpoin
37d50 74 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  ted after the ch
37d60 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70  eckpoint.** comp
37d70 6c 65 74 65 73 20 69 6e 74 6f 20 6d 65 6d 5b 50  letes into mem[P
37d80 33 2b 32 5d 2e 20 20 48 6f 77 65 76 65 72 20 6f  3+2].  However o
37d90 6e 20 61 6e 20 65 72 72 6f 72 2c 20 6d 65 6d 5b  n an error, mem[
37da0 50 33 2b 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d  P3+1] and.** mem
37db0 5b 50 33 2b 32 5d 20 61 72 65 20 69 6e 69 74 69  [P3+2] are initi
37dc0 61 6c 69 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f  alized to -1..*/
37dd0 0a 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f  .case OP_Checkpo
37de0 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 20  int: {.  int i; 
37df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e00 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
37e10 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
37e20 74 20 61 52 65 73 5b 33 5d 3b 20 20 20 20 20 20  t aRes[3];      
37e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37e40 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 4d 65   Results */.  Me
37e50 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20  m *pMem;        
37e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37e70 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68   Write results h
37e80 65 72 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ere */..  assert
37e90 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
37ea0 20 29 3b 0a 20 20 61 52 65 73 5b 30 5d 20 3d 20   );.  aRes[0] = 
37eb0 30 3b 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20 61  0;.  aRes[1] = a
37ec0 52 65 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 61  Res[2] = -1;.  a
37ed0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d  ssert( pOp->p2==
37ee0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
37ef0 54 5f 50 41 53 53 49 56 45 0a 20 20 20 20 20 20  T_PASSIVE.      
37f00 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c   || pOp->p2==SQL
37f10 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
37f20 55 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  ULL.       || pO
37f30 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48  p->p2==SQLITE_CH
37f40 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
37f50 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e  .       || pOp->
37f60 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b  p2==SQLITE_CHECK
37f70 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 0a 20  POINT_TRUNCATE. 
37f80 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
37f90 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
37fa0 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
37fb0 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20 26 61 52  2, &aRes[1], &aR
37fc0 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72 63  es[2]);.  if( rc
37fd0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   ){.    if( rc!=
37fe0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 20 67 6f  SQLITE_BUSY ) go
37ff0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
38000 65 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20  error;.    rc = 
38010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 61  SQLITE_OK;.    a
38020 52 65 73 5b 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Res[0] = 1;.  }.
38030 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 20    for(i=0, pMem 
38040 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
38050 3b 20 69 3c 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d  ; i<3; i++, pMem
38060 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
38070 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
38080 70 4d 65 6d 2c 20 28 69 36 34 29 61 52 65 73 5b  pMem, (i64)aRes[
38090 69 5d 29 3b 0a 20 20 7d 20 20 20 20 0a 20 20 62  i]);.  }    .  b
380a0 72 65 61 6b 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69  reak;.};  .#endi
380b0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
380c0 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 2f 2a  E_OMIT_PRAGMA./*
380d0 20 4f 70 63 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c   Opcode: Journal
380e0 4d 6f 64 65 20 50 31 20 50 32 20 50 33 20 2a 20  Mode P1 P2 P3 * 
380f0 2a 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  *.**.** Change t
38100 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  he journal mode 
38110 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 20 74  of database P1 t
38120 6f 20 50 33 2e 20 50 33 20 6d 75 73 74 20 62 65  o P3. P3 must be
38130 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 50   one of the.** P
38140 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
38150 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49 66 20  _XXX values. If 
38160 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65 6e  changing between
38170 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 6c   the various rol
38180 6c 62 61 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28  lback.** modes (
38190 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
381a0 2c 20 70 65 72 73 69 73 74 2c 20 6f 66 66 20 61  , persist, off a
381b0 6e 64 20 6d 65 6d 6f 72 79 29 2c 20 74 68 69 73  nd memory), this
381c0 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
381d0 6f 70 65 72 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f  operation. No IO
381e0 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   is required..**
381f0 0a 2a 2a 20 49 66 20 63 68 61 6e 67 69 6e 67 20  .** If changing 
38200 69 6e 74 6f 20 6f 72 20 6f 75 74 20 6f 66 20 57  into or out of W
38210 41 4c 20 6d 6f 64 65 20 74 68 65 20 70 72 6f 63  AL mode the proc
38220 65 64 75 72 65 20 69 73 20 6d 6f 72 65 20 63 6f  edure is more co
38230 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  mplicated..**.**
38240 20 57 72 69 74 65 20 61 20 73 74 72 69 6e 67 20   Write a string 
38250 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
38260 69 6e 61 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  inal journal-mod
38270 65 20 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  e to register P2
38280 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f 75  ..*/.case OP_Jou
38290 72 6e 61 6c 4d 6f 64 65 3a 20 7b 20 20 20 20 2f  rnalMode: {    /
382a0 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 42 74 72 65  * out2 */.  Btre
3