/ Hex Artifact Content
Login

Artifact 55ea5eb95860106a8f665231f8d0c6b55dbf8974:


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 4f 4d 49  fined(SQLITE_OMI
0fa0: 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 29 0a  T_BUILTIN_TEST).
0fb0: 23 20 64 65 66 69 6e 65 20 55 50 44 41 54 45 5f  # define UPDATE_
0fc0: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 50 29 20  MAX_BLOBSIZE(P) 
0fd0: 20 75 70 64 61 74 65 4d 61 78 42 6c 6f 62 73 69   updateMaxBlobsi
0fe0: 7a 65 28 50 29 0a 23 65 6c 73 65 0a 23 20 64 65  ze(P).#else.# de
0ff0: 66 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58 5f  fine UPDATE_MAX_
1000: 42 4c 4f 42 53 49 5a 45 28 50 29 0a 23 65 6e 64  BLOBSIZE(P).#end
1010: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  if../*.** Invoke
1020: 20 74 68 65 20 56 44 42 45 20 63 6f 76 65 72 61   the VDBE covera
1030: 67 65 20 63 61 6c 6c 62 61 63 6b 2c 20 69 66 20  ge callback, if 
1040: 74 68 61 74 20 63 61 6c 6c 62 61 63 6b 20 69 73  that callback is
1050: 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 0a   defined.  This.
1060: 2a 2a 20 66 65 61 74 75 72 65 20 69 73 20 75 73  ** feature is us
1070: 65 64 20 66 6f 72 20 74 65 73 74 20 73 75 69 74  ed for test suit
1080: 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 6f 6e 6c  e validation onl
1090: 79 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  y and does not a
10a0: 70 70 65 61 72 20 61 6e 0a 2a 2a 20 70 72 6f 64  ppear an.** prod
10b0: 75 63 74 69 6f 6e 20 62 75 69 6c 64 73 2e 0a 2a  uction builds..*
10c0: 2a 0a 2a 2a 20 4d 20 69 73 20 61 6e 20 69 6e 74  *.** M is an int
10d0: 65 67 65 72 2c 20 32 20 6f 72 20 33 2c 20 74 68  eger, 2 or 3, th
10e0: 61 74 20 69 6e 64 69 63 65 73 20 68 6f 77 20 6d  at indices how m
10f0: 61 6e 79 20 64 69 66 66 65 72 65 6e 74 20 77 61  any different wa
1100: 79 73 20 74 68 65 0a 2a 2a 20 62 72 61 6e 63 68  ys the.** branch
1110: 20 63 61 6e 20 67 6f 2e 20 20 49 74 20 69 73 20   can go.  It is 
1120: 75 73 75 61 6c 6c 79 20 32 2e 20 20 22 49 22 20  usually 2.  "I" 
1130: 69 73 20 74 68 65 20 64 69 72 65 63 74 69 6f 6e  is the direction
1140: 20 74 68 65 20 62 72 61 6e 63 68 0a 2a 2a 20 67   the branch.** g
1150: 6f 65 73 2e 20 20 30 20 6d 65 61 6e 73 20 66 61  oes.  0 means fa
1160: 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20 20 31 20  lls through.  1 
1170: 6d 65 61 6e 73 20 62 72 61 6e 63 68 20 69 73 20  means branch is 
1180: 74 61 6b 65 6e 2e 20 20 32 20 6d 65 61 6e 73 20  taken.  2 means 
1190: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6c  the.** second al
11a0: 74 65 72 6e 61 74 69 76 65 20 62 72 61 6e 63 68  ternative branch
11b0: 20 69 73 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   is taken..**.**
11c0: 20 69 53 72 63 4c 69 6e 65 20 69 73 20 74 68 65   iSrcLine is the
11d0: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 69 6e   source code lin
11e0: 65 20 28 66 72 6f 6d 20 74 68 65 20 5f 5f 4c 49  e (from the __LI
11f0: 4e 45 5f 5f 20 6d 61 63 72 6f 29 20 74 68 61 74  NE__ macro) that
1200: 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 68  .** generated th
1210: 65 20 56 44 42 45 20 69 6e 73 74 72 75 63 74 69  e VDBE instructi
1220: 6f 6e 2e 20 20 54 68 69 73 20 69 6e 73 74 72 75  on.  This instru
1230: 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mentation assume
1240: 73 20 74 68 61 74 20 61 6c 6c 0a 2a 2a 20 73 6f  s that all.** so
1250: 75 72 63 65 20 63 6f 64 65 20 69 73 20 69 6e 20  urce code is in 
1260: 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 28 74  a single file (t
1270: 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 29  he amalgamation)
1280: 2e 20 20 53 70 65 63 69 61 6c 20 76 61 6c 75 65  .  Special value
1290: 73 20 31 0a 2a 2a 20 61 6e 64 20 32 20 66 6f 72  s 1.** and 2 for
12a0: 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 70 61   the iSrcLine pa
12b0: 72 61 6d 65 74 65 72 20 6d 65 61 6e 20 74 68 61  rameter mean tha
12c0: 74 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61  t this particula
12d0: 72 20 62 72 61 6e 63 68 20 69 73 0a 2a 2a 20 61  r branch is.** a
12e0: 6c 77 61 79 73 20 74 61 6b 65 6e 20 6f 72 20 6e  lways taken or n
12f0: 65 76 65 72 20 74 61 6b 65 6e 2c 20 72 65 73 70  ever taken, resp
1300: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 23 69 66  ectively..*/.#if
1310: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1320: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 29 0a  _VDBE_COVERAGE).
1330: 23 20 64 65 66 69 6e 65 20 56 64 62 65 42 72 61  # define VdbeBra
1340: 6e 63 68 54 61 6b 65 6e 28 49 2c 4d 29 0a 23 65  nchTaken(I,M).#e
1350: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 56 64 62  lse.# define Vdb
1360: 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 49 2c 4d  eBranchTaken(I,M
1370: 29 20 76 64 62 65 54 61 6b 65 42 72 61 6e 63 68  ) vdbeTakeBranch
1380: 28 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 2c 49  (pOp->iSrcLine,I
1390: 2c 4d 29 0a 20 20 73 74 61 74 69 63 20 76 6f 69  ,M).  static voi
13a0: 64 20 76 64 62 65 54 61 6b 65 42 72 61 6e 63 68  d vdbeTakeBranch
13b0: 28 69 6e 74 20 69 53 72 63 4c 69 6e 65 2c 20 75  (int iSrcLine, u
13c0: 38 20 49 2c 20 75 38 20 4d 29 7b 0a 20 20 20 20  8 I, u8 M){.    
13d0: 69 66 28 20 69 53 72 63 4c 69 6e 65 3c 3d 32 20  if( iSrcLine<=2 
13e0: 26 26 20 41 4c 57 41 59 53 28 69 53 72 63 4c 69  && ALWAYS(iSrcLi
13f0: 6e 65 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 4d  ne>0) ){.      M
1400: 20 3d 20 69 53 72 63 4c 69 6e 65 3b 0a 20 20 20   = iSrcLine;.   
1410: 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 65     /* Assert the
1420: 20 74 72 75 74 68 20 6f 66 20 56 64 62 65 43 6f   truth of VdbeCo
1430: 76 65 72 61 67 65 41 6c 77 61 79 73 54 61 6b 65  verageAlwaysTake
1440: 6e 28 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a  n() and .      *
1450: 2a 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65  * VdbeCoverageNe
1460: 76 65 72 54 61 6b 65 6e 28 29 20 2a 2f 0a 20 20  verTaken() */.  
1470: 20 20 20 20 61 73 73 65 72 74 28 20 28 4d 20 26      assert( (M &
1480: 20 49 29 3d 3d 49 20 29 3b 0a 20 20 20 20 7d 65   I)==I );.    }e
1490: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73  lse{.      if( s
14a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
14b0: 69 67 2e 78 56 64 62 65 42 72 61 6e 63 68 3d 3d  ig.xVdbeBranch==
14c0: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 4e  0 ) return;  /*N
14d0: 4f 5f 54 45 53 54 2a 2f 0a 20 20 20 20 20 20 73  O_TEST*/.      s
14e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
14f0: 69 67 2e 78 56 64 62 65 42 72 61 6e 63 68 28 73  ig.xVdbeBranch(s
1500: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1510: 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72  ig.pVdbeBranchAr
1520: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 20 20 20 20 69 53 72 63 4c 69 6e           iSrcLin
1550: 65 2c 49 2c 4d 29 3b 0a 20 20 20 20 7d 0a 20 20  e,I,M);.    }.  
1560: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1570: 43 6f 6e 76 65 72 74 20 74 68 65 20 67 69 76 65  Convert the give
1580: 6e 20 72 65 67 69 73 74 65 72 20 69 6e 74 6f 20  n register into 
1590: 61 20 73 74 72 69 6e 67 20 69 66 20 69 74 20 69  a string if it i
15a0: 73 6e 27 74 20 6f 6e 65 0a 2a 2a 20 61 6c 72 65  sn't one.** alre
15b0: 61 64 79 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ady. Return non-
15c0: 7a 65 72 6f 20 69 66 20 61 20 6d 61 6c 6c 6f 63  zero if a malloc
15d0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65  () fails..*/.#de
15e0: 66 69 6e 65 20 53 74 72 69 6e 67 69 66 79 28 50  fine Stringify(P
15f0: 2c 20 65 6e 63 29 20 5c 0a 20 20 20 69 66 28 28  , enc) \.   if((
1600: 28 50 29 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  (P)->flags&(MEM_
1610: 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  Str|MEM_Blob))==
1620: 30 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  0 && sqlite3Vdbe
1630: 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 50 2c 65  MemStringify(P,e
1640: 6e 63 2c 30 29 29 20 5c 0a 20 20 20 20 20 7b 20  nc,0)) \.     { 
1650: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20 7d 0a 0a  goto no_mem; }..
1660: 2f 2a 0a 2a 2a 20 41 6e 20 65 70 68 65 6d 65 72  /*.** An ephemer
1670: 61 6c 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20  al string value 
1680: 28 73 69 67 6e 69 66 69 65 64 20 62 79 20 74 68  (signified by th
1690: 65 20 4d 45 4d 5f 45 70 68 65 6d 20 66 6c 61 67  e MEM_Ephem flag
16a0: 29 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  ) contains.** a 
16b0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 79 6e  pointer to a dyn
16c0: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
16d0: 65 64 20 73 74 72 69 6e 67 20 77 68 65 72 65 20  ed string where 
16e0: 73 6f 6d 65 20 6f 74 68 65 72 20 65 6e 74 69 74  some other entit
16f0: 79 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  y.** is responsi
1700: 62 6c 65 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ble for dealloca
1710: 74 69 6e 67 20 74 68 61 74 20 73 74 72 69 6e 67  ting that string
1720: 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20 72  .  Because the r
1730: 65 67 69 73 74 65 72 0a 2a 2a 20 64 6f 65 73 20  egister.** does 
1740: 6e 6f 74 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20  not control the 
1750: 73 74 72 69 6e 67 2c 20 69 74 20 6d 69 67 68 74  string, it might
1760: 20 62 65 20 64 65 6c 65 74 65 64 20 77 69 74 68   be deleted with
1770: 6f 75 74 20 74 68 65 20 72 65 67 69 73 74 65 72  out the register
1780: 0a 2a 2a 20 6b 6e 6f 77 69 6e 67 20 69 74 2e 0a  .** knowing it..
1790: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17a0: 6e 65 20 63 6f 6e 76 65 72 74 73 20 61 6e 20 65  ne converts an e
17b0: 70 68 65 6d 65 72 61 6c 20 73 74 72 69 6e 67 20  phemeral string 
17c0: 69 6e 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c  into a dynamical
17d0: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ly allocated.** 
17e0: 73 74 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  string that the 
17f0: 72 65 67 69 73 74 65 72 20 69 74 73 65 6c 66 20  register itself 
1800: 63 6f 6e 74 72 6f 6c 73 2e 20 20 49 6e 20 6f 74  controls.  In ot
1810: 68 65 72 20 77 6f 72 64 73 2c 20 69 74 0a 2a 2a  her words, it.**
1820: 20 63 6f 6e 76 65 72 74 73 20 61 6e 20 4d 45 4d   converts an MEM
1830: 5f 45 70 68 65 6d 20 73 74 72 69 6e 67 20 69 6e  _Ephem string in
1840: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 69 74 68  to a string with
1850: 20 50 2e 7a 3d 3d 50 2e 7a 4d 61 6c 6c 6f 63 2e   P.z==P.zMalloc.
1860: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 65 65 70  .*/.#define Deep
1870: 68 65 6d 65 72 61 6c 69 7a 65 28 50 29 20 5c 0a  hemeralize(P) \.
1880: 20 20 20 69 66 28 20 28 28 50 29 2d 3e 66 6c 61     if( ((P)->fla
1890: 67 73 26 4d 45 4d 5f 45 70 68 65 6d 29 21 3d 30  gs&MEM_Ephem)!=0
18a0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c   \.       && sql
18b0: 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57  ite3VdbeMemMakeW
18c0: 72 69 74 65 61 62 6c 65 28 50 29 20 29 7b 20 67  riteable(P) ){ g
18d0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 7d 0a 0a 2f 2a  oto no_mem;}../*
18e0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
18f0: 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  the cursor was o
1900: 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
1910: 4f 50 5f 4f 70 65 6e 53 6f 72 74 65 72 20 6f 70  OP_OpenSorter op
1920: 63 6f 64 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  code. */.#define
1930: 20 69 73 53 6f 72 74 65 72 28 78 29 20 28 28 78   isSorter(x) ((x
1940: 29 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  )->eCurType==CUR
1950: 54 59 50 45 5f 53 4f 52 54 45 52 29 0a 0a 2f 2a  TYPE_SORTER)../*
1960: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 56 64 62  .** Allocate Vdb
1970: 65 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69  eCursor number i
1980: 43 75 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70  Cur.  Return a p
1990: 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 52  ointer to it.  R
19a0: 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
19b0: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
19c0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
19d0: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 61 6c 6c   VdbeCursor *all
19e0: 6f 63 61 74 65 43 75 72 73 6f 72 28 0a 20 20 56  ocateCursor(.  V
19f0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
1a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
1a10: 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
1a20: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
1a30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1a40: 6f 66 20 74 68 65 20 6e 65 77 20 56 64 62 65 43  of the new VdbeC
1a50: 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ursor */.  int n
1a60: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
1a70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
1a80: 65 6c 64 73 20 69 6e 20 74 68 65 20 74 61 62 6c  elds in the tabl
1a90: 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
1aa0: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
1ab0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1ac0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 6c  e the cursor bel
1ad0: 6f 6e 67 73 20 74 6f 2c 20 6f 72 20 2d 31 20 2a  ongs to, or -1 *
1ae0: 2f 0a 20 20 75 38 20 65 43 75 72 54 79 70 65 20  /.  u8 eCurType 
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
1b00: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 63 75 72  e of the new cur
1b10: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 46  sor */.){.  /* F
1b20: 69 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ind the memory c
1b30: 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ell that will be
1b40: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
1b50: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
1b60: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20  y.  ** required 
1b70: 66 6f 72 20 74 68 69 73 20 56 64 62 65 43 75 72  for this VdbeCur
1b80: 73 6f 72 20 73 74 72 75 63 74 75 72 65 2e 20 49  sor structure. I
1b90: 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
1ba0: 74 6f 20 75 73 65 20 61 20 0a 20 20 2a 2a 20 76  to use a .  ** v
1bb0: 64 62 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  dbe memory cell 
1bc0: 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 6d 65  to manage the me
1bd0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1be0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 0a 20  required for a. 
1bf0: 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 20 73   ** VdbeCursor s
1c00: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
1c10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f   following reaso
1c20: 6e 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ns:.  **.  **   
1c30: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 63 75 72 73  * Sometimes curs
1c40: 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 75  or numbers are u
1c50: 73 65 64 20 66 6f 72 20 61 20 63 6f 75 70 6c 65  sed for a couple
1c60: 20 6f 66 20 64 69 66 66 65 72 65 6e 74 0a 20 20   of different.  
1c70: 2a 2a 20 20 20 20 20 70 75 72 70 6f 73 65 73 20  **     purposes 
1c80: 69 6e 20 61 20 76 64 62 65 20 70 72 6f 67 72 61  in a vdbe progra
1c90: 6d 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 74  m. The different
1ca0: 20 75 73 65 73 20 6d 69 67 68 74 20 72 65 71 75   uses might requ
1cb0: 69 72 65 0a 20 20 2a 2a 20 20 20 20 20 64 69 66  ire.  **     dif
1cc0: 66 65 72 65 6e 74 20 73 69 7a 65 64 20 61 6c 6c  ferent sized all
1cd0: 6f 63 61 74 69 6f 6e 73 2e 20 4d 65 6d 6f 72 79  ocations. Memory
1ce0: 20 63 65 6c 6c 73 20 70 72 6f 76 69 64 65 20 67   cells provide g
1cf0: 72 6f 77 61 62 6c 65 0a 20 20 2a 2a 20 20 20 20  rowable.  **    
1d00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   allocations..  
1d10: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
1d20: 20 75 73 69 6e 67 20 45 4e 41 42 4c 45 5f 4d 45   using ENABLE_ME
1d30: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 2c  MORY_MANAGEMENT,
1d40: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 62 75 66   memory cell buf
1d50: 66 65 72 73 20 63 61 6e 0a 20 20 2a 2a 20 20 20  fers can.  **   
1d60: 20 20 62 65 20 66 72 65 65 64 20 6c 61 7a 69 6c    be freed lazil
1d70: 79 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  y via the sqlite
1d80: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
1d90: 28 29 20 41 50 49 2e 20 54 68 69 73 0a 20 20 2a  () API. This.  *
1da0: 2a 20 20 20 20 20 6d 69 6e 69 6d 69 7a 65 73 20  *     minimizes 
1db0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  the number of ma
1dc0: 6c 6c 6f 63 20 63 61 6c 6c 73 20 6d 61 64 65 20  lloc calls made 
1dd0: 62 79 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 20  by the system.. 
1de0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 65 6d   **.  ** The mem
1df0: 6f 72 79 20 63 65 6c 6c 20 66 6f 72 20 63 75 72  ory cell for cur
1e00: 73 6f 72 20 30 20 69 73 20 61 4d 65 6d 5b 30 5d  sor 0 is aMem[0]
1e10: 2e 20 54 68 65 20 72 65 73 74 20 61 72 65 20 61  . The rest are a
1e20: 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 0a 20 20  llocated from.  
1e30: 2a 2a 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  ** the top of th
1e40: 65 20 72 65 67 69 73 74 65 72 20 73 70 61 63 65  e register space
1e50: 2e 20 20 43 75 72 73 6f 72 20 31 20 69 73 20 61  .  Cursor 1 is a
1e60: 74 20 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 31 5d  t Mem[p->nMem-1]
1e70: 2e 0a 20 20 2a 2a 20 43 75 72 73 6f 72 20 32 20  ..  ** Cursor 2 
1e80: 69 73 20 61 74 20 4d 65 6d 5b 70 2d 3e 6e 4d 65  is at Mem[p->nMe
1e90: 6d 2d 32 5d 2e 20 41 6e 64 20 73 6f 20 66 6f 72  m-2]. And so for
1ea0: 74 68 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 20 2a  th..  */.  Mem *
1eb0: 70 4d 65 6d 20 3d 20 69 43 75 72 3e 30 20 3f 20  pMem = iCur>0 ? 
1ec0: 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d  &p->aMem[p->nMem
1ed0: 2d 69 43 75 72 5d 20 3a 20 70 2d 3e 61 4d 65 6d  -iCur] : p->aMem
1ee0: 3b 0a 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ;..  int nByte;.
1ef0: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1f00: 78 20 3d 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  x = 0;.  nByte =
1f10: 20 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73   .      ROUND8(s
1f20: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
1f30: 29 29 20 2b 20 32 2a 73 69 7a 65 6f 66 28 75 33  )) + 2*sizeof(u3
1f40: 32 29 2a 6e 46 69 65 6c 64 20 2b 20 0a 20 20 20  2)*nField + .   
1f50: 20 20 20 28 65 43 75 72 54 79 70 65 3d 3d 43 55     (eCurType==CU
1f60: 52 54 59 50 45 5f 42 54 52 45 45 3f 73 71 6c 69  RTYPE_BTREE?sqli
1f70: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1f80: 7a 65 28 29 3a 30 29 3b 0a 0a 20 20 61 73 73 65  ze():0);..  asse
1f90: 72 74 28 20 69 43 75 72 3e 3d 30 20 26 26 20 69  rt( iCur>=0 && i
1fa0: 43 75 72 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  Cur<p->nCursor )
1fb0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
1fc0: 5b 69 43 75 72 5d 20 29 7b 20 2f 2a 4f 50 54 49  [iCur] ){ /*OPTI
1fd0: 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53  MIZATION-IF-FALS
1fe0: 45 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56  E*/.    sqlite3V
1ff0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
2000: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 29   p->apCsr[iCur])
2010: 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69  ;.    p->apCsr[i
2020: 43 75 72 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Cur] = 0;.  }.  
2030: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73  if( SQLITE_OK==s
2040: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
2050: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
2060: 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  , nByte) ){.    
2070: 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d  p->apCsr[iCur] =
2080: 20 70 43 78 20 3d 20 28 56 64 62 65 43 75 72 73   pCx = (VdbeCurs
2090: 6f 72 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  or*)pMem->z;.   
20a0: 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20   memset(pCx, 0, 
20b0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
20c0: 72 29 29 3b 0a 20 20 20 20 70 43 78 2d 3e 65 43  r));.    pCx->eC
20d0: 75 72 54 79 70 65 20 3d 20 65 43 75 72 54 79 70  urType = eCurTyp
20e0: 65 3b 0a 20 20 20 20 70 43 78 2d 3e 69 44 62 20  e;.    pCx->iDb 
20f0: 3d 20 69 44 62 3b 0a 20 20 20 20 70 43 78 2d 3e  = iDb;.    pCx->
2100: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
2110: 0a 20 20 20 20 70 43 78 2d 3e 61 4f 66 66 73 65  .    pCx->aOffse
2120: 74 20 3d 20 26 70 43 78 2d 3e 61 54 79 70 65 5b  t = &pCx->aType[
2130: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 69 66 28  nField];.    if(
2140: 20 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59   eCurType==CURTY
2150: 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20  PE_BTREE ){.    
2160: 20 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f    pCx->uc.pCurso
2170: 72 20 3d 20 28 42 74 43 75 72 73 6f 72 2a 29 0a  r = (BtCursor*).
2180: 20 20 20 20 20 20 20 20 20 20 26 70 4d 65 6d 2d            &pMem-
2190: 3e 7a 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  >z[ROUND8(sizeof
21a0: 28 56 64 62 65 43 75 72 73 6f 72 29 29 2b 32 2a  (VdbeCursor))+2*
21b0: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65  sizeof(u32)*nFie
21c0: 6c 64 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld];.      sqlit
21d0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
21e0: 6f 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  o(pCx->uc.pCurso
21f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2200: 72 65 74 75 72 6e 20 70 43 78 3b 0a 7d 0a 0a 2f  return pCx;.}../
2210: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76  *.** Try to conv
2220: 65 72 74 20 61 20 76 61 6c 75 65 20 69 6e 74 6f  ert a value into
2230: 20 61 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65   a numeric repre
2240: 73 65 6e 74 61 74 69 6f 6e 20 69 66 20 77 65 20  sentation if we 
2250: 63 61 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77 69 74  can.** do so wit
2260: 68 6f 75 74 20 6c 6f 73 73 20 6f 66 20 69 6e 66  hout loss of inf
2270: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74  ormation.  In ot
2280: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
2290: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f 6f 6b  e string.** look
22a0: 73 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c  s like a number,
22b0: 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f   convert it into
22c0: 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 69   a number.  If i
22d0: 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6c 6f  t does not.** lo
22e0: 6f 6b 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72  ok like a number
22f0: 2c 20 6c 65 61 76 65 20 69 74 20 61 6c 6f 6e 65  , leave it alone
2300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
2310: 54 72 79 46 6f 72 49 6e 74 20 66 6c 61 67 20 69  TryForInt flag i
2320: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 65 78 74  s true, then ext
2330: 72 61 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  ra effort is mad
2340: 65 20 74 6f 20 67 69 76 65 0a 2a 2a 20 61 6e 20  e to give.** an 
2350: 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e  integer represen
2360: 74 61 74 69 6f 6e 2e 20 20 53 74 72 69 6e 67 73  tation.  Strings
2370: 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20   that look like 
2380: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
2390: 2a 20 76 61 6c 75 65 73 20 62 75 74 20 77 68 69  * values but whi
23a0: 63 68 20 68 61 76 65 20 6e 6f 20 66 72 61 63 74  ch have no fract
23b0: 69 6f 6e 61 6c 20 63 6f 6d 70 6f 6e 65 6e 74 20  ional component 
23c0: 28 65 78 61 6d 70 6c 65 3a 20 27 34 38 2e 30 30  (example: '48.00
23d0: 27 29 0a 2a 2a 20 77 69 6c 6c 20 68 61 76 65 20  ').** will have 
23e0: 61 20 4d 45 4d 5f 49 6e 74 20 72 65 70 72 65 73  a MEM_Int repres
23f0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 62 54  entation when bT
2400: 72 79 46 6f 72 49 6e 74 20 69 73 20 74 72 75 65  ryForInt is true
2410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 54 72 79 46  ..**.** If bTryF
2420: 6f 72 49 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  orInt is false, 
2430: 74 68 65 6e 20 69 66 20 74 68 65 20 69 6e 70 75  then if the inpu
2440: 74 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  t string contain
2450: 73 20 61 20 64 65 63 69 6d 61 6c 0a 2a 2a 20 70  s a decimal.** p
2460: 6f 69 6e 74 20 6f 72 20 65 78 70 6f 6e 65 6e 74  oint or exponent
2470: 69 61 6c 20 6e 6f 74 61 74 69 6f 6e 2c 20 74 68  ial notation, th
2480: 65 20 72 65 73 75 6c 74 20 69 73 20 6f 6e 6c 79  e result is only
2490: 20 4d 45 4d 5f 52 65 61 6c 2c 20 65 76 65 6e 0a   MEM_Real, even.
24a0: 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
24b0: 6e 20 65 78 61 63 74 20 69 6e 74 65 67 65 72 20  n exact integer 
24c0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
24d0: 66 20 74 68 65 20 71 75 61 6e 74 69 74 79 2e 0a  f the quantity..
24e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
24f0: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
2500: 69 74 79 28 4d 65 6d 20 2a 70 52 65 63 2c 20 69  ity(Mem *pRec, i
2510: 6e 74 20 62 54 72 79 46 6f 72 49 6e 74 29 7b 0a  nt bTryForInt){.
2520: 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 75 65 3b    double rValue;
2530: 0a 20 20 69 36 34 20 69 56 61 6c 75 65 3b 0a 20  .  i64 iValue;. 
2540: 20 75 38 20 65 6e 63 20 3d 20 70 52 65 63 2d 3e   u8 enc = pRec->
2550: 65 6e 63 3b 0a 20 20 61 73 73 65 72 74 28 20 28  enc;.  assert( (
2560: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pRec->flags & (M
2570: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 49 6e 74 7c 4d  EM_Str|MEM_Int|M
2580: 45 4d 5f 52 65 61 6c 29 29 3d 3d 4d 45 4d 5f 53  EM_Real))==MEM_S
2590: 74 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tr );.  if( sqli
25a0: 74 65 33 41 74 6f 46 28 70 52 65 63 2d 3e 7a 2c  te3AtoF(pRec->z,
25b0: 20 26 72 56 61 6c 75 65 2c 20 70 52 65 63 2d 3e   &rValue, pRec->
25c0: 6e 2c 20 65 6e 63 29 3d 3d 30 20 29 20 72 65 74  n, enc)==0 ) ret
25d0: 75 72 6e 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  urn;.  if( 0==sq
25e0: 6c 69 74 65 33 41 74 6f 69 36 34 28 70 52 65 63  lite3Atoi64(pRec
25f0: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 2c 20 70 52  ->z, &iValue, pR
2600: 65 63 2d 3e 6e 2c 20 65 6e 63 29 20 29 7b 0a 20  ec->n, enc) ){. 
2610: 20 20 20 70 52 65 63 2d 3e 75 2e 69 20 3d 20 69     pRec->u.i = i
2620: 56 61 6c 75 65 3b 0a 20 20 20 20 70 52 65 63 2d  Value;.    pRec-
2630: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 49 6e  >flags |= MEM_In
2640: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
2650: 70 52 65 63 2d 3e 75 2e 72 20 3d 20 72 56 61 6c  pRec->u.r = rVal
2660: 75 65 3b 0a 20 20 20 20 70 52 65 63 2d 3e 66 6c  ue;.    pRec->fl
2670: 61 67 73 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c 3b  ags |= MEM_Real;
2680: 0a 20 20 20 20 69 66 28 20 62 54 72 79 46 6f 72  .    if( bTryFor
2690: 49 6e 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  Int ) sqlite3Vdb
26a0: 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79  eIntegerAffinity
26b0: 28 70 52 65 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pRec);.  }.}../
26c0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67 20  *.** Processing 
26d0: 69 73 20 64 65 74 65 72 6d 69 6e 65 20 62 79 20  is determine by 
26e0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 61 72  the affinity par
26f0: 61 6d 65 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 53 51  ameter:.**.** SQ
2700: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
2710: 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  :.** SQLITE_AFF_
2720: 52 45 41 4c 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f  REAL:.** SQLITE_
2730: 41 46 46 5f 4e 55 4d 45 52 49 43 3a 0a 2a 2a 20  AFF_NUMERIC:.** 
2740: 20 20 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72     Try to conver
2750: 74 20 70 52 65 63 20 74 6f 20 61 6e 20 69 6e 74  t pRec to an int
2760: 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74  eger representat
2770: 69 6f 6e 20 6f 72 20 61 20 0a 2a 2a 20 20 20 20  ion or a .**    
2780: 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 72  floating-point r
2790: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 66  epresentation if
27a0: 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72   an integer repr
27b0: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
27c0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
27d0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
27e0: 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
27f0: 6e 74 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 20 20  ntation is.**   
2800: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 72 65   always preferre
2810: 64 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 61  d, even if the a
2820: 66 66 69 6e 69 74 79 20 69 73 20 52 45 41 4c 2c  ffinity is REAL,
2830: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 61   because.**    a
2840: 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
2850: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  entation is more
2860: 20 73 70 61 63 65 20 65 66 66 69 63 69 65 6e 74   space efficient
2870: 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   on disk..**.** 
2880: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
2890: 0a 2a 2a 20 20 20 20 43 6f 6e 76 65 72 74 20 70  .**    Convert p
28a0: 52 65 63 20 74 6f 20 61 20 74 65 78 74 20 72 65  Rec to a text re
28b0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a  presentation..**
28c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  .** SQLITE_AFF_B
28d0: 4c 4f 42 3a 0a 2a 2a 20 20 20 20 4e 6f 2d 6f 70  LOB:.**    No-op
28e0: 2e 20 20 70 52 65 63 20 69 73 20 75 6e 63 68 61  .  pRec is uncha
28f0: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
2900: 76 6f 69 64 20 61 70 70 6c 79 41 66 66 69 6e 69  void applyAffini
2910: 74 79 28 0a 20 20 4d 65 6d 20 2a 70 52 65 63 2c  ty(.  Mem *pRec,
2920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2930: 20 76 61 6c 75 65 20 74 6f 20 61 70 70 6c 79 20   value to apply 
2940: 61 66 66 69 6e 69 74 79 20 74 6f 20 2a 2f 0a 20  affinity to */. 
2950: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 2c 20   char affinity, 
2960: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69       /* The affi
2970: 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70 6c 69  nity to be appli
2980: 65 64 20 2a 2f 0a 20 20 75 38 20 65 6e 63 20 20  ed */.  u8 enc  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
29a0: 73 65 20 74 68 69 73 20 74 65 78 74 20 65 6e 63  se this text enc
29b0: 6f 64 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66  oding */.){.  if
29c0: 28 20 61 66 66 69 6e 69 74 79 3e 3d 53 51 4c 49  ( affinity>=SQLI
29d0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
29e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  {.    assert( af
29f0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2a00: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
2a10: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2a20: 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 20 20  FF_REAL.        
2a30: 20 20 20 20 20 7c 7c 20 61 66 66 69 6e 69 74 79       || affinity
2a40: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
2a50: 45 52 49 43 20 29 3b 0a 20 20 20 20 69 66 28 20  ERIC );.    if( 
2a60: 28 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d  (pRec->flags & M
2a70: 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 20 2f 2a  EM_Int)==0 ){ /*
2a80: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d  OPTIMIZATION-IF-
2a90: 46 41 4c 53 45 2a 2f 0a 20 20 20 20 20 20 69 66  FALSE*/.      if
2aa0: 28 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 20 26  ( (pRec->flags &
2ab0: 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b   MEM_Real)==0 ){
2ac0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65  .        if( pRe
2ad0: 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  c->flags & MEM_S
2ae0: 74 72 20 29 20 61 70 70 6c 79 4e 75 6d 65 72 69  tr ) applyNumeri
2af0: 63 41 66 66 69 6e 69 74 79 28 70 52 65 63 2c 31  cAffinity(pRec,1
2b00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2b10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b20: 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69  dbeIntegerAffini
2b30: 74 79 28 70 52 65 63 29 3b 0a 20 20 20 20 20 20  ty(pRec);.      
2b40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
2b50: 69 66 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51  if( affinity==SQ
2b60: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b  LITE_AFF_TEXT ){
2b70: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 74 74  .    /* Only att
2b80: 65 6d 70 74 20 74 68 65 20 63 6f 6e 76 65 72 73  empt the convers
2b90: 69 6f 6e 20 74 6f 20 54 45 58 54 20 69 66 20 74  ion to TEXT if t
2ba0: 68 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 67  here is an integ
2bb0: 65 72 20 6f 72 20 72 65 61 6c 0a 20 20 20 20 2a  er or real.    *
2bc0: 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
2bd0: 20 28 62 6c 6f 62 20 61 6e 64 20 4e 55 4c 4c 20   (blob and NULL 
2be0: 64 6f 20 6e 6f 74 20 67 65 74 20 63 6f 6e 76 65  do not get conve
2bf0: 72 74 65 64 29 20 62 75 74 20 6e 6f 20 73 74 72  rted) but no str
2c00: 69 6e 67 0a 20 20 20 20 2a 2a 20 72 65 70 72 65  ing.    ** repre
2c10: 73 65 6e 74 61 74 69 6f 6e 2e 20 20 49 74 20 77  sentation.  It w
2c20: 6f 75 6c 64 20 62 65 20 68 61 72 6d 6c 65 73 73  ould be harmless
2c30: 20 74 6f 20 72 65 70 65 61 74 20 74 68 65 20 63   to repeat the c
2c40: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 0a 20 20  onversion if .  
2c50: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6c    ** there is al
2c60: 72 65 61 64 79 20 61 20 73 74 72 69 6e 67 20 72  ready a string r
2c70: 65 70 2c 20 62 75 74 20 69 74 20 69 73 20 70 6f  ep, but it is po
2c80: 69 6e 74 6c 65 73 73 20 74 6f 20 77 61 73 74 65  intless to waste
2c90: 20 74 68 6f 73 65 0a 20 20 20 20 2a 2a 20 43 50   those.    ** CP
2ca0: 55 20 63 79 63 6c 65 73 2e 20 2a 2f 0a 20 20 20  U cycles. */.   
2cb0: 20 69 66 28 20 30 3d 3d 28 70 52 65 63 2d 3e 66   if( 0==(pRec->f
2cc0: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 20 29 7b  lags&MEM_Str) ){
2cd0: 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d   /*OPTIMIZATION-
2ce0: 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 20  IF-FALSE*/.     
2cf0: 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61 67   if( (pRec->flag
2d00: 73 26 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  s&(MEM_Real|MEM_
2d10: 49 6e 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20  Int)) ){.       
2d20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2d30: 74 72 69 6e 67 69 66 79 28 70 52 65 63 2c 20 65  tringify(pRec, e
2d40: 6e 63 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  nc, 1);.      }.
2d50: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 63 2d 3e      }.    pRec->
2d60: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 52  flags &= ~(MEM_R
2d70: 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  eal|MEM_Int);.  
2d80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
2d90: 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20 74 79  o convert the ty
2da0: 70 65 20 6f 66 20 61 20 66 75 6e 63 74 69 6f 6e  pe of a function
2db0: 20 61 72 67 75 6d 65 6e 74 20 6f 72 20 61 20 72   argument or a r
2dc0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  esult column.** 
2dd0: 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63 20 72  into a numeric r
2de0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20  epresentation.  
2df0: 55 73 65 20 65 69 74 68 65 72 20 49 4e 54 45 47  Use either INTEG
2e00: 45 52 20 6f 72 20 52 45 41 4c 20 77 68 69 63 68  ER or REAL which
2e10: 65 76 65 72 0a 2a 2a 20 69 73 20 61 70 70 72 6f  ever.** is appro
2e20: 70 72 69 61 74 65 2e 20 20 42 75 74 20 6f 6e 6c  priate.  But onl
2e30: 79 20 64 6f 20 74 68 65 20 63 6f 6e 76 65 72 73  y do the convers
2e40: 69 6f 6e 20 69 66 20 69 74 20 69 73 20 70 6f 73  ion if it is pos
2e50: 73 69 62 6c 65 20 77 69 74 68 6f 75 74 0a 2a 2a  sible without.**
2e60: 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61   loss of informa
2e70: 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  tion and return 
2e80: 74 68 65 20 72 65 76 69 73 65 64 20 74 79 70 65  the revised type
2e90: 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
2ea0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2eb0: 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74  _value_numeric_t
2ec0: 79 70 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ype(sqlite3_valu
2ed0: 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 6e 74 20  e *pVal){.  int 
2ee0: 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
2ef0: 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
2f00: 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ;.  if( eType==S
2f10: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
2f20: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 28 4d    Mem *pMem = (M
2f30: 65 6d 2a 29 70 56 61 6c 3b 0a 20 20 20 20 61 70  em*)pVal;.    ap
2f40: 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
2f50: 74 79 28 70 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  ty(pMem, 0);.   
2f60: 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
2f70: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c  _value_type(pVal
2f80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2f90: 65 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eType;.}../*.** 
2fa0: 45 78 70 6f 72 74 65 64 20 76 65 72 73 69 6f 6e  Exported version
2fb0: 20 6f 66 20 61 70 70 6c 79 41 66 66 69 6e 69 74   of applyAffinit
2fc0: 79 28 29 2e 20 54 68 69 73 20 6f 6e 65 20 77 6f  y(). This one wo
2fd0: 72 6b 73 20 6f 6e 20 73 71 6c 69 74 65 33 5f 76  rks on sqlite3_v
2fe0: 61 6c 75 65 2a 2c 20 0a 2a 2a 20 6e 6f 74 20 74  alue*, .** not t
2ff0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 4d 65 6d 2a  he internal Mem*
3000: 20 74 79 70 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   type..*/.void s
3010: 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
3020: 41 66 66 69 6e 69 74 79 28 0a 20 20 73 71 6c 69  Affinity(.  sqli
3030: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c  te3_value *pVal,
3040: 20 0a 20 20 75 38 20 61 66 66 69 6e 69 74 79 2c   .  u8 affinity,
3050: 20 0a 20 20 75 38 20 65 6e 63 0a 29 7b 0a 20 20   .  u8 enc.){.  
3060: 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 28 4d  applyAffinity((M
3070: 65 6d 20 2a 29 70 56 61 6c 2c 20 61 66 66 69 6e  em *)pVal, affin
3080: 69 74 79 2c 20 65 6e 63 29 3b 0a 7d 0a 0a 2f 2a  ity, enc);.}../*
3090: 0a 2a 2a 20 70 4d 65 6d 20 63 75 72 72 65 6e 74  .** pMem current
30a0: 6c 79 20 6f 6e 6c 79 20 68 6f 6c 64 73 20 61 20  ly only holds a 
30b0: 73 74 72 69 6e 67 20 74 79 70 65 20 28 6f 72 20  string type (or 
30c0: 6d 61 79 62 65 20 61 20 42 4c 4f 42 20 74 68 61  maybe a BLOB tha
30d0: 74 20 77 65 20 63 61 6e 0a 2a 2a 20 69 6e 74 65  t we can.** inte
30e0: 72 70 72 65 74 20 61 73 20 61 20 73 74 72 69 6e  rpret as a strin
30f0: 67 20 69 66 20 77 65 20 77 61 6e 74 20 74 6f 29  g if we want to)
3100: 2e 20 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63  .  Compute its c
3110: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
3120: 6e 75 6d 65 72 69 63 20 74 79 70 65 2c 20 69 66  numeric type, if
3130: 20 68 61 73 20 6f 6e 65 2e 20 20 53 65 74 20 74   has one.  Set t
3140: 68 65 20 70 4d 65 6d 2d 3e 75 2e 72 20 61 6e 64  he pMem->u.r and
3150: 20 70 4d 65 6d 2d 3e 75 2e 69 20 66 69 65 6c 64   pMem->u.i field
3160: 73 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  s.** accordingly
3170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  ..*/.static u16 
3180: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
3190: 63 6f 6d 70 75 74 65 4e 75 6d 65 72 69 63 54 79  computeNumericTy
31a0: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  pe(Mem *pMem){. 
31b0: 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e   assert( (pMem->
31c0: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74  flags & (MEM_Int
31d0: 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d 3d 30 20 29  |MEM_Real))==0 )
31e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65  ;.  assert( (pMe
31f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  m->flags & (MEM_
3200: 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 21 3d  Str|MEM_Blob))!=
3210: 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
3220: 65 33 41 74 6f 46 28 70 4d 65 6d 2d 3e 7a 2c 20  e3AtoF(pMem->z, 
3230: 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 70 4d 65 6d  &pMem->u.r, pMem
3240: 2d 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 3d  ->n, pMem->enc)=
3250: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3260: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
3270: 6c 69 74 65 33 41 74 6f 69 36 34 28 70 4d 65 6d  lite3Atoi64(pMem
3280: 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75 2e 69 2c  ->z, &pMem->u.i,
3290: 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d 3e   pMem->n, pMem->
32a0: 65 6e 63 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  enc)==SQLITE_OK 
32b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4d 45  ){.    return ME
32c0: 4d 5f 49 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  M_Int;.  }.  ret
32d0: 75 72 6e 20 4d 45 4d 5f 52 65 61 6c 3b 0a 7d 0a  urn MEM_Real;.}.
32e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
32f0: 65 20 6e 75 6d 65 72 69 63 20 74 79 70 65 20 66  e numeric type f
3300: 6f 72 20 70 4d 65 6d 2c 20 65 69 74 68 65 72 20  or pMem, either 
3310: 4d 45 4d 5f 49 6e 74 20 6f 72 20 4d 45 4d 5f 52  MEM_Int or MEM_R
3320: 65 61 6c 20 6f 72 20 62 6f 74 68 20 6f 72 0a 2a  eal or both or.*
3330: 2a 20 6e 6f 6e 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  * none.  .**.** 
3340: 55 6e 6c 69 6b 65 20 61 70 70 6c 79 4e 75 6d 65  Unlike applyNume
3350: 72 69 63 41 66 66 69 6e 69 74 79 28 29 2c 20 74  ricAffinity(), t
3360: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
3370: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 70 4d 65 6d   not modify pMem
3380: 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20 42 75 74 20  ->flags..** But 
3390: 69 74 20 64 6f 65 73 20 73 65 74 20 70 4d 65 6d  it does set pMem
33a0: 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e  ->u.r and pMem->
33b0: 75 2e 69 20 61 70 70 72 6f 70 72 69 61 74 65 6c  u.i appropriatel
33c0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y..*/.static u16
33d0: 20 6e 75 6d 65 72 69 63 54 79 70 65 28 4d 65 6d   numericType(Mem
33e0: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28 20 70   *pMem){.  if( p
33f0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  Mem->flags & (ME
3400: 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20  M_Int|MEM_Real) 
3410: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4d  ){.    return pM
3420: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  em->flags & (MEM
3430: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 3b 0a  _Int|MEM_Real);.
3440: 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e    }.  if( pMem->
3450: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
3460: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20  |MEM_Blob) ){.  
3470: 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65    return compute
3480: 4e 75 6d 65 72 69 63 54 79 70 65 28 70 4d 65 6d  NumericType(pMem
3490: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34a0: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
34b0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
34c0: 57 72 69 74 65 20 61 20 6e 69 63 65 20 73 74 72  Write a nice str
34d0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
34e0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  on of the conten
34f0: 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65 6d 0a  ts of cell pMem.
3500: 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72 20 7a  ** into buffer z
3510: 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42 75 66  Buf, length nBuf
3520: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3530: 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72  3VdbeMemPrettyPr
3540: 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 63  int(Mem *pMem, c
3550: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 68  har *zBuf){.  ch
3560: 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75 66 3b  ar *zCsr = zBuf;
3570: 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65 6d 2d  .  int f = pMem-
3580: 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61 74 69  >flags;..  stati
3590: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
35a0: 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d  nst encnames[] =
35b0: 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22 2c 20   {"(X)", "(8)", 
35c0: 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36 42 45  "(16LE)", "(16BE
35d0: 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26 4d 45  )"};..  if( f&ME
35e0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 69 6e  M_Blob ){.    in
35f0: 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63 3b  t i;.    char c;
3600: 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d  .    if( f & MEM
3610: 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 63 20  _Dyn ){.      c 
3620: 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73  = 'z';.      ass
3630: 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53  ert( (f & (MEM_S
3640: 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29  tatic|MEM_Ephem)
3650: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3660: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74  e if( f & MEM_St
3670: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 63 20  atic ){.      c 
3680: 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61 73 73  = 't';.      ass
3690: 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 44  ert( (f & (MEM_D
36a0: 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d  yn|MEM_Ephem))==
36b0: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  0 );.    }else i
36c0: 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d  f( f & MEM_Ephem
36d0: 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 65   ){.      c = 'e
36e0: 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ';.      assert(
36f0: 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69   (f & (MEM_Stati
3700: 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29  c|MEM_Dyn))==0 )
3710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3720: 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20 20 20     c = 's';.    
3730: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  }..    sqlite3_s
3740: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
3750: 72 2c 20 22 25 63 22 2c 20 63 29 3b 0a 20 20 20  r, "%c", c);.   
3760: 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   zCsr += sqlite3
3770: 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a  Strlen30(zCsr);.
3780: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
3790: 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20  intf(100, zCsr, 
37a0: 22 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b  "%d[", pMem->n);
37b0: 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c  .    zCsr += sql
37c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73  ite3Strlen30(zCs
37d0: 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
37e0: 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d   i<16 && i<pMem-
37f0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  >n; i++){.      
3800: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3810: 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 30 32  (100, zCsr, "%02
3820: 58 22 2c 20 28 28 69 6e 74 29 70 4d 65 6d 2d 3e  X", ((int)pMem->
3830: 7a 5b 69 5d 20 26 20 30 78 46 46 29 29 3b 0a 20  z[i] & 0xFF));. 
3840: 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c       zCsr += sql
3850: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73  ite3Strlen30(zCs
3860: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  r);.    }.    fo
3870: 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20 69  r(i=0; i<16 && i
3880: 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  <pMem->n; i++){.
3890: 20 20 20 20 20 20 63 68 61 72 20 7a 20 3d 20 70        char z = p
38a0: 4d 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20 20 20 20  Mem->z[i];.     
38b0: 20 69 66 28 20 7a 3c 33 32 20 7c 7c 20 7a 3e 31   if( z<32 || z>1
38c0: 32 36 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 27  26 ) *zCsr++ = '
38d0: 2e 27 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 2a  .';.      else *
38e0: 7a 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20 20 20 20  zCsr++ = z;.    
38f0: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  }..    sqlite3_s
3900: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
3910: 72 2c 20 22 5d 25 73 22 2c 20 65 6e 63 6e 61 6d  r, "]%s", encnam
3920: 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a  es[pMem->enc]);.
3930: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
3940: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
3950: 29 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d  );.    if( f & M
3960: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
3970: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3980: 66 28 31 30 30 2c 20 7a 43 73 72 2c 22 2b 25 64  f(100, zCsr,"+%d
3990: 7a 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  z",pMem->u.nZero
39a0: 29 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d  );.      zCsr +=
39b0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
39c0: 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (zCsr);.    }.  
39d0: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
39e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20    }else if( f & 
39f0: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
3a00: 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42 75  nt j, k;.    zBu
3a10: 66 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  f[0] = ' ';.    
3a20: 69 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20  if( f & MEM_Dyn 
3a30: 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d  ){.      zBuf[1]
3a40: 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73   = 'z';.      as
3a50: 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f  sert( (f & (MEM_
3a60: 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d  Static|MEM_Ephem
3a70: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
3a80: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
3a90: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 7a  tatic ){.      z
3aa0: 42 75 66 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20  Buf[1] = 't';.  
3ab0: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26      assert( (f &
3ac0: 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70   (MEM_Dyn|MEM_Ep
3ad0: 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  hem))==0 );.    
3ae0: 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45  }else if( f & ME
3af0: 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20  M_Ephem ){.     
3b00: 20 7a 42 75 66 5b 31 5d 20 3d 20 27 65 27 3b 0a   zBuf[1] = 'e';.
3b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66        assert( (f
3b20: 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d   & (MEM_Static|M
3b30: 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20  EM_Dyn))==0 );. 
3b40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b50: 7a 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20  zBuf[1] = 's';. 
3b60: 20 20 20 7d 0a 20 20 20 20 6b 20 3d 20 32 3b 0a     }.    k = 2;.
3b70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
3b80: 69 6e 74 66 28 31 30 30 2c 20 26 7a 42 75 66 5b  intf(100, &zBuf[
3b90: 6b 5d 2c 20 22 25 64 22 2c 20 70 4d 65 6d 2d 3e  k], "%d", pMem->
3ba0: 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c  n);.    k += sql
3bb0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42  ite3Strlen30(&zB
3bc0: 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66  uf[k]);.    zBuf
3bd0: 5b 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20 20  [k++] = '[';.   
3be0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35 20 26   for(j=0; j<15 &
3bf0: 26 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b  & j<pMem->n; j++
3c00: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 20 3d 20  ){.      u8 c = 
3c10: 70 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20 20  pMem->z[j];.    
3c20: 20 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26 26    if( c>=0x20 &&
3c30: 20 63 3c 30 78 37 66 20 29 7b 0a 20 20 20 20 20   c<0x7f ){.     
3c40: 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63     zBuf[k++] = c
3c50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3c60: 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d         zBuf[k++]
3c70: 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 7d 0a   = '.';.      }.
3c80: 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6b      }.    zBuf[k
3c90: 2b 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 73  ++] = ']';.    s
3ca0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3cb0: 31 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65 6e  100,&zBuf[k], en
3cc0: 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63  cnames[pMem->enc
3cd0: 5d 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c  ]);.    k += sql
3ce0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42  ite3Strlen30(&zB
3cf0: 75 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66  uf[k]);.    zBuf
3d00: 5b 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d  [k++] = 0;.  }.}
3d10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
3d20: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
3d30: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 76 61 6c  ** Print the val
3d40: 75 65 20 6f 66 20 61 20 72 65 67 69 73 74 65 72  ue of a register
3d50: 20 66 6f 72 20 74 72 61 63 69 6e 67 20 70 75 72   for tracing pur
3d60: 70 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63  poses:.*/.static
3d70: 20 76 6f 69 64 20 6d 65 6d 54 72 61 63 65 50 72   void memTracePr
3d80: 69 6e 74 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 69  int(Mem *p){.  i
3d90: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  f( p->flags & ME
3da0: 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 7b 0a 20  M_Undefined ){. 
3db0: 20 20 20 70 72 69 6e 74 66 28 22 20 75 6e 64 65     printf(" unde
3dc0: 66 69 6e 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65  fined");.  }else
3dd0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
3de0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
3df0: 70 72 69 6e 74 66 28 22 20 4e 55 4c 4c 22 29 3b  printf(" NULL");
3e00: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d  .  }else if( (p-
3e10: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e  >flags & (MEM_In
3e20: 74 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28 4d 45  t|MEM_Str))==(ME
3e30: 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 20 29  M_Int|MEM_Str) )
3e40: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 73  {.    printf(" s
3e50: 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29  i:%lld", p->u.i)
3e60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
3e70: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
3e80: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
3e90: 20 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69   i:%lld", p->u.i
3ea0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
3eb0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
3ec0: 50 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20 69 66  POINT.  }else if
3ed0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
3ee0: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 70 72 69  _Real ){.    pri
3ef0: 6e 74 66 28 22 20 72 3a 25 67 22 2c 20 70 2d 3e  ntf(" r:%g", p->
3f00: 75 2e 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  u.r);.#endif.  }
3f10: 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67  else if( p->flag
3f20: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29  s & MEM_RowSet )
3f30: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 28  {.    printf(" (
3f40: 72 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d 65 6c  rowset)");.  }el
3f50: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
3f60: 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  f[200];.    sqli
3f70: 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79  te3VdbeMemPretty
3f80: 50 72 69 6e 74 28 70 2c 20 7a 42 75 66 29 3b 0a  Print(p, zBuf);.
3f90: 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22      printf(" %s"
3fa0: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 69  , zBuf);.  }.  i
3fb0: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  f( p->flags & ME
3fc0: 4d 5f 53 75 62 74 79 70 65 20 29 20 70 72 69 6e  M_Subtype ) prin
3fd0: 74 66 28 22 20 73 75 62 74 79 70 65 3d 30 78 25  tf(" subtype=0x%
3fe0: 30 32 78 22 2c 20 70 2d 3e 65 53 75 62 74 79 70  02x", p->eSubtyp
3ff0: 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  e);.}.static voi
4000: 64 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28  d registerTrace(
4010: 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20 2a 70  int iReg, Mem *p
4020: 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 52 45 47  ){.  printf("REG
4030: 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 67 29 3b  [%d] = ", iReg);
4040: 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74  .  memTracePrint
4050: 28 70 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c  (p);.  printf("\
4060: 6e 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n");.}.#endif..#
4070: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4080: 55 47 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47  UG.#  define REG
4090: 49 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29  ISTER_TRACE(R,M)
40a0: 20 69 66 28 64 62 2d 3e 66 6c 61 67 73 26 53 51   if(db->flags&SQ
40b0: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 72  LITE_VdbeTrace)r
40c0: 65 67 69 73 74 65 72 54 72 61 63 65 28 52 2c 4d  egisterTrace(R,M
40d0: 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  ).#else.#  defin
40e0: 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45  e REGISTER_TRACE
40f0: 28 52 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 0a 23  (R,M).#endif...#
4100: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
4110: 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77 74 69 6d  LE../* .** hwtim
4120: 65 2e 68 20 63 6f 6e 74 61 69 6e 73 20 69 6e 6c  e.h contains inl
4130: 69 6e 65 20 61 73 73 65 6d 62 6c 65 72 20 63 6f  ine assembler co
4140: 64 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  de for implement
4150: 69 6e 67 20 0a 2a 2a 20 68 69 67 68 2d 70 65 72  ing .** high-per
4160: 66 6f 72 6d 61 6e 63 65 20 74 69 6d 69 6e 67 20  formance timing 
4170: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 23 69 6e  routines..*/.#in
4180: 63 6c 75 64 65 20 22 68 77 74 69 6d 65 2e 68 22  clude "hwtime.h"
4190: 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ..#endif..#ifnde
41a0: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  f NDEBUG./*.** T
41b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
41c0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
41d0: 20 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65 72   within an asser
41e0: 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  t() expression. 
41f0: 49 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 61  It.** checks tha
4200: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 54  t the sqlite3.nT
4210: 72 61 6e 73 61 63 74 69 6f 6e 20 76 61 72 69 61  ransaction varia
4220: 62 6c 65 20 69 73 20 63 6f 72 72 65 63 74 6c 79  ble is correctly
4230: 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e   set to.** the n
4240: 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 74 72 61  umber of non-tra
4250: 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
4260: 6e 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  nts currently in
4270: 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
4280: 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
4290: 20 73 71 6c 69 74 65 33 2e 70 53 61 76 65 70 6f   sqlite3.pSavepo
42a0: 69 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67  int..** .** Usag
42b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73  e:.**.**     ass
42c0: 65 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f  ert( checkSavepo
42d0: 69 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a  intCount(db) );.
42e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
42f0: 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e  eckSavepointCoun
4300: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
4310: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 53    int n = 0;.  S
4320: 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 66  avepoint *p;.  f
4330: 6f 72 28 70 3d 64 62 2d 3e 70 53 61 76 65 70 6f  or(p=db->pSavepo
4340: 69 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  int; p; p=p->pNe
4350: 78 74 29 20 6e 2b 2b 3b 0a 20 20 61 73 73 65 72  xt) n++;.  asser
4360: 74 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53 61 76 65  t( n==(db->nSave
4370: 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 69 73 54 72  point + db->isTr
4380: 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
4390: 6e 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  nt) );.  return 
43a0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
43b0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
43c0: 67 69 73 74 65 72 20 6f 66 20 70 4f 70 2d 3e 70  gister of pOp->p
43d0: 32 20 61 66 74 65 72 20 66 69 72 73 74 20 70 72  2 after first pr
43e0: 65 70 61 72 69 6e 67 20 69 74 20 74 6f 20 62 65  eparing it to be
43f0: 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20  .** overwritten 
4400: 77 69 74 68 20 61 6e 20 69 6e 74 65 67 65 72 20  with an integer 
4410: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
4420: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
4430: 20 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c   Mem *out2Prerel
4440: 65 61 73 65 57 69 74 68 43 6c 65 61 72 28 4d 65  easeWithClear(Me
4450: 6d 20 2a 70 4f 75 74 29 7b 0a 20 20 73 71 6c 69  m *pOut){.  sqli
4460: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
4470: 6c 28 70 4f 75 74 29 3b 0a 20 20 70 4f 75 74 2d  l(pOut);.  pOut-
4480: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
4490: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 75 74 3b  ;.  return pOut;
44a0: 0a 7d 0a 73 74 61 74 69 63 20 4d 65 6d 20 2a 6f  .}.static Mem *o
44b0: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 56 64  ut2Prerelease(Vd
44c0: 62 65 20 2a 70 2c 20 56 64 62 65 4f 70 20 2a 70  be *p, VdbeOp *p
44d0: 4f 70 29 7b 0a 20 20 4d 65 6d 20 2a 70 4f 75 74  Op){.  Mem *pOut
44e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
44f0: 3e 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  >p2>0 );.  asser
4500: 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e  t( pOp->p2<=(p->
4510: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
4520: 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20 3d  sor) );.  pOut =
4530: 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
4540: 32 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f  2];.  memAboutTo
4550: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
4560: 0a 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79  .  if( VdbeMemDy
4570: 6e 61 6d 69 63 28 70 4f 75 74 29 20 29 7b 20 2f  namic(pOut) ){ /
4580: 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
4590: 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 72 65 74  -FALSE*/.    ret
45a0: 75 72 6e 20 6f 75 74 32 50 72 65 72 65 6c 65 61  urn out2Prerelea
45b0: 73 65 57 69 74 68 43 6c 65 61 72 28 70 4f 75 74  seWithClear(pOut
45c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
45d0: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
45e0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 72 65 74 75 72  M_Int;.    retur
45f0: 6e 20 70 4f 75 74 3b 0a 20 20 7d 0a 7d 0a 0a 0a  n pOut;.  }.}...
4600: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 73  /*.** Execute as
4610: 20 6d 75 63 68 20 6f 66 20 61 20 56 44 42 45 20   much of a VDBE 
4620: 70 72 6f 67 72 61 6d 20 61 73 20 77 65 20 63 61  program as we ca
4630: 6e 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  n..** This is th
4640: 65 20 63 6f 72 65 20 6f 66 20 73 71 6c 69 74 65  e core of sqlite
4650: 33 5f 73 74 65 70 28 29 2e 20 20 0a 2a 2f 0a 69  3_step().  .*/.i
4660: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  nt sqlite3VdbeEx
4670: 65 63 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  ec(.  Vdbe *p   
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
46a0: 29 7b 0a 20 20 4f 70 20 2a 61 4f 70 20 3d 20 70  ){.  Op *aOp = p
46b0: 2d 3e 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20  ->aOp;          
46c0: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4f  /* Copy of p->aO
46d0: 70 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f 70 20 3d  p */.  Op *pOp =
46e0: 20 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20   aOp;           
46f0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 70 65    /* Current ope
4700: 72 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 64 65  ration */.#if de
4710: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
4720: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56  UG) || defined(V
4730: 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 4f  DBE_PROFILE).  O
4740: 70 20 2a 70 4f 72 69 67 4f 70 3b 20 20 20 20 20  p *pOrigOp;     
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
4760: 75 65 20 6f 66 20 70 4f 70 20 61 74 20 74 68 65  ue of pOp at the
4770: 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
4780: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
4790: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
47a0: 20 69 6e 74 20 6e 45 78 74 72 61 44 65 6c 65 74   int nExtraDelet
47b0: 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 56  e = 0;      /* V
47c0: 65 72 69 66 69 65 73 20 46 4f 52 44 45 4c 45 54  erifies FORDELET
47d0: 45 20 61 6e 64 20 41 55 58 44 45 4c 45 54 45 20  E and AUXDELETE 
47e0: 66 6c 61 67 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  flags */.#endif.
47f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4800: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f 2a 20  E_OK;        /* 
4810: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
4820: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4830: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
4840: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
4850: 2a 2f 0a 20 20 75 38 20 72 65 73 65 74 53 63 68  */.  u8 resetSch
4860: 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 30 3b 20  emaOnFault = 0; 
4870: 2f 2a 20 52 65 73 65 74 20 73 63 68 65 6d 61 20  /* Reset schema 
4880: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  after an error i
4890: 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
48a0: 75 38 20 65 6e 63 6f 64 69 6e 67 20 3d 20 45 4e  u8 encoding = EN
48b0: 43 28 64 62 29 3b 20 20 20 20 20 2f 2a 20 54 68  C(db);     /* Th
48c0: 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64  e database encod
48d0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ing */.  int iCo
48e0: 6d 70 61 72 65 20 3d 20 30 3b 20 20 20 20 20 20  mpare = 0;      
48f0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
4900: 20 6c 61 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e   last comparison
4910: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e   */.  unsigned n
4920: 56 6d 53 74 65 70 20 3d 20 30 3b 20 20 20 20 20  VmStep = 0;     
4930: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 69   /* Number of vi
4940: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 73 74  rtual machine st
4950: 65 70 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  eps */.#ifndef S
4960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
4970: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 75  ESS_CALLBACK.  u
4980: 6e 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65 73  nsigned nProgres
4990: 73 4c 69 6d 69 74 20 3d 20 30 3b 2f 2a 20 49 6e  sLimit = 0;/* In
49a0: 76 6f 6b 65 20 78 50 72 6f 67 72 65 73 73 28 29  voke xProgress()
49b0: 20 77 68 65 6e 20 6e 56 6d 53 74 65 70 20 72 65   when nVmStep re
49c0: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 23 65  aches this */.#e
49d0: 6e 64 69 66 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  ndif.  Mem *aMem
49e0: 20 3d 20 70 2d 3e 61 4d 65 6d 3b 20 20 20 20 20   = p->aMem;     
49f0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e    /* Copy of p->
4a00: 61 4d 65 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  aMem */.  Mem *p
4a10: 49 6e 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  In1 = 0;        
4a20: 20 20 20 20 20 2f 2a 20 31 73 74 20 69 6e 70 75       /* 1st inpu
4a30: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d  t operand */.  M
4a40: 65 6d 20 2a 70 49 6e 32 20 3d 20 30 3b 20 20 20  em *pIn2 = 0;   
4a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 6e 64            /* 2nd
4a60: 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a   input operand *
4a70: 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 33 20 3d 20  /.  Mem *pIn3 = 
4a80: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
4a90: 2a 20 33 72 64 20 69 6e 70 75 74 20 6f 70 65 72  * 3rd input oper
4aa0: 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4f  and */.  Mem *pO
4ab0: 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
4ac0: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 70      /* Output op
4ad0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  erand */.  int *
4ae0: 61 50 65 72 6d 75 74 65 20 3d 20 30 3b 20 20 20  aPermute = 0;   
4af0: 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 75 74 61        /* Permuta
4b00: 74 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tion of columns 
4b10: 66 6f 72 20 4f 50 5f 43 6f 6d 70 61 72 65 20 2a  for OP_Compare *
4b20: 2f 0a 20 20 69 36 34 20 6c 61 73 74 52 6f 77 69  /.  i64 lastRowi
4b30: 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  d = db->lastRowi
4b40: 64 3b 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  d;  /* Saved val
4b50: 75 65 20 6f 66 20 74 68 65 20 6c 61 73 74 20 69  ue of the last i
4b60: 6e 73 65 72 74 20 52 4f 57 49 44 20 2a 2f 0a 23  nsert ROWID */.#
4b70: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
4b80: 4c 45 0a 20 20 75 36 34 20 73 74 61 72 74 3b 20  LE.  u64 start; 
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 2f 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75  /* CPU clock cou
4bb0: 6e 74 20 61 74 20 73 74 61 72 74 20 6f 66 20 6f  nt at start of o
4bc0: 70 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  pcode */.#endif.
4bd0: 20 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20 53 54    /*** INSERT ST
4be0: 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45 20 2a  ACK UNION HERE *
4bf0: 2a 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70  **/..  assert( p
4c00: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4c10: 47 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a 20 73  GIC_RUN );  /* s
4c20: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 76 65  qlite3_step() ve
4c30: 72 69 66 69 65 73 20 74 68 69 73 20 2a 2f 0a 20  rifies this */. 
4c40: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
4c50: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  r(p);.  if( p->r
4c60: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
4c70: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
4c80: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
4c90: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
4ca0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
4cb0: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
4cc0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
4cd0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
4ce0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 67 6f  iled.  */.    go
4cf0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20  to no_mem;.  }. 
4d00: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
4d10: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
4d20: 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
4d30: 45 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65  E_BUSY );.  asse
4d40: 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
4d50: 20 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 21   || p->readOnly!
4d60: 3d 30 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  =0 );.  p->rc = 
4d70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
4d80: 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
4d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
4da0: 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  xplain==0 );.  p
4db0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
4dc0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
4dd0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
4de0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
4df0: 74 65 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f  terrupted ) goto
4e00: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e   abort_due_to_in
4e10: 74 65 72 72 75 70 74 3b 0a 20 20 73 71 6c 69 74  terrupt;.  sqlit
4e20: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
4e30: 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
4e40: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
4e50: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 69 66 28  S_CALLBACK.  if(
4e60: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 29   db->xProgress )
4e70: 7b 0a 20 20 20 20 75 33 32 20 69 50 72 69 6f 72  {.    u32 iPrior
4e80: 20 3d 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53   = p->aCounter[S
4e90: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
4ea0: 5f 56 4d 5f 53 54 45 50 5d 3b 0a 20 20 20 20 61  _VM_STEP];.    a
4eb0: 73 73 65 72 74 28 20 30 20 3c 20 64 62 2d 3e 6e  ssert( 0 < db->n
4ec0: 50 72 6f 67 72 65 73 73 4f 70 73 20 29 3b 0a 20  ProgressOps );. 
4ed0: 20 20 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69     nProgressLimi
4ee0: 74 20 3d 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73  t = db->nProgres
4ef0: 73 4f 70 73 20 2d 20 28 69 50 72 69 6f 72 20 25  sOps - (iPrior %
4f00: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
4f10: 73 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  s);.  }.#endif.#
4f20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4f30: 55 47 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  UG.  sqlite3Begi
4f40: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
4f50: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3d 3d 30 0a  .  if( p->pc==0.
4f60: 20 20 20 26 26 20 28 70 2d 3e 64 62 2d 3e 66 6c     && (p->db->fl
4f70: 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 56 64  ags & (SQLITE_Vd
4f80: 62 65 4c 69 73 74 69 6e 67 7c 53 51 4c 49 54 45  beListing|SQLITE
4f90: 5f 56 64 62 65 45 51 50 7c 53 51 4c 49 54 45 5f  _VdbeEQP|SQLITE_
4fa0: 56 64 62 65 54 72 61 63 65 29 29 21 3d 30 0a 20  VdbeTrace))!=0. 
4fb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4fc0: 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
4fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4fe0: 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20  PrintSql(p);.   
4ff0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
5000: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 4c  s & SQLITE_VdbeL
5010: 69 73 74 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  isting ){.      
5020: 70 72 69 6e 74 66 28 22 56 44 42 45 20 50 72 6f  printf("VDBE Pro
5030: 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e 22  gram Listing:\n"
5040: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
5050: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
5060: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5070: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64  3VdbePrintOp(std
5080: 6f 75 74 2c 20 69 2c 20 26 61 4f 70 5b 69 5d 29  out, i, &aOp[i])
5090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
50a0: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
50b0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
50c0: 62 65 45 51 50 20 29 7b 0a 20 20 20 20 20 20 66  beEQP ){.      f
50d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
50e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
50f0: 69 66 28 20 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64  if( aOp[i].opcod
5100: 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 7b  e==OP_Explain ){
5110: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
5120: 6e 63 65 20 29 20 70 72 69 6e 74 66 28 22 56 44  nce ) printf("VD
5130: 42 45 20 51 75 65 72 79 20 50 6c 61 6e 3a 5c 6e  BE Query Plan:\n
5140: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72  ");.          pr
5150: 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61 4f 70  intf("%s\n", aOp
5160: 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20 20 20 20 20  [i].p4.z);.     
5170: 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
5180: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5190: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
51a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
51b0: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 20 29  LITE_VdbeTrace )
51c0: 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 54    printf("VDBE T
51d0: 72 61 63 65 3a 5c 6e 22 29 3b 0a 20 20 7d 0a 20  race:\n");.  }. 
51e0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
51f0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64 69  nMalloc();.#endi
5200: 66 0a 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70  f.  for(pOp=&aOp
5210: 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20 70 4f 70 2b  [p->pc]; 1; pOp+
5220: 2b 29 7b 0a 20 20 20 20 2f 2a 20 45 72 72 6f 72  +){.    /* Error
5230: 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  s are detected b
5240: 79 20 69 6e 64 69 76 69 64 75 61 6c 20 6f 70 63  y individual opc
5250: 6f 64 65 73 2c 20 77 69 74 68 20 61 6e 20 69 6d  odes, with an im
5260: 6d 65 64 69 61 74 65 0a 20 20 20 20 2a 2a 20 6a  mediate.    ** j
5270: 75 6d 70 73 20 74 6f 20 61 62 6f 72 74 5f 64 75  umps to abort_du
5280: 65 5f 74 6f 5f 65 72 72 6f 72 2e 20 2a 2f 0a 20  e_to_error. */. 
5290: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
52a0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
52b0: 20 61 73 73 65 72 74 28 20 70 4f 70 3e 3d 61 4f   assert( pOp>=aO
52c0: 70 20 26 26 20 70 4f 70 3c 26 61 4f 70 5b 70 2d  p && pOp<&aOp[p-
52d0: 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64 65 66 20 56  >nOp]);.#ifdef V
52e0: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20 20  DBE_PROFILE.    
52f0: 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 48  start = sqlite3H
5300: 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69 66 0a  wtime();.#endif.
5310: 20 20 20 20 6e 56 6d 53 74 65 70 2b 2b 3b 0a 23      nVmStep++;.#
5320: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5330: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
5340: 54 55 53 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  TUS.    if( p->a
5350: 6e 45 78 65 63 20 29 20 70 2d 3e 61 6e 45 78 65  nExec ) p->anExe
5360: 63 5b 28 69 6e 74 29 28 70 4f 70 2d 61 4f 70 29  c[(int)(pOp-aOp)
5370: 5d 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ]++;.#endif..   
5380: 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 74   /* Only allow t
5390: 72 61 63 69 6e 67 20 69 66 20 53 51 4c 49 54 45  racing if SQLITE
53a0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
53b0: 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  d..    */.#ifdef
53c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
53d0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
53e0: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
53f0: 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ce ){.      sqli
5400: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73  te3VdbePrintOp(s
5410: 74 64 6f 75 74 2c 20 28 69 6e 74 29 28 70 4f 70  tdout, (int)(pOp
5420: 20 2d 20 61 4f 70 29 2c 20 70 4f 70 29 3b 0a 20   - aOp), pOp);. 
5430: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
5440: 20 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b    ..    /* Check
5450: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
5460: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  ed to simulate a
5470: 6e 20 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68  n interrupt.  Th
5480: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a  is only happens.
5490: 20 20 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76      ** if we hav
54a0: 65 20 61 20 73 70 65 63 69 61 6c 20 74 65 73 74  e a special test
54b0: 20 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23   build..    */.#
54c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
54d0: 54 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  T.    if( sqlite
54e0: 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
54f0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t>0 ){.      sql
5500: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
5510: 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ount--;.      if
5520: 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  ( sqlite3_interr
5530: 75 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a  upt_count==0 ){.
5540: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5550: 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20  interrupt(db);. 
5560: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
5570: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69  dif..    /* Sani
5580: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 6f  ty checking on o
5590: 74 68 65 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ther operands */
55a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
55b0: 45 42 55 47 0a 20 20 20 20 7b 0a 20 20 20 20 20  EBUG.    {.     
55c0: 20 75 38 20 6f 70 50 72 6f 70 65 72 74 79 20 3d   u8 opProperty =
55d0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72   sqlite3OpcodePr
55e0: 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f  operty[pOp->opco
55f0: 64 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  de];.      if( (
5600: 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46  opProperty & OPF
5610: 4c 47 5f 49 4e 31 29 21 3d 30 20 29 7b 0a 20 20  LG_IN1)!=0 ){.  
5620: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5630: 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 20 20 20  p->p1>0 );.     
5640: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
5650: 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p1<=(p->nMem+1 -
5660: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
5670: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5680: 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d  memIsValid(&aMem
5690: 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20 20  [pOp->p1]) );.  
56a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
56b0: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65  lite3VdbeCheckMe
56c0: 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d 65  mInvariants(&aMe
56d0: 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20  m[pOp->p1]) );. 
56e0: 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f         REGISTER_
56f0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 26  TRACE(pOp->p1, &
5700: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a  aMem[pOp->p1]);.
5710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5720: 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20  ( (opProperty & 
5730: 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b  OPFLG_IN2)!=0 ){
5740: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5750: 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20   pOp->p2>0 );.  
5760: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5770: 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p2<=(p->nMem+
5780: 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
5790: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
57a0: 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61  t( memIsValid(&a
57b0: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29 3b  Mem[pOp->p2]) );
57c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
57d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
57e0: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26  kMemInvariants(&
57f0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29  aMem[pOp->p2]) )
5800: 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53 54  ;.        REGIST
5810: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
5820: 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  , &aMem[pOp->p2]
5830: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5840: 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79   if( (opProperty
5850: 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d 30   & OPFLG_IN3)!=0
5860: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
5870: 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b  rt( pOp->p3>0 );
5880: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5890: 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
58a0: 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
58b0: 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  r) );.        as
58c0: 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
58d0: 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29  (&aMem[pOp->p3])
58e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
58f0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
5900: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
5910: 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  s(&aMem[pOp->p3]
5920: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47  ) );.        REG
5930: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
5940: 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  >p3, &aMem[pOp->
5950: 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p3]);.      }.  
5960: 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65      if( (opPrope
5970: 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32  rty & OPFLG_OUT2
5980: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
5990: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
59a0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
59b0: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70  ert( pOp->p2<=(p
59c0: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
59d0: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
59e0: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
59f0: 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ge(p, &aMem[pOp-
5a00: 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >p2]);.      }. 
5a10: 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70       if( (opProp
5a20: 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54  erty & OPFLG_OUT
5a30: 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)!=0 ){.       
5a40: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
5a50: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
5a60: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28  sert( pOp->p3<=(
5a70: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
5a80: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
5a90: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
5aa0: 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70  nge(p, &aMem[pOp
5ab0: 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ->p3]);.      }.
5ac0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
5ad0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5ae0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
5af0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
5b00: 20 20 20 20 70 4f 72 69 67 4f 70 20 3d 20 70 4f      pOrigOp = pO
5b10: 70 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20  p;.#endif.  .   
5b20: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
5b30: 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a  code ){../******
5b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b80: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74 20  *******.** What 
5b90: 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61 73  follows is a mas
5ba0: 73 69 76 65 20 73 77 69 74 63 68 20 73 74 61 74  sive switch stat
5bb0: 65 6d 65 6e 74 20 77 68 65 72 65 20 65 61 63 68  ement where each
5bc0: 20 63 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74 73   case implements
5bd0: 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69   a.** separate i
5be0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
5bf0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
5c00: 65 2e 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f 77  e.  If we follow
5c10: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69 6e   the usual.** in
5c20: 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65 6e  dentation conven
5c30: 74 69 6f 6e 73 2c 20 65 61 63 68 20 63 61 73 65  tions, each case
5c40: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e   should be inden
5c50: 74 65 64 20 62 79 20 36 20 73 70 61 63 65 73 2e  ted by 6 spaces.
5c60: 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 69 73    But.** that is
5c70: 20 61 20 6c 6f 74 20 6f 66 20 77 61 73 74 65 64   a lot of wasted
5c80: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 6c 65   space on the le
5c90: 66 74 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20 74  ft margin.  So t
5ca0: 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 0a 2a  he code within.*
5cb0: 2a 20 74 68 65 20 73 77 69 74 63 68 20 73 74 61  * the switch sta
5cc0: 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65 61  tement will brea
5cd0: 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e 74 69 6f  k with conventio
5ce0: 6e 20 61 6e 64 20 62 65 20 66 6c 75 73 68 2d 6c  n and be flush-l
5cf0: 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a 20  eft. Another.** 
5d00: 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69 6d  big comment (sim
5d10: 69 6c 61 72 20 74 6f 20 74 68 69 73 20 6f 6e 65  ilar to this one
5d20: 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65 20  ) will mark the 
5d30: 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
5d40: 65 20 77 68 65 72 65 0a 2a 2a 20 77 65 20 74 72  e where.** we tr
5d50: 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20 74 6f  ansition back to
5d60: 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74   normal indentat
5d70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
5d80: 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65 61 63  ormatting of eac
5d90: 68 20 63 61 73 65 20 69 73 20 69 6d 70 6f 72 74  h case is import
5da0: 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b 65 66 69  ant.  The makefi
5db0: 6c 65 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a 2a  le for SQLite.**
5dc0: 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 43   generates two C
5dd0: 20 66 69 6c 65 73 20 22 6f 70 63 6f 64 65 73 2e   files "opcodes.
5de0: 68 22 20 61 6e 64 20 22 6f 70 63 6f 64 65 73 2e  h" and "opcodes.
5df0: 63 22 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74  c" by scanning t
5e00: 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f 6b  his.** file look
5e10: 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73 20 74 68  ing for lines th
5e20: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 63  at begin with "c
5e30: 61 73 65 20 4f 50 5f 22 2e 20 20 54 68 65 20 6f  ase OP_".  The o
5e40: 70 63 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a 2a  pcodes.h files.*
5e50: 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65 64  * will be filled
5e60: 20 77 69 74 68 20 23 64 65 66 69 6e 65 73 20 74   with #defines t
5e70: 68 61 74 20 67 69 76 65 20 75 6e 69 71 75 65 20  hat give unique 
5e80: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 74  integer values t
5e90: 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64 65  o each.** opcode
5ea0: 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 73   and the opcodes
5eb0: 2e 63 20 66 69 6c 65 20 69 73 20 66 69 6c 6c 65  .c file is fille
5ec0: 64 20 77 69 74 68 20 61 6e 20 61 72 72 61 79 20  d with an array 
5ed0: 6f 66 20 73 74 72 69 6e 67 73 20 77 68 65 72 65  of strings where
5ee0: 0a 2a 2a 20 65 61 63 68 20 73 74 72 69 6e 67 20  .** each string 
5ef0: 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20  is the symbolic 
5f00: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 72  name for the cor
5f10: 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f 64  responding opcod
5f20: 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 61  e.  If the.** ca
5f30: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  se statement is 
5f40: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f  followed by a co
5f50: 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  mment of the for
5f60: 6d 20 22 2f 23 20 73 61 6d 65 20 61 73 20 2e 2e  m "/# same as ..
5f70: 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74 20 63 6f  . #/".** that co
5f80: 6d 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  mment is used to
5f90: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
5fa0: 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
5fb0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  of the opcode..*
5fc0: 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65 79 77 6f  *.** Other keywo
5fd0: 72 64 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65  rds in the comme
5fe0: 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  nt that follows 
5ff0: 65 61 63 68 20 63 61 73 65 20 61 72 65 20 75 73  each case are us
6000: 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74 72 75  ed to.** constru
6010: 63 74 20 74 68 65 20 4f 50 46 4c 47 5f 49 4e 49  ct the OPFLG_INI
6020: 54 49 41 4c 49 5a 45 52 20 76 61 6c 75 65 20 74  TIALIZER value t
6030: 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  hat initializes 
6040: 6f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 5d  opcodeProperty[]
6050: 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73 20 69 6e  ..** Keywords in
6060: 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69 6e 32 2c  clude: in1, in2,
6070: 20 69 6e 33 2c 20 6f 75 74 32 2c 20 6f 75 74 33   in3, out2, out3
6080: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 6d 6b  .  See.** the mk
6090: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
60a0: 70 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  pt for additiona
60b0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
60c0: 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74 61 74 69  *.** Documentati
60d0: 6f 6e 20 61 62 6f 75 74 20 56 44 42 45 20 6f 70  on about VDBE op
60e0: 63 6f 64 65 73 20 69 73 20 67 65 6e 65 72 61 74  codes is generat
60f0: 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74  ed by scanning t
6100: 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66 6f 72 20  his file.** for 
6110: 6c 69 6e 65 73 20 6f 66 20 74 68 61 74 20 63 6f  lines of that co
6120: 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65 3a 22 2e  ntain "Opcode:".
6130: 20 20 54 68 61 74 20 6c 69 6e 65 20 61 6e 64 20    That line and 
6140: 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
6150: 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73 20  * comment lines 
6160: 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20  are used in the 
6170: 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
6180: 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c 20 64 6f  e opcode.html do
6190: 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 66  cumentation.** f
61a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d 41  ile..**.** SUMMA
61b0: 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f  RY:.**.**     Fo
61c0: 72 6d 61 74 74 69 6e 67 20 69 73 20 69 6d 70 6f  rmatting is impo
61d0: 72 74 61 6e 74 20 74 6f 20 73 63 72 69 70 74 73  rtant to scripts
61e0: 20 74 68 61 74 20 73 63 61 6e 20 74 68 69 73 20   that scan this 
61f0: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 44 6f 20  file..**     Do 
6200: 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72 6f 6d  not deviate from
6210: 20 74 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 20   the formatting 
6220: 73 74 79 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  style currently 
6230: 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  in use..**.*****
6240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6280: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f 70  ********/../* Op
6290: 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20 50 32  code:  Goto * P2
62a0: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20   * * *.**.** An 
62b0: 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75  unconditional ju
62c0: 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20 50 32  mp to address P2
62d0: 2e 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 69 6e  ..** The next in
62e0: 73 74 72 75 63 74 69 6f 6e 20 65 78 65 63 75 74  struction execut
62f0: 65 64 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 74  ed will be .** t
6300: 68 65 20 6f 6e 65 20 61 74 20 69 6e 64 65 78 20  he one at index 
6310: 50 32 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  P2 from the begi
6320: 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
6330: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 54  program..**.** T
6340: 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20  he P1 parameter 
6350: 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
6360: 75 73 65 64 20 62 79 20 74 68 69 73 20 6f 70 63  used by this opc
6370: 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 69  ode.  However, i
6380: 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 69 6d 65  t.** is sometime
6390: 73 20 73 65 74 20 74 6f 20 31 20 69 6e 73 74 65  s set to 1 inste
63a0: 61 64 20 6f 66 20 30 20 61 73 20 61 20 68 69 6e  ad of 0 as a hin
63b0: 74 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64  t to the command
63c0: 2d 6c 69 6e 65 20 73 68 65 6c 6c 0a 2a 2a 20 74  -line shell.** t
63d0: 68 61 74 20 74 68 69 73 20 47 6f 74 6f 20 69 73  hat this Goto is
63e0: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61   the bottom of a
63f0: 20 6c 6f 6f 70 20 61 6e 64 20 74 68 61 74 20 74   loop and that t
6400: 68 65 20 6c 69 6e 65 73 20 66 72 6f 6d 20 50 32  he lines from P2
6410: 20 64 6f 77 6e 0a 2a 2a 20 74 6f 20 74 68 65 20   down.** to the 
6420: 63 75 72 72 65 6e 74 20 6c 69 6e 65 20 73 68 6f  current line sho
6430: 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20  uld be indented 
6440: 66 6f 72 20 45 58 50 4c 41 49 4e 20 6f 75 74 70  for EXPLAIN outp
6450: 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  ut..*/.case OP_G
6460: 6f 74 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 20  oto: {          
6470: 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 6a 75     /* jump */.ju
6480: 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68 65  mp_to_p2_and_che
6490: 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74  ck_for_interrupt
64a0: 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70  :.  pOp = &aOp[p
64b0: 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 0a 20 20  Op->p2 - 1];..  
64c0: 2f 2a 20 4f 70 63 6f 64 65 73 20 74 68 61 74 20  /* Opcodes that 
64d0: 61 72 65 20 75 73 65 64 20 61 73 20 74 68 65 20  are used as the 
64e0: 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f 70  bottom of a loop
64f0: 20 28 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72   (OP_Next, OP_Pr
6500: 65 76 2c 0a 20 20 2a 2a 20 4f 50 5f 56 4e 65 78  ev,.  ** OP_VNex
6510: 74 2c 20 4f 50 5f 52 6f 77 53 65 74 4e 65 78 74  t, OP_RowSetNext
6520: 2c 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72 4e 65  , or OP_SorterNe
6530: 78 74 29 20 61 6c 6c 20 6a 75 6d 70 20 68 65 72  xt) all jump her
6540: 65 20 75 70 6f 6e 0a 20 20 2a 2a 20 63 6f 6d 70  e upon.  ** comp
6550: 6c 65 74 69 6f 6e 2e 20 20 43 68 65 63 6b 20 74  letion.  Check t
6560: 6f 20 73 65 65 20 69 66 20 73 71 6c 69 74 65 33  o see if sqlite3
6570: 5f 69 6e 74 65 72 72 75 70 74 28 29 20 68 61 73  _interrupt() has
6580: 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 20 20 2a   been called.  *
6590: 2a 20 6f 72 20 69 66 20 74 68 65 20 70 72 6f 67  * or if the prog
65a0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 6e 65  ress callback ne
65b0: 65 64 73 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  eds to be invoke
65c0: 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  d. .  **.  ** Th
65d0: 69 73 20 63 6f 64 65 20 75 73 65 73 20 75 6e 73  is code uses uns
65e0: 74 72 75 63 74 75 72 65 64 20 22 67 6f 74 6f 22  tructured "goto"
65f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
6600: 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 20 63 6c  does not look cl
6610: 65 61 6e 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  ean..  ** But th
6620: 61 74 20 69 73 20 6e 6f 74 20 64 75 65 20 74 6f  at is not due to
6630: 20 73 6c 6f 70 70 79 20 63 6f 64 69 6e 67 20 68   sloppy coding h
6640: 61 62 69 74 73 2e 20 54 68 65 20 63 6f 64 65 20  abits. The code 
6650: 69 73 20 77 72 69 74 74 65 6e 20 74 68 69 73 0a  is written this.
6660: 20 20 2a 2a 20 77 61 79 20 66 6f 72 20 70 65 72    ** way for per
6670: 66 6f 72 6d 61 6e 63 65 2c 20 74 6f 20 61 76 6f  formance, to avo
6680: 69 64 20 68 61 76 69 6e 67 20 74 6f 20 72 75 6e  id having to run
6690: 20 74 68 65 20 69 6e 74 65 72 72 75 70 74 20 61   the interrupt a
66a0: 6e 64 20 70 72 6f 67 72 65 73 73 0a 20 20 2a 2a  nd progress.  **
66b0: 20 63 68 65 63 6b 73 20 6f 6e 20 65 76 65 72 79   checks on every
66c0: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 68   opcode.  This h
66d0: 65 6c 70 73 20 73 71 6c 69 74 65 33 5f 73 74 65  elps sqlite3_ste
66e0: 70 28 29 20 74 6f 20 72 75 6e 20 61 62 6f 75 74  p() to run about
66f0: 20 31 2e 35 25 0a 20 20 2a 2a 20 66 61 73 74 65   1.5%.  ** faste
6700: 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 22  r according to "
6710: 76 61 6c 67 72 69 6e 64 20 2d 2d 74 6f 6f 6c 3d  valgrind --tool=
6720: 63 61 63 68 65 67 72 69 6e 64 22 20 2a 2f 0a 63  cachegrind" */.c
6730: 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
6740: 70 74 3a 0a 20 20 69 66 28 20 64 62 2d 3e 75 31  pt:.  if( db->u1
6750: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
6760: 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
6770: 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a 23 69  to_interrupt;.#i
6780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6790: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
67a0: 41 43 4b 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68  ACK.  /* Call th
67b0: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
67c0: 61 63 6b 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ack if it is con
67d0: 66 69 67 75 72 65 64 20 61 6e 64 20 74 68 65 20  figured and the 
67e0: 72 65 71 75 69 72 65 64 20 6e 75 6d 62 65 72 0a  required number.
67f0: 20 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f 70 73    ** of VDBE ops
6800: 20 68 61 76 65 20 62 65 65 6e 20 65 78 65 63 75   have been execu
6810: 74 65 64 20 28 65 69 74 68 65 72 20 73 69 6e 63  ted (either sinc
6820: 65 20 74 68 69 73 20 69 6e 76 6f 63 61 74 69 6f  e this invocatio
6830: 6e 20 6f 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65  n of.  ** sqlite
6840: 33 56 64 62 65 45 78 65 63 28 29 20 6f 72 20 73  3VdbeExec() or s
6850: 69 6e 63 65 20 6c 61 73 74 20 74 69 6d 65 20 74  ince last time t
6860: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
6870: 62 61 63 6b 20 77 61 73 20 63 61 6c 6c 65 64 29  back was called)
6880: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72  ..  ** If the pr
6890: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
68a0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
68b0: 2c 20 65 78 69 74 20 74 68 65 20 76 69 72 74 75  , exit the virtu
68c0: 61 6c 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a  al machine with.
68d0: 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63 6f    ** a return co
68e0: 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e  de SQLITE_ABORT.
68f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
6900: 78 50 72 6f 67 72 65 73 73 21 3d 30 20 26 26 20  xProgress!=0 && 
6910: 6e 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72 65  nVmStep>=nProgre
6920: 73 73 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61  ssLimit ){.    a
6930: 73 73 65 72 74 28 20 64 62 2d 3e 6e 50 72 6f 67  ssert( db->nProg
6940: 72 65 73 73 4f 70 73 21 3d 30 20 29 3b 0a 20 20  ressOps!=0 );.  
6950: 20 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74    nProgressLimit
6960: 20 3d 20 6e 56 6d 53 74 65 70 20 2b 20 64 62 2d   = nVmStep + db-
6970: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 2d 20  >nProgressOps - 
6980: 28 6e 56 6d 53 74 65 70 25 64 62 2d 3e 6e 50 72  (nVmStep%db->nPr
6990: 6f 67 72 65 73 73 4f 70 73 29 3b 0a 20 20 20 20  ogressOps);.    
69a0: 69 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65 73  if( db->xProgres
69b0: 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41  s(db->pProgressA
69c0: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rg) ){.      rc 
69d0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
69e0: 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  PT;.      goto a
69f0: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
6a00: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  r;.    }.  }.#en
6a10: 64 69 66 0a 20 20 0a 20 20 62 72 65 61 6b 3b 0a  dif.  .  break;.
6a20: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 47  }../* Opcode:  G
6a30: 6f 73 75 62 20 50 31 20 50 32 20 2a 20 2a 20 2a  osub P1 P2 * * *
6a40: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
6a50: 20 63 75 72 72 65 6e 74 20 61 64 64 72 65 73 73   current address
6a60: 20 6f 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   onto register P
6a70: 31 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 6a 75  1.** and then ju
6a80: 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20 50 32  mp to address P2
6a90: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 73  ..*/.case OP_Gos
6aa0: 75 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ub: {           
6ab0: 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73   /* jump */.  as
6ac0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20  sert( pOp->p1>0 
6ad0: 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e  && pOp->p1<=(p->
6ae0: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
6af0: 73 6f 72 29 20 29 3b 0a 20 20 70 49 6e 31 20 3d  sor) );.  pIn1 =
6b00: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
6b10: 0a 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d  .  assert( VdbeM
6b20: 65 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31 29 3d  emDynamic(pIn1)=
6b30: 3d 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  =0 );.  memAbout
6b40: 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31  ToChange(p, pIn1
6b50: 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  );.  pIn1->flags
6b60: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49   = MEM_Int;.  pI
6b70: 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74 29 28  n1->u.i = (int)(
6b80: 70 4f 70 2d 61 4f 70 29 3b 0a 20 20 52 45 47 49  pOp-aOp);.  REGI
6b90: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
6ba0: 70 31 2c 20 70 49 6e 31 29 3b 0a 0a 20 20 2f 2a  p1, pIn1);..  /*
6bb0: 20 4d 6f 73 74 20 6a 75 6d 70 20 6f 70 65 72 61   Most jump opera
6bc0: 74 69 6f 6e 73 20 64 6f 20 61 20 67 6f 74 6f 20  tions do a goto 
6bd0: 74 6f 20 74 68 69 73 20 73 70 6f 74 20 69 6e 20  to this spot in 
6be0: 6f 72 64 65 72 20 74 6f 20 75 70 64 61 74 65 0a  order to update.
6bf0: 20 20 2a 2a 20 74 68 65 20 70 4f 70 20 70 6f 69    ** the pOp poi
6c00: 6e 74 65 72 2e 20 2a 2f 0a 6a 75 6d 70 5f 74 6f  nter. */.jump_to
6c10: 5f 70 32 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f  _p2:.  pOp = &aO
6c20: 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a  p[pOp->p2 - 1];.
6c30: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6c40: 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50  pcode:  Return P
6c50: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
6c60: 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  Jump to the next
6c70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74   instruction aft
6c80: 65 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69  er the address i
6c90: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20  n register P1.  
6ca0: 41 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 75 6d  After.** the jum
6cb0: 70 2c 20 72 65 67 69 73 74 65 72 20 50 31 20 62  p, register P1 b
6cc0: 65 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e 65 64  ecomes undefined
6cd0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74  ..*/.case OP_Ret
6ce0: 75 72 6e 3a 20 7b 20 20 20 20 20 20 20 20 20 20  urn: {          
6cf0: 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e   /* in1 */.  pIn
6d00: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
6d10: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  1];.  assert( pI
6d20: 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49  n1->flags==MEM_I
6d30: 6e 74 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61  nt );.  pOp = &a
6d40: 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20  Op[pIn1->u.i];. 
6d50: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d   pIn1->flags = M
6d60: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
6d70: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
6d80: 6f 64 65 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69  ode: InitCorouti
6d90: 6e 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ne P1 P2 P3 * *.
6da0: 2a 2a 0a 2a 2a 20 53 65 74 20 75 70 20 72 65 67  **.** Set up reg
6db0: 69 73 74 65 72 20 50 31 20 73 6f 20 74 68 61 74  ister P1 so that
6dc0: 20 69 74 20 77 69 6c 6c 20 59 69 65 6c 64 20 74   it will Yield t
6dd0: 6f 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 0a  o the coroutine.
6de0: 2a 2a 20 6c 6f 63 61 74 65 64 20 61 74 20 61 64  ** located at ad
6df0: 64 72 65 73 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  dress P3..**.** 
6e00: 49 66 20 50 32 21 3d 30 20 74 68 65 6e 20 74 68  If P2!=0 then th
6e10: 65 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  e coroutine impl
6e20: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6d 6d 65 64  ementation immed
6e30: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 0a 2a  iately follows.*
6e40: 2a 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20  * this opcode.  
6e50: 53 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65  So jump over the
6e60: 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
6e70: 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20  mentation to.** 
6e80: 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 0a 2a  address P2..**.*
6e90: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 45 6e 64 43  * See also: EndC
6ea0: 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61 73 65  oroutine.*/.case
6eb0: 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
6ec0: 65 3a 20 7b 20 20 20 20 20 2f 2a 20 6a 75 6d 70  e: {     /* jump
6ed0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
6ee0: 70 2d 3e 70 31 3e 30 20 26 26 20 20 70 4f 70 2d  p->p1>0 &&  pOp-
6ef0: 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p1<=(p->nMem+1 
6f00: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
6f10: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
6f20: 70 32 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  p2>=0 && pOp->p2
6f30: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 61 73 73  <p->nOp );.  ass
6f40: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20  ert( pOp->p3>=0 
6f50: 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 4f  && pOp->p3<p->nO
6f60: 70 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p );.  pOut = &a
6f70: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
6f80: 61 73 73 65 72 74 28 20 21 56 64 62 65 4d 65 6d  assert( !VdbeMem
6f90: 44 79 6e 61 6d 69 63 28 70 4f 75 74 29 20 29 3b  Dynamic(pOut) );
6fa0: 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70  .  pOut->u.i = p
6fb0: 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a 20 20 70 4f  Op->p3 - 1;.  pO
6fc0: 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
6fd0: 49 6e 74 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  Int;.  if( pOp->
6fe0: 70 32 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  p2 ) goto jump_t
6ff0: 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
7000: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 45 6e  ../* Opcode:  En
7010: 64 43 6f 72 6f 75 74 69 6e 65 20 50 31 20 2a 20  dCoroutine P1 * 
7020: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  * * *.**.** The 
7030: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 74  instruction at t
7040: 68 65 20 61 64 64 72 65 73 73 20 69 6e 20 72 65  he address in re
7050: 67 69 73 74 65 72 20 50 31 20 69 73 20 61 20 59  gister P1 is a Y
7060: 69 65 6c 64 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f  ield..** Jump to
7070: 20 74 68 65 20 50 32 20 70 61 72 61 6d 65 74 65   the P2 paramete
7080: 72 20 6f 66 20 74 68 61 74 20 59 69 65 6c 64 2e  r of that Yield.
7090: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 75  .** After the ju
70a0: 6d 70 2c 20 72 65 67 69 73 74 65 72 20 50 31 20  mp, register P1 
70b0: 62 65 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e 65  becomes undefine
70c0: 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
70d0: 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  o: InitCoroutine
70e0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 6e 64 43  .*/.case OP_EndC
70f0: 6f 72 6f 75 74 69 6e 65 3a 20 7b 20 20 20 20 20  oroutine: {     
7100: 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a        /* in1 */.
7110: 20 20 56 64 62 65 4f 70 20 2a 70 43 61 6c 6c 65    VdbeOp *pCalle
7120: 72 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  r;.  pIn1 = &aMe
7130: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
7140: 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67  sert( pIn1->flag
7150: 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20  s==MEM_Int );.  
7160: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 75 2e  assert( pIn1->u.
7170: 69 3e 3d 30 20 26 26 20 70 49 6e 31 2d 3e 75 2e  i>=0 && pIn1->u.
7180: 69 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 43  i<p->nOp );.  pC
7190: 61 6c 6c 65 72 20 3d 20 26 61 4f 70 5b 70 49 6e  aller = &aOp[pIn
71a0: 31 2d 3e 75 2e 69 5d 3b 0a 20 20 61 73 73 65 72  1->u.i];.  asser
71b0: 74 28 20 70 43 61 6c 6c 65 72 2d 3e 6f 70 63 6f  t( pCaller->opco
71c0: 64 65 3d 3d 4f 50 5f 59 69 65 6c 64 20 29 3b 0a  de==OP_Yield );.
71d0: 20 20 61 73 73 65 72 74 28 20 70 43 61 6c 6c 65    assert( pCalle
71e0: 72 2d 3e 70 32 3e 3d 30 20 26 26 20 70 43 61 6c  r->p2>=0 && pCal
71f0: 6c 65 72 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29  ler->p2<p->nOp )
7200: 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70  ;.  pOp = &aOp[p
7210: 43 61 6c 6c 65 72 2d 3e 70 32 20 2d 20 31 5d 3b  Caller->p2 - 1];
7220: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d  .  pIn1->flags =
7230: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
7240: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
7250: 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20 50 31  pcode:  Yield P1
7260: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
7270: 53 77 61 70 20 74 68 65 20 70 72 6f 67 72 61 6d  Swap the program
7280: 20 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74 68   counter with th
7290: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
72a0: 74 65 72 20 50 31 2e 20 20 54 68 69 73 0a 2a 2a  ter P1.  This.**
72b0: 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
72c0: 6f 66 20 79 69 65 6c 64 69 6e 67 20 74 6f 20 61  of yielding to a
72d0: 20 63 6f 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a   coroutine..**.*
72e0: 2a 20 49 66 20 74 68 65 20 63 6f 72 6f 75 74 69  * If the corouti
72f0: 6e 65 20 74 68 61 74 20 69 73 20 6c 61 75 6e 63  ne that is launc
7300: 68 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74  hed by this inst
7310: 72 75 63 74 69 6f 6e 20 65 6e 64 73 20 77 69 74  ruction ends wit
7320: 68 0a 2a 2a 20 59 69 65 6c 64 20 6f 72 20 52 65  h.** Yield or Re
7330: 74 75 72 6e 20 74 68 65 6e 20 63 6f 6e 74 69 6e  turn then contin
7340: 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ue to the next i
7350: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74  nstruction.  But
7360: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 72 6f 75   if.** the corou
7370: 74 69 6e 65 20 6c 61 75 6e 63 68 65 64 20 62 79  tine launched by
7380: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
7390: 6e 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a 20 45  n ends with.** E
73a0: 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 74 68 65  ndCoroutine, the
73b0: 6e 20 6a 75 6d 70 20 74 6f 20 50 32 20 72 61 74  n jump to P2 rat
73c0: 68 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 6e 75  her than continu
73d0: 69 6e 67 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ing with the.** 
73e0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
73f0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
7400: 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 0a  : InitCoroutine.
7410: 2a 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65 6c 64  */.case OP_Yield
7420: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
7430: 2a 20 69 6e 31 2c 20 6a 75 6d 70 20 2a 2f 0a 20  * in1, jump */. 
7440: 20 69 6e 74 20 70 63 44 65 73 74 3b 0a 20 20 70   int pcDest;.  p
7450: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
7460: 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
7470: 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70  VdbeMemDynamic(p
7480: 49 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e  In1)==0 );.  pIn
7490: 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  1->flags = MEM_I
74a0: 6e 74 3b 0a 20 20 70 63 44 65 73 74 20 3d 20 28  nt;.  pcDest = (
74b0: 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20  int)pIn1->u.i;. 
74c0: 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e   pIn1->u.i = (in
74d0: 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20  t)(pOp - aOp);. 
74e0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
74f0: 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a  pOp->p1, pIn1);.
7500: 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 44    pOp = &aOp[pcD
7510: 65 73 74 5d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  est];.  break;.}
7520: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61  ../* Opcode:  Ha
7530: 6c 74 49 66 4e 75 6c 6c 20 20 50 31 20 50 32 20  ltIfNull  P1 P2 
7540: 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
7550: 70 73 69 73 3a 20 69 66 20 72 5b 50 33 5d 3d 6e  psis: if r[P3]=n
7560: 75 6c 6c 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 43  ull halt.**.** C
7570: 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 69  heck the value i
7580: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 20  n register P3.  
7590: 49 66 20 69 74 20 69 73 20 4e 55 4c 4c 20 74 68  If it is NULL th
75a0: 65 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a 2a 2a  en Halt using.**
75b0: 20 70 61 72 61 6d 65 74 65 72 20 50 31 2c 20 50   parameter P1, P
75c0: 32 2c 20 61 6e 64 20 50 34 20 61 73 20 69 66 20  2, and P4 as if 
75d0: 74 68 69 73 20 77 65 72 65 20 61 20 48 61 6c 74  this were a Halt
75e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49   instruction.  I
75f0: 66 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69  f the.** value i
7600: 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  n register P3 is
7610: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
7620: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7630: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
7640: 50 35 20 70 61 72 61 6d 65 74 65 72 20 73 68 6f  P5 parameter sho
7650: 75 6c 64 20 62 65 20 31 2e 0a 2a 2f 0a 63 61 73  uld be 1..*/.cas
7660: 65 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a  e OP_HaltIfNull:
7670: 20 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a   {      /* in3 *
7680: 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  /.  pIn3 = &aMem
7690: 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28  [pOp->p3];.  if(
76a0: 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
76b0: 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 20 62  MEM_Null)==0 ) b
76c0: 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20  reak;.  /* Fall 
76d0: 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f  through into OP_
76e0: 48 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70  Halt */.}../* Op
76f0: 63 6f 64 65 3a 20 20 48 61 6c 74 20 50 31 20 50  code:  Halt P1 P
7700: 32 20 2a 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20  2 * P4 P5.**.** 
7710: 45 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  Exit immediately
7720: 2e 20 20 41 6c 6c 20 6f 70 65 6e 20 63 75 72 73  .  All open curs
7730: 6f 72 73 2c 20 65 74 63 20 61 72 65 20 63 6c 6f  ors, etc are clo
7740: 73 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  sed.** automatic
7750: 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69  ally..**.** P1 i
7760: 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  s the result cod
7770: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
7780: 6c 69 74 65 33 5f 65 78 65 63 28 29 2c 20 73 71  lite3_exec(), sq
7790: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2c 0a 2a  lite3_reset(),.*
77a0: 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 66 69 6e  * or sqlite3_fin
77b0: 61 6c 69 7a 65 28 29 2e 20 20 46 6f 72 20 61 20  alize().  For a 
77c0: 6e 6f 72 6d 61 6c 20 68 61 6c 74 2c 20 74 68 69  normal halt, thi
77d0: 73 20 73 68 6f 75 6c 64 20 62 65 20 53 51 4c 49  s should be SQLI
77e0: 54 45 5f 4f 4b 20 28 30 29 2e 0a 2a 2a 20 46 6f  TE_OK (0)..** Fo
77f0: 72 20 65 72 72 6f 72 73 2c 20 69 74 20 63 61 6e  r errors, it can
7800: 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 76   be some other v
7810: 61 6c 75 65 2e 20 20 49 66 20 50 31 21 3d 30 20  alue.  If P1!=0 
7820: 74 68 65 6e 20 50 32 20 77 69 6c 6c 20 64 65 74  then P2 will det
7830: 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
7840: 72 20 6f 72 20 6e 6f 74 20 74 6f 20 72 6f 6c 6c  r or not to roll
7850: 62 61 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  back the current
7860: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 44   transaction.  D
7870: 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o not rollback.*
7880: 2a 20 69 66 20 50 32 3d 3d 4f 45 5f 46 61 69 6c  * if P2==OE_Fail
7890: 2e 20 44 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  . Do the rollbac
78a0: 6b 20 69 66 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c  k if P2==OE_Roll
78b0: 62 61 63 6b 2e 20 20 49 66 20 50 32 3d 3d 4f 45  back.  If P2==OE
78c0: 5f 41 62 6f 72 74 2c 0a 2a 2a 20 74 68 65 6e 20  _Abort,.** then 
78d0: 62 61 63 6b 20 6f 75 74 20 61 6c 6c 20 63 68 61  back out all cha
78e0: 6e 67 65 73 20 74 68 61 74 20 68 61 76 65 20 6f  nges that have o
78f0: 63 63 75 72 72 65 64 20 64 75 72 69 6e 67 20 74  ccurred during t
7900: 68 69 73 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  his execution of
7910: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2c 20 62 75   the.** VDBE, bu
7920: 74 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63  t do not rollbac
7930: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
7940: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20  n. .**.** If P4 
7950: 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e  is not null then
7960: 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   it is an error 
7970: 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
7980: 2a 2a 0a 2a 2a 20 50 35 20 69 73 20 61 20 76 61  **.** P5 is a va
7990: 6c 75 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e  lue between 0 an
79a0: 64 20 34 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  d 4, inclusive, 
79b0: 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 74 68  that modifies th
79c0: 65 20 50 34 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  e P4 string..**.
79d0: 2a 2a 20 20 20 20 30 3a 20 20 28 6e 6f 20 63 68  **    0:  (no ch
79e0: 61 6e 67 65 29 0a 2a 2a 20 20 20 20 31 3a 20 20  ange).**    1:  
79f0: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 74 72 61 69  NOT NULL contrai
7a00: 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a  nt failed: P4.**
7a10: 20 20 20 20 32 3a 20 20 55 4e 49 51 55 45 20 63      2:  UNIQUE c
7a20: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
7a30: 3a 20 50 34 0a 2a 2a 20 20 20 20 33 3a 20 20 43  : P4.**    3:  C
7a40: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
7a50: 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20  failed: P4.**   
7a60: 20 34 3a 20 20 46 4f 52 45 49 47 4e 20 4b 45 59   4:  FOREIGN KEY
7a70: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
7a80: 65 64 3a 20 50 34 0a 2a 2a 0a 2a 2a 20 49 66 20  ed: P4.**.** If 
7a90: 50 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 61  P5 is not zero a
7aa0: 6e 64 20 50 34 20 69 73 20 4e 55 4c 4c 2c 20 74  nd P4 is NULL, t
7ab0: 68 65 6e 20 65 76 65 72 79 74 68 69 6e 67 20 61  hen everything a
7ac0: 66 74 65 72 20 74 68 65 20 22 3a 22 20 69 73 0a  fter the ":" is.
7ad0: 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a  ** omitted..**.*
7ae0: 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20 69 6d  * There is an im
7af0: 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20 30 20  plied "Halt 0 0 
7b00: 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  0" instruction i
7b10: 6e 73 65 72 74 65 64 20 61 74 20 74 68 65 20 76  nserted at the v
7b20: 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20 65 76  ery end of.** ev
7b30: 65 72 79 20 70 72 6f 67 72 61 6d 2e 20 20 53 6f  ery program.  So
7b40: 20 61 20 6a 75 6d 70 20 70 61 73 74 20 74 68 65   a jump past the
7b50: 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f   last instructio
7b60: 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  n of the program
7b70: 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20  .** is the same 
7b80: 61 73 20 65 78 65 63 75 74 69 6e 67 20 48 61 6c  as executing Hal
7b90: 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61  t..*/.case OP_Ha
7ba0: 6c 74 3a 20 7b 0a 20 20 56 64 62 65 46 72 61 6d  lt: {.  VdbeFram
7bb0: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69 6e 74  e *pFrame;.  int
7bc0: 20 70 63 78 3b 0a 0a 20 20 70 63 78 20 3d 20 28   pcx;..  pcx = (
7bd0: 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b  int)(pOp - aOp);
7be0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d  .  if( pOp->p1==
7bf0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
7c00: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  pFrame ){.    /*
7c10: 20 48 61 6c 74 20 74 68 65 20 73 75 62 2d 70 72   Halt the sub-pr
7c20: 6f 67 72 61 6d 2e 20 52 65 74 75 72 6e 20 63 6f  ogram. Return co
7c30: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 70 61 72  ntrol to the par
7c40: 65 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20  ent frame. */.  
7c50: 20 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46    pFrame = p->pF
7c60: 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 46 72  rame;.    p->pFr
7c70: 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e 70 50  ame = pFrame->pP
7c80: 61 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e 46  arent;.    p->nF
7c90: 72 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69  rame--;.    sqli
7ca0: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
7cb0: 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
7cc0: 29 3b 0a 20 20 20 20 70 63 78 20 3d 20 73 71 6c  );.    pcx = sql
7cd0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
7ce0: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
7cf0: 20 20 6c 61 73 74 52 6f 77 69 64 20 3d 20 64 62    lastRowid = db
7d00: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 20  ->lastRowid;.   
7d10: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45   if( pOp->p2==OE
7d20: 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
7d30: 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
7d40: 70 63 78 20 69 73 20 74 68 65 20 4f 50 5f 50 72  pcx is the OP_Pr
7d50: 6f 67 72 61 6d 20 74 68 61 74 20 69 6e 76 6f 6b  ogram that invok
7d60: 65 64 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  ed the sub-progr
7d70: 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72  am .      ** cur
7d80: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 68 61 6c  rently being hal
7d90: 74 65 64 2e 20 49 66 20 74 68 65 20 70 32 20 69  ted. If the p2 i
7da0: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
7db0: 69 73 20 4f 50 5f 48 61 6c 74 0a 20 20 20 20 20  is OP_Halt.     
7dc0: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
7dd0: 69 73 20 73 65 74 20 74 6f 20 4f 45 5f 49 67 6e  is set to OE_Ign
7de0: 6f 72 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ore, then the su
7df0: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 74 68 72  b-program is thr
7e00: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  owing.      ** a
7e10: 6e 20 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69  n IGNORE excepti
7e20: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
7e30: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 61 64 64   jump to the add
7e40: 72 65 73 73 20 73 70 65 63 69 66 69 65 64 0a 20  ress specified. 
7e50: 20 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 70       ** as the p
7e60: 32 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67  2 of the calling
7e70: 20 4f 50 5f 50 72 6f 67 72 61 6d 2e 20 20 2a 2f   OP_Program.  */
7e80: 0a 20 20 20 20 20 20 70 63 78 20 3d 20 70 2d 3e  .      pcx = p->
7e90: 61 4f 70 5b 70 63 78 5d 2e 70 32 2d 31 3b 0a 20  aOp[pcx].p2-1;. 
7ea0: 20 20 20 7d 0a 20 20 20 20 61 4f 70 20 3d 20 70     }.    aOp = p
7eb0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 61 4d 65 6d 20  ->aOp;.    aMem 
7ec0: 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70  = p->aMem;.    p
7ed0: 4f 70 20 3d 20 26 61 4f 70 5b 70 63 78 5d 3b 0a  Op = &aOp[pcx];.
7ee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
7ef0: 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d 3e 70 31   p->rc = pOp->p1
7f00: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
7f10: 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 32  on = (u8)pOp->p2
7f20: 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63 78 3b  ;.  p->pc = pcx;
7f30: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
7f40: 70 35 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 35  p5>=0 && pOp->p5
7f50: 3c 3d 34 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  <=4 );.  if( p->
7f60: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  rc ){.    if( pO
7f70: 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 73  p->p5 ){.      s
7f80: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7f90: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
7fa0: 5d 20 3d 20 7b 20 22 4e 4f 54 20 4e 55 4c 4c 22  ] = { "NOT NULL"
7fb0: 2c 20 22 55 4e 49 51 55 45 22 2c 20 22 43 48 45  , "UNIQUE", "CHE
7fc0: 43 4b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  CK",.           
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 22 20    "FOREIGN KEY" 
8000: 7d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  };.      testcas
8010: 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b  e( pOp->p5==1 );
8020: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8030: 20 70 4f 70 2d 3e 70 35 3d 3d 32 20 29 3b 0a 20   pOp->p5==2 );. 
8040: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8050: 4f 70 2d 3e 70 35 3d 3d 33 20 29 3b 0a 20 20 20  Op->p5==3 );.   
8060: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70     testcase( pOp
8070: 2d 3e 70 35 3d 3d 34 20 29 3b 0a 20 20 20 20 20  ->p5==4 );.     
8080: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
8090: 72 28 70 2c 20 22 25 73 20 63 6f 6e 73 74 72 61  r(p, "%s constra
80a0: 69 6e 74 20 66 61 69 6c 65 64 22 2c 20 61 7a 54  int failed", azT
80b0: 79 70 65 5b 70 4f 70 2d 3e 70 35 2d 31 5d 29 3b  ype[pOp->p5-1]);
80c0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
80d0: 70 34 2e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  p4.z ){.        
80e0: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
80f0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
8100: 22 25 7a 3a 20 25 73 22 2c 20 70 2d 3e 7a 45 72  "%z: %s", p->zEr
8110: 72 4d 73 67 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  rMsg, pOp->p4.z)
8120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8130: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8140: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
8150: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
8160: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8170: 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20  e3_log(pOp->p1, 
8180: 22 61 62 6f 72 74 20 61 74 20 25 64 20 69 6e 20  "abort at %d in 
8190: 5b 25 73 5d 3a 20 25 73 22 2c 20 70 63 78 2c 20  [%s]: %s", pcx, 
81a0: 70 2d 3e 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72 72  p->zSql, p->zErr
81b0: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  Msg);.  }.  rc =
81c0: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
81d0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  (p);.  assert( r
81e0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
81f0: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
8200: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  || rc==SQLITE_ER
8210: 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ROR );.  if( rc=
8220: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
8230: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
8240: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
8250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
8260: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
8270: 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  p->rc&0xff)==SQL
8280: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
8290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
82a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64  ==SQLITE_OK || d
82b0: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
82c0: 3e 30 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72  >0 || db->nDefer
82d0: 72 65 64 49 6d 6d 43 6f 6e 73 3e 30 20 29 3b 0a  redImmCons>0 );.
82e0: 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 20 3f      rc = p->rc ?
82f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20   SQLITE_ERROR : 
8300: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8310: 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74  .  goto vdbe_ret
8320: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  urn;.}../* Opcod
8330: 65 3a 20 49 6e 74 65 67 65 72 20 50 31 20 50 32  e: Integer P1 P2
8340: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
8350: 69 73 3a 20 72 5b 50 32 5d 3d 50 31 0a 2a 2a 0a  is: r[P2]=P1.**.
8360: 2a 2a 20 54 68 65 20 33 32 2d 62 69 74 20 69 6e  ** The 32-bit in
8370: 74 65 67 65 72 20 76 61 6c 75 65 20 50 31 20 69  teger value P1 i
8380: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 72  s written into r
8390: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
83a0: 61 73 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20  ase OP_Integer: 
83b0: 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74  {         /* out
83c0: 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75  2 */.  pOut = ou
83d0: 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
83e0: 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  pOp);.  pOut->u.
83f0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62  i = pOp->p1;.  b
8400: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
8410: 64 65 3a 20 49 6e 74 36 34 20 2a 20 50 32 20 2a  de: Int64 * P2 *
8420: 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
8430: 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a  s: r[P2]=P4.**.*
8440: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
8450: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e  r to a 64-bit in
8460: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20  teger value..** 
8470: 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65  Write that value
8480: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
8490: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  2..*/.case OP_In
84a0: 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20 20  t64: {          
84b0: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f   /* out2 */.  pO
84c0: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
84d0: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61  ase(p, pOp);.  a
84e0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70  ssert( pOp->p4.p
84f0: 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  I64!=0 );.  pOut
8500: 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 34  ->u.i = *pOp->p4
8510: 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a  .pI64;.  break;.
8520: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8530: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
8540: 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a  POINT./* Opcode:
8550: 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34 20   Real * P2 * P4 
8560: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
8570: 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50 34  [P2]=P4.**.** P4
8580: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
8590: 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69   a 64-bit floati
85a0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a  ng point value..
85b0: 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 61  ** Write that va
85c0: 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  lue into registe
85d0: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
85e0: 5f 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20  _Real: {        
85f0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
8600: 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74 32 20 2a 2f  K_FLOAT, out2 */
8610: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
8620: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
8630: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
8640: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73  = MEM_Real;.  as
8650: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
8660: 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  NaN(*pOp->p4.pRe
8670: 61 6c 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75  al) );.  pOut->u
8680: 2e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  .r = *pOp->p4.pR
8690: 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  eal;.  break;.}.
86a0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64  #endif../* Opcod
86b0: 65 3a 20 53 74 72 69 6e 67 38 20 2a 20 50 32 20  e: String8 * P2 
86c0: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
86d0: 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 0a 2a  is: r[P2]='P4'.*
86e0: 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 74  *.** P4 points t
86f0: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
8700: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e  ed UTF-8 string.
8710: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
8720: 74 72 61 6e 73 66 6f 72 6d 65 64 20 0a 2a 2a 20  transformed .** 
8730: 69 6e 74 6f 20 61 20 53 74 72 69 6e 67 20 6f 70  into a String op
8740: 63 6f 64 65 20 62 65 66 6f 72 65 20 69 74 20 69  code before it i
8750: 73 20 65 78 65 63 75 74 65 64 20 66 6f 72 20 74  s executed for t
8760: 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e 20 20  he first time.  
8770: 44 75 72 69 6e 67 0a 2a 2a 20 74 68 69 73 20 74  During.** this t
8780: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 74  ransformation, t
8790: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 73 74 72  he length of str
87a0: 69 6e 67 20 50 34 20 69 73 20 63 6f 6d 70 75 74  ing P4 is comput
87b0: 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
87c0: 20 61 73 20 74 68 65 20 50 31 20 70 61 72 61 6d   as the P1 param
87d0: 65 74 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  eter..*/.case OP
87e0: 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20 20  _String8: {     
87f0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
8800: 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 20 2a  K_STRING, out2 *
8810: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
8820: 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f  >p4.z!=0 );.  pO
8830: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
8840: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
8850: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
8860: 53 74 72 69 6e 67 3b 0a 20 20 70 4f 70 2d 3e 70  String;.  pOp->p
8870: 31 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  1 = sqlite3Strle
8880: 6e 33 30 28 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  n30(pOp->p4.z);.
8890: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
88a0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
88b0: 20 65 6e 63 6f 64 69 6e 67 21 3d 53 51 4c 49 54   encoding!=SQLIT
88c0: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 72 63  E_UTF8 ){.    rc
88d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
88e0: 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 70 4f  mSetStr(pOut, pO
88f0: 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c  p->p4.z, -1, SQL
8900: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
8910: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73  _STATIC);.    as
8920: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
8930: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
8940: 45 5f 54 4f 4f 42 49 47 20 29 3b 0a 20 20 20 20  E_TOOBIG );.    
8950: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
8960: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8970: 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65  Encoding(pOut, e
8980: 6e 63 6f 64 69 6e 67 29 20 29 20 67 6f 74 6f 20  ncoding) ) goto 
8990: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65  no_mem;.    asse
89a0: 72 74 28 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c  rt( pOut->szMall
89b0: 6f 63 3e 30 20 26 26 20 70 4f 75 74 2d 3e 7a 4d  oc>0 && pOut->zM
89c0: 61 6c 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29  alloc==pOut->z )
89d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 56 64  ;.    assert( Vd
89e0: 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75  beMemDynamic(pOu
89f0: 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75  t)==0 );.    pOu
8a00: 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  t->szMalloc = 0;
8a10: 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
8a20: 20 7c 3d 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a   |= MEM_Static;.
8a30: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
8a40: 79 70 65 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20  ype==P4_DYNAMIC 
8a50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8a60: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
8a70: 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p4.z);.    }.   
8a80: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
8a90: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20 70  4_DYNAMIC;.    p
8aa0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75 74 2d  Op->p4.z = pOut-
8ab0: 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 31 20  >z;.    pOp->p1 
8ac0: 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20 7d 0a 20  = pOut->n;.  }. 
8ad0: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
8ae0: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 3b 0a  QLITE_TOOBIG );.
8af0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 70  #endif.  if( pOp
8b00: 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ->p1>db->aLimit[
8b10: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
8b20: 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f  GTH] ){.    goto
8b30: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
8b40: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
8b50: 54 45 5f 4f 4b 20 29 3b 0a 20 20 2f 2a 20 46 61  TE_OK );.  /* Fa
8b60: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
8b70: 65 20 6e 65 78 74 20 63 61 73 65 2c 20 4f 50 5f  e next case, OP_
8b80: 53 74 72 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f  String */.}.  ./
8b90: 2a 20 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67  * Opcode: String
8ba0: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
8bb0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
8bc0: 32 5d 3d 27 50 34 27 20 28 6c 65 6e 3d 50 31 29  2]='P4' (len=P1)
8bd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e  .**.** The strin
8be0: 67 20 76 61 6c 75 65 20 50 34 20 6f 66 20 6c 65  g value P4 of le
8bf0: 6e 67 74 68 20 50 31 20 28 62 79 74 65 73 29 20  ngth P1 (bytes) 
8c00: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
8c10: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
8c20: 49 66 20 50 33 20 69 73 20 6e 6f 74 20 7a 65 72  If P3 is not zer
8c30: 6f 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  o and the conten
8c40: 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33  t of register P3
8c50: 20 69 73 20 65 71 75 61 6c 20 74 6f 20 50 35 2c   is equal to P5,
8c60: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74   then.** the dat
8c70: 61 74 79 70 65 20 6f 66 20 74 68 65 20 72 65 67  atype of the reg
8c80: 69 73 74 65 72 20 50 32 20 69 73 20 63 6f 6e 76  ister P2 is conv
8c90: 65 72 74 65 64 20 74 6f 20 42 4c 4f 42 2e 20 20  erted to BLOB.  
8ca0: 54 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 0a 2a  The content is.*
8cb0: 2a 20 74 68 65 20 73 61 6d 65 20 73 65 71 75 65  * the same seque
8cc0: 6e 63 65 20 6f 66 20 62 79 74 65 73 2c 20 69 74  nce of bytes, it
8cd0: 20 69 73 20 6d 65 72 65 6c 79 20 69 6e 74 65 72   is merely inter
8ce0: 70 72 65 74 65 64 20 61 73 20 61 20 42 4c 4f 42  preted as a BLOB
8cf0: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61   instead.** of a
8d00: 20 73 74 72 69 6e 67 2c 20 61 73 20 69 66 20 69   string, as if i
8d10: 74 20 68 61 64 20 62 65 65 6e 20 43 41 53 54 2e  t had been CAST.
8d20: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
8d30: 3a 0a 2a 2a 0a 2a 2a 20 69 66 28 20 50 33 21 3d  :.**.** if( P3!=
8d40: 30 20 61 6e 64 20 72 65 67 5b 50 33 5d 3d 3d 50  0 and reg[P3]==P
8d50: 35 20 29 20 72 65 67 5b 50 32 5d 20 3a 3d 20 43  5 ) reg[P2] := C
8d60: 41 53 54 28 72 65 67 5b 50 32 5d 20 61 73 20 42  AST(reg[P2] as B
8d70: 4c 4f 42 29 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  LOB).*/.case OP_
8d80: 53 74 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20  String: {       
8d90: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
8da0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
8db0: 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d  z!=0 );.  pOut =
8dc0: 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
8dd0: 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
8de0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
8df0: 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  |MEM_Static|MEM_
8e00: 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20  Term;.  pOut->z 
8e10: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 70  = pOp->p4.z;.  p
8e20: 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e 70 31  Out->n = pOp->p1
8e30: 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
8e40: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41  encoding;.  UPDA
8e50: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
8e60: 70 4f 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  pOut);.#ifndef S
8e70: 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e  QLITE_LIKE_DOESN
8e80: 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20  T_MATCH_BLOBS.  
8e90: 69 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b  if( pOp->p3>0 ){
8ea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
8eb0: 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
8ec0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
8ed0: 3b 0a 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d  ;.    pIn3 = &aM
8ee0: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
8ef0: 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
8f00: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
8f10: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e  ;.    if( pIn3->
8f20: 75 2e 69 3d 3d 70 4f 70 2d 3e 70 35 20 29 20 70  u.i==pOp->p5 ) p
8f30: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
8f40: 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 61 74 69 63  _Blob|MEM_Static
8f50: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 7d 0a 23  |MEM_Term;.  }.#
8f60: 65 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d  endif.  break;.}
8f70: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c  ../* Opcode: Nul
8f80: 6c 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  l P1 P2 P3 * *.*
8f90: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
8fa0: 2e 2e 50 33 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a 2a  ..P3]=NULL.**.**
8fb0: 20 57 72 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e   Write a NULL in
8fc0: 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 32 2e  to registers P2.
8fd0: 20 20 49 66 20 50 33 20 67 72 65 61 74 65 72 20    If P3 greater 
8fe0: 74 68 61 6e 20 50 32 2c 20 74 68 65 6e 20 61 6c  than P2, then al
8ff0: 73 6f 20 77 72 69 74 65 0a 2a 2a 20 4e 55 4c 4c  so write.** NULL
9000: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
9010: 33 20 61 6e 64 20 65 76 65 72 79 20 72 65 67 69  3 and every regi
9020: 73 74 65 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ster in between 
9030: 50 32 20 61 6e 64 20 50 33 2e 20 20 49 66 20 50  P2 and P3.  If P
9040: 33 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61  3.** is less tha
9050: 6e 20 50 32 20 28 74 79 70 69 63 61 6c 6c 79 20  n P2 (typically 
9060: 50 33 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  P3 is zero) then
9070: 20 6f 6e 6c 79 20 72 65 67 69 73 74 65 72 20 50   only register P
9080: 32 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 4e  2 is.** set to N
9090: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
90a0: 65 20 50 31 20 76 61 6c 75 65 20 69 73 20 6e 6f  e P1 value is no
90b0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6c 73  n-zero, then als
90c0: 6f 20 73 65 74 20 74 68 65 20 4d 45 4d 5f 43 6c  o set the MEM_Cl
90d0: 65 61 72 65 64 20 66 6c 61 67 20 73 6f 20 74 68  eared flag so th
90e0: 61 74 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  at.** NULL value
90f0: 73 20 77 69 6c 6c 20 6e 6f 74 20 63 6f 6d 70 61  s will not compa
9100: 72 65 20 65 71 75 61 6c 20 65 76 65 6e 20 69 66  re equal even if
9110: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
9120: 73 20 73 65 74 20 6f 6e 0a 2a 2a 20 4f 50 5f 4e  s set on.** OP_N
9130: 65 20 6f 72 20 4f 50 5f 45 71 2e 0a 2a 2f 0a 63  e or OP_Eq..*/.c
9140: 61 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20  ase OP_Null: {  
9150: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
9160: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 20   */.  int cnt;. 
9170: 20 75 31 36 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20   u16 nullFlag;. 
9180: 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
9190: 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
91a0: 20 20 63 6e 74 20 3d 20 70 4f 70 2d 3e 70 33 2d    cnt = pOp->p3-
91b0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
91c0: 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  t( pOp->p3<=(p->
91d0: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
91e0: 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e  sor) );.  pOut->
91f0: 66 6c 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67  flags = nullFlag
9200: 20 3d 20 70 4f 70 2d 3e 70 31 20 3f 20 28 4d 45   = pOp->p1 ? (ME
9210: 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 43 6c 65 61 72  M_Null|MEM_Clear
9220: 65 64 29 20 3a 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ed) : MEM_Null;.
9230: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20    pOut->n = 0;. 
9240: 20 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 29 7b   while( cnt>0 ){
9250: 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20  .    pOut++;.   
9260: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
9270: 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  e(p, pOut);.    
9280: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
9290: 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20  tNull(pOut);.   
92a0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e   pOut->flags = n
92b0: 75 6c 6c 46 6c 61 67 3b 0a 20 20 20 20 70 4f 75  ullFlag;.    pOu
92c0: 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 63 6e  t->n = 0;.    cn
92d0: 74 2d 2d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  t--;.  }.  break
92e0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
92f0: 53 6f 66 74 4e 75 6c 6c 20 50 31 20 2a 20 2a 20  SoftNull P1 * * 
9300: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
9310: 20 72 5b 50 31 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a   r[P1]=NULL.**.*
9320: 2a 20 53 65 74 20 72 65 67 69 73 74 65 72 20 50  * Set register P
9330: 31 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 61  1 to have the va
9340: 6c 75 65 20 4e 55 4c 4c 20 61 73 20 73 65 65 6e  lue NULL as seen
9350: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
9360: 65 63 6f 72 64 0a 2a 2a 20 69 6e 73 74 72 75 63  ecord.** instruc
9370: 74 69 6f 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  tion, but do not
9380: 20 66 72 65 65 20 61 6e 79 20 73 74 72 69 6e 67   free any string
9390: 20 6f 72 20 62 6c 6f 62 20 6d 65 6d 6f 72 79 20   or blob memory 
93a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
93b0: 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 2c  ** the register,
93c0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
93d0: 76 61 6c 75 65 20 77 61 73 20 61 20 73 74 72 69  value was a stri
93e0: 6e 67 20 6f 72 20 62 6c 6f 62 20 74 68 61 74 20  ng or blob that 
93f0: 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
9400: 79 20 63 6f 70 69 65 64 20 75 73 69 6e 67 20 4f  y copied using O
9410: 50 5f 53 43 6f 70 79 2c 20 74 68 65 20 63 6f 70  P_SCopy, the cop
9420: 69 65 73 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  ies will continu
9430: 65 20 74 6f 20 62 65 20 76 61 6c 69 64 2e 0a 2a  e to be valid..*
9440: 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 66 74 4e 75  /.case OP_SoftNu
9450: 6c 6c 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  ll: {.  assert( 
9460: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70  pOp->p1>0 && pOp
9470: 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p1<=(p->nMem+1
9480: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
9490: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
94a0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75  [pOp->p1];.  pOu
94b0: 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 4f 75 74  t->flags = (pOut
94c0: 2d 3e 66 6c 61 67 73 7c 4d 45 4d 5f 4e 75 6c 6c  ->flags|MEM_Null
94d0: 29 26 7e 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  )&~MEM_Undefined
94e0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
94f0: 20 4f 70 63 6f 64 65 3a 20 42 6c 6f 62 20 50 31   Opcode: Blob P1
9500: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
9510: 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34  nopsis: r[P2]=P4
9520: 20 28 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20   (len=P1).**.** 
9530: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  P4 points to a b
9540: 6c 6f 62 20 6f 66 20 64 61 74 61 20 50 31 20 62  lob of data P1 b
9550: 79 74 65 73 20 6c 6f 6e 67 2e 20 20 53 74 6f 72  ytes long.  Stor
9560: 65 20 74 68 69 73 0a 2a 2a 20 62 6c 6f 62 20 69  e this.** blob i
9570: 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
9580: 2f 0a 63 61 73 65 20 4f 50 5f 42 6c 6f 62 3a 20  /.case OP_Blob: 
9590: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
95a0: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73   /* out2 */.  as
95b0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 20 3c 3d  sert( pOp->p1 <=
95c0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
95d0: 54 48 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f  TH );.  pOut = o
95e0: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
95f0: 20 70 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33   pOp);.  sqlite3
9600: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f  VdbeMemSetStr(pO
9610: 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70  ut, pOp->p4.z, p
9620: 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a 20  Op->p1, 0, 0);. 
9630: 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63   pOut->enc = enc
9640: 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f  oding;.  UPDATE_
9650: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
9660: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
9670: 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 72 69 61  /* Opcode: Varia
9680: 62 6c 65 20 50 31 20 50 32 20 2a 20 50 34 20 2a  ble P1 P2 * P4 *
9690: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
96a0: 50 32 5d 3d 70 61 72 61 6d 65 74 65 72 28 50 31  P2]=parameter(P1
96b0: 2c 50 34 29 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  ,P4).**.** Trans
96c0: 66 65 72 20 74 68 65 20 76 61 6c 75 65 73 20 6f  fer the values o
96d0: 66 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  f bound paramete
96e0: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
96f0: 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74  er P2.**.** If t
9700: 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
9710: 6e 61 6d 65 64 2c 20 74 68 65 6e 20 69 74 73 20  named, then its 
9720: 6e 61 6d 65 20 61 70 70 65 61 72 73 20 69 6e 20  name appears in 
9730: 50 34 2e 0a 2a 2a 20 54 68 65 20 50 34 20 76 61  P4..** The P4 va
9740: 6c 75 65 20 69 73 20 75 73 65 64 20 62 79 20 73  lue is used by s
9750: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
9760: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f  meter_name()..*/
9770: 0a 63 61 73 65 20 4f 50 5f 56 61 72 69 61 62 6c  .case OP_Variabl
9780: 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  e: {            
9790: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 4d 65 6d  /* out2 */.  Mem
97a0: 20 2a 70 56 61 72 3b 20 20 20 20 20 20 20 2f 2a   *pVar;       /*
97b0: 20 56 61 6c 75 65 20 62 65 69 6e 67 20 74 72 61   Value being tra
97c0: 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a 20 20 61  nsferred */..  a
97d0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
97e0: 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e   && pOp->p1<=p->
97f0: 6e 56 61 72 20 29 3b 0a 20 20 61 73 73 65 72 74  nVar );.  assert
9800: 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c  ( pOp->p4.z==0 |
9810: 7c 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 70 2d 3e  | pOp->p4.z==p->
9820: 61 7a 56 61 72 5b 70 4f 70 2d 3e 70 31 2d 31 5d  azVar[pOp->p1-1]
9830: 20 29 3b 0a 20 20 70 56 61 72 20 3d 20 26 70 2d   );.  pVar = &p-
9840: 3e 61 56 61 72 5b 70 4f 70 2d 3e 70 31 20 2d 20  >aVar[pOp->p1 - 
9850: 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  1];.  if( sqlite
9860: 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
9870: 56 61 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Var) ){.    goto
9880: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
9890: 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
98a0: 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
98b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
98c0: 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
98d0: 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74 61 74 69   pVar, MEM_Stati
98e0: 63 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  c);.  UPDATE_MAX
98f0: 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
9900: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9910: 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50 31 20  Opcode: Move P1 
9920: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
9930: 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33 5d 3d  opsis: r[P2@P3]=
9940: 72 5b 50 31 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d  r[P1@P3].**.** M
9950: 6f 76 65 20 74 68 65 20 50 33 20 76 61 6c 75 65  ove the P3 value
9960: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
9970: 2e 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72 20 69  ..P1+P3-1 over i
9980: 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  nto.** registers
9990: 20 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52   P2..P2+P3-1.  R
99a0: 65 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b  egisters P1..P1+
99b0: 50 33 2d 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74  P3-1 are.** left
99c0: 20 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e   holding a NULL.
99d0: 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
99e0: 20 66 6f 72 20 72 65 67 69 73 74 65 72 20 72 61   for register ra
99f0: 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50  nges.** P1..P1+P
9a00: 33 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50  3-1 and P2..P2+P
9a10: 33 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70 2e 20  3-1 to overlap. 
9a20: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 0a   It is an error.
9a30: 2a 2a 20 66 6f 72 20 50 33 20 74 6f 20 62 65 20  ** for P3 to be 
9a40: 6c 65 73 73 20 74 68 61 6e 20 31 2e 0a 2a 2f 0a  less than 1..*/.
9a50: 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a  case OP_Move: {.
9a60: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
9a70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9a80: 72 65 67 69 73 74 65 72 73 20 6c 65 66 74 20 74  registers left t
9a90: 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
9aa0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p1;          /* 
9ab0: 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79  Register to copy
9ac0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 70   from */.  int p
9ad0: 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  2;          /* R
9ae0: 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79 20  egister to copy 
9af0: 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70  to */..  n = pOp
9b00: 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20 70 4f 70  ->p3;.  p1 = pOp
9b10: 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70  ->p1;.  p2 = pOp
9b20: 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
9b30: 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26 20 70  n>0 && p1>0 && p
9b40: 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  2>0 );.  assert(
9b50: 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b   p1+n<=p2 || p2+
9b60: 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49 6e 31  n<=p1 );..  pIn1
9b70: 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20   = &aMem[p1];.  
9b80: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 32 5d  pOut = &aMem[p2]
9b90: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
9ba0: 72 74 28 20 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b  rt( pOut<=&aMem[
9bb0: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
9bc0: 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20  nCursor)] );.   
9bd0: 20 61 73 73 65 72 74 28 20 70 49 6e 31 3c 3d 26   assert( pIn1<=&
9be0: 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20  aMem[(p->nMem+1 
9bf0: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29  - p->nCursor)] )
9c00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
9c10: 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29  mIsValid(pIn1) )
9c20: 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
9c30: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
9c40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9c50: 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49  MemMove(pOut, pI
9c60: 6e 31 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  n1);.#ifdef SQLI
9c70: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28  TE_DEBUG.    if(
9c80: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
9c90: 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d 20 26 26 20  m>=&aMem[p1] && 
9ca0: 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d  pOut->pScopyFrom
9cb0: 3c 70 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 70  <pOut ){.      p
9cc0: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20  Out->pScopyFrom 
9cd0: 2b 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 70 31 3b  += pOp->p2 - p1;
9ce0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9cf0: 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65    Deephemeralize
9d00: 28 70 4f 75 74 29 3b 0a 20 20 20 20 52 45 47 49  (pOut);.    REGI
9d10: 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b 2b 2c  STER_TRACE(p2++,
9d20: 20 70 4f 75 74 29 3b 0a 20 20 20 20 70 49 6e 31   pOut);.    pIn1
9d30: 2b 2b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a  ++;.    pOut++;.
9d40: 20 20 7d 77 68 69 6c 65 28 20 2d 2d 6e 20 29 3b    }while( --n );
9d50: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9d60: 4f 70 63 6f 64 65 3a 20 43 6f 70 79 20 50 31 20  Opcode: Copy P1 
9d70: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
9d80: 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33 2b 31  opsis: r[P2@P3+1
9d90: 5d 3d 72 5b 50 31 40 50 33 2b 31 5d 0a 2a 2a 0a  ]=r[P1@P3+1].**.
9da0: 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ** Make a copy o
9db0: 66 20 72 65 67 69 73 74 65 72 73 20 50 31 2e 2e  f registers P1..
9dc0: 50 31 2b 50 33 20 69 6e 74 6f 20 72 65 67 69 73  P1+P3 into regis
9dd0: 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2e 0a  ters P2..P2+P3..
9de0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
9df0: 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 64  uction makes a d
9e00: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
9e10: 76 61 6c 75 65 2e 20 20 41 20 64 75 70 6c 69 63  value.  A duplic
9e20: 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64 65 20 6f  ate.** is made o
9e30: 66 20 61 6e 79 20 73 74 72 69 6e 67 20 6f 72 20  f any string or 
9e40: 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74 2e 20 20  blob constant.  
9e50: 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53 43 6f 70  See also OP_SCop
9e60: 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  y..*/.case OP_Co
9e70: 70 79 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  py: {.  int n;..
9e80: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    n = pOp->p3;. 
9e90: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
9ea0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
9eb0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
9ec0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21  .  assert( pOut!
9ed0: 3d 70 49 6e 31 20 29 3b 0a 20 20 77 68 69 6c 65  =pIn1 );.  while
9ee0: 28 20 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( 1 ){.    sqlit
9ef0: 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
9f00: 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c  Copy(pOut, pIn1,
9f10: 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
9f20: 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28   Deephemeralize(
9f30: 70 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51  pOut);.#ifdef SQ
9f40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
9f50: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20  Out->pScopyFrom 
9f60: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
9f70: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
9f80: 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2d 6e  Op->p2+pOp->p3-n
9f90: 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  , pOut);.    if(
9fa0: 20 28 6e 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (n--)==0 ) brea
9fb0: 6b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20  k;.    pOut++;. 
9fc0: 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20     pIn1++;.  }. 
9fd0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
9fe0: 63 6f 64 65 3a 20 53 43 6f 70 79 20 50 31 20 50  code: SCopy P1 P
9ff0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
a000: 73 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50 31 5d  sis: r[P2]=r[P1]
a010: 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68  .**.** Make a sh
a020: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 72 65  allow copy of re
a030: 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72  gister P1 into r
a040: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
a050: 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  * This instructi
a060: 6f 6e 20 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c  on makes a shall
a070: 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76  ow copy of the v
a080: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 76 61  alue.  If the va
a090: 6c 75 65 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  lue.** is a stri
a0a0: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e  ng or blob, then
a0b0: 20 74 68 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c   the copy is onl
a0c0: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
a0d0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61  he.** original a
a0e0: 6e 64 20 68 65 6e 63 65 20 69 66 20 74 68 65 20  nd hence if the 
a0f0: 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73  original changes
a100: 20 73 6f 20 77 69 6c 6c 20 74 68 65 20 63 6f 70   so will the cop
a110: 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20  y..** Worse, if 
a120: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 73 20  the original is 
a130: 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  deallocated, the
a140: 20 63 6f 70 79 20 62 65 63 6f 6d 65 73 20 69 6e   copy becomes in
a150: 76 61 6c 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74  valid..** Thus t
a160: 68 65 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20  he program must 
a170: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
a180: 68 65 20 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c  he original will
a190: 20 6e 6f 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64   not change.** d
a1a0: 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69  uring the lifeti
a1b0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 70 79 2e 20  me of the copy. 
a1c0: 20 55 73 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20   Use OP_Copy to 
a1d0: 6d 61 6b 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a  make a complete.
a1e0: 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65  ** copy..*/.case
a1f0: 20 4f 50 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20   OP_SCopy: {    
a200: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
a210: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
a220: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f  m[pOp->p1];.  pO
a230: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
a240: 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
a250: 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73  Out!=pIn1 );.  s
a260: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
a270: 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70  llowCopy(pOut, p
a280: 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  In1, MEM_Ephem);
a290: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a2a0: 45 42 55 47 0a 20 20 69 66 28 20 70 4f 75 74 2d  EBUG.  if( pOut-
a2b0: 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d 30 20 29  >pScopyFrom==0 )
a2c0: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
a2d0: 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e 64 69 66  m = pIn1;.#endif
a2e0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
a2f0: 4f 70 63 6f 64 65 3a 20 49 6e 74 43 6f 70 79 20  Opcode: IntCopy 
a300: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
a310: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72  ynopsis: r[P2]=r
a320: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  [P1].**.** Trans
a330: 66 65 72 20 74 68 65 20 69 6e 74 65 67 65 72 20  fer the integer 
a340: 76 61 6c 75 65 20 68 65 6c 64 20 69 6e 20 72 65  value held in re
a350: 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72  gister P1 into r
a360: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
a370: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
a380: 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
a390: 66 20 53 43 6f 70 79 20 74 68 61 74 20 77 6f 72  f SCopy that wor
a3a0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 69 6e 74 65  ks only for inte
a3b0: 67 65 72 0a 2a 2a 20 76 61 6c 75 65 73 2e 0a 2a  ger.** values..*
a3c0: 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 43 6f 70  /.case OP_IntCop
a3d0: 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  y: {            
a3e0: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e  /* out2 */.  pIn
a3f0: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
a400: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  1];.  assert( (p
a410: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
a420: 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 70 4f  _Int)!=0 );.  pO
a430: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
a440: 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p2];.  sqlite3Vd
a450: 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4f  beMemSetInt64(pO
a460: 75 74 2c 20 70 49 6e 31 2d 3e 75 2e 69 29 3b 0a  ut, pIn1->u.i);.
a470: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
a480: 70 63 6f 64 65 3a 20 52 65 73 75 6c 74 52 6f 77  pcode: ResultRow
a490: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
a4a0: 53 79 6e 6f 70 73 69 73 3a 20 6f 75 74 70 75 74  Synopsis: output
a4b0: 3d 72 5b 50 31 40 50 32 5d 0a 2a 2a 0a 2a 2a 20  =r[P1@P2].**.** 
a4c0: 54 68 65 20 72 65 67 69 73 74 65 72 73 20 50 31  The registers P1
a4d0: 20 74 68 72 6f 75 67 68 20 50 31 2b 50 32 2d 31   through P1+P2-1
a4e0: 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e 67 6c   contain a singl
a4f0: 65 20 72 6f 77 20 6f 66 0a 2a 2a 20 72 65 73 75  e row of.** resu
a500: 6c 74 73 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  lts. This opcode
a510: 20 63 61 75 73 65 73 20 74 68 65 20 73 71 6c 69   causes the sqli
a520: 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 20  te3_step() call 
a530: 74 6f 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20  to terminate.** 
a540: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 52  with an SQLITE_R
a550: 4f 57 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  OW return code a
a560: 6e 64 20 69 74 20 73 65 74 73 20 75 70 20 74 68  nd it sets up th
a570: 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 0a 2a  e sqlite3_stmt.*
a580: 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 70  * structure to p
a590: 72 6f 76 69 64 65 20 61 63 63 65 73 73 20 74 6f  rovide access to
a5a0: 20 74 68 65 20 72 28 50 31 29 2e 2e 72 28 50 31   the r(P1)..r(P1
a5b0: 2b 50 32 2d 31 29 20 76 61 6c 75 65 73 20 61 73  +P2-1) values as
a5c0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 72  .** the result r
a5d0: 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ow..*/.case OP_R
a5e0: 65 73 75 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d 65  esultRow: {.  Me
a5f0: 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 69  m *pMem;.  int i
a600: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
a610: 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e  ResColumn==pOp->
a620: 70 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p2 );.  assert( 
a630: 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 61  pOp->p1>0 );.  a
a640: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 2b 70  ssert( pOp->p1+p
a650: 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p2<=(p->nMem
a660: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
a670: 2b 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  +1 );..#ifndef S
a680: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
a690: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 2f  ESS_CALLBACK.  /
a6a0: 2a 20 52 75 6e 20 74 68 65 20 70 72 6f 67 72 65  * Run the progre
a6b0: 73 73 20 63 6f 75 6e 74 65 72 20 6a 75 73 74 20  ss counter just 
a6c0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
a6d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
a6e0: 3e 78 50 72 6f 67 72 65 73 73 21 3d 30 0a 20 20  >xProgress!=0.  
a6f0: 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d 6e 50 72   && nVmStep>=nPr
a700: 6f 67 72 65 73 73 4c 69 6d 69 74 0a 20 20 20 26  ogressLimit.   &
a710: 26 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 28  & db->xProgress(
a720: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
a730: 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 63  )!=0.  ){.    rc
a740: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
a750: 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  UPT;.    goto ab
a760: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
a770: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
a780: 2f 2a 20 49 66 20 74 68 69 73 20 73 74 61 74 65  /* If this state
a790: 6d 65 6e 74 20 68 61 73 20 76 69 6f 6c 61 74 65  ment has violate
a7a0: 64 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  d immediate fore
a7b0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
a7c0: 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  nts, do.  ** not
a7d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
a7e0: 65 72 20 6f 66 20 72 6f 77 73 20 6d 6f 64 69 66  er of rows modif
a7f0: 69 65 64 2e 20 41 6e 64 20 64 6f 20 6e 6f 74 20  ied. And do not 
a800: 52 45 4c 45 41 53 45 20 74 68 65 20 73 74 61 74  RELEASE the stat
a810: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
a820: 61 63 74 69 6f 6e 2e 20 49 74 20 6e 65 65 64 73  action. It needs
a830: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
a840: 63 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  ck.  */.  if( SQ
a850: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
a860: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
a870: 6b 28 70 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  k(p, 0)) ){.    
a880: 61 73 73 65 72 74 28 20 64 62 2d 3e 66 6c 61 67  assert( db->flag
a890: 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  s&SQLITE_CountRo
a8a0: 77 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ws );.    assert
a8b0: 28 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  ( p->usesStmtJou
a8c0: 72 6e 61 6c 20 29 3b 0a 20 20 20 20 67 6f 74 6f  rnal );.    goto
a8d0: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
a8e0: 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ror;.  }..  /* I
a8f0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 43 6f 75  f the SQLITE_Cou
a900: 6e 74 52 6f 77 73 20 66 6c 61 67 20 69 73 20 73  ntRows flag is s
a910: 65 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c  et in sqlite3.fl
a920: 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e 20 0a  ags mask, then .
a930: 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74 65 6d 65    ** DML stateme
a940: 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  nts invoke this 
a950: 6f 70 63 6f 64 65 20 74 6f 20 72 65 74 75 72 6e  opcode to return
a960: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
a970: 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ows .  ** modifi
a980: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
a990: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
a9a0: 20 77 61 79 20 74 68 61 74 20 61 20 56 4d 20 74   way that a VM t
a9b0: 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e 73 20 61  hat.  ** opens a
a9c0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
a9d0: 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e 76 6f 6b  action may invok
a9e0: 65 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 20  e this opcode.. 
a9f0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65   **.  ** In case
aa00: 20 74 68 69 73 20 69 73 20 73 75 63 68 20 61 20   this is such a 
aa10: 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c 6f 73 65  statement, close
aa20: 20 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 74   any statement t
aa30: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
aa40: 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 56  opened by this V
aa50: 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  M before returni
aa60: 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ng control to th
aa70: 65 20 75 73 65 72 2e 20 54 68 69 73 20 69 73 20  e user. This is 
aa80: 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74  to.  ** ensure t
aa90: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  hat statement-tr
aaa0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 61  ansactions are a
aab0: 6c 77 61 79 73 20 6e 65 73 74 65 64 2c 20 6e 6f  lways nested, no
aac0: 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 2e 0a 20  t overlapping.. 
aad0: 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 6e 20   ** If the open 
aae0: 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
aaf0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6c 6f  ction is not clo
ab00: 73 65 64 20 68 65 72 65 2c 20 74 68 65 6e 20 74  sed here, then t
ab10: 68 65 20 75 73 65 72 0a 20 20 2a 2a 20 6d 61 79  he user.  ** may
ab20: 20 73 74 65 70 20 61 6e 6f 74 68 65 72 20 56 4d   step another VM
ab30: 20 74 68 61 74 20 6f 70 65 6e 73 20 69 74 73 20   that opens its 
ab40: 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74 20 74 72  own statement tr
ab50: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 0a  ansaction. This.
ab60: 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64 20 74 6f    ** may lead to
ab70: 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73 74 61   overlapping sta
ab80: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ab90: 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ons..  **.  ** T
aba0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
abb0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 76 65  nsaction is neve
abc0: 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72  r a top-level tr
abd0: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48 65 6e 63  ansaction.  Henc
abe0: 65 0a 20 20 2a 2a 20 74 68 65 20 52 45 4c 45 41  e.  ** the RELEA
abf0: 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77 20 63 61  SE call below ca
ac00: 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 20 20  n never fail..  
ac10: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
ac20: 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c  iStatement==0 ||
ac30: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
ac40: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20  E_CountRows );. 
ac50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
ac60: 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
ac70: 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p, SAVEPOINT_REL
ac80: 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28  EASE);.  assert(
ac90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
aca0: 3b 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61  ;..  /* Invalida
acb0: 74 65 20 61 6c 6c 20 65 70 68 65 6d 65 72 61 6c  te all ephemeral
acc0: 20 63 75 72 73 6f 72 20 72 6f 77 20 63 61 63 68   cursor row cach
acd0: 65 73 20 2a 2f 0a 20 20 70 2d 3e 63 61 63 68 65  es */.  p->cache
ace0: 43 74 72 20 3d 20 28 70 2d 3e 63 61 63 68 65 43  Ctr = (p->cacheC
acf0: 74 72 20 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f 2a  tr + 2)|1;..  /*
ad00: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 72   Make sure the r
ad10: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63 75  esults of the cu
ad20: 72 72 65 6e 74 20 72 6f 77 20 61 72 65 20 5c 30  rrent row are \0
ad30: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20  00 terminated.  
ad40: 2a 2a 20 61 6e 64 20 68 61 76 65 20 61 6e 20 61  ** and have an a
ad50: 73 73 69 67 6e 65 64 20 74 79 70 65 2e 20 20 54  ssigned type.  T
ad60: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
ad70: 65 2d 65 70 68 65 6d 65 72 61 6c 69 7a 65 64 20  e-ephemeralized 
ad80: 61 73 0a 20 20 2a 2a 20 61 20 73 69 64 65 20 65  as.  ** a side e
ad90: 66 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ffect..  */.  pM
ada0: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
adb0: 65 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  et = &aMem[pOp->
adc0: 70 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  p1];.  for(i=0; 
add0: 69 3c 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29 7b  i<pOp->p2; i++){
ade0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
adf0: 49 73 56 61 6c 69 64 28 26 70 4d 65 6d 5b 69 5d  IsValid(&pMem[i]
ae00: 29 20 29 3b 0a 20 20 20 20 44 65 65 70 68 65 6d  ) );.    Deephem
ae10: 65 72 61 6c 69 7a 65 28 26 70 4d 65 6d 5b 69 5d  eralize(&pMem[i]
ae20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
ae30: 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20  pMem[i].flags & 
ae40: 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d 30 0a 20 20  MEM_Ephem)==0.  
ae50: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4d            || (pM
ae60: 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28 4d  em[i].flags & (M
ae70: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
ae80: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  )==0 );.    sqli
ae90: 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72  te3VdbeMemNulTer
aea0: 6d 69 6e 61 74 65 28 26 70 4d 65 6d 5b 69 5d 29  minate(&pMem[i])
aeb0: 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
aec0: 52 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c 20  RACE(pOp->p1+i, 
aed0: 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  &pMem[i]);.  }. 
aee0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
aef0: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f  ailed ) goto no_
af00: 6d 65 6d 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  mem;..  if( db->
af10: 6d 54 72 61 63 65 20 26 20 53 51 4c 49 54 45 5f  mTrace & SQLITE_
af20: 54 52 41 43 45 5f 52 4f 57 20 29 7b 0a 20 20 20  TRACE_ROW ){.   
af30: 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c 49   db->xTrace(SQLI
af40: 54 45 5f 54 52 41 43 45 5f 52 4f 57 2c 20 64 62  TE_TRACE_ROW, db
af50: 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 70 2c 20  ->pTraceArg, p, 
af60: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  0);.  }..  /* Re
af70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f 57 0a  turn SQLITE_ROW.
af80: 20 20 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d 20 28    */.  p->pc = (
af90: 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 20  int)(pOp - aOp) 
afa0: 2b 20 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  + 1;.  rc = SQLI
afb0: 54 45 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20 76  TE_ROW;.  goto v
afc0: 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  dbe_return;.}../
afd0: 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61 74  * Opcode: Concat
afe0: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
aff0: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
b000: 3d 72 5b 50 32 5d 2b 72 5b 50 31 5d 0a 2a 2a 0a  =r[P2]+r[P1].**.
b010: 2a 2a 20 41 64 64 20 74 68 65 20 74 65 78 74 20  ** Add the text 
b020: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 6f  in register P1 o
b030: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
b040: 68 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20 72 65  he text in.** re
b050: 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 73 74  gister P2 and st
b060: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
b070: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
b080: 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
b090: 50 31 20 6f 72 20 50 32 20 74 65 78 74 20 61 72  P1 or P2 text ar
b0a0: 65 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72  e NULL then stor
b0b0: 65 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a  e NULL in P3..**
b0c0: 0a 2a 2a 20 20 20 50 33 20 3d 20 50 32 20 7c 7c  .**   P3 = P2 ||
b0d0: 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20   P1.**.** It is 
b0e0: 69 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31 20 61  illegal for P1 a
b0f0: 6e 64 20 50 33 20 74 6f 20 62 65 20 74 68 65 20  nd P3 to be the 
b100: 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 20 53  same register. S
b110: 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69 66 20  ometimes,.** if 
b120: 50 33 20 69 73 20 74 68 65 20 73 61 6d 65 20 72  P3 is the same r
b130: 65 67 69 73 74 65 72 20 61 73 20 50 32 2c 20 74  egister as P2, t
b140: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
b150: 6e 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74 6f 20  n is able.** to 
b160: 61 76 6f 69 64 20 61 20 6d 65 6d 63 70 79 28 29  avoid a memcpy()
b170: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6e  ..*/.case OP_Con
b180: 63 61 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  cat: {          
b190: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 43   /* same as TK_C
b1a0: 4f 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e 32 2c  ONCAT, in1, in2,
b1b0: 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 6e   out3 */.  i64 n
b1c0: 42 79 74 65 3b 0a 0a 20 20 70 49 6e 31 20 3d 20  Byte;..  pIn1 = 
b1d0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
b1e0: 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
b1f0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20  Op->p2];.  pOut 
b200: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
b210: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
b220: 21 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66 28 20  !=pOut );.  if( 
b230: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70  (pIn1->flags | p
b240: 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45  In2->flags) & ME
b250: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71  M_Null ){.    sq
b260: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
b270: 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62  ull(pOut);.    b
b280: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
b290: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29  ExpandBlob(pIn1)
b2a0: 20 7c 7c 20 45 78 70 61 6e 64 42 6c 6f 62 28 70   || ExpandBlob(p
b2b0: 49 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  In2) ) goto no_m
b2c0: 65 6d 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28  em;.  Stringify(
b2d0: 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  pIn1, encoding);
b2e0: 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e  .  Stringify(pIn
b2f0: 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  2, encoding);.  
b300: 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e 6e 20  nByte = pIn1->n 
b310: 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28  + pIn2->n;.  if(
b320: 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69   nByte>db->aLimi
b330: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
b340: 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f  ENGTH] ){.    go
b350: 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
b360: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
b370: 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28  eMemGrow(pOut, (
b380: 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20 70 4f 75  int)nByte+2, pOu
b390: 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20 20 20 20  t==pIn2) ){.    
b3a0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
b3b0: 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
b3c0: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72 29  g(pOut, MEM_Str)
b3d0: 3b 0a 20 20 69 66 28 20 70 4f 75 74 21 3d 70 49  ;.  if( pOut!=pI
b3e0: 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  n2 ){.    memcpy
b3f0: 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e  (pOut->z, pIn2->
b400: 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d  z, pIn2->n);.  }
b410: 0a 20 20 6d 65 6d 63 70 79 28 26 70 4f 75 74 2d  .  memcpy(&pOut-
b420: 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e  >z[pIn2->n], pIn
b430: 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a  1->z, pIn1->n);.
b440: 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d    pOut->z[nByte]
b450: 3d 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42  =0;.  pOut->z[nB
b460: 79 74 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 4f  yte+1] = 0;.  pO
b470: 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ut->flags |= MEM
b480: 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e  _Term;.  pOut->n
b490: 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20   = (int)nByte;. 
b4a0: 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63   pOut->enc = enc
b4b0: 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f  oding;.  UPDATE_
b4c0: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
b4d0: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
b4e0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 20 50  /* Opcode: Add P
b4f0: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
b500: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72  ynopsis: r[P3]=r
b510: 5b 50 31 5d 2b 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a  [P1]+r[P2].**.**
b520: 20 41 64 64 20 74 68 65 20 76 61 6c 75 65 20 69   Add the value i
b530: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  n register P1 to
b540: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
b550: 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64  gister P2.** and
b560: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
b570: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
b580: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
b590: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
b5a0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b5b0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
b5c0: 4d 75 6c 74 69 70 6c 79 20 50 31 20 50 32 20 50  Multiply P1 P2 P
b5d0: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
b5e0: 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2a 72  s: r[P3]=r[P1]*r
b5f0: 5b 50 32 5d 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75  [P2].**.**.** Mu
b600: 6c 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75 65  ltiply the value
b610: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b620: 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  by the value in 
b630: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
b640: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
b650: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
b660: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
b670: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
b680: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
b690: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
b6a0: 3a 20 53 75 62 74 72 61 63 74 20 50 31 20 50 32  : Subtract P1 P2
b6b0: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
b6c0: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d  sis: r[P3]=r[P2]
b6d0: 2d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 75 62  -r[P1].**.** Sub
b6e0: 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
b6f0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 66  in register P1 f
b700: 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rom the value in
b710: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20   register P2.** 
b720: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
b730: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
b740: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
b750: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
b760: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
b770: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
b780: 65 3a 20 44 69 76 69 64 65 20 50 31 20 50 32 20  e: Divide P1 P2 
b790: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
b7a0: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2f  is: r[P3]=r[P2]/
b7b0: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 44 69 76 69  r[P1].**.** Divi
b7c0: 64 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  de the value in 
b7d0: 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74  register P1 by t
b7e0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
b7f0: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73  ster P2.** and s
b800: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
b810: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 28  in register P3 (
b820: 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20 74 68  P3=P2/P1). If th
b830: 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20 72  e value in .** r
b840: 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a 65  egister P1 is ze
b850: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ro, then the res
b860: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20  ult is NULL. If 
b870: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
b880: 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  .** NULL, the re
b890: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
b8a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d 61  ./* Opcode: Rema
b8b0: 69 6e 64 65 72 20 50 31 20 50 32 20 50 33 20 2a  inder P1 P2 P3 *
b8c0: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
b8d0: 72 5b 50 33 5d 3d 72 5b 50 32 5d 25 72 5b 50 31  r[P3]=r[P2]%r[P1
b8e0: 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ].**.** Compute 
b8f0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 61 66  the remainder af
b900: 74 65 72 20 69 6e 74 65 67 65 72 20 72 65 67 69  ter integer regi
b910: 73 74 65 72 20 50 32 20 69 73 20 64 69 76 69 64  ster P2 is divid
b920: 65 64 20 62 79 20 0a 2a 2a 20 72 65 67 69 73 74  ed by .** regist
b930: 65 72 20 50 31 20 61 6e 64 20 73 74 6f 72 65 20  er P1 and store 
b940: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
b950: 67 69 73 74 65 72 20 50 33 2e 20 0a 2a 2a 20 49  gister P3. .** I
b960: 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
b970: 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a 65  egister P1 is ze
b980: 72 6f 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ro the result is
b990: 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69 74   NULL..** If eit
b9a0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
b9b0: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
b9c0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  is NULL..*/.case
b9d0: 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20   OP_Add:        
b9e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
b9f0: 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20 69  me as TK_PLUS, i
ba00: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
ba10: 0a 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63  .case OP_Subtrac
ba20: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
ba30: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d 49  /* same as TK_MI
ba40: 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  NUS, in1, in2, o
ba50: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d  ut3 */.case OP_M
ba60: 75 6c 74 69 70 6c 79 3a 20 20 20 20 20 20 20 20  ultiply:        
ba70: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
ba80: 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20 69   TK_STAR, in1, i
ba90: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
baa0: 20 4f 50 5f 44 69 76 69 64 65 3a 20 20 20 20 20   OP_Divide:     
bab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
bac0: 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c 20  me as TK_SLASH, 
bad0: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
bae0: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d 61 69 6e  /.case OP_Remain
baf0: 64 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20  der: {          
bb00: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52   /* same as TK_R
bb10: 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  EM, in1, in2, ou
bb20: 74 33 20 2a 2f 0a 20 20 63 68 61 72 20 62 49 6e  t3 */.  char bIn
bb30: 74 69 6e 74 3b 20 20 20 2f 2a 20 53 74 61 72 74  tint;   /* Start
bb40: 65 64 20 6f 75 74 20 61 73 20 74 77 6f 20 69 6e  ed out as two in
bb50: 74 65 67 65 72 20 6f 70 65 72 61 6e 64 73 20 2a  teger operands *
bb60: 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 3b 20 20  /.  u16 flags;  
bb70: 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
bb80: 4d 45 4d 5f 2a 20 66 6c 61 67 73 20 66 72 6f 6d  MEM_* flags from
bb90: 20 62 6f 74 68 20 69 6e 70 75 74 73 20 2a 2f 0a   both inputs */.
bba0: 20 20 75 31 36 20 74 79 70 65 31 3b 20 20 20 20    u16 type1;    
bbb0: 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79 70    /* Numeric typ
bbc0: 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e  e of left operan
bbd0: 64 20 2a 2f 0a 20 20 75 31 36 20 74 79 70 65 32  d */.  u16 type2
bbe0: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72 69  ;      /* Numeri
bbf0: 63 20 74 79 70 65 20 6f 66 20 72 69 67 68 74 20  c type of right 
bc00: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36 34  operand */.  i64
bc10: 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   iA;         /* 
bc20: 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f 66  Integer value of
bc30: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
bc40: 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20 20 20  .  i64 iB;      
bc50: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61     /* Integer va
bc60: 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f 70 65  lue of right ope
bc70: 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  rand */.  double
bc80: 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52 65 61   rA;      /* Rea
bc90: 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 20  l value of left 
bca0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75  operand */.  dou
bcb0: 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f 2a 20  ble rB;      /* 
bcc0: 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 72 69  Real value of ri
bcd0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 0a  ght operand */..
bce0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
bcf0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74 79 70 65 31  Op->p1];.  type1
bd00: 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65 28 70   = numericType(p
bd10: 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26  In1);.  pIn2 = &
bd20: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
bd30: 20 74 79 70 65 32 20 3d 20 6e 75 6d 65 72 69 63   type2 = numeric
bd40: 54 79 70 65 28 70 49 6e 32 29 3b 0a 20 20 70 4f  Type(pIn2);.  pO
bd50: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
bd60: 70 33 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70  p3];.  flags = p
bd70: 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e  In1->flags | pIn
bd80: 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  2->flags;.  if( 
bd90: 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  (flags & MEM_Nul
bda0: 6c 29 21 3d 30 20 29 20 67 6f 74 6f 20 61 72 69  l)!=0 ) goto ari
bdb0: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
bdc0: 73 5f 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 28 74  s_null;.  if( (t
bdd0: 79 70 65 31 20 26 20 74 79 70 65 32 20 26 20 4d  ype1 & type2 & M
bde0: 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
bdf0: 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e 75 2e 69    iA = pIn1->u.i
be00: 3b 0a 20 20 20 20 69 42 20 3d 20 70 49 6e 32 2d  ;.    iB = pIn2-
be10: 3e 75 2e 69 3b 0a 20 20 20 20 62 49 6e 74 69 6e  >u.i;.    bIntin
be20: 74 20 3d 20 31 3b 0a 20 20 20 20 73 77 69 74 63  t = 1;.    switc
be30: 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
be40: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
be50: 41 64 64 3a 20 20 20 20 20 20 20 69 66 28 20 73  Add:       if( s
be60: 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26  qlite3AddInt64(&
be70: 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70  iB,iA) ) goto fp
be80: 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20  _math;  break;. 
be90: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62       case OP_Sub
bea0: 74 72 61 63 74 3a 20 20 69 66 28 20 73 71 6c 69  tract:  if( sqli
beb0: 74 65 33 53 75 62 49 6e 74 36 34 28 26 69 42 2c  te3SubInt64(&iB,
bec0: 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  iA) ) goto fp_ma
bed0: 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  th;  break;.    
bee0: 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70    case OP_Multip
bef0: 6c 79 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ly:  if( sqlite3
bf00: 4d 75 6c 49 6e 74 36 34 28 26 69 42 2c 69 41 29  MulInt64(&iB,iA)
bf10: 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b   ) goto fp_math;
bf20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bf30: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b  ase OP_Divide: {
bf40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
bf50: 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d  =0 ) goto arithm
bf60: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
bf70: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ull;.        if(
bf80: 20 69 41 3d 3d 2d 31 20 26 26 20 69 42 3d 3d 53   iA==-1 && iB==S
bf90: 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20  MALLEST_INT64 ) 
bfa0: 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 20  goto fp_math;.  
bfb0: 20 20 20 20 20 20 69 42 20 2f 3d 20 69 41 3b 0a        iB /= iA;.
bfc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bfd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
bfe0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
bff0: 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f  if( iA==0 ) goto
c000: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
c010: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
c020: 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29      if( iA==-1 )
c030: 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   iA = 1;.       
c040: 20 69 42 20 25 3d 20 69 41 3b 0a 20 20 20 20 20   iB %= iA;.     
c050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c060: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  }.    }.    pOut
c070: 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a 20 20 20 20  ->u.i = iB;.    
c080: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
c090: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
c0a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 49 6e 74   }else{.    bInt
c0b0: 69 6e 74 20 3d 20 30 3b 0a 66 70 5f 6d 61 74 68  int = 0;.fp_math
c0c0: 3a 0a 20 20 20 20 72 41 20 3d 20 73 71 6c 69 74  :.    rA = sqlit
c0d0: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
c0e0: 70 49 6e 31 29 3b 0a 20 20 20 20 72 42 20 3d 20  pIn1);.    rB = 
c0f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56  sqlite3VdbeRealV
c100: 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 20  alue(pIn2);.    
c110: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63  switch( pOp->opc
c120: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
c130: 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20  e OP_Add:       
c140: 20 20 72 42 20 2b 3d 20 72 41 3b 20 20 20 20 20    rB += rA;     
c150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c160: 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a  ase OP_Subtract:
c170: 20 20 20 20 72 42 20 2d 3d 20 72 41 3b 20 20 20      rB -= rA;   
c180: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c190: 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c   case OP_Multipl
c1a0: 79 3a 20 20 20 20 72 42 20 2a 3d 20 72 41 3b 20  y:    rB *= rA; 
c1b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c1c0: 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64     case OP_Divid
c1d0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e: {.        /* 
c1e0: 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73  (double)0 In cas
c1f0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
c200: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
c210: 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  .. */.        if
c220: 28 20 72 41 3d 3d 28 64 6f 75 62 6c 65 29 30 20  ( rA==(double)0 
c230: 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69  ) goto arithmeti
c240: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
c250: 3b 0a 20 20 20 20 20 20 20 20 72 42 20 2f 3d 20  ;.        rB /= 
c260: 72 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  rA;.        brea
c270: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
c280: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
c290: 20 20 20 20 69 41 20 3d 20 28 69 36 34 29 72 41      iA = (i64)rA
c2a0: 3b 0a 20 20 20 20 20 20 20 20 69 42 20 3d 20 28  ;.        iB = (
c2b0: 69 36 34 29 72 42 3b 0a 20 20 20 20 20 20 20 20  i64)rB;.        
c2c0: 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f  if( iA==0 ) goto
c2d0: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
c2e0: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20  lt_is_null;.    
c2f0: 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29      if( iA==-1 )
c300: 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   iA = 1;.       
c310: 20 72 42 20 3d 20 28 64 6f 75 62 6c 65 29 28 69   rB = (double)(i
c320: 42 20 25 20 69 41 29 3b 0a 20 20 20 20 20 20 20  B % iA);.       
c330: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c340: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
c350: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
c360: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 70 4f 75 74  G_POINT.    pOut
c370: 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a 20 20 20 20  ->u.i = rB;.    
c380: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
c390: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23  Out, MEM_Int);.#
c3a0: 65 6c 73 65 0a 20 20 20 20 69 66 28 20 73 71 6c  else.    if( sql
c3b0: 69 74 65 33 49 73 4e 61 4e 28 72 42 29 20 29 7b  ite3IsNaN(rB) ){
c3c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 72 69 74  .      goto arit
c3d0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
c3e0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _null;.    }.   
c3f0: 20 70 4f 75 74 2d 3e 75 2e 72 20 3d 20 72 42 3b   pOut->u.r = rB;
c400: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
c410: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 52 65  lag(pOut, MEM_Re
c420: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 28 74  al);.    if( ((t
c430: 79 70 65 31 7c 74 79 70 65 32 29 26 4d 45 4d 5f  ype1|type2)&MEM_
c440: 52 65 61 6c 29 3d 3d 30 20 26 26 20 21 62 49 6e  Real)==0 && !bIn
c450: 74 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  tint ){.      sq
c460: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
c470: 41 66 66 69 6e 69 74 79 28 70 4f 75 74 29 3b 0a  Affinity(pOut);.
c480: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
c490: 0a 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74 68  .  break;..arith
c4a0: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
c4b0: 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56  null:.  sqlite3V
c4c0: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
c4d0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
c4e0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c  ./* Opcode: Coll
c4f0: 53 65 71 20 50 31 20 2a 20 2a 20 50 34 0a 2a 2a  Seq P1 * * P4.**
c500: 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
c510: 74 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53 65 71  ter to a CollSeq
c520: 20 73 74 72 75 63 74 2e 20 49 66 20 74 68 65 20   struct. If the 
c530: 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 20 75  next call to a u
c540: 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ser function.** 
c550: 6f 72 20 61 67 67 72 65 67 61 74 65 20 63 61 6c  or aggregate cal
c560: 6c 73 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e  ls sqlite3GetFun
c570: 63 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68 69 73  cCollSeq(), this
c580: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
c590: 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72  nce will.** be r
c5a0: 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69 73  eturned. This is
c5b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 75 69   used by the bui
c5c0: 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d 61 78  lt-in min(), max
c5d0: 28 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29 0a  () and nullif().
c5e0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  ** functions..**
c5f0: 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 74  .** If P1 is not
c600: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69   zero, then it i
c610: 73 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  s a register tha
c620: 74 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6d  t a subsequent m
c630: 69 6e 28 29 20 6f 72 0a 2a 2a 20 6d 61 78 28 29  in() or.** max()
c640: 20 61 67 67 72 65 67 61 74 65 20 77 69 6c 6c 20   aggregate will 
c650: 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20  set to 1 if the 
c660: 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 6e  current row is n
c670: 6f 74 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  ot the minimum o
c680: 72 0a 2a 2a 20 6d 61 78 69 6d 75 6d 2e 20 20 54  r.** maximum.  T
c690: 68 65 20 50 31 20 72 65 67 69 73 74 65 72 20 69  he P1 register i
c6a0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
c6b0: 20 30 20 62 79 20 74 68 69 73 20 69 6e 73 74 72   0 by this instr
c6c0: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  uction..**.** Th
c6d0: 65 20 69 6e 74 65 72 66 61 63 65 20 75 73 65 64  e interface used
c6e0: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
c6f0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 66  tation of the af
c700: 6f 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66 75 6e  orementioned fun
c710: 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72 65 74  ctions.** to ret
c720: 72 69 65 76 65 20 74 68 65 20 63 6f 6c 6c 61 74  rieve the collat
c730: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 65 74  ion sequence set
c740: 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20   by this opcode 
c750: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
c760: 0a 2a 2a 20 70 75 62 6c 69 63 6c 79 2e 20 20 4f  .** publicly.  O
c770: 6e 6c 79 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  nly built-in fun
c780: 63 74 69 6f 6e 73 20 68 61 76 65 20 61 63 63 65  ctions have acce
c790: 73 73 20 74 6f 20 74 68 69 73 20 66 65 61 74 75  ss to this featu
c7a0: 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  re..*/.case OP_C
c7b0: 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73 65  ollSeq: {.  asse
c7c0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
c7d0: 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20  =P4_COLLSEQ );. 
c7e0: 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a   if( pOp->p1 ){.
c7f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
c800: 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d  emSetInt64(&aMem
c810: 5b 70 4f 70 2d 3e 70 31 5d 2c 20 30 29 3b 0a 20  [pOp->p1], 0);. 
c820: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
c830: 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6e 63 74 69  * Opcode: Functi
c840: 6f 6e 30 20 50 31 20 50 32 20 50 33 20 50 34 20  on0 P1 P2 P3 P4 
c850: 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
c860: 72 5b 50 33 5d 3d 66 75 6e 63 28 72 5b 50 32 40  r[P3]=func(r[P2@
c870: 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  P5]).**.** Invok
c880: 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  e a user functio
c890: 6e 20 28 50 34 20 69 73 20 61 20 70 6f 69 6e 74  n (P4 is a point
c8a0: 65 72 20 74 6f 20 61 20 46 75 6e 63 44 65 66 20  er to a FuncDef 
c8b0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64  object that.** d
c8c0: 65 66 69 6e 65 73 20 74 68 65 20 66 75 6e 63 74  efines the funct
c8d0: 69 6f 6e 29 20 77 69 74 68 20 50 35 20 61 72 67  ion) with P5 arg
c8e0: 75 6d 65 6e 74 73 20 74 61 6b 65 6e 20 66 72 6f  uments taken fro
c8f0: 6d 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  m register P2 an
c900: 64 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e  d.** successors.
c910: 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20    The result of 
c920: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
c930: 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
c940: 65 72 20 50 33 2e 0a 2a 2a 20 52 65 67 69 73 74  er P3..** Regist
c950: 65 72 20 50 33 20 6d 75 73 74 20 6e 6f 74 20 62  er P3 must not b
c960: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 75 6e  e one of the fun
c970: 63 74 69 6f 6e 20 69 6e 70 75 74 73 2e 0a 2a 2a  ction inputs..**
c980: 0a 2a 2a 20 50 31 20 69 73 20 61 20 33 32 2d 62  .** P1 is a 32-b
c990: 69 74 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63  it bitmask indic
c9a0: 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 6f 72  ating whether or
c9b0: 20 6e 6f 74 20 65 61 63 68 20 61 72 67 75 6d 65   not each argume
c9c0: 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 75  nt to the .** fu
c9d0: 6e 63 74 69 6f 6e 20 77 61 73 20 64 65 74 65 72  nction was deter
c9e0: 6d 69 6e 65 64 20 74 6f 20 62 65 20 63 6f 6e 73  mined to be cons
c9f0: 74 61 6e 74 20 61 74 20 63 6f 6d 70 69 6c 65 20  tant at compile 
ca00: 74 69 6d 65 2e 20 49 66 20 74 68 65 20 66 69 72  time. If the fir
ca10: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 77  st.** argument w
ca20: 61 73 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  as constant then
ca30: 20 62 69 74 20 30 20 6f 66 20 50 31 20 69 73 20   bit 0 of P1 is 
ca40: 73 65 74 2e 20 54 68 69 73 20 69 73 20 75 73 65  set. This is use
ca50: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a  d to determine.*
ca60: 2a 20 77 68 65 74 68 65 72 20 6d 65 74 61 20 64  * whether meta d
ca70: 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
ca80: 69 74 68 20 61 20 75 73 65 72 20 66 75 6e 63 74  ith a user funct
ca90: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 75 73 69  ion argument usi
caa0: 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
cab0: 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 29 20  3_set_auxdata() 
cac0: 41 50 49 20 6d 61 79 20 62 65 20 73 61 66 65 6c  API may be safel
cad0: 79 20 72 65 74 61 69 6e 65 64 20 75 6e 74 69 6c  y retained until
cae0: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 76   the next.** inv
caf0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ocation of this 
cb00: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  opcode..**.** Se
cb10: 65 20 61 6c 73 6f 3a 20 46 75 6e 63 74 69 6f 6e  e also: Function
cb20: 2c 20 41 67 67 53 74 65 70 2c 20 41 67 67 46 69  , AggStep, AggFi
cb30: 6e 61 6c 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  nal.*/./* Opcode
cb40: 3a 20 46 75 6e 63 74 69 6f 6e 20 50 31 20 50 32  : Function P1 P2
cb50: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
cb60: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 66 75 6e  opsis: r[P3]=fun
cb70: 63 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a  c(r[P2@P5]).**.*
cb80: 2a 20 49 6e 76 6f 6b 65 20 61 20 75 73 65 72 20  * Invoke a user 
cb90: 66 75 6e 63 74 69 6f 6e 20 28 50 34 20 69 73 20  function (P4 is 
cba0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
cbb0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
cbc0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63  object that.** c
cbd0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
cbe0: 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  r to the functio
cbf0: 6e 20 74 6f 20 62 65 20 72 75 6e 29 20 77 69 74  n to be run) wit
cc00: 68 20 50 35 20 61 72 67 75 6d 65 6e 74 73 20 74  h P5 arguments t
cc10: 61 6b 65 6e 0a 2a 2a 20 66 72 6f 6d 20 72 65 67  aken.** from reg
cc20: 69 73 74 65 72 20 50 32 20 61 6e 64 20 73 75 63  ister P2 and suc
cc30: 63 65 73 73 6f 72 73 2e 20 20 54 68 65 20 72 65  cessors.  The re
cc40: 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63  sult of the func
cc50: 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 0a 2a  tion is stored.*
cc60: 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  * in register P3
cc70: 2e 20 20 52 65 67 69 73 74 65 72 20 50 33 20 6d  .  Register P3 m
cc80: 75 73 74 20 6e 6f 74 20 62 65 20 6f 6e 65 20 6f  ust not be one o
cc90: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  f the function i
cca0: 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  nputs..**.** P1 
ccb0: 69 73 20 61 20 33 32 2d 62 69 74 20 62 69 74 6d  is a 32-bit bitm
ccc0: 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77  ask indicating w
ccd0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 65 61  hether or not ea
cce0: 63 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ch argument to t
ccf0: 68 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  he .** function 
cd00: 77 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74  was determined t
cd10: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 61 74  o be constant at
cd20: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e 20 49   compile time. I
cd30: 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  f the first.** a
cd40: 72 67 75 6d 65 6e 74 20 77 61 73 20 63 6f 6e 73  rgument was cons
cd50: 74 61 6e 74 20 74 68 65 6e 20 62 69 74 20 30 20  tant then bit 0 
cd60: 6f 66 20 50 31 20 69 73 20 73 65 74 2e 20 54 68  of P1 is set. Th
cd70: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  is is used to de
cd80: 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
cd90: 65 72 20 6d 65 74 61 20 64 61 74 61 20 61 73 73  er meta data ass
cda0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 75  ociated with a u
cdb0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  ser function arg
cdc0: 75 6d 65 6e 74 20 75 73 69 6e 67 20 74 68 65 0a  ument using the.
cdd0: 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61  ** sqlite3_set_a
cde0: 75 78 64 61 74 61 28 29 20 41 50 49 20 6d 61 79  uxdata() API may
cdf0: 20 62 65 20 73 61 66 65 6c 79 20 72 65 74 61 69   be safely retai
ce00: 6e 65 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65  ned until the ne
ce10: 78 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e  xt.** invocation
ce20: 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65 2e   of this opcode.
ce30: 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  .**.** SQL funct
ce40: 69 6f 6e 73 20 61 72 65 20 69 6e 69 74 69 61 6c  ions are initial
ce50: 6c 79 20 63 6f 64 65 64 20 61 73 20 4f 50 5f 46  ly coded as OP_F
ce60: 75 6e 63 74 69 6f 6e 30 20 77 69 74 68 20 50 34  unction0 with P4
ce70: 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
ce80: 61 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63 74  a FuncDef object
ce90: 2e 20 20 42 75 74 20 6f 6e 20 66 69 72 73 74 20  .  But on first 
cea0: 65 76 61 6c 75 61 74 69 6f 6e 2c 20 74 68 65 20  evaluation, the 
ceb0: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 0a 2a 2a  P4 operand is.**
cec0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
ced0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
cee0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
cef0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 65 20   object and the 
cf00: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 68 61  operation.** cha
cf10: 6e 67 65 64 20 74 6f 20 74 68 69 73 20 4f 50 5f  nged to this OP_
cf20: 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 2e  Function opcode.
cf30: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 74    In this way, t
cf40: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
cf50: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 73 71 6c 69  n of.** the sqli
cf60: 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65  te3_context obje
cf70: 63 74 20 6f 63 63 75 72 73 20 6f 6e 6c 79 20 6f  ct occurs only o
cf80: 6e 63 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  nce, rather than
cf90: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a   once for each.*
cfa0: 2a 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20  * evaluation of 
cfb0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
cfc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 75  .** See also: Fu
cfd0: 6e 63 74 69 6f 6e 30 2c 20 41 67 67 53 74 65 70  nction0, AggStep
cfe0: 2c 20 41 67 67 46 69 6e 61 6c 0a 2a 2f 0a 63 61  , AggFinal.*/.ca
cff0: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 3a  se OP_Function0:
d000: 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71   {.  int n;.  sq
d010: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
d020: 43 74 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Ctx;..  assert( 
d030: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
d040: 46 55 4e 43 44 45 46 20 29 3b 0a 20 20 6e 20 3d  FUNCDEF );.  n =
d050: 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73 65   pOp->p5;.  asse
d060: 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
d070: 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
d080: 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
d090: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
d0a0: 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32  n==0 || (pOp->p2
d0b0: 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c  >0 && pOp->p2+n<
d0c0: 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
d0d0: 3e 6e 43 75 72 73 6f 72 29 2b 31 29 20 29 3b 0a  >nCursor)+1) );.
d0e0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
d0f0: 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f 70  3<pOp->p2 || pOp
d100: 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20  ->p3>=pOp->p2+n 
d110: 29 3b 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69  );.  pCtx = sqli
d120: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
d130: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  (db, sizeof(*pCt
d140: 78 29 20 2b 20 28 6e 2d 31 29 2a 73 69 7a 65 6f  x) + (n-1)*sizeo
d150: 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  f(sqlite3_value*
d160: 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d  ));.  if( pCtx==
d170: 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
d180: 0a 20 20 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20  .  pCtx->pOut = 
d190: 30 3b 0a 20 20 70 43 74 78 2d 3e 70 46 75 6e 63  0;.  pCtx->pFunc
d1a0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
d1b0: 3b 0a 20 20 70 43 74 78 2d 3e 69 4f 70 20 3d 20  ;.  pCtx->iOp = 
d1c0: 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
d1d0: 3b 0a 20 20 70 43 74 78 2d 3e 70 56 64 62 65 20  ;.  pCtx->pVdbe 
d1e0: 3d 20 70 3b 0a 20 20 70 43 74 78 2d 3e 61 72 67  = p;.  pCtx->arg
d1f0: 63 20 3d 20 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34  c = n;.  pOp->p4
d200: 74 79 70 65 20 3d 20 50 34 5f 46 55 4e 43 43 54  type = P4_FUNCCT
d210: 58 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 43 74  X;.  pOp->p4.pCt
d220: 78 20 3d 20 70 43 74 78 3b 0a 20 20 70 4f 70 2d  x = pCtx;.  pOp-
d230: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 46 75 6e  >opcode = OP_Fun
d240: 63 74 69 6f 6e 3b 0a 20 20 2f 2a 20 46 61 6c 6c  ction;.  /* Fall
d250: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50   through into OP
d260: 5f 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 7d 0a 63  _Function */.}.c
d270: 61 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a  ase OP_Function:
d280: 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71   {.  int i;.  sq
d290: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
d2a0: 43 74 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Ctx;..  assert( 
d2b0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
d2c0: 46 55 4e 43 43 54 58 20 29 3b 0a 20 20 70 43 74  FUNCCTX );.  pCt
d2d0: 78 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  x = pOp->p4.pCtx
d2e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
d2f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 73 69  function is insi
d300: 64 65 20 6f 66 20 61 20 74 72 69 67 67 65 72 2c  de of a trigger,
d310: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61 72   the register ar
d320: 72 61 79 20 69 6e 20 61 4d 65 6d 5b 5d 0a 20 20  ray in aMem[].  
d330: 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
d340: 66 72 6f 6d 20 6f 6e 65 20 65 76 61 6c 75 61 74  from one evaluat
d350: 69 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78 74 2e  ion to the next.
d360: 20 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b    The next block
d370: 20 6f 66 20 63 6f 64 65 0a 20 20 2a 2a 20 63 68   of code.  ** ch
d380: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
d390: 68 65 20 72 65 67 69 73 74 65 72 20 61 72 72 61  he register arra
d3a0: 79 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 61  y has changed, a
d3b0: 6e 64 20 69 66 20 73 6f 20 69 74 0a 20 20 2a 2a  nd if so it.  **
d3c0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 73 20 74   reinitializes t
d3d0: 68 65 20 72 65 6c 61 76 61 6e 74 20 70 61 72 74  he relavant part
d3e0: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
d3f0: 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20  _context object 
d400: 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  */.  pOut = &aMe
d410: 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66  m[pOp->p3];.  if
d420: 28 20 70 43 74 78 2d 3e 70 4f 75 74 20 21 3d 20  ( pCtx->pOut != 
d430: 70 4f 75 74 20 29 7b 0a 20 20 20 20 70 43 74 78  pOut ){.    pCtx
d440: 2d 3e 70 4f 75 74 20 3d 20 70 4f 75 74 3b 0a 20  ->pOut = pOut;. 
d450: 20 20 20 66 6f 72 28 69 3d 70 43 74 78 2d 3e 61     for(i=pCtx->a
d460: 72 67 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  rgc-1; i>=0; i--
d470: 29 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 20  ) pCtx->argv[i] 
d480: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 2b  = &aMem[pOp->p2+
d490: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 41 62  i];.  }..  memAb
d4a0: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
d4b0: 43 74 78 2d 3e 70 4f 75 74 29 3b 0a 23 69 66 64  Ctx->pOut);.#ifd
d4c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
d4d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 74    for(i=0; i<pCt
d4e0: 78 2d 3e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  x->argc; i++){. 
d4f0: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
d500: 56 61 6c 69 64 28 70 43 74 78 2d 3e 61 72 67 76  Valid(pCtx->argv
d510: 5b 69 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49  [i]) );.    REGI
d520: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
d530: 70 32 2b 69 2c 20 70 43 74 78 2d 3e 61 72 67 76  p2+i, pCtx->argv
d540: 5b 69 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  [i]);.  }.#endif
d550: 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
d560: 67 28 70 43 74 78 2d 3e 70 4f 75 74 2c 20 4d 45  g(pCtx->pOut, ME
d570: 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 70 43 74 78 2d  M_Null);.  pCtx-
d580: 3e 66 45 72 72 6f 72 4f 72 41 75 78 20 3d 20 30  >fErrorOrAux = 0
d590: 3b 0a 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  ;.  db->lastRowi
d5a0: 64 20 3d 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20  d = lastRowid;. 
d5b0: 20 28 2a 70 43 74 78 2d 3e 70 46 75 6e 63 2d 3e   (*pCtx->pFunc->
d5c0: 78 53 46 75 6e 63 29 28 70 43 74 78 2c 20 70 43  xSFunc)(pCtx, pC
d5d0: 74 78 2d 3e 61 72 67 63 2c 20 70 43 74 78 2d 3e  tx->argc, pCtx->
d5e0: 61 72 67 76 29 3b 2f 2a 20 49 4d 50 3a 20 52 2d  argv);/* IMP: R-
d5f0: 32 34 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a 20  24505-23230 */. 
d600: 20 6c 61 73 74 52 6f 77 69 64 20 3d 20 64 62 2d   lastRowid = db-
d610: 3e 6c 61 73 74 52 6f 77 69 64 3b 20 20 2f 2a 20  >lastRowid;  /* 
d620: 52 65 6d 65 6d 62 65 72 20 72 6f 77 69 64 20 63  Remember rowid c
d630: 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 78  hanges made by x
d640: 53 46 75 6e 63 20 2a 2f 0a 0a 20 20 2f 2a 20 49  SFunc */..  /* I
d650: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  f the function r
d660: 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
d670: 2c 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65 70  , throw an excep
d680: 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 43  tion */.  if( pC
d690: 74 78 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78 20  tx->fErrorOrAux 
d6a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  ){.    if( pCtx-
d6b0: 3e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >isError ){.    
d6c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
d6d0: 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69  or(p, "%s", sqli
d6e0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
d6f0: 43 74 78 2d 3e 70 4f 75 74 29 29 3b 0a 20 20 20  Ctx->pOut));.   
d700: 20 20 20 72 63 20 3d 20 70 43 74 78 2d 3e 69 73     rc = pCtx->is
d710: 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Error;.    }.   
d720: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
d730: 74 65 41 75 78 44 61 74 61 28 64 62 2c 20 26 70  teAuxData(db, &p
d740: 2d 3e 70 41 75 78 44 61 74 61 2c 20 70 43 74 78  ->pAuxData, pCtx
d750: 2d 3e 69 4f 70 2c 20 70 4f 70 2d 3e 70 31 29 3b  ->iOp, pOp->p1);
d760: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
d770: 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
d780: 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  error;.  }..  /*
d790: 20 43 6f 70 79 20 74 68 65 20 72 65 73 75 6c 74   Copy the result
d7a0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
d7b0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
d7c0: 33 20 2a 2f 0a 20 20 69 66 28 20 70 4f 75 74 2d  3 */.  if( pOut-
d7d0: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74  >flags & (MEM_St
d7e0: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20  r|MEM_Blob) ){. 
d7f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
d800: 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 43 74  angeEncoding(pCt
d810: 78 2d 3e 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e  x->pOut, encodin
d820: 67 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  g);.    if( sqli
d830: 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67  te3VdbeMemTooBig
d840: 28 70 43 74 78 2d 3e 70 4f 75 74 29 20 29 20 67  (pCtx->pOut) ) g
d850: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
d860: 0a 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ..  REGISTER_TRA
d870: 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 43 74 78  CE(pOp->p3, pCtx
d880: 2d 3e 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 54  ->pOut);.  UPDAT
d890: 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
d8a0: 43 74 78 2d 3e 70 4f 75 74 29 3b 0a 20 20 62 72  Ctx->pOut);.  br
d8b0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
d8c0: 65 3a 20 42 69 74 41 6e 64 20 50 31 20 50 32 20  e: BitAnd P1 P2 
d8d0: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
d8e0: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 26  is: r[P3]=r[P1]&
d8f0: 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 61 6b 65  r[P2].**.** Take
d900: 20 74 68 65 20 62 69 74 2d 77 69 73 65 20 41 4e   the bit-wise AN
d910: 44 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  D of the values 
d920: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
d930: 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f  nd P2 and.** sto
d940: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
d950: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
d960: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
d970: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
d980: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
d990: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 4f  ./* Opcode: BitO
d9a0: 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  r P1 P2 P3 * *.*
d9b0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
d9c0: 5d 3d 72 5b 50 31 5d 7c 72 5b 50 32 5d 0a 2a 2a  ]=r[P1]|r[P2].**
d9d0: 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74  .** Take the bit
d9e0: 2d 77 69 73 65 20 4f 52 20 6f 66 20 74 68 65 20  -wise OR of the 
d9f0: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
da00: 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  er P1 and P2 and
da10: 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65  .** store the re
da20: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
da30: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
da40: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
da50: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
da60: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
da70: 65 3a 20 53 68 69 66 74 4c 65 66 74 20 50 31 20  e: ShiftLeft P1 
da80: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
da90: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
daa0: 32 5d 3c 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  2]<<r[P1].**.** 
dab0: 53 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65  Shift the intege
dac0: 72 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  r value in regis
dad0: 74 65 72 20 50 32 20 74 6f 20 74 68 65 20 6c 65  ter P2 to the le
dae0: 66 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d  ft by the.** num
daf0: 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65 63  ber of bits spec
db00: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 74  ified by the int
db10: 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65 72  eger in register
db20: 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68   P1..** Store th
db30: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
db40: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
db50: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
db60: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
db70: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
db80: 70 63 6f 64 65 3a 20 53 68 69 66 74 52 69 67 68  pcode: ShiftRigh
db90: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
dba0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
dbb0: 5d 3d 72 5b 50 32 5d 3e 3e 72 5b 50 31 5d 0a 2a  ]=r[P2]>>r[P1].*
dbc0: 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69  *.** Shift the i
dbd0: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20  nteger value in 
dbe0: 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 74  register P2 to t
dbf0: 68 65 20 72 69 67 68 74 20 62 79 20 74 68 65 0a  he right by the.
dc00: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  ** number of bit
dc10: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
dc20: 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65  he integer in re
dc30: 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74  gister P1..** St
dc40: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
dc50: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
dc60: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
dc70: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
dc80: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
dc90: 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 41 6e 64  /.case OP_BitAnd
dca0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
dcb0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
dcc0: 42 49 54 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32  BITAND, in1, in2
dcd0: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
dce0: 50 5f 42 69 74 4f 72 3a 20 20 20 20 20 20 20 20  P_BitOr:        
dcf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
dd00: 65 20 61 73 20 54 4b 5f 42 49 54 4f 52 2c 20 69  e as TK_BITOR, i
dd10: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
dd20: 0a 63 61 73 65 20 4f 50 5f 53 68 69 66 74 4c 65  .case OP_ShiftLe
dd30: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ft:             
dd40: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c   /* same as TK_L
dd50: 53 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c  SHIFT, in1, in2,
dd60: 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50   out3 */.case OP
dd70: 5f 53 68 69 66 74 52 69 67 68 74 3a 20 7b 20 20  _ShiftRight: {  
dd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
dd90: 20 61 73 20 54 4b 5f 52 53 48 49 46 54 2c 20 69   as TK_RSHIFT, i
dda0: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
ddb0: 0a 20 20 69 36 34 20 69 41 3b 0a 20 20 75 36 34  .  i64 iA;.  u64
ddc0: 20 75 41 3b 0a 20 20 69 36 34 20 69 42 3b 0a 20   uA;.  i64 iB;. 
ddd0: 20 75 38 20 6f 70 3b 0a 0a 20 20 70 49 6e 31 20   u8 op;..  pIn1 
dde0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
ddf0: 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
de00: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75  [pOp->p2];.  pOu
de10: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
de20: 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  3];.  if( (pIn1-
de30: 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66  >flags | pIn2->f
de40: 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c  lags) & MEM_Null
de50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
de60: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
de70: 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ut);.    break;.
de80: 20 20 7d 0a 20 20 69 41 20 3d 20 73 71 6c 69 74    }.  iA = sqlit
de90: 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
dea0: 49 6e 32 29 3b 0a 20 20 69 42 20 3d 20 73 71 6c  In2);.  iB = sql
deb0: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
dec0: 28 70 49 6e 31 29 3b 0a 20 20 6f 70 20 3d 20 70  (pIn1);.  op = p
ded0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 69 66  Op->opcode;.  if
dee0: 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  ( op==OP_BitAnd 
def0: 29 7b 0a 20 20 20 20 69 41 20 26 3d 20 69 42 3b  ){.    iA &= iB;
df00: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
df10: 3d 4f 50 5f 42 69 74 4f 72 20 29 7b 0a 20 20 20  =OP_BitOr ){.   
df20: 20 69 41 20 7c 3d 20 69 42 3b 0a 20 20 7d 65 6c   iA |= iB;.  }el
df30: 73 65 20 69 66 28 20 69 42 21 3d 30 20 29 7b 0a  se if( iB!=0 ){.
df40: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
df50: 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 7c 7c  OP_ShiftRight ||
df60: 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66   op==OP_ShiftLef
df70: 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t );..    /* If 
df80: 73 68 69 66 74 69 6e 67 20 62 79 20 61 20 6e 65  shifting by a ne
df90: 67 61 74 69 76 65 20 61 6d 6f 75 6e 74 2c 20 73  gative amount, s
dfa0: 68 69 66 74 20 69 6e 20 74 68 65 20 6f 74 68 65  hift in the othe
dfb0: 72 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20  r direction */. 
dfc0: 20 20 20 69 66 28 20 69 42 3c 30 20 29 7b 0a 20     if( iB<0 ){. 
dfd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f       assert( OP_
dfe0: 53 68 69 66 74 52 69 67 68 74 3d 3d 4f 50 5f 53  ShiftRight==OP_S
dff0: 68 69 66 74 4c 65 66 74 2b 31 20 29 3b 0a 20 20  hiftLeft+1 );.  
e000: 20 20 20 20 6f 70 20 3d 20 32 2a 4f 50 5f 53 68      op = 2*OP_Sh
e010: 69 66 74 4c 65 66 74 20 2b 20 31 20 2d 20 6f 70  iftLeft + 1 - op
e020: 3b 0a 20 20 20 20 20 20 69 42 20 3d 20 69 42 3e  ;.      iB = iB>
e030: 28 2d 36 34 29 20 3f 20 2d 69 42 20 3a 20 36 34  (-64) ? -iB : 64
e040: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e050: 20 69 42 3e 3d 36 34 20 29 7b 0a 20 20 20 20 20   iB>=64 ){.     
e060: 20 69 41 20 3d 20 28 69 41 3e 3d 30 20 7c 7c 20   iA = (iA>=0 || 
e070: 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  op==OP_ShiftLeft
e080: 29 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 20 20  ) ? 0 : -1;.    
e090: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
e0a0: 63 70 79 28 26 75 41 2c 20 26 69 41 2c 20 73 69  cpy(&uA, &iA, si
e0b0: 7a 65 6f 66 28 75 41 29 29 3b 0a 20 20 20 20 20  zeof(uA));.     
e0c0: 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66   if( op==OP_Shif
e0d0: 74 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  tLeft ){.       
e0e0: 20 75 41 20 3c 3c 3d 20 69 42 3b 0a 20 20 20 20   uA <<= iB;.    
e0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e100: 20 75 41 20 3e 3e 3d 20 69 42 3b 0a 20 20 20 20   uA >>= iB;.    
e110: 20 20 20 20 2f 2a 20 53 69 67 6e 2d 65 78 74 65      /* Sign-exte
e120: 6e 64 20 6f 6e 20 61 20 72 69 67 68 74 20 73 68  nd on a right sh
e130: 69 66 74 20 6f 66 20 61 20 6e 65 67 61 74 69 76  ift of a negativ
e140: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
e150: 20 20 20 20 69 66 28 20 69 41 3c 30 20 29 20 75      if( iA<0 ) u
e160: 41 20 7c 3d 20 28 28 28 28 75 36 34 29 30 78 66  A |= ((((u64)0xf
e170: 66 66 66 66 66 66 66 29 3c 3c 33 32 29 7c 30 78  fffffff)<<32)|0x
e180: 66 66 66 66 66 66 66 66 29 20 3c 3c 20 28 36 34  ffffffff) << (64
e190: 2d 69 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  -iB);.      }.  
e1a0: 20 20 20 20 6d 65 6d 63 70 79 28 26 69 41 2c 20      memcpy(&iA, 
e1b0: 26 75 41 2c 20 73 69 7a 65 6f 66 28 69 41 29 29  &uA, sizeof(iA))
e1c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f  ;.    }.  }.  pO
e1d0: 75 74 2d 3e 75 2e 69 20 3d 20 69 41 3b 0a 20 20  ut->u.i = iA;.  
e1e0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
e1f0: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
e200: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
e210: 63 6f 64 65 3a 20 41 64 64 49 6d 6d 20 20 50 31  code: AddImm  P1
e220: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
e230: 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 72 5b 50  opsis: r[P1]=r[P
e240: 31 5d 2b 50 32 0a 2a 2a 20 0a 2a 2a 20 41 64 64  1]+P2.** .** Add
e250: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32   the constant P2
e260: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
e270: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
e280: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
e290: 6c 77 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72  lways an integer
e2a0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65  ..**.** To force
e2b0: 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f   any register to
e2c0: 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   be an integer, 
e2d0: 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63  just add 0..*/.c
e2e0: 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b  ase OP_AddImm: {
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
e300: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
e310: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
e320: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
e330: 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71  e(p, pIn1);.  sq
e340: 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
e350: 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  gerify(pIn1);.  
e360: 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70  pIn1->u.i += pOp
e370: 2d 3e 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ->p2;.  break;.}
e380: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73  ../* Opcode: Mus
e390: 74 42 65 49 6e 74 20 50 31 20 50 32 20 2a 20 2a  tBeInt P1 P2 * *
e3a0: 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20   *.** .** Force 
e3b0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
e3c0: 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 61  ister P1 to be a
e3d0: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74  n integer.  If t
e3e0: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50  he value.** in P
e3f0: 31 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  1 is not an inte
e400: 67 65 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62  ger and cannot b
e410: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
e420: 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77   an integer.** w
e430: 69 74 68 6f 75 74 20 64 61 74 61 20 6c 6f 73 73  ithout data loss
e440: 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65  , then jump imme
e450: 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f  diately to P2, o
e460: 72 20 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61  r if P2==0.** ra
e470: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ise an SQLITE_MI
e480: 53 4d 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e  SMATCH exception
e490: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73  ..*/.case OP_Mus
e4a0: 74 42 65 49 6e 74 3a 20 7b 20 20 20 20 20 20 20  tBeInt: {       
e4b0: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
e4c0: 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
e4d0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
e4e0: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
e4f0: 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29   & MEM_Int)==0 )
e500: 7b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e  {.    applyAffin
e510: 69 74 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45  ity(pIn1, SQLITE
e520: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e  _AFF_NUMERIC, en
e530: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 56 64 62  coding);.    Vdb
e540: 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 28 70 49  eBranchTaken((pI
e550: 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  n1->flags&MEM_In
e560: 74 29 3d 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69  t)==0, 2);.    i
e570: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
e580: 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b  & MEM_Int)==0 ){
e590: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
e5a0: 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p2==0 ){.       
e5b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53   rc = SQLITE_MIS
e5c0: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20 67  MATCH;.        g
e5d0: 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
e5e0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65  _error;.      }e
e5f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  lse{.        got
e600: 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
e610: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e620: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
e630: 28 70 49 6e 31 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pIn1, MEM_Int);
e640: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66  .  break;.}..#if
e650: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e660: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
e670: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41  /* Opcode: RealA
e680: 66 66 69 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a  ffinity P1 * * *
e690: 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69   *.**.** If regi
e6a0: 73 74 65 72 20 50 31 20 68 6f 6c 64 73 20 61 6e  ster P1 holds an
e6b0: 20 69 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 74   integer convert
e6c0: 20 69 74 20 74 6f 20 61 20 72 65 61 6c 20 76 61   it to a real va
e6d0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
e6e0: 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 77  opcode is used w
e6f0: 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
e700: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
e710: 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a  a column that.**
e720: 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
e730: 74 79 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e  ty.  Such column
e740: 20 76 61 6c 75 65 73 20 6d 61 79 20 73 74 69 6c   values may stil
e750: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
e760: 2a 20 69 6e 74 65 67 65 72 73 2c 20 66 6f 72 20  * integers, for 
e770: 73 70 61 63 65 20 65 66 66 69 63 69 65 6e 63 79  space efficiency
e780: 2c 20 62 75 74 20 61 66 74 65 72 20 65 78 74 72  , but after extr
e790: 61 63 74 69 6f 6e 20 77 65 20 77 61 6e 74 20 74  action we want t
e7a0: 68 65 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f  hem.** to have o
e7b0: 6e 6c 79 20 61 20 72 65 61 6c 20 76 61 6c 75 65  nly a real value
e7c0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
e7d0: 6c 41 66 66 69 6e 69 74 79 3a 20 7b 20 20 20 20  lAffinity: {    
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e7f0: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
e800: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
e810: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
e820: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
e830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
e840: 65 6d 52 65 61 6c 69 66 79 28 70 49 6e 31 29 3b  emRealify(pIn1);
e850: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
e860: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
e870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
e880: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 61 73 74  ./* Opcode: Cast
e890: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
e8a0: 53 79 6e 6f 70 73 69 73 3a 20 61 66 66 69 6e 69  Synopsis: affini
e8b0: 74 79 28 72 5b 50 31 5d 29 0a 2a 2a 0a 2a 2a 20  ty(r[P1]).**.** 
e8c0: 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20  Force the value 
e8d0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
e8e0: 6f 20 62 65 20 74 68 65 20 74 79 70 65 20 64 65  o be the type de
e8f0: 66 69 6e 65 64 20 62 79 20 50 32 2e 0a 2a 2a 20  fined by P2..** 
e900: 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 20  .** <ul>.** <li 
e910: 76 61 6c 75 65 3d 22 39 37 22 3e 20 54 45 58 54  value="97"> TEXT
e920: 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65 3d 22 39  .** <li value="9
e930: 38 22 3e 20 42 4c 4f 42 0a 2a 2a 20 3c 6c 69 20  8"> BLOB.** <li 
e940: 76 61 6c 75 65 3d 22 39 39 22 3e 20 4e 55 4d 45  value="99"> NUME
e950: 52 49 43 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65  RIC.** <li value
e960: 3d 22 31 30 30 22 3e 20 49 4e 54 45 47 45 52 0a  ="100"> INTEGER.
e970: 2a 2a 20 3c 6c 69 20 76 61 6c 75 65 3d 22 31 30  ** <li value="10
e980: 31 22 3e 20 52 45 41 4c 0a 2a 2a 20 3c 2f 75 6c  1"> REAL.** </ul
e990: 3e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  >.**.** A NULL v
e9a0: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
e9b0: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
e9c0: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
e9d0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
e9e0: 50 5f 43 61 73 74 3a 20 7b 20 20 20 20 20 20 20  P_Cast: {       
e9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
ea00: 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  1 */.  assert( p
ea10: 4f 70 2d 3e 70 32 3e 3d 53 51 4c 49 54 45 5f 41  Op->p2>=SQLITE_A
ea20: 46 46 5f 42 4c 4f 42 20 26 26 20 70 4f 70 2d 3e  FF_BLOB && pOp->
ea30: 70 32 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  p2<=SQLITE_AFF_R
ea40: 45 41 4c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  EAL );.  testcas
ea50: 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  e( pOp->p2==SQLI
ea60: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
ea70: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
ea80: 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  p2==SQLITE_AFF_B
ea90: 4c 4f 42 20 29 3b 0a 20 20 74 65 73 74 63 61 73  LOB );.  testcas
eaa0: 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  e( pOp->p2==SQLI
eab0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
eac0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
ead0: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
eae0: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 74  F_INTEGER );.  t
eaf0: 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32  estcase( pOp->p2
eb00: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
eb10: 4c 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  L );.  pIn1 = &a
eb20: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
eb30: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
eb40: 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 72 63 20  (p, pIn1);.  rc 
eb50: 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  = ExpandBlob(pIn
eb60: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
eb70: 65 4d 65 6d 43 61 73 74 28 70 49 6e 31 2c 20 70  eMemCast(pIn1, p
eb80: 4f 70 2d 3e 70 32 2c 20 65 6e 63 6f 64 69 6e 67  Op->p2, encoding
eb90: 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
eba0: 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a  BLOBSIZE(pIn1);.
ebb0: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
ebc0: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
ebd0: 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  or;.  break;.}.#
ebe0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ebf0: 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a  OMIT_CAST */../*
ec00: 20 4f 70 63 6f 64 65 3a 20 45 71 20 50 31 20 50   Opcode: Eq P1 P
ec10: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
ec20: 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d  nopsis: IF r[P3]
ec30: 3d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f  ==r[P1].**.** Co
ec40: 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
ec50: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
ec60: 61 6e 64 20 50 33 2e 20 20 49 66 20 72 65 67 28  and P3.  If reg(
ec70: 50 33 29 3d 3d 72 65 67 28 50 31 29 20 74 68 65  P3)==reg(P1) the
ec80: 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64  n.** jump to add
ec90: 72 65 73 73 20 50 32 2e 20 20 4f 72 20 69 66 20  ress P2.  Or if 
eca0: 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  the SQLITE_STORE
ecb0: 50 32 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  P2 flag is set i
ecc0: 6e 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20 73 74  n P5, then.** st
ecd0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ore the result o
ece0: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  f comparison in 
ecf0: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
ed00: 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41 46  ** The SQLITE_AF
ed10: 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f  F_MASK portion o
ed20: 66 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e 20  f P5 must be an 
ed30: 61 66 66 69 6e 69 74 79 20 63 68 61 72 61 63 74  affinity charact
ed40: 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  er -.** SQLITE_A
ed50: 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f  FF_TEXT, SQLITE_
ed60: 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64  AFF_INTEGER, and
ed70: 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61 74   so forth. An at
ed80: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a  tempt is made .*
ed90: 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74 68  * to coerce both
eda0: 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69 6e   inputs accordin
edb0: 67 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e 69  g to this affini
edc0: 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a  ty before the.**
edd0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
ede0: 61 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c 49  ade. If the SQLI
edf0: 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20 30  TE_AFF_MASK is 0
ee00: 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  x00, then numeri
ee10: 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69 73  c.** affinity is
ee20: 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61 74   used. Note that
ee30: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63 6f   the affinity co
ee40: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73 74  nversions are st
ee50: 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74  ored.** back int
ee60: 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69  o the input regi
ee70: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e  sters P1 and P3.
ee80: 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64 65    So this opcode
ee90: 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65   can cause.** pe
eea0: 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65 73  rsistent changes
eeb0: 20 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 31   to registers P1
eec0: 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f   and P3..**.** O
eed0: 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73 69  nce any conversi
eee0: 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ons have taken p
eef0: 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68 65  lace, and neithe
ef00: 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  r value is NULL,
ef10: 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20   .** the values 
ef20: 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66  are compared. If
ef30: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
ef40: 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63   blobs then memc
ef50: 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64 20  mp() is.** used 
ef60: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
ef70: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
ef80: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20  comparison.  If 
ef90: 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61  both values.** a
efa0: 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74 68  re text, then th
efb0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
efc0: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
efd0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a   specified in.**
efe0: 20 50 34 20 69 73 20 75 73 65 64 20 74 6f 20 64   P4 is used to d
eff0: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
f000: 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  .  If P4 is not 
f010: 73 70 65 63 69 66 69 65 64 20 74 68 65 6e 0a 2a  specified then.*
f020: 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75 73  * memcmp() is us
f030: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 65  ed to compare te
f040: 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66 20 62  xt string.  If b
f050: 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 0a 2a  oth values are.*
f060: 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e 20  * numeric, then 
f070: 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72  a numeric compar
f080: 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20 49 66  ison is used. If
f090: 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
f0a0: 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66 65 72  ** are of differ
f0b0: 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65 6e 20  ent types, then 
f0c0: 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f 6e 73  numbers are cons
f0d0: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
f0e0: 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20  .** strings and 
f0f0: 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f 6e 73  strings are cons
f100: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
f110: 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   blobs..**.** If
f120: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
f130: 73 20 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e  s set in P5 then
f140: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
f150: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77  omparison is alw
f160: 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72  ays either.** tr
f170: 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20  ue or false and 
f180: 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20  is never NULL.  
f190: 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  If both operands
f1a0: 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74   are NULL then t
f1b0: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20  he result.** of 
f1c0: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72  comparison is tr
f1d0: 75 65 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f  ue.  If either o
f1e0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74  perand is NULL t
f1f0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
f200: 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e  s false..** If n
f210: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
f220: 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c  s NULL the resul
f230: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
f240: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 0a   it would be if.
f250: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55  ** the SQLITE_NU
f260: 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65 20 6f  LLEQ flag were o
f270: 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a  mitted from P5..
f280: 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 53 51  **.** If both SQ
f290: 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 61 6e 64  LITE_STOREP2 and
f2a0: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
f2b0: 20 66 6c 61 67 73 20 61 72 65 20 73 65 74 20 74   flags are set t
f2c0: 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  hen the.** conte
f2d0: 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f  nt of r[P2] is o
f2e0: 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74  nly changed if t
f2f0: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
f300: 4e 55 4c 4c 20 6f 72 20 30 20 28 66 61 6c 73 65  NULL or 0 (false
f310: 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  )..** In other w
f320: 6f 72 64 73 2c 20 61 20 70 72 69 6f 72 20 72 5b  ords, a prior r[
f330: 50 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e  P2] value will n
f340: 6f 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ot be overwritte
f350: 6e 20 62 79 20 31 20 28 74 72 75 65 29 2e 0a 2a  n by 1 (true)..*
f360: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20  /./* Opcode: Ne 
f370: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
f380: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
f390: 5b 50 33 5d 21 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  [P3]!=r[P1].**.*
f3a0: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
f3b0: 74 20 6c 69 6b 65 20 74 68 65 20 45 71 20 6f 70  t like the Eq op
f3c0: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
f3d0: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
f3e0: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65  en if.** the ope
f3f0: 72 61 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65  rands in registe
f400: 72 73 20 50 31 20 61 6e 64 20 50 33 20 61 72 65  rs P1 and P3 are
f410: 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20 53 65 65   not equal.  See
f420: 20 74 68 65 20 45 71 20 6f 70 63 6f 64 65 20 66   the Eq opcode f
f430: 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  or.** additional
f440: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
f450: 0a 2a 2a 20 49 66 20 62 6f 74 68 20 53 51 4c 49  .** If both SQLI
f460: 54 45 5f 53 54 4f 52 45 50 32 20 61 6e 64 20 53  TE_STOREP2 and S
f470: 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66  QLITE_KEEPNULL f
f480: 6c 61 67 73 20 61 72 65 20 73 65 74 20 74 68 65  lags are set the
f490: 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  n the.** content
f4a0: 20 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c   of r[P2] is onl
f4b0: 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
f4c0: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 4e 55   new value is NU
f4d0: 4c 4c 20 6f 72 20 31 20 28 74 72 75 65 29 2e 0a  LL or 1 (true)..
f4e0: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
f4f0: 73 2c 20 61 20 70 72 69 6f 72 20 72 5b 50 32 5d  s, a prior r[P2]
f500: 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
f510: 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
f520: 79 20 30 20 28 66 61 6c 73 65 29 2e 0a 2a 2f 0a  y 0 (false)..*/.
f530: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74 20 50 31  /* Opcode: Lt P1
f540: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
f550: 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50  Synopsis: IF r[P
f560: 33 5d 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43  3]<r[P1].**.** C
f570: 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
f580: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
f590: 20 61 6e 64 20 50 33 2e 20 20 49 66 20 72 65 67   and P3.  If reg
f5a0: 28 50 33 29 3c 72 65 67 28 50 31 29 20 74 68 65  (P3)<reg(P1) the
f5b0: 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64  n.** jump to add
f5c0: 72 65 73 73 20 50 32 2e 20 20 4f 72 20 69 66 20  ress P2.  Or if 
f5d0: 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  the SQLITE_STORE
f5e0: 50 32 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  P2 flag is set i
f5f0: 6e 20 50 35 20 73 74 6f 72 65 0a 2a 2a 20 74 68  n P5 store.** th
f600: 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
f610: 61 72 69 73 6f 6e 20 28 30 20 6f 72 20 31 20 6f  arison (0 or 1 o
f620: 72 20 4e 55 4c 4c 29 20 69 6e 74 6f 20 72 65 67  r NULL) into reg
f630: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
f640: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  If the SQLITE_JU
f650: 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20  MPIFNULL bit of 
f660: 50 35 20 69 73 20 73 65 74 20 61 6e 64 20 65 69  P5 is set and ei
f670: 74 68 65 72 20 72 65 67 28 50 31 29 20 6f 72 0a  ther reg(P1) or.
f680: 2a 2a 20 72 65 67 28 50 33 29 20 69 73 20 4e 55  ** reg(P3) is NU
f690: 4c 4c 20 74 68 65 6e 20 74 68 65 20 74 61 6b 65  LL then the take
f6a0: 20 74 68 65 20 6a 75 6d 70 2e 20 20 49 66 20 74   the jump.  If t
f6b0: 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  he SQLITE_JUMPIF
f6c0: 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74 20 69 73 20  NULL .** bit is 
f6d0: 63 6c 65 61 72 20 74 68 65 6e 20 66 61 6c 6c 20  clear then fall 
f6e0: 74 68 72 6f 75 67 68 20 69 66 20 65 69 74 68 65  through if eithe
f6f0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
f700: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  L..**.** The SQL
f710: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72  ITE_AFF_MASK por
f720: 74 69 6f 6e 20 6f 66 20 50 35 20 6d 75 73 74 20  tion of P5 must 
f730: 62 65 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  be an affinity c
f740: 68 61 72 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51  haracter -.** SQ
f750: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 53  LITE_AFF_TEXT, S
f760: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
f770: 52 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  R, and so forth.
f780: 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
f790: 61 64 65 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63  ade .** to coerc
f7a0: 65 20 62 6f 74 68 20 69 6e 70 75 74 73 20 61 63  e both inputs ac
f7b0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
f7c0: 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20  affinity before 
f7d0: 74 68 65 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  the.** compariso
f7e0: 6e 20 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68  n is made. If th
f7f0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53  e SQLITE_AFF_MAS
f800: 4b 20 69 73 20 30 78 30 30 2c 20 74 68 65 6e 20  K is 0x00, then 
f810: 6e 75 6d 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e  numeric.** affin
f820: 69 74 79 20 69 73 20 75 73 65 64 2e 20 4e 6f 74  ity is used. Not
f830: 65 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  e that the affin
f840: 69 74 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  ity conversions 
f850: 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61  are stored.** ba
f860: 63 6b 20 69 6e 74 6f 20 74 68 65 20 69 6e 70 75  ck into the inpu
f870: 74 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61  t registers P1 a
f880: 6e 64 20 50 33 2e 20 20 53 6f 20 74 68 69 73 20  nd P3.  So this 
f890: 6f 70 63 6f 64 65 20 63 61 6e 20 63 61 75 73 65  opcode can cause
f8a0: 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 20 63  .** persistent c
f8b0: 68 61 6e 67 65 73 20 74 6f 20 72 65 67 69 73 74  hanges to regist
f8c0: 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a  ers P1 and P3..*
f8d0: 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f  *.** Once any co
f8e0: 6e 76 65 72 73 69 6f 6e 73 20 68 61 76 65 20 74  nversions have t
f8f0: 61 6b 65 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20  aken place, and 
f900: 6e 65 69 74 68 65 72 20 76 61 6c 75 65 20 69 73  neither value is
f910: 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76   NULL, .** the v
f920: 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72  alues are compar
f930: 65 64 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  ed. If both valu
f940: 65 73 20 61 72 65 20 62 6c 6f 62 73 20 74 68 65  es are blobs the
f950: 6e 20 6d 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a  n memcmp() is.**
f960: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
f970: 6e 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ne the results o
f980: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
f990: 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  .  If both value
f9a0: 73 0a 2a 2a 20 61 72 65 20 74 65 78 74 2c 20 74  s.** are text, t
f9b0: 68 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  hen the appropri
f9c0: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ate collating fu
f9d0: 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  nction specified
f9e0: 20 69 6e 0a 2a 2a 20 50 34 20 69 73 20 20 75 73   in.** P4 is  us
f9f0: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  ed to do the com
fa00: 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 50 34 20  parison.  If P4 
fa10: 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  is not specified
fa20: 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28   then.** memcmp(
fa30: 29 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ) is used to com
fa40: 70 61 72 65 20 74 65 78 74 20 73 74 72 69 6e 67  pare text string
fa50: 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  .  If both value
fa60: 73 20 61 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63  s are.** numeric
fa70: 2c 20 74 68 65 6e 20 61 20 6e 75 6d 65 72 69 63  , then a numeric
fa80: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 75   comparison is u
fa90: 73 65 64 2e 20 49 66 20 74 68 65 20 74 77 6f 20  sed. If the two 
faa0: 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66  values.** are of
fab0: 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
fac0: 2c 20 74 68 65 6e 20 6e 75 6d 62 65 72 73 20 61  , then numbers a
fad0: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65  re considered le
fae0: 73 73 20 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e  ss than.** strin
faf0: 67 73 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61  gs and strings a
fb00: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65  re considered le
fb10: 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a  ss than blobs..*
fb20: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20  /./* Opcode: Le 
fb30: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
fb40: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
fb50: 5b 50 33 5d 3c 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  [P3]<=r[P1].**.*
fb60: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
fb70: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
fb80: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
fb90: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
fba0: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  en if.** the con
fbb0: 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
fbc0: 20 50 33 20 69 73 20 6c 65 73 73 20 74 68 61 6e   P3 is less than
fbd0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
fbe0: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72   content of.** r
fbf0: 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65  egister P1.  See
fc00: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66   the Lt opcode f
fc10: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
fc20: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  formation..*/./*
fc30: 20 4f 70 63 6f 64 65 3a 20 47 74 20 50 31 20 50   Opcode: Gt P1 P
fc40: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
fc50: 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d  nopsis: IF r[P3]
fc60: 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  >r[P1].**.** Thi
fc70: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
fc80: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
fc90: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
fca0: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
fcb0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
fcc0: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
fcd0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
fce0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
fcf0: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53   register P1.  S
fd00: 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ee the Lt opcode
fd10: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
fd20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
fd30: 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65 20 50 31  /* Opcode: Ge P1
fd40: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
fd50: 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50  Synopsis: IF r[P
fd60: 33 5d 3e 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  3]>=r[P1].**.** 
fd70: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
fd80: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f  like the Lt opco
fd90: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74  de except that t
fda0: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
fdb0: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65   if.** the conte
fdc0: 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
fdd0: 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
fde0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
fdf0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20  e content of.** 
fe00: 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65  register P1.  Se
fe10: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
fe20: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
fe30: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63  nformation..*/.c
fe40: 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 20 20  ase OP_Eq:      
fe50: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
fe60: 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c   as TK_EQ, jump,
fe70: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
fe80: 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20 20 20 20  e OP_Ne:        
fe90: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
fea0: 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69  s TK_NE, jump, i
feb0: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
fec0: 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20 20 20 20  OP_Lt:          
fed0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
fee0: 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_LT, jump, in1
fef0: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
ff00: 5f 4c 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Le:            
ff10: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
ff20: 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _LE, jump, in1, 
ff30: 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  in3 */.case OP_G
ff40: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
ff50: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47   /* same as TK_G
ff60: 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  T, jump, in1, in
ff70: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a  3 */.case OP_Ge:
ff80: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   {             /
ff90: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c  * same as TK_GE,
ffa0: 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
ffb0: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 65  */.  int res, re
ffc0: 73 32 3b 20 20 20 20 20 20 2f 2a 20 52 65 73 75  s2;      /* Resu
ffd0: 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  lt of the compar
ffe0: 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20 61 67 61  ison of pIn1 aga
fff0: 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a 20 20 63  inst pIn3 */.  c
10000 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
10010 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
10020 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72  o use for compar
10030 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c  ison */.  u16 fl
10040 61 67 73 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  ags1;         /*
10050 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   Copy of initial
10060 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 31 2d 3e   value of pIn1->
10070 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31 36 20 66  flags */.  u16 f
10080 6c 61 67 73 33 3b 20 20 20 20 20 20 20 20 20 2f  lags3;         /
10090 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  * Copy of initia
100a0 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 33 2d  l value of pIn3-
100b0 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 70 49 6e  >flags */..  pIn
100c0 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
100d0 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d  1];.  pIn3 = &aM
100e0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66  em[pOp->p3];.  f
100f0 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c  lags1 = pIn1->fl
10100 61 67 73 3b 0a 20 20 66 6c 61 67 73 33 20 3d 20  ags;.  flags3 = 
10110 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pIn3->flags;.  i
10120 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66 6c 61  f( (flags1 | fla
10130 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs3)&MEM_Null ){
10140 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 62  .    /* One or b
10150 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65  oth operands are
10160 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28   NULL */.    if(
10170 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
10180 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20 20 20 20  E_NULLEQ ){.    
10190 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e    /* If SQLITE_N
101a0 55 4c 4c 45 51 20 69 73 20 73 65 74 20 28 77 68  ULLEQ is set (wh
101b0 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61  ich will only ha
101c0 70 70 65 6e 20 69 66 20 74 68 65 20 6f 70 65 72  ppen if the oper
101d0 61 74 6f 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ator is.      **
101e0 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f 4e 65 29   OP_Eq or OP_Ne)
101f0 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
10200 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ump or not depen
10210 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a  ding on whether.
10220 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e 6f 74 20        ** or not 
10230 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
10240 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  e null..      */
10250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10260 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
10270 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  q || pOp->opcode
10280 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
10290 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 31   assert( (flags1
102a0 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d   & MEM_Cleared)=
102b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
102c0 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 53  rt( (pOp->p5 & S
102d0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
102e0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
102f0 28 20 28 66 6c 61 67 73 31 26 66 6c 61 67 73 33  ( (flags1&flags3
10300 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20  &MEM_Null)!=0.  
10310 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 33 26       && (flags3&
10320 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 0a  MEM_Cleared)==0.
10330 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
10340 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20 4f 70   res = 0;  /* Op
10350 65 72 61 6e 64 73 20 61 72 65 20 65 71 75 61 6c  erands are equal
10360 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
10370 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 31  .        res = 1
10380 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61  ;  /* Operands a
10390 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a  re not equal */.
103a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
103b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  e{.      /* SQLI
103c0 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 63 6c 65  TE_NULLEQ is cle
103d0 61 72 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20  ar and at least 
103e0 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  one operand is N
103f0 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ULL,.      ** th
10400 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
10410 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20   always NULL..  
10420 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d 70 20      ** The jump 
10430 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
10440 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
10450 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a 20 20  L bit is set..  
10460 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
10470 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
10480 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20  E_STOREP2 ){.   
10490 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65       pOut = &aMe
104a0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  m[pOp->p2];.    
104b0 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 31      iCompare = 1
104c0 3b 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73  ;    /* Operands
104d0 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a   are not equal *
104e0 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f  /.        memAbo
104f0 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
10500 75 74 29 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ut);.        Mem
10510 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
10520 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
10530 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
10540 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
10550 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
10560 0a 20 20 20 20 20 20 20 20 56 64 62 65 42 72 61  .        VdbeBra
10570 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29 3b 0a 20  nchTaken(2,3);. 
10580 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
10590 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50  p5 & SQLITE_JUMP
105a0 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  IFNULL ){.      
105b0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
105c0 5f 70 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _p2;.        }. 
105d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
105e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ak;.    }.  }els
105f0 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  e{.    /* Neithe
10600 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
10610 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70 61 72 69  L.  Do a compari
10620 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69  son. */.    affi
10630 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26  nity = pOp->p5 &
10640 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
10650 3b 0a 20 20 20 20 69 66 28 20 61 66 66 69 6e 69  ;.    if( affini
10660 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty>=SQLITE_AFF_N
10670 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
10680 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66 6c  if( (flags1 | fl
10690 61 67 73 33 29 26 4d 45 4d 5f 53 74 72 20 29 7b  ags3)&MEM_Str ){
106a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 66 6c  .        if( (fl
106b0 61 67 73 31 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  ags1 & (MEM_Int|
106c0 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72  MEM_Real|MEM_Str
106d0 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ))==MEM_Str ){. 
106e0 20 20 20 20 20 20 20 20 20 61 70 70 6c 79 4e 75           applyNu
106f0 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49  mericAffinity(pI
10700 6e 31 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n1,0);.         
10710 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
10720 33 21 3d 70 49 6e 33 2d 3e 66 6c 61 67 73 20 29  3!=pIn3->flags )
10730 3b 20 2f 2a 20 50 6f 73 73 69 62 6c 65 20 69 66  ; /* Possible if
10740 20 70 49 6e 31 3d 3d 70 49 6e 33 20 2a 2f 0a 20   pIn1==pIn3 */. 
10750 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 33 20           flags3 
10760 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20  = pIn3->flags;. 
10770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10780 20 69 66 28 20 28 66 6c 61 67 73 33 20 26 20 28   if( (flags3 & (
10790 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
107a0 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f  |MEM_Str))==MEM_
107b0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Str ){.         
107c0 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
107d0 69 6e 69 74 79 28 70 49 6e 33 2c 30 29 3b 0a 20  inity(pIn3,0);. 
107e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
107f0 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65  .      /* Handle
10800 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
10810 20 6f 66 20 69 6e 74 65 67 65 72 20 63 6f 6d 70   of integer comp
10820 61 72 69 73 6f 6e 20 68 65 72 65 2c 20 61 73 20  arison here, as 
10830 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69  an.      ** opti
10840 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 61 76 6f  mization, to avo
10850 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  id a call to sql
10860 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
10870 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
10880 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e  In1->flags & pIn
10890 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
108a0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
108b0 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20    if( pIn3->u.i 
108c0 3e 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72  > pIn1->u.i ){ r
108d0 65 73 20 3d 20 2b 31 3b 20 67 6f 74 6f 20 63 6f  es = +1; goto co
108e0 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20  mpare_op; }.    
108f0 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e      if( pIn3->u.
10900 69 20 3c 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b  i < pIn1->u.i ){
10910 20 72 65 73 20 3d 20 2d 31 3b 20 67 6f 74 6f 20   res = -1; goto 
10920 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20  compare_op; }.  
10930 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
10940 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 70         goto comp
10950 61 72 65 5f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  are_op;.      }.
10960 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66      }else if( af
10970 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
10980 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  FF_TEXT ){.     
10990 20 69 66 28 20 28 66 6c 61 67 73 31 20 26 20 4d   if( (flags1 & M
109a0 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20 28 66  EM_Str)==0 && (f
109b0 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f 49 6e 74  lags1 & (MEM_Int
109c0 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d 30 20 29  |MEM_Real))!=0 )
109d0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
109e0 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  se( pIn1->flags 
109f0 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20  & MEM_Int );.   
10a00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
10a10 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
10a20 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Real );.       
10a30 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
10a40 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c 20 65  tringify(pIn1, e
10a50 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a 20 20 20  ncoding, 1);.   
10a60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
10a70 66 6c 61 67 73 31 26 4d 45 4d 5f 44 79 6e 29 20  flags1&MEM_Dyn) 
10a80 21 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26  != (pIn1->flags&
10a90 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20  MEM_Dyn) );.    
10aa0 20 20 20 20 66 6c 61 67 73 31 20 3d 20 28 70 49      flags1 = (pI
10ab0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45 4d  n1->flags & ~MEM
10ac0 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c  _TypeMask) | (fl
10ad0 61 67 73 31 20 26 20 4d 45 4d 5f 54 79 70 65 4d  ags1 & MEM_TypeM
10ae0 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ask);.        as
10af0 73 65 72 74 28 20 70 49 6e 31 21 3d 70 49 6e 33  sert( pIn1!=pIn3
10b00 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
10b10 20 20 69 66 28 20 28 66 6c 61 67 73 33 20 26 20    if( (flags3 & 
10b20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20 28  MEM_Str)==0 && (
10b30 66 6c 61 67 73 33 20 26 20 28 4d 45 4d 5f 49 6e  flags3 & (MEM_In
10b40 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d 30 20  t|MEM_Real))!=0 
10b50 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
10b60 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ase( pIn3->flags
10b70 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
10b80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10b90 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
10ba0 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  M_Real );.      
10bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
10bc0 53 74 72 69 6e 67 69 66 79 28 70 49 6e 33 2c 20  Stringify(pIn3, 
10bd0 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a 20 20  encoding, 1);.  
10be0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10bf0 28 66 6c 61 67 73 33 26 4d 45 4d 5f 44 79 6e 29  (flags3&MEM_Dyn)
10c00 20 21 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73   != (pIn3->flags
10c10 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20  &MEM_Dyn) );.   
10c20 20 20 20 20 20 66 6c 61 67 73 33 20 3d 20 28 70       flags3 = (p
10c30 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45  In3->flags & ~ME
10c40 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66  M_TypeMask) | (f
10c50 6c 61 67 73 33 20 26 20 4d 45 4d 5f 54 79 70 65  lags3 & MEM_Type
10c60 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Mask);.      }. 
10c70 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
10c80 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
10c90 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d  _COLLSEQ || pOp-
10ca0 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a  >p4.pColl==0 );.
10cb0 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
10cc0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 49 6e 33  3MemCompare(pIn3
10cd0 2c 20 70 49 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e  , pIn1, pOp->p4.
10ce0 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 63 6f 6d 70  pColl);.  }.comp
10cf0 61 72 65 5f 6f 70 3a 0a 20 20 73 77 69 74 63 68  are_op:.  switch
10d00 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b  ( pOp->opcode ){
10d10 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 45 71 3a  .    case OP_Eq:
10d20 20 20 20 20 72 65 73 32 20 3d 20 72 65 73 3d 3d      res2 = res==
10d30 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  0;     break;.  
10d40 20 20 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20    case OP_Ne:   
10d50 20 72 65 73 32 20 3d 20 72 65 73 3b 20 20 20 20   res2 = res;    
10d60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
10d70 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 72 65  ase OP_Lt:    re
10d80 73 32 20 3d 20 72 65 73 3c 30 3b 20 20 20 20 20  s2 = res<0;     
10d90 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
10da0 20 4f 50 5f 4c 65 3a 20 20 20 20 72 65 73 32 20   OP_Le:    res2 
10db0 3d 20 72 65 73 3c 3d 30 3b 20 20 20 20 20 62 72  = res<=0;     br
10dc0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50  eak;.    case OP
10dd0 5f 47 74 3a 20 20 20 20 72 65 73 32 20 3d 20 72  _Gt:    res2 = r
10de0 65 73 3e 30 3b 20 20 20 20 20 20 62 72 65 61 6b  es>0;      break
10df0 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
10e00 20 20 20 20 20 72 65 73 32 20 3d 20 72 65 73 3e       res2 = res>
10e10 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  =0;     break;. 
10e20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f 20 61 6e   }..  /* Undo an
10e30 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
10e40 79 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28  y applyAffinity(
10e50 29 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72  ) to the input r
10e60 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 61  egisters. */.  a
10e70 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c  ssert( (pIn1->fl
10e80 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d  ags & MEM_Dyn) =
10e90 3d 20 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f  = (flags1 & MEM_
10ea0 44 79 6e 29 20 29 3b 0a 20 20 70 49 6e 31 2d 3e  Dyn) );.  pIn1->
10eb0 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 31 3b 0a  flags = flags1;.
10ec0 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 33 2d    assert( (pIn3-
10ed0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
10ee0 29 20 3d 3d 20 28 66 6c 61 67 73 33 20 26 20 4d  ) == (flags3 & M
10ef0 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 70 49 6e  EM_Dyn) );.  pIn
10f00 33 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  3->flags = flags
10f10 33 3b 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  3;..  if( pOp->p
10f20 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  5 & SQLITE_STORE
10f30 50 32 20 29 7b 0a 20 20 20 20 70 4f 75 74 20 3d  P2 ){.    pOut =
10f40 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
10f50 0a 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d 20  .    iCompare = 
10f60 72 65 73 3b 0a 20 20 20 20 72 65 73 32 20 3d 20  res;.    res2 = 
10f70 72 65 73 32 21 3d 30 3b 20 20 2f 2a 20 46 6f 72  res2!=0;  /* For
10f80 20 74 68 69 73 20 70 61 74 68 20 72 65 73 32 20   this path res2 
10f90 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
10fa0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 20 20 69 66  0 or 1 */.    if
10fb0 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  ( (pOp->p5 & SQL
10fc0 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 29 21 3d 30  ITE_KEEPNULL)!=0
10fd0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
10fe0 20 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67 20 70   KEEPNULL flag p
10ff0 72 65 76 65 6e 74 73 20 4f 50 5f 45 71 20 66 72  revents OP_Eq fr
11000 6f 6d 20 6f 76 65 72 77 72 69 74 69 6e 67 20 61  om overwriting a
11010 20 4e 55 4c 4c 20 77 69 74 68 20 31 0a 20 20 20   NULL with 1.   
11020 20 20 20 2a 2a 20 61 6e 64 20 70 72 65 76 65 6e     ** and preven
11030 74 73 20 4f 50 5f 4e 65 20 66 72 6f 6d 20 6f 76  ts OP_Ne from ov
11040 65 72 77 72 69 74 69 6e 67 20 4e 55 4c 4c 20 77  erwriting NULL w
11050 69 74 68 20 30 2e 20 20 54 68 69 73 20 66 6c 61  ith 0.  This fla
11060 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 6e  g.      ** is on
11070 6c 79 20 75 73 65 64 20 69 6e 20 63 6f 6e 74 65  ly used in conte
11080 78 74 73 20 77 68 65 72 65 20 65 69 74 68 65 72  xts where either
11090 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 31 29  :.      **   (1)
110a0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 28 72   op==OP_Eq && (r
110b0 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20 72 5b  [P2]==NULL || r[
110c0 50 32 5d 3d 3d 30 29 0a 20 20 20 20 20 20 2a 2a  P2]==0).      **
110d0 20 20 20 28 32 29 20 6f 70 3d 3d 4f 50 5f 4e 65     (2) op==OP_Ne
110e0 20 26 26 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c   && (r[P2]==NULL
110f0 20 7c 7c 20 72 5b 50 32 5d 3d 3d 31 29 0a 20 20   || r[P2]==1).  
11100 20 20 20 20 2a 2a 20 54 68 65 72 65 66 6f 72 65      ** Therefore
11110 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
11120 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68  sary to check th
11130 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 5b 50  e content of r[P
11140 32 5d 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  2] for.      ** 
11150 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 61  NULL. */.      a
11160 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
11170 64 65 3d 3d 4f 50 5f 4e 65 20 7c 7c 20 70 4f 70  de==OP_Ne || pOp
11180 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20  ->opcode==OP_Eq 
11190 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
111a0 20 72 65 73 32 3d 3d 30 20 7c 7c 20 72 65 73 32   res2==0 || res2
111b0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
111c0 74 63 61 73 65 28 20 72 65 73 32 3d 3d 30 20 26  tcase( res2==0 &
111d0 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  & pOp->opcode==O
111e0 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Eq );.      te
111f0 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d 31 20  stcase( res2==1 
11200 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  && pOp->opcode==
11210 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 74  OP_Eq );.      t
11220 65 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d 30  estcase( res2==0
11230 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   && pOp->opcode=
11240 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
11250 74 65 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d  testcase( res2==
11260 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  1 && pOp->opcode
11270 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
11280 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64   if( (pOp->opcod
11290 65 3d 3d 4f 50 5f 45 71 29 3d 3d 72 65 73 32 20  e==OP_Eq)==res2 
112a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
112b0 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
112c0 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20  nge(p, pOut);.  
112d0 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
112e0 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pOut, MEM_Int);
112f0 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
11300 20 72 65 73 32 3b 0a 20 20 20 20 52 45 47 49 53   res2;.    REGIS
11310 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
11320 32 2c 20 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73  2, pOut);.  }els
11330 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  e{.    VdbeBranc
11340 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 20 28  hTaken(res!=0, (
11350 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
11360 5f 4e 55 4c 4c 45 51 29 3f 32 3a 33 29 3b 0a 20  _NULLEQ)?2:3);. 
11370 20 20 20 69 66 28 20 72 65 73 32 20 29 7b 0a 20     if( res2 ){. 
11380 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74       goto jump_t
11390 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  o_p2;.    }.  }.
113a0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
113b0 70 63 6f 64 65 3a 20 45 6c 73 65 4e 6f 74 45 71  pcode: ElseNotEq
113c0 20 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   * P2 * * *.**.*
113d0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6d 75  * This opcode mu
113e0 73 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  st immediately f
113f0 6f 6c 6c 6f 77 20 61 6e 20 4f 50 5f 4c 74 20 6f  ollow an OP_Lt o
11400 72 20 4f 50 5f 47 74 20 63 6f 6d 70 61 72 69 73  r OP_Gt comparis
11410 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  on operator..** 
11420 49 66 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20  If result of an 
11430 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f 6e  OP_Eq comparison
11440 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 77 6f   on the same two
11450 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75   operands.** wou
11460 6c 64 20 68 61 76 65 20 62 65 20 4e 55 4c 4c 20  ld have be NULL 
11470 6f 72 20 66 61 6c 73 65 20 28 30 29 2c 20 74 68  or false (0), th
11480 65 6e 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  en then jump to 
11490 50 32 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 72  P2. .** If the r
114a0 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f 50 5f 45  esult of an OP_E
114b0 71 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 6e 20  q comparison on 
114c0 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73  the two previous
114d0 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 77 6f 75   operands.** wou
114e0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 74 72 75  ld have been tru
114f0 65 20 28 31 29 2c 20 74 68 65 6e 20 66 61 6c 6c  e (1), then fall
11500 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73   through..*/.cas
11510 65 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 3a 20  e OP_ElseNotEq: 
11520 7b 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20  {       /* same 
11530 61 73 20 54 4b 5f 45 53 43 41 50 45 2c 20 6a 75  as TK_ESCAPE, ju
11540 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  mp */.  assert( 
11550 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 61 73 73  pOp>aOp );.  ass
11560 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
11570 6f 64 65 3d 3d 4f 50 5f 4c 74 20 7c 7c 20 70 4f  ode==OP_Lt || pO
11580 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
11590 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
115a0 20 70 4f 70 5b 2d 31 5d 2e 70 35 20 26 20 53 51   pOp[-1].p5 & SQ
115b0 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 3b 0a  LITE_STOREP2 );.
115c0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
115d0 6e 28 69 43 6f 6d 70 61 72 65 21 3d 30 2c 20 32  n(iCompare!=0, 2
115e0 29 3b 0a 20 20 69 66 28 20 69 43 6f 6d 70 61 72  );.  if( iCompar
115f0 65 21 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70  e!=0 ) goto jump
11600 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
11610 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  .}.../* Opcode: 
11620 50 65 72 6d 75 74 61 74 69 6f 6e 20 2a 20 2a 20  Permutation * * 
11630 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74  * P4 *.**.** Set
11640 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
11650 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f   used by the OP_
11660 43 6f 6d 70 61 72 65 20 6f 70 65 72 61 74 6f 72  Compare operator
11670 20 74 6f 20 62 65 20 74 68 65 20 61 72 72 61 79   to be the array
11680 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65 72 73 20  .** of integers 
11690 69 6e 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  in P4..**.** The
116a0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20   permutation is 
116b0 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e 74 69 6c  only valid until
116c0 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 43 6f 6d   the next OP_Com
116d0 70 61 72 65 20 74 68 61 74 20 68 61 73 0a 2a 2a  pare that has.**
116e0 20 74 68 65 20 4f 50 46 4c 41 47 5f 50 45 52 4d   the OPFLAG_PERM
116f0 55 54 45 20 62 69 74 20 73 65 74 20 69 6e 20 50  UTE bit set in P
11700 35 2e 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65  5. Typically the
11710 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20   OP_Permutation 
11720 73 68 6f 75 6c 64 20 0a 2a 2a 20 6f 63 63 75 72  should .** occur
11730 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 69   immediately pri
11740 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6d  or to the OP_Com
11750 70 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pare..**.** The 
11760 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 6e  first integer in
11770 20 74 68 65 20 50 34 20 69 6e 74 65 67 65 72 20   the P4 integer 
11780 61 72 72 61 79 20 69 73 20 74 68 65 20 6c 65 6e  array is the len
11790 67 74 68 20 6f 66 20 74 68 65 20 61 72 72 61 79  gth of the array
117a0 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  .** and does not
117b0 20 62 65 63 6f 6d 65 20 70 61 72 74 20 6f 66 20   become part of 
117c0 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 2e  the permutation.
117d0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 65 72 6d  .*/.case OP_Perm
117e0 75 74 61 74 69 6f 6e 3a 20 7b 0a 20 20 61 73 73  utation: {.  ass
117f0 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
11800 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b  ==P4_INTARRAY );
11810 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
11820 70 34 2e 61 69 20 29 3b 0a 20 20 61 50 65 72 6d  p4.ai );.  aPerm
11830 75 74 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69  ute = pOp->p4.ai
11840 20 2b 20 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   + 1;.  break;.}
11850 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6d  ../* Opcode: Com
11860 70 61 72 65 20 50 31 20 50 32 20 50 33 20 50 34  pare P1 P2 P3 P4
11870 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
11880 20 72 5b 50 31 40 50 33 5d 20 3c 2d 3e 20 72 5b   r[P1@P3] <-> r[
11890 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d  P2@P3].**.** Com
118a0 70 61 72 65 20 74 77 6f 20 76 65 63 74 6f 72 73  pare two vectors
118b0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e   of registers in
118c0 20 72 65 67 28 50 31 29 2e 2e 72 65 67 28 50 31   reg(P1)..reg(P1
118d0 2b 50 33 2d 31 29 20 28 63 61 6c 6c 20 74 68 69  +P3-1) (call thi
118e0 73 0a 2a 2a 20 76 65 63 74 6f 72 20 22 41 22 29  s.** vector "A")
118f0 20 61 6e 64 20 69 6e 20 72 65 67 28 50 32 29 2e   and in reg(P2).
11900 2e 72 65 67 28 50 32 2b 50 33 2d 31 29 20 28 22  .reg(P2+P3-1) ("
11910 42 22 29 2e 20 20 53 61 76 65 20 74 68 65 20 72  B").  Save the r
11920 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 74 68 65 20  esult of.** the 
11930 63 6f 6d 70 61 72 69 73 6f 6e 20 66 6f 72 20 75  comparison for u
11940 73 65 20 62 79 20 74 68 65 20 6e 65 78 74 20 4f  se by the next O
11950 50 5f 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 2e  P_Jump instruct.
11960 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73  .**.** If P5 has
11970 20 74 68 65 20 4f 50 46 4c 41 47 5f 50 45 52 4d   the OPFLAG_PERM
11980 55 54 45 20 62 69 74 20 73 65 74 2c 20 74 68 65  UTE bit set, the
11990 6e 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 63  n the order of c
119a0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 0a 2a 2a 20  omparison is.** 
119b0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
119c0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f 50  e most recent OP
119d0 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 6f 70 65  _Permutation ope
119e0 72 61 74 6f 72 2e 20 20 49 66 20 74 68 65 0a 2a  rator.  If the.*
119f0 2a 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  * OPFLAG_PERMUTE
11a00 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c 20 74   bit is clear, t
11a10 68 65 6e 20 72 65 67 69 73 74 65 72 20 61 72 65  hen register are
11a20 20 63 6f 6d 70 61 72 65 64 20 69 6e 20 73 65 71   compared in seq
11a30 75 65 6e 74 69 61 6c 0a 2a 2a 20 6f 72 64 65 72  uential.** order
11a40 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  ..**.** P4 is a 
11a50 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
11a60 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 63  e that defines c
11a70 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
11a80 65 73 20 61 6e 64 20 73 6f 72 74 0a 2a 2a 20 6f  es and sort.** o
11a90 72 64 65 72 73 20 66 6f 72 20 74 68 65 20 63 6f  rders for the co
11aa0 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 70  mparison.  The p
11ab0 65 72 6d 75 74 61 74 69 6f 6e 20 61 70 70 6c 69  ermutation appli
11ac0 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73 0a  es to registers.
11ad0 2a 2a 20 6f 6e 6c 79 2e 20 20 54 68 65 20 4b 65  ** only.  The Ke
11ae0 79 49 6e 66 6f 20 65 6c 65 6d 65 6e 74 73 20 61  yInfo elements a
11af0 72 65 20 75 73 65 64 20 73 65 71 75 65 6e 74 69  re used sequenti
11b00 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ally..**.** The 
11b10 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
11b20 73 6f 72 74 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  sort comparison,
11b30 20 73 6f 20 4e 55 4c 4c 73 20 63 6f 6d 70 61 72   so NULLs compar
11b40 65 20 65 71 75 61 6c 2c 0a 2a 2a 20 4e 55 4c 4c  e equal,.** NULL
11b50 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  s are less than 
11b60 6e 75 6d 62 65 72 73 2c 20 6e 75 6d 62 65 72 73  numbers, numbers
11b70 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 73   are less than s
11b80 74 72 69 6e 67 73 2c 0a 2a 2a 20 61 6e 64 20 73  trings,.** and s
11b90 74 72 69 6e 67 73 20 61 72 65 20 6c 65 73 73 20  trings are less 
11ba0 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 63  than blobs..*/.c
11bb0 61 73 65 20 4f 50 5f 43 6f 6d 70 61 72 65 3a 20  ase OP_Compare: 
11bc0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  {.  int n;.  int
11bd0 20 69 3b 0a 20 20 69 6e 74 20 70 31 3b 0a 20 20   i;.  int p1;.  
11be0 69 6e 74 20 70 32 3b 0a 20 20 63 6f 6e 73 74 20  int p2;.  const 
11bf0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
11c00 6f 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  o;.  int idx;.  
11c10 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
11c20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
11c30 73 65 71 75 65 6e 63 65 20 74 6f 20 75 73 65 20  sequence to use 
11c40 6f 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  on this term */.
11c50 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
11c60 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
11c70 20 44 45 53 43 45 4e 44 49 4e 47 20 73 6f 72 74   DESCENDING sort
11c80 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 69 66 28   order */..  if(
11c90 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
11ca0 41 47 5f 50 45 52 4d 55 54 45 29 3d 3d 30 20 29  AG_PERMUTE)==0 )
11cb0 20 61 50 65 72 6d 75 74 65 20 3d 20 30 3b 0a 20   aPermute = 0;. 
11cc0 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20   n = pOp->p3;.  
11cd0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
11ce0 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61  p4.pKeyInfo;.  a
11cf0 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
11d00 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
11d10 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d 20 70 4f  !=0 );.  p1 = pO
11d20 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f  p->p1;.  p2 = pO
11d30 70 2d 3e 70 32 3b 0a 23 69 66 20 53 51 4c 49 54  p->p2;.#if SQLIT
11d40 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 61 50  E_DEBUG.  if( aP
11d50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 69 6e  ermute ){.    in
11d60 74 20 6b 2c 20 6d 78 20 3d 20 30 3b 0a 20 20 20  t k, mx = 0;.   
11d70 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b   for(k=0; k<n; k
11d80 2b 2b 29 20 69 66 28 20 61 50 65 72 6d 75 74 65  ++) if( aPermute
11d90 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20 3d 20 61 50  [k]>mx ) mx = aP
11da0 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20 20 20 20 61  ermute[k];.    a
11db0 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20 70  ssert( p1>0 && p
11dc0 31 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  1+mx<=(p->nMem+1
11dd0 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31   - p->nCursor)+1
11de0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11df0 70 32 3e 30 20 26 26 20 70 32 2b 6d 78 3c 3d 28  p2>0 && p2+mx<=(
11e00 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
11e10 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 7d  Cursor)+1 );.  }
11e20 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
11e30 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6e 3c 3d  ( p1>0 && p1+n<=
11e40 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
11e50 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
11e60 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 26    assert( p2>0 &
11e70 26 20 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d  & p2+n<=(p->nMem
11e80 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
11e90 2b 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  +1 );.  }.#endif
11ea0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
11eb0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11ec0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 64  <n; i++){.    id
11ed0 78 20 3d 20 61 50 65 72 6d 75 74 65 20 3f 20 61  x = aPermute ? a
11ee0 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a  Permute[i] : i;.
11ef0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
11f00 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 31 2b  sValid(&aMem[p1+
11f10 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 61 73 73  idx]) );.    ass
11f20 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
11f30 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 20 29  &aMem[p2+idx]) )
11f40 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
11f50 52 41 43 45 28 70 31 2b 69 64 78 2c 20 26 61 4d  RACE(p1+idx, &aM
11f60 65 6d 5b 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20  em[p1+idx]);.   
11f70 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
11f80 70 32 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 32  p2+idx, &aMem[p2
11f90 2b 69 64 78 5d 29 3b 0a 20 20 20 20 61 73 73 65  +idx]);.    asse
11fa0 72 74 28 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e  rt( i<pKeyInfo->
11fb0 6e 46 69 65 6c 64 20 29 3b 0a 20 20 20 20 70 43  nField );.    pC
11fc0 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
11fd0 61 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62 52  aColl[i];.    bR
11fe0 65 76 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ev = pKeyInfo->a
11ff0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
12000 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c    iCompare = sql
12010 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
12020 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 2c 20 26 61  aMem[p1+idx], &a
12030 4d 65 6d 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f  Mem[p2+idx], pCo
12040 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ll);.    if( iCo
12050 6d 70 61 72 65 20 29 7b 0a 20 20 20 20 20 20 69  mpare ){.      i
12060 66 28 20 62 52 65 76 20 29 20 69 43 6f 6d 70 61  f( bRev ) iCompa
12070 72 65 20 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a  re = -iCompare;.
12080 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12090 20 7d 0a 20 20 7d 0a 20 20 61 50 65 72 6d 75 74   }.  }.  aPermut
120a0 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a  e = 0;.  break;.
120b0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75  }../* Opcode: Ju
120c0 6d 70 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  mp P1 P2 P3 * *.
120d0 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68  **.** Jump to th
120e0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74  e instruction at
120f0 20 61 64 64 72 65 73 73 20 50 31 2c 20 50 32 2c   address P1, P2,
12100 20 6f 72 20 50 33 20 64 65 70 65 6e 64 69 6e 67   or P3 depending
12110 20 6f 6e 20 77 68 65 74 68 65 72 0a 2a 2a 20 69   on whether.** i
12120 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
12130 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73  t OP_Compare ins
12140 74 72 75 63 74 69 6f 6e 20 74 68 65 20 50 31 20  truction the P1 
12150 76 65 63 74 6f 72 20 77 61 73 20 6c 65 73 73 20  vector was less 
12160 74 68 61 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  than.** equal to
12170 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
12180 6e 20 74 68 65 20 50 32 20 76 65 63 74 6f 72 2c  n the P2 vector,
12190 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
121a0 2f 0a 63 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20  /.case OP_Jump: 
121b0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
121c0 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69   jump */.  if( i
121d0 43 6f 6d 70 61 72 65 3c 30 20 29 7b 0a 20 20 20  Compare<0 ){.   
121e0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
121f0 28 30 2c 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f  (0,3); pOp = &aO
12200 70 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a  p[pOp->p1 - 1];.
12210 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6d    }else if( iCom
12220 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 56  pare==0 ){.    V
12230 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 31  dbeBranchTaken(1
12240 2c 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b  ,3); pOp = &aOp[
12250 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20  pOp->p2 - 1];.  
12260 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42  }else{.    VdbeB
12270 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29 3b  ranchTaken(2,3);
12280 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d   pOp = &aOp[pOp-
12290 3e 70 33 20 2d 20 31 5d 3b 0a 20 20 7d 0a 20 20  >p3 - 1];.  }.  
122a0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
122b0 6f 64 65 3a 20 41 6e 64 20 50 31 20 50 32 20 50  ode: And P1 P2 P
122c0 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
122d0 73 3a 20 72 5b 50 33 5d 3d 28 72 5b 50 31 5d 20  s: r[P3]=(r[P1] 
122e0 26 26 20 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  && r[P2]).**.** 
122f0 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c  Take the logical
12300 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c 75   AND of the valu
12310 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  es in registers 
12320 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a  P1 and P2 and.**
12330 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
12340 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
12350 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  P3..**.** If eit
12360 68 65 72 20 50 31 20 6f 72 20 50 32 20 69 73 20  her P1 or P2 is 
12370 30 20 28 66 61 6c 73 65 29 20 74 68 65 6e 20 74  0 (false) then t
12380 68 65 20 72 65 73 75 6c 74 20 69 73 20 30 20 65  he result is 0 e
12390 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 74  ven if.** the ot
123a0 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
123b0 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 74  L.  A NULL and t
123c0 72 75 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73  rue or two NULLs
123d0 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55 4c 4c 20   give.** a NULL 
123e0 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70  output..*/./* Op
123f0 63 6f 64 65 3a 20 4f 72 20 50 31 20 50 32 20 50  code: Or P1 P2 P
12400 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
12410 73 3a 20 72 5b 50 33 5d 3d 28 72 5b 50 31 5d 20  s: r[P3]=(r[P1] 
12420 7c 7c 20 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  || r[P2]).**.** 
12430 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c  Take the logical
12440 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65   OR of the value
12450 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
12460 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
12470 74 6f 72 65 20 74 68 65 20 61 6e 73 77 65 72 20  tore the answer 
12480 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
12490 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
124a0 50 31 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a  P1 or P2 is nonz
124b0 65 72 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20  ero (true) then 
124c0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 31 20  the result is 1 
124d0 28 74 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69  (true).** even i
124e0 66 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75  f the other inpu
124f0 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55  t is NULL.  A NU
12500 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20  LL and false or 
12510 74 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76  two NULLs.** giv
12520 65 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e  e a NULL output.
12530 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a  .*/.case OP_And:
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12550 20 73 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c   same as TK_AND,
12560 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
12570 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b  */.case OP_Or: {
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12590 73 61 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69  same as TK_OR, i
125a0 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
125b0 0a 20 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a  .  int v1;    /*
125c0 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20   Left operand:  
125d0 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55  0==FALSE, 1==TRU
125e0 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72  E, 2==UNKNOWN or
125f0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76   NULL */.  int v
12600 32 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f  2;    /* Right o
12610 70 65 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45  perand: 0==FALSE
12620 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e  , 1==TRUE, 2==UN
12630 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f  KNOWN or NULL */
12640 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
12650 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28  [pOp->p1];.  if(
12660 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
12670 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76  EM_Null ){.    v
12680 31 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1 = 2;.  }else{.
12690 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
126a0 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
126b0 31 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 70 49 6e  1)!=0;.  }.  pIn
126c0 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
126d0 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e 32 2d 3e  2];.  if( pIn2->
126e0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
126f0 20 29 7b 0a 20 20 20 20 76 32 20 3d 20 32 3b 0a   ){.    v2 = 2;.
12700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 32 20    }else{.    v2 
12710 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
12720 56 61 6c 75 65 28 70 49 6e 32 29 21 3d 30 3b 0a  Value(pIn2)!=0;.
12730 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f    }.  if( pOp->o
12740 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b  pcode==OP_And ){
12750 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
12760 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
12770 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20  and_logic[] = { 
12780 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32  0, 0, 0, 0, 1, 2
12790 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20  , 0, 2, 2 };.   
127a0 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b   v1 = and_logic[
127b0 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73  v1*3+v2];.  }els
127c0 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
127d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
127e0 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b  r or_logic[] = {
127f0 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20   0, 1, 2, 1, 1, 
12800 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20  1, 2, 1, 2 };.  
12810 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b    v1 = or_logic[
12820 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20  v1*3+v2];.  }.  
12830 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
12840 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d  ->p3];.  if( v1=
12850 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74  =2 ){.    MemSet
12860 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
12870 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73  EM_Null);.  }els
12880 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  e{.    pOut->u.i
12890 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65   = v1;.    MemSe
128a0 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
128b0 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20  MEM_Int);.  }.  
128c0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
128d0 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50 32 20 2a  ode: Not P1 P2 *
128e0 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
128f0 3a 20 72 5b 50 32 5d 3d 20 21 72 5b 50 31 5d 0a  : r[P2]= !r[P1].
12900 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  **.** Interpret 
12910 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
12920 69 73 74 65 72 20 50 31 20 61 73 20 61 20 62 6f  ister P1 as a bo
12930 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 53 74  olean value.  St
12940 6f 72 65 20 74 68 65 0a 2a 2a 20 62 6f 6f 6c 65  ore the.** boole
12950 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  an complement in
12960 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49   register P2.  I
12970 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
12980 65 67 69 73 74 65 72 20 50 31 20 69 73 20 0a 2a  egister P1 is .*
12990 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 4e  * NULL, then a N
129a0 55 4c 4c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ULL is stored in
129b0 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
129c0 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  Not: {          
129d0 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
129e0 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75   TK_NOT, in1, ou
129f0 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
12a00 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
12a10 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
12a20 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65  p->p2];.  sqlite
12a30 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
12a40 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 28 70 49  pOut);.  if( (pI
12a50 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
12a60 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Null)==0 ){.    
12a70 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
12a80 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d  M_Int;.    pOut-
12a90 3e 75 2e 69 20 3d 20 21 73 71 6c 69 74 65 33 56  >u.i = !sqlite3V
12aa0 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
12ab0 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
12ac0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
12ad0 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  tNot P1 P2 * * *
12ae0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
12af0 50 31 5d 3d 20 7e 72 5b 50 31 5d 0a 2a 2a 0a 2a  P1]= ~r[P1].**.*
12b00 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
12b10 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
12b20 74 65 72 20 50 31 20 61 73 20 61 6e 20 69 6e 74  ter P1 as an int
12b30 65 67 65 72 2e 20 20 53 74 6f 72 65 20 74 68 65  eger.  Store the
12b40 0a 2a 2a 20 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d  .** ones-complem
12b50 65 6e 74 20 6f 66 20 74 68 65 20 50 31 20 76 61  ent of the P1 va
12b60 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  lue into registe
12b70 72 20 50 32 2e 20 20 49 66 20 50 31 20 68 6f 6c  r P2.  If P1 hol
12b80 64 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 68 65  ds.** a NULL the
12b90 6e 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69  n store a NULL i
12ba0 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  n P2..*/.case OP
12bb0 5f 42 69 74 4e 6f 74 3a 20 7b 20 20 20 20 20 20  _BitNot: {      
12bc0 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
12bd0 73 20 54 4b 5f 42 49 54 4e 4f 54 2c 20 69 6e 31  s TK_BITNOT, in1
12be0 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31  , out2 */.  pIn1
12bf0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
12c00 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
12c10 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71  m[pOp->p2];.  sq
12c20 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
12c30 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 69 66 28  ull(pOut);.  if(
12c40 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
12c50 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  MEM_Null)==0 ){.
12c60 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20      pOut->flags 
12c70 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
12c80 4f 75 74 2d 3e 75 2e 69 20 3d 20 7e 73 71 6c 69  Out->u.i = ~sqli
12c90 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
12ca0 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65  pIn1);.  }.  bre
12cb0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
12cc0 3a 20 4f 6e 63 65 20 50 31 20 50 32 20 2a 20 2a  : Once P1 P2 * *
12cd0 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20   *.**.** If the 
12ce0 50 31 20 76 61 6c 75 65 20 69 73 20 65 71 75 61  P1 value is equa
12cf0 6c 20 74 6f 20 74 68 65 20 50 31 20 76 61 6c 75  l to the P1 valu
12d00 65 20 6f 6e 20 74 68 65 20 4f 50 5f 49 6e 69 74  e on the OP_Init
12d10 20 6f 70 63 6f 64 65 20 61 74 0a 2a 2a 20 69 6e   opcode at.** in
12d20 73 74 72 75 63 74 69 6f 6e 20 30 2c 20 74 68 65  struction 0, the
12d30 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 49  n jump to P2.  I
12d40 66 20 74 68 65 20 74 77 6f 20 50 31 20 76 61 6c  f the two P1 val
12d50 75 65 73 20 64 69 66 66 65 72 2c 20 74 68 65 6e  ues differ, then
12d60 0a 2a 2a 20 73 65 74 20 74 68 65 20 50 31 20 76  .** set the P1 v
12d70 61 6c 75 65 20 6f 6e 20 74 68 69 73 20 6f 70 63  alue on this opc
12d80 6f 64 65 20 74 6f 20 65 71 75 61 6c 20 74 68 65  ode to equal the
12d90 20 50 31 20 76 61 6c 75 65 20 6f 6e 20 74 68 65   P1 value on the
12da0 20 4f 50 5f 49 6e 69 74 0a 2a 2a 20 61 6e 64 20   OP_Init.** and 
12db0 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  fall through..*/
12dc0 0a 63 61 73 65 20 4f 50 5f 4f 6e 63 65 3a 20 7b  .case OP_Once: {
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12de0 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74  jump */.  assert
12df0 28 20 70 2d 3e 61 4f 70 5b 30 5d 2e 6f 70 63 6f  ( p->aOp[0].opco
12e00 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20  de==OP_Init );. 
12e10 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
12e20 28 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3d 3d 70  (p->aOp[0].p1==p
12e30 4f 70 2d 3e 70 31 2c 20 32 29 3b 0a 20 20 69 66  Op->p1, 2);.  if
12e40 28 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3d 3d  ( p->aOp[0].p1==
12e50 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 67  pOp->p1 ){.    g
12e60 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
12e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f 70    }else{.    pOp
12e80 2d 3e 70 31 20 3d 20 70 2d 3e 61 4f 70 5b 30 5d  ->p1 = p->aOp[0]
12e90 2e 70 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  .p1;.  }.  break
12ea0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
12eb0 49 66 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  If P1 P2 P3 * *.
12ec0 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32  **.** Jump to P2
12ed0 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   if the value in
12ee0 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
12ef0 74 72 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65  true.  The value
12f00 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
12f10 64 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  d true if it is 
12f20 6e 75 6d 65 72 69 63 20 61 6e 64 20 6e 6f 6e 2d  numeric and non-
12f30 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 76 61  zero.  If the va
12f40 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20  lue.** in P1 is 
12f50 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20 74  NULL then take t
12f60 68 65 20 6a 75 6d 70 20 69 66 20 61 6e 64 20 6f  he jump if and o
12f70 6e 6c 79 20 69 66 20 50 33 20 69 73 20 6e 6f 6e  nly if P3 is non
12f80 2d 7a 65 72 6f 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  -zero..*/./* Opc
12f90 6f 64 65 3a 20 49 66 4e 6f 74 20 50 31 20 50 32  ode: IfNot P1 P2
12fa0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75   P3 * *.**.** Ju
12fb0 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
12fc0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
12fd0 72 20 50 31 20 69 73 20 46 61 6c 73 65 2e 20 20  r P1 is False.  
12fe0 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  The value.** is 
12ff0 63 6f 6e 73 69 64 65 72 65 64 20 66 61 6c 73 65  considered false
13000 20 69 66 20 69 74 20 68 61 73 20 61 20 6e 75 6d   if it has a num
13010 65 72 69 63 20 76 61 6c 75 65 20 6f 66 20 7a 65  eric value of ze
13020 72 6f 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  ro.  If the valu
13030 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 4e 55  e.** in P1 is NU
13040 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65  LL then take the
13050 20 6a 75 6d 70 20 69 66 20 61 6e 64 20 6f 6e 6c   jump if and onl
13060 79 20 69 66 20 50 33 20 69 73 20 6e 6f 6e 2d 7a  y if P3 is non-z
13070 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ero..*/.case OP_
13080 49 66 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  If:             
13090 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
130a0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f   */.case OP_IfNo
130b0 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
130c0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
130d0 20 20 69 6e 74 20 63 3b 0a 20 20 70 49 6e 31 20    int c;.  pIn1 
130e0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
130f0 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c  ;.  if( pIn1->fl
13100 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
13110 7b 0a 20 20 20 20 63 20 3d 20 70 4f 70 2d 3e 70  {.    c = pOp->p
13120 33 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64  3;.  }else{.#ifd
13130 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
13140 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
13150 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
13160 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21  eIntValue(pIn1)!
13170 3d 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 20  =0;.#else.    c 
13180 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61  = sqlite3VdbeRea
13190 6c 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 2e  lValue(pIn1)!=0.
131a0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  0;.#endif.    if
131b0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
131c0 50 5f 49 66 4e 6f 74 20 29 20 63 20 3d 20 21 63  P_IfNot ) c = !c
131d0 3b 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61 6e  ;.  }.  VdbeBran
131e0 63 68 54 61 6b 65 6e 28 63 21 3d 30 2c 20 32 29  chTaken(c!=0, 2)
131f0 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
13200 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
13210 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
13220 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73 4e  ../* Opcode: IsN
13230 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ull P1 P2 * * *.
13240 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20  ** Synopsis: if 
13250 72 5b 50 31 5d 3d 3d 4e 55 4c 4c 20 67 6f 74 6f  r[P1]==NULL goto
13260 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74   P2.**.** Jump t
13270 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75  o P2 if the valu
13280 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
13290 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73   is NULL..*/.cas
132a0 65 20 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20 20  e OP_IsNull: {  
132b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
132c0 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20  e as TK_ISNULL, 
132d0 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70  jump, in1 */.  p
132e0 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
132f0 3e 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61 6e  >p1];.  VdbeBran
13300 63 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d 3e  chTaken( (pIn1->
13310 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
13320 29 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20  )!=0, 2);.  if( 
13330 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
13340 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a 20  EM_Null)!=0 ){. 
13350 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
13360 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
13370 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
13380 6f 74 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a  otNull P1 P2 * *
13390 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
133a0 69 66 20 72 5b 50 31 5d 21 3d 4e 55 4c 4c 20 67  if r[P1]!=NULL g
133b0 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d  oto P2.**.** Jum
133c0 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76  p to P2 if the v
133d0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
133e0 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   P1 is not NULL.
133f0 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f    .*/.case OP_No
13400 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20  tNull: {        
13410 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
13420 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70 2c  K_NOTNULL, jump,
13430 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
13440 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
13450 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
13460 65 6e 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  en( (pIn1->flags
13470 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 2c   & MEM_Null)==0,
13480 20 32 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31   2);.  if( (pIn1
13490 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
134a0 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ll)==0 ){.    go
134b0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
134c0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
134d0 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e  * Opcode: Column
134e0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
134f0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
13500 33 5d 3d 50 58 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  3]=PX.**.** Inte
13510 72 70 72 65 74 20 74 68 65 20 64 61 74 61 20 74  rpret the data t
13520 68 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f  hat cursor P1 po
13530 69 6e 74 73 20 74 6f 20 61 73 20 61 20 73 74 72  ints to as a str
13540 75 63 74 75 72 65 20 62 75 69 6c 74 20 75 73 69  ucture built usi
13550 6e 67 0a 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65  ng.** the MakeRe
13560 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  cord instruction
13570 2e 20 20 28 53 65 65 20 74 68 65 20 4d 61 6b 65  .  (See the Make
13580 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f  Record opcode fo
13590 72 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  r additional.** 
135a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
135b0 74 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20  t the format of 
135c0 74 68 65 20 64 61 74 61 2e 29 20 20 45 78 74 72  the data.)  Extr
135d0 61 63 74 20 74 68 65 20 50 32 2d 74 68 20 63 6f  act the P2-th co
135e0 6c 75 6d 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69  lumn.** from thi
135f0 73 20 72 65 63 6f 72 64 2e 20 20 49 66 20 74 68  s record.  If th
13600 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
13610 74 20 28 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c  t (P2+1) .** val
13620 75 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ues in the recor
13630 64 2c 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c  d, extract a NUL
13640 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  L..**.** The val
13650 75 65 20 65 78 74 72 61 63 74 65 64 20 69 73 20  ue extracted is 
13660 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
13670 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P3..**.** If 
13680 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
13690 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 50  ins fewer than P
136a0 32 20 66 69 65 6c 64 73 2c 20 74 68 65 6e 20 65  2 fields, then e
136b0 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20  xtract a NULL.  
136c0 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 50 34  Or,.** if the P4
136d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 50   argument is a P
136e0 34 5f 4d 45 4d 20 75 73 65 20 74 68 65 20 76 61  4_MEM use the va
136f0 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 61 72  lue of the P4 ar
13700 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65  gument as.** the
13710 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49   result..**.** I
13720 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45  f the OPFLAG_CLE
13730 41 52 43 41 43 48 45 20 62 69 74 20 69 73 20 73  ARCACHE bit is s
13740 65 74 20 6f 6e 20 50 35 20 61 6e 64 20 50 31 20  et on P5 and P1 
13750 69 73 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c  is a pseudo-tabl
13760 65 20 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65  e cursor,.** the
13770 6e 20 74 68 65 20 63 61 63 68 65 20 6f 66 20 74  n the cache of t
13780 68 65 20 63 75 72 73 6f 72 20 69 73 20 72 65 73  he cursor is res
13790 65 74 20 70 72 69 6f 72 20 74 6f 20 65 78 74 72  et prior to extr
137a0 61 63 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  acting the colum
137b0 6e 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  n..** The first 
137c0 4f 50 5f 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73  OP_Column agains
137d0 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  t a pseudo-table
137e0 20 61 66 74 65 72 20 74 68 65 20 76 61 6c 75 65   after the value
137f0 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a   of the content.
13800 2a 2a 20 72 65 67 69 73 74 65 72 20 68 61 73 20  ** register has 
13810 63 68 61 6e 67 65 64 20 73 68 6f 75 6c 64 20 68  changed should h
13820 61 76 65 20 74 68 69 73 20 62 69 74 20 73 65 74  ave this bit set
13830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
13840 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
13850 61 6e 64 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  and OPFLAG_TYPEO
13860 46 41 52 47 20 62 69 74 73 20 61 72 65 20 73 65  FARG bits are se
13870 74 20 6f 6e 20 50 35 20 77 68 65 6e 0a 2a 2a 20  t on P5 when.** 
13880 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75  the result is gu
13890 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79  aranteed to only
138a0 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
138b0 61 72 67 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65  argument of a le
138c0 6e 67 74 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70  ngth().** or typ
138d0 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20  eof() function, 
138e0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54  respectively.  T
138f0 68 65 20 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61  he loading of la
13900 72 67 65 20 62 6c 6f 62 73 20 63 61 6e 20 62 65  rge blobs can be
13910 0a 2a 2a 20 73 6b 69 70 70 65 64 20 66 6f 72 20  .** skipped for 
13920 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 61 6c 6c  length() and all
13930 20 63 6f 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67   content loading
13940 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 20   can be skipped 
13950 66 6f 72 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f  for typeof()..*/
13960 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a  .case OP_Column:
13970 20 7b 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20   {.  int p2;    
13980 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d          /* colum
13990 6e 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 74 72  n number to retr
139a0 69 65 76 65 20 2a 2f 0a 20 20 56 64 62 65 43 75  ieve */.  VdbeCu
139b0 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20  rsor *pC;    /* 
139c0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
139d0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
139e0 43 72 73 72 3b 20 20 20 2f 2a 20 54 68 65 20 42  Crsr;   /* The B
139f0 54 72 65 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20  Tree cursor */. 
13a00 20 75 33 32 20 2a 61 4f 66 66 73 65 74 3b 20 20   u32 *aOffset;  
13a10 20 20 20 20 2f 2a 20 61 4f 66 66 73 65 74 5b 69      /* aOffset[i
13a20 5d 20 69 73 20 6f 66 66 73 65 74 20 74 6f 20 73  ] is offset to s
13a30 74 61 72 74 20 6f 66 20 64 61 74 61 20 66 6f 72  tart of data for
13a40 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   i-th column */.
13a50 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20    int len;      
13a60 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67       /* The leng
13a70 74 68 20 6f 66 20 74 68 65 20 73 65 72 69 61 6c  th of the serial
13a80 69 7a 65 64 20 64 61 74 61 20 66 6f 72 20 74 68  ized data for th
13a90 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
13aa0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
13ab0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
13ac0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74   */.  Mem *pDest
13ad0 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ;        /* Wher
13ae0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 65  e to write the e
13af0 78 74 72 61 63 74 65 64 20 76 61 6c 75 65 20 2a  xtracted value *
13b00 2f 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20  /.  Mem sMem;   
13b10 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74         /* For st
13b20 6f 72 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  oring the record
13b30 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
13b40 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 44  /.  const u8 *zD
13b50 61 74 61 3b 20 20 20 2f 2a 20 50 61 72 74 20 6f  ata;   /* Part o
13b60 66 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69  f the record bei
13b70 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
13b80 63 6f 6e 73 74 20 75 38 20 2a 7a 48 64 72 3b 20  const u8 *zHdr; 
13b90 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 70 61 72     /* Next unpar
13ba0 73 65 64 20 62 79 74 65 20 6f 66 20 74 68 65 20  sed byte of the 
13bb0 68 65 61 64 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  header */.  cons
13bc0 74 20 75 38 20 2a 7a 45 6e 64 48 64 72 3b 20 2f  t u8 *zEndHdr; /
13bd0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
13be0 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
13bf0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
13c00 32 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  2 offset;       
13c10 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
13c20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 36  the data */.  u6
13c30 34 20 6f 66 66 73 65 74 36 34 3b 20 20 20 20 20  4 offset64;     
13c40 20 2f 2a 20 36 34 2d 62 69 74 20 6f 66 66 73 65   /* 64-bit offse
13c50 74 20 2a 2f 0a 20 20 75 33 32 20 61 76 61 69 6c  t */.  u32 avail
13c60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
13c70 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
13c80 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 20 2a  available data *
13c90 2f 0a 20 20 75 33 32 20 74 3b 20 20 20 20 20 20  /.  u32 t;      
13ca0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 79 70 65         /* A type
13cb0 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 72   code from the r
13cc0 65 63 6f 72 64 20 68 65 61 64 65 72 20 2a 2f 0a  ecord header */.
13cd0 20 20 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20 20    Mem *pReg;    
13ce0 20 20 20 20 20 2f 2a 20 50 73 65 75 64 6f 54 61       /* PseudoTa
13cf0 62 6c 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  ble input regist
13d00 65 72 20 2a 2f 0a 0a 20 20 70 43 20 3d 20 70 2d  er */..  pC = p-
13d10 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
13d20 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
13d30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
13d40 72 73 6f 72 20 63 61 63 68 65 20 69 73 20 73 74  rsor cache is st
13d50 61 6c 65 2c 20 62 72 69 6e 67 20 69 74 20 75 70  ale, bring it up
13d60 2d 74 6f 2d 64 61 74 65 20 2a 2f 0a 20 20 72 63  -to-date */.  rc
13d70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
13d80 72 73 6f 72 4d 6f 76 65 74 6f 28 26 70 43 2c 20  rsorMoveto(&pC, 
13d90 26 70 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29  &p2);.  if( rc )
13da0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
13db0 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73  to_error;..  ass
13dc0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
13dd0 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  & pOp->p3<=(p->n
13de0 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
13df0 6f 72 29 20 29 3b 0a 20 20 70 44 65 73 74 20 3d  or) );.  pDest =
13e00 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
13e10 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
13e20 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20  nge(p, pDest);. 
13e30 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
13e40 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
13e50 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
13e60 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
13e70 20 20 61 73 73 65 72 74 28 20 70 32 3c 70 43 2d    assert( p2<pC-
13e80 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20 61 4f 66  >nField );.  aOf
13e90 66 73 65 74 20 3d 20 70 43 2d 3e 61 4f 66 66 73  fset = pC->aOffs
13ea0 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  et;.  assert( pC
13eb0 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54  ->eCurType!=CURT
13ec0 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  YPE_VTAB );.  as
13ed0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
13ee0 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53 45 55  pe!=CURTYPE_PSEU
13ef0 44 4f 20 7c 7c 20 70 43 2d 3e 6e 75 6c 6c 52 6f  DO || pC->nullRo
13f00 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
13f10 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52  C->eCurType!=CUR
13f20 54 59 50 45 5f 53 4f 52 54 45 52 20 29 3b 0a 20  TYPE_SORTER );. 
13f30 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e   pCrsr = pC->uc.
13f40 70 43 75 72 73 6f 72 3b 0a 0a 20 20 69 66 28 20  pCursor;..  if( 
13f50 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 21  pC->cacheStatus!
13f60 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 20  =p->cacheCtr ){ 
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f80 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
13f90 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 69 66 28  -FALSE*/.    if(
13fa0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a   pC->nullRow ){.
13fb0 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 65 43        if( pC->eC
13fc0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
13fd0 50 53 45 55 44 4f 20 29 7b 0a 20 20 20 20 20 20  PSEUDO ){.      
13fe0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63    assert( pC->uc
13ff0 2e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3e  .pseudoTableReg>
14000 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  0 );.        pRe
14010 67 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 75 63  g = &aMem[pC->uc
14020 2e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 5d  .pseudoTableReg]
14030 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14040 28 20 70 52 65 67 2d 3e 66 6c 61 67 73 20 26 20  ( pReg->flags & 
14050 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
14060 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
14070 73 56 61 6c 69 64 28 70 52 65 67 29 20 29 3b 0a  sValid(pReg) );.
14080 20 20 20 20 20 20 20 20 70 43 2d 3e 70 61 79 6c          pC->payl
14090 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e 73 7a  oadSize = pC->sz
140a0 52 6f 77 20 3d 20 61 76 61 69 6c 20 3d 20 70 52  Row = avail = pR
140b0 65 67 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 70  eg->n;.        p
140c0 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29 70  C->aRow = (u8*)p
140d0 52 65 67 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Reg->z;.      }e
140e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
140f0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
14100 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  ll(pDest);.     
14110 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d     goto op_colum
14120 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  n_out;.      }. 
14130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14140 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
14150 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
14160 52 45 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REE );.      ass
14170 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20  ert( pCrsr );.  
14180 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14190 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
141a0 56 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a  Valid(pCrsr) );.
141b0 20 20 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61        pC->payloa
141c0 64 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 42  dSize = sqlite3B
141d0 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28  treePayloadSize(
141e0 70 43 72 73 72 29 3b 0a 20 20 20 20 20 20 70 43  pCrsr);.      pC
141f0 2d 3e 61 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ->aRow = sqlite3
14200 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63  BtreePayloadFetc
14210 68 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c 29  h(pCrsr, &avail)
14220 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14230 61 76 61 69 6c 3c 3d 36 35 35 33 36 20 29 3b 20  avail<=65536 ); 
14240 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 61 67 65   /* Maximum page
14250 20 73 69 7a 65 20 69 73 20 36 34 4b 69 42 20 2a   size is 64KiB *
14260 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e  /.      if( pC->
14270 70 61 79 6c 6f 61 64 53 69 7a 65 20 3c 3d 20 28  payloadSize <= (
14280 75 33 32 29 61 76 61 69 6c 20 29 7b 0a 20 20 20  u32)avail ){.   
14290 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20 3d       pC->szRow =
142a0 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65   pC->payloadSize
142b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
142c0 28 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a  ( pC->payloadSiz
142d0 65 20 3e 20 28 75 33 32 29 64 62 2d 3e 61 4c 69  e > (u32)db->aLi
142e0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
142f0 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
14300 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
14310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14320 20 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77         pC->szRow
14330 20 3d 20 61 76 61 69 6c 3b 0a 20 20 20 20 20 20   = avail;.      
14340 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e  }.    }.    pC->
14350 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 70 2d  cacheStatus = p-
14360 3e 63 61 63 68 65 43 74 72 3b 0a 20 20 20 20 70  >cacheCtr;.    p
14370 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3d 20  C->iHdrOffset = 
14380 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 2d 3e  getVarint32(pC->
14390 61 52 6f 77 2c 20 6f 66 66 73 65 74 29 3b 0a 20  aRow, offset);. 
143a0 20 20 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65     pC->nHdrParse
143b0 64 20 3d 20 30 3b 0a 20 20 20 20 61 4f 66 66 73  d = 0;.    aOffs
143c0 65 74 5b 30 5d 20 3d 20 6f 66 66 73 65 74 3b 0a  et[0] = offset;.
143d0 0a 0a 20 20 20 20 69 66 28 20 61 76 61 69 6c 3c  ..    if( avail<
143e0 6f 66 66 73 65 74 20 29 7b 20 20 20 20 20 20 2f  offset ){      /
143f0 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
14400 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 20 20 2f  -FALSE*/.      /
14410 2a 20 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73 20  * pC->aRow does 
14420 6e 6f 74 20 68 61 76 65 20 74 6f 20 68 6f 6c 64  not have to hold
14430 20 74 68 65 20 65 6e 74 69 72 65 20 72 6f 77 2c   the entire row,
14440 20 62 75 74 20 69 74 20 64 6f 65 73 20 61 74 20   but it does at 
14450 6c 65 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 6e  least.      ** n
14460 65 65 64 20 74 6f 20 63 6f 76 65 72 20 74 68 65  eed to cover the
14470 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 72   header of the r
14480 65 63 6f 72 64 2e 20 20 49 66 20 70 43 2d 3e 61  ecord.  If pC->a
14490 52 6f 77 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  Row does not con
144a0 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  tain.      ** th
144b0 65 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  e complete heade
144c0 72 2c 20 74 68 65 6e 20 73 65 74 20 69 74 20 74  r, then set it t
144d0 6f 20 7a 65 72 6f 2c 20 66 6f 72 63 69 6e 67 20  o zero, forcing 
144e0 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 62 65  the header to be
144f0 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69  .      ** dynami
14500 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e  cally allocated.
14510 20 2a 2f 0a 20 20 20 20 20 20 70 43 2d 3e 61 52   */.      pC->aR
14520 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  ow = 0;.      pC
14530 2d 3e 73 7a 52 6f 77 20 3d 20 30 3b 0a 0a 20 20  ->szRow = 0;..  
14540 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
14550 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
14560 61 73 65 20 68 61 73 20 6e 6f 74 20 67 69 76 65  ase has not give
14570 6e 20 75 73 20 61 6e 20 6f 76 65 72 73 69 7a 65  n us an oversize
14580 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 2a   header..      *
14590 2a 20 44 6f 20 74 68 69 73 20 6e 6f 77 20 74 6f  * Do this now to
145a0 20 61 76 6f 69 64 20 61 6e 20 6f 76 65 72 73 69   avoid an oversi
145b0 7a 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ze memory alloca
145c0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tion..      **. 
145d0 20 20 20 20 20 2a 2a 20 54 79 70 65 20 65 6e 74       ** Type ent
145e0 72 69 65 73 20 63 61 6e 20 62 65 20 62 65 74 77  ries can be betw
145f0 65 65 6e 20 31 20 61 6e 64 20 35 20 62 79 74 65  een 1 and 5 byte
14600 73 20 65 61 63 68 2e 20 20 42 75 74 20 34 20 61  s each.  But 4 a
14610 6e 64 20 35 20 62 79 74 65 0a 20 20 20 20 20 20  nd 5 byte.      
14620 2a 2a 20 74 79 70 65 73 20 75 73 65 20 73 6f 20  ** types use so 
14630 6d 75 63 68 20 64 61 74 61 20 73 70 61 63 65 20  much data space 
14640 74 68 61 74 20 74 68 65 72 65 20 63 61 6e 20 6f  that there can o
14650 6e 6c 79 20 62 65 20 34 30 39 36 20 61 6e 64 20  nly be 4096 and 
14660 33 32 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  32 of.      ** t
14670 68 65 6d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  hem, respectivel
14680 79 2e 20 20 53 6f 20 74 68 65 20 6d 61 78 69 6d  y.  So the maxim
14690 75 6d 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  um header length
146a0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 0a   results from a.
146b0 20 20 20 20 20 20 2a 2a 20 33 2d 62 79 74 65 20        ** 3-byte 
146c0 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 6f 66  type for each of
146d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
146e0 33 32 37 36 38 20 63 6f 6c 75 6d 6e 73 20 70 6c  32768 columns pl
146f0 75 73 20 74 68 72 65 65 0a 20 20 20 20 20 20 2a  us three.      *
14700 2a 20 65 78 74 72 61 20 62 79 74 65 73 20 66 6f  * extra bytes fo
14710 72 20 74 68 65 20 68 65 61 64 65 72 20 6c 65 6e  r the header len
14720 67 74 68 20 69 74 73 65 6c 66 2e 20 20 33 32 37  gth itself.  327
14730 36 38 2a 33 20 2b 20 33 20 3d 20 39 38 33 30 37  68*3 + 3 = 98307
14740 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14750 20 69 66 28 20 6f 66 66 73 65 74 20 3e 20 39 38   if( offset > 98
14760 33 30 37 20 7c 7c 20 6f 66 66 73 65 74 20 3e 20  307 || offset > 
14770 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20  pC->payloadSize 
14780 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14790 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
147a0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
147b0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
147c0 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rror;.      }.  
147d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 66 66 73    }else if( offs
147e0 65 74 3e 30 20 29 7b 20 2f 2a 4f 50 54 49 4d 49  et>0 ){ /*OPTIMI
147f0 5a 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f  ZATION-IF-TRUE*/
14800 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
14810 6c 6c 6f 77 69 6e 67 20 67 6f 74 6f 20 69 73 20  llowing goto is 
14820 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
14830 20 20 49 74 20 63 61 6e 20 62 65 20 6f 6d 69 74    It can be omit
14840 74 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ted and.      **
14850 20 65 76 65 72 79 74 68 69 6e 67 20 77 69 6c 6c   everything will
14860 20 73 74 69 6c 6c 20 77 6f 72 6b 2e 20 20 42 75   still work.  Bu
14870 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 69 73 20 6d  t OP_Column is m
14880 65 61 73 75 72 61 62 6c 79 20 66 61 73 74 65 72  easurably faster
14890 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 73 6b 69  .      ** by ski
148a0 70 70 69 6e 67 20 74 68 65 20 73 75 62 73 65 71  pping the subseq
148b0 75 65 6e 74 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  uent conditional
148c0 2c 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79  , which is alway
148d0 73 20 74 72 75 65 2e 0a 20 20 20 20 20 20 2a 2f  s true..      */
148e0 0a 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 70  .      zData = p
148f0 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20 20 61  C->aRow;.      a
14900 73 73 65 72 74 28 20 70 43 2d 3e 6e 48 64 72 50  ssert( pC->nHdrP
14910 61 72 73 65 64 3c 3d 70 32 20 29 3b 20 20 20 20  arsed<=p2 );    
14920 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
14930 6e 61 6c 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20  nal skipped */. 
14940 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c       goto op_col
14950 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65 72 3b  umn_read_header;
14960 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14970 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
14980 61 73 74 20 74 68 65 20 66 69 72 73 74 20 70 32  ast the first p2
14990 2b 31 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  +1 entries of th
149a0 65 20 68 65 61 64 65 72 20 68 61 76 65 20 62 65  e header have be
149b0 65 6e 0a 20 20 2a 2a 20 70 61 72 73 65 64 20 61  en.  ** parsed a
149c0 6e 64 20 76 61 6c 69 64 20 69 6e 66 6f 72 6d 61  nd valid informa
149d0 74 69 6f 6e 20 69 73 20 69 6e 20 61 4f 66 66 73  tion is in aOffs
149e0 65 74 5b 5d 20 61 6e 64 20 70 43 2d 3e 61 54 79  et[] and pC->aTy
149f0 70 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pe[]..  */.  if(
14a00 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c   pC->nHdrParsed<
14a10 3d 70 32 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  =p2 ){.    /* If
14a20 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 68   there is more h
14a30 65 61 64 65 72 20 61 76 61 69 6c 61 62 6c 65 20  eader available 
14a40 66 6f 72 20 70 61 72 73 69 6e 67 20 69 6e 20 74  for parsing in t
14a50 68 65 20 72 65 63 6f 72 64 2c 20 74 72 79 0a 20  he record, try. 
14a60 20 20 20 2a 2a 20 74 6f 20 65 78 74 72 61 63 74     ** to extract
14a70 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 69 65 6c   additional fiel
14a80 64 73 20 75 70 20 74 68 72 6f 75 67 68 20 74 68  ds up through th
14a90 65 20 70 32 2b 31 2d 74 68 20 66 69 65 6c 64 20  e p2+1-th field 
14aa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14ab0 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 3c 61  pC->iHdrOffset<a
14ac0 4f 66 66 73 65 74 5b 30 5d 20 29 7b 0a 20 20 20  Offset[0] ){.   
14ad0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
14ae0 7a 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20  zData points to 
14af0 65 6e 6f 75 67 68 20 6f 66 20 74 68 65 20 72 65  enough of the re
14b00 63 6f 72 64 20 74 6f 20 63 6f 76 65 72 20 74 68  cord to cover th
14b10 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
14b20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d     if( pC->aRow=
14b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
14b40 6d 73 65 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73  mset(&sMem, 0, s
14b50 69 7a 65 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20  izeof(sMem));.  
14b60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14b70 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
14b80 65 65 28 70 43 72 73 72 2c 20 30 2c 20 61 4f 66  ee(pCrsr, 0, aOf
14b90 66 73 65 74 5b 30 5d 2c 20 21 70 43 2d 3e 69 73  fset[0], !pC->is
14ba0 54 61 62 6c 65 2c 20 26 73 4d 65 6d 29 3b 0a 20  Table, &sMem);. 
14bb0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
14bc0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
14bd0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
14be0 6f 72 3b 0a 20 20 20 20 20 20 20 20 7a 44 61 74  or;.        zDat
14bf0 61 20 3d 20 28 75 38 2a 29 73 4d 65 6d 2e 7a 3b  a = (u8*)sMem.z;
14c00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14c10 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 70 43        zData = pC
14c20 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20 20 7d 0a  ->aRow;.      }.
14c30 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c    .      /* Fill
14c40 20 69 6e 20 70 43 2d 3e 61 54 79 70 65 5b 69 5d   in pC->aType[i]
14c50 20 61 6e 64 20 61 4f 66 66 73 65 74 5b 69 5d 20   and aOffset[i] 
14c60 76 61 6c 75 65 73 20 74 68 72 6f 75 67 68 20 74  values through t
14c70 68 65 20 70 32 2d 74 68 20 66 69 65 6c 64 2e 20  he p2-th field. 
14c80 2a 2f 0a 20 20 20 20 6f 70 5f 63 6f 6c 75 6d 6e  */.    op_column
14c90 5f 72 65 61 64 5f 68 65 61 64 65 72 3a 0a 20 20  _read_header:.  
14ca0 20 20 20 20 69 20 3d 20 70 43 2d 3e 6e 48 64 72      i = pC->nHdr
14cb0 50 61 72 73 65 64 3b 0a 20 20 20 20 20 20 6f 66  Parsed;.      of
14cc0 66 73 65 74 36 34 20 3d 20 61 4f 66 66 73 65 74  fset64 = aOffset
14cd0 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 48 64 72 20  [i];.      zHdr 
14ce0 3d 20 7a 44 61 74 61 20 2b 20 70 43 2d 3e 69 48  = zData + pC->iH
14cf0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
14d00 7a 45 6e 64 48 64 72 20 3d 20 7a 44 61 74 61 20  zEndHdr = zData 
14d10 2b 20 61 4f 66 66 73 65 74 5b 30 5d 3b 0a 20 20  + aOffset[0];.  
14d20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
14d30 69 66 28 20 28 74 20 3d 20 7a 48 64 72 5b 30 5d  if( (t = zHdr[0]
14d40 29 3c 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20  )<0x80 ){.      
14d50 20 20 20 20 7a 48 64 72 2b 2b 3b 0a 20 20 20 20      zHdr++;.    
14d60 20 20 20 20 20 20 6f 66 66 73 65 74 36 34 20 2b        offset64 +
14d70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65  = sqlite3VdbeOne
14d80 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65  ByteSerialTypeLe
14d90 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  n(t);.        }e
14da0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
14db0 48 64 72 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Hdr += sqlite3Ge
14dc0 74 56 61 72 69 6e 74 33 32 28 7a 48 64 72 2c 20  tVarint32(zHdr, 
14dd0 26 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  &t);.          o
14de0 66 66 73 65 74 36 34 20 2b 3d 20 73 71 6c 69 74  ffset64 += sqlit
14df0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14e00 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20  Len(t);.        
14e10 7d 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 61 54  }.        pC->aT
14e20 79 70 65 5b 69 2b 2b 5d 20 3d 20 74 3b 0a 20 20  ype[i++] = t;.  
14e30 20 20 20 20 20 20 61 4f 66 66 73 65 74 5b 69 5d        aOffset[i]
14e40 20 3d 20 28 75 33 32 29 28 6f 66 66 73 65 74 36   = (u32)(offset6
14e50 34 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  4 & 0xffffffff);
14e60 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 69  .      }while( i
14e70 3c 3d 70 32 20 26 26 20 7a 48 64 72 3c 7a 45 6e  <=p2 && zHdr<zEn
14e80 64 48 64 72 20 29 3b 0a 0a 20 20 20 20 20 20 2f  dHdr );..      /
14e90 2a 20 54 68 65 20 72 65 63 6f 72 64 20 69 73 20  * The record is 
14ea0 63 6f 72 72 75 70 74 20 69 66 20 61 6e 79 20 6f  corrupt if any o
14eb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
14ec0 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
14ed0 2a 2a 20 28 31 29 20 74 68 65 20 62 79 74 65 73  ** (1) the bytes
14ee0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 65   of the header e
14ef0 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 64  xtend past the d
14f00 65 63 6c 61 72 65 64 20 68 65 61 64 65 72 20 73  eclared header s
14f10 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 28 32 29  ize.      ** (2)
14f20 20 74 68 65 20 65 6e 74 69 72 65 20 68 65 61 64   the entire head
14f30 65 72 20 77 61 73 20 75 73 65 64 20 62 75 74 20  er was used but 
14f40 6e 6f 74 20 61 6c 6c 20 64 61 74 61 20 77 61 73  not all data was
14f50 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 28   used.      ** (
14f60 33 29 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  3) the end of th
14f70 65 20 64 61 74 61 20 65 78 74 65 6e 64 73 20 62  e data extends b
14f80 65 79 6f 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  eyond the end of
14f90 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20   the record..   
14fa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14fb0 28 7a 48 64 72 3e 3d 7a 45 6e 64 48 64 72 20 26  (zHdr>=zEndHdr &
14fc0 26 20 28 7a 48 64 72 3e 7a 45 6e 64 48 64 72 20  & (zHdr>zEndHdr 
14fd0 7c 7c 20 6f 66 66 73 65 74 36 34 21 3d 70 43 2d  || offset64!=pC-
14fe0 3e 70 61 79 6c 6f 61 64 53 69 7a 65 29 29 0a 20  >payloadSize)). 
14ff0 20 20 20 20 20 20 7c 7c 20 28 6f 66 66 73 65 74        || (offset
15000 36 34 20 3e 20 70 43 2d 3e 70 61 79 6c 6f 61 64  64 > pC->payload
15010 53 69 7a 65 29 0a 20 20 20 20 20 20 29 7b 0a 20  Size).      ){. 
15020 20 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 61         if( pC->a
15030 52 6f 77 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Row==0 ) sqlite3
15040 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
15050 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 72  sMem);.        r
15060 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
15070 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
15080 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
15090 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
150a0 7d 0a 0a 20 20 20 20 20 20 70 43 2d 3e 6e 48 64  }..      pC->nHd
150b0 72 50 61 72 73 65 64 20 3d 20 69 3b 0a 20 20 20  rParsed = i;.   
150c0 20 20 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65     pC->iHdrOffse
150d0 74 20 3d 20 28 75 33 32 29 28 7a 48 64 72 20 2d  t = (u32)(zHdr -
150e0 20 7a 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69   zData);.      i
150f0 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29  f( pC->aRow==0 )
15100 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
15110 65 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20  elease(&sMem);. 
15120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15130 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
15140 20 20 2f 2a 20 49 66 20 61 66 74 65 72 20 74 72    /* If after tr
15150 79 69 6e 67 20 74 6f 20 65 78 74 72 61 63 74 20  ying to extract 
15160 6e 65 77 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  new entries from
15170 20 74 68 65 20 68 65 61 64 65 72 2c 20 6e 48 64   the header, nHd
15180 72 50 61 72 73 65 64 20 69 73 0a 20 20 20 20 2a  rParsed is.    *
15190 2a 20 73 74 69 6c 6c 20 6e 6f 74 20 75 70 20 74  * still not up t
151a0 6f 20 70 32 2c 20 74 68 61 74 20 6d 65 61 6e 73  o p2, that means
151b0 20 74 68 61 74 20 74 68 65 20 72 65 63 6f 72 64   that the record
151c0 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
151d0 70 32 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  p2.    ** column
151e0 73 2e 20 20 53 6f 20 74 68 65 20 72 65 73 75 6c  s.  So the resul
151f0 74 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  t will be either
15200 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
15210 75 65 20 6f 72 20 61 20 4e 55 4c 4c 2e 0a 20 20  ue or a NULL..  
15220 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 2d    */.    if( pC-
15230 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20  >nHdrParsed<=p2 
15240 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
15250 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4d 45 4d  ->p4type==P4_MEM
15260 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15270 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
15280 77 43 6f 70 79 28 70 44 65 73 74 2c 20 70 4f 70  wCopy(pDest, pOp
15290 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d 45 4d 5f 53  ->p4.pMem, MEM_S
152a0 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 7d 65  tatic);.      }e
152b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
152c0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
152d0 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  ll(pDest);.     
152e0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70   }.      goto op
152f0 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20  _column_out;.   
15300 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
15310 74 20 3d 20 70 43 2d 3e 61 54 79 70 65 5b 70 32  t = pC->aType[p2
15320 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  ];.  }..  /* Ext
15330 72 61 63 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  ract the content
15340 20 66 6f 72 20 74 68 65 20 70 32 2b 31 2d 74 68   for the p2+1-th
15350 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6e 74 72 6f   column.  Contro
15360 6c 20 63 61 6e 20 6f 6e 6c 79 0a 20 20 2a 2a 20  l can only.  ** 
15370 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
15380 20 69 66 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c   if aOffset[p2],
15390 20 61 4f 66 66 73 65 74 5b 70 32 2b 31 5d 2c 20   aOffset[p2+1], 
153a0 61 6e 64 20 70 43 2d 3e 61 54 79 70 65 5b 70 32  and pC->aType[p2
153b0 5d 20 61 72 65 0a 20 20 2a 2a 20 61 6c 6c 20 76  ] are.  ** all v
153c0 61 6c 69 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  alid..  */.  ass
153d0 65 72 74 28 20 70 32 3c 70 43 2d 3e 6e 48 64 72  ert( p2<pC->nHdr
153e0 50 61 72 73 65 64 20 29 3b 0a 20 20 61 73 73 65  Parsed );.  asse
153f0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
15400 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  K );.  assert( s
15410 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
15420 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 44 65  emInvariants(pDe
15430 73 74 29 20 29 3b 0a 20 20 69 66 28 20 56 64 62  st) );.  if( Vdb
15440 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 44 65 73  eMemDynamic(pDes
15450 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
15460 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
15470 70 44 65 73 74 29 3b 0a 20 20 7d 0a 20 20 61 73  pDest);.  }.  as
15480 73 65 72 74 28 20 74 3d 3d 70 43 2d 3e 61 54 79  sert( t==pC->aTy
15490 70 65 5b 70 32 5d 20 29 3b 0a 20 20 69 66 28 20  pe[p2] );.  if( 
154a0 70 43 2d 3e 73 7a 52 6f 77 3e 3d 61 4f 66 66 73  pC->szRow>=aOffs
154b0 65 74 5b 70 32 2b 31 5d 20 29 7b 0a 20 20 20 20  et[p2+1] ){.    
154c0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  /* This is the c
154d0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
154e0 20 74 68 65 20 64 65 73 69 72 65 64 20 63 6f 6e   the desired con
154f0 74 65 6e 74 20 66 69 74 73 20 6f 6e 20 74 68 65  tent fits on the
15500 20 6f 72 69 67 69 6e 61 6c 0a 20 20 20 20 2a 2a   original.    **
15510 20 70 61 67 65 20 2d 20 77 68 65 72 65 20 74 68   page - where th
15520 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  e content is not
15530 20 6f 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   on an overflow 
15540 70 61 67 65 20 2a 2f 0a 20 20 20 20 7a 44 61 74  page */.    zDat
15550 61 20 3d 20 70 43 2d 3e 61 52 6f 77 20 2b 20 61  a = pC->aRow + a
15560 4f 66 66 73 65 74 5b 70 32 5d 3b 0a 20 20 20 20  Offset[p2];.    
15570 69 66 28 20 74 3c 31 32 20 29 7b 0a 20 20 20 20  if( t<12 ){.    
15580 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
15590 69 61 6c 47 65 74 28 7a 44 61 74 61 2c 20 74 2c  ialGet(zData, t,
155a0 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c   pDest);.    }el
155b0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
155c0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
155d0 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 77 65   is a string, we
155e0 20 6e 65 65 64 20 61 20 70 65 72 73 69 73 74 65   need a persiste
155f0 6e 74 20 76 61 6c 75 65 2c 20 6e 6f 74 0a 20 20  nt value, not.  
15600 20 20 20 20 2a 2a 20 61 20 4d 45 4d 5f 45 70 68      ** a MEM_Eph
15610 65 6d 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  em value.  This 
15620 62 72 61 6e 63 68 20 69 73 20 61 20 66 61 73 74  branch is a fast
15630 20 73 68 6f 72 74 2d 63 75 74 20 74 68 61 74 20   short-cut that 
15640 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  is equivalent.  
15650 20 20 20 20 2a 2a 20 74 6f 20 63 61 6c 6c 69 6e      ** to callin
15660 67 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  g sqlite3VdbeSer
15670 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
15680 69 74 65 33 56 64 62 65 44 65 65 70 68 65 6d 65  ite3VdbeDeepheme
15690 72 61 6c 69 7a 65 28 29 2e 0a 20 20 20 20 20 20  ralize()..      
156a0 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
156b0 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
156c0 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 2c 20  ] = { MEM_Blob, 
156d0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
156e0 20 7d 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d   };.      pDest-
156f0 3e 6e 20 3d 20 6c 65 6e 20 3d 20 28 74 2d 31 32  >n = len = (t-12
15700 29 2f 32 3b 0a 20 20 20 20 20 20 70 44 65 73 74  )/2;.      pDest
15710 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
15720 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  ;.      if( pDes
15730 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3c 20 6c 65  t->szMalloc < le
15740 6e 2b 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n+2 ){.        p
15750 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  Dest->flags = ME
15760 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
15770 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
15780 65 6d 47 72 6f 77 28 70 44 65 73 74 2c 20 6c 65  emGrow(pDest, le
15790 6e 2b 32 2c 20 30 29 20 29 20 67 6f 74 6f 20 6e  n+2, 0) ) goto n
157a0 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  o_mem;.      }el
157b0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73  se{.        pDes
157c0 74 2d 3e 7a 20 3d 20 70 44 65 73 74 2d 3e 7a 4d  t->z = pDest->zM
157d0 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20  alloc;.      }. 
157e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 65 73       memcpy(pDes
157f0 74 2d 3e 7a 2c 20 7a 44 61 74 61 2c 20 6c 65 6e  t->z, zData, len
15800 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
15810 7a 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  z[len] = 0;.    
15820 20 20 70 44 65 73 74 2d 3e 7a 5b 6c 65 6e 2b 31    pDest->z[len+1
15830 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 65  ] = 0;.      pDe
15840 73 74 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  st->flags = aFla
15850 67 5b 74 26 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  g[t&1];.    }.  
15860 7d 65 6c 73 65 7b 0a 20 20 20 20 70 44 65 73 74  }else{.    pDest
15870 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
15880 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  ;.    /* This br
15890 61 6e 63 68 20 68 61 70 70 65 6e 73 20 6f 6e 6c  anch happens onl
158a0 79 20 77 68 65 6e 20 63 6f 6e 74 65 6e 74 20 69  y when content i
158b0 73 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s on overflow pa
158c0 67 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  ges */.    if( (
158d0 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c  (pOp->p5 & (OPFL
158e0 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46  AG_LENGTHARG|OPF
158f0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 29 21  LAG_TYPEOFARG))!
15900 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
15910 28 28 74 3e 3d 31 32 20 26 26 20 28 74 26 31 29  ((t>=12 && (t&1)
15920 3d 3d 30 29 20 7c 7c 20 28 70 4f 70 2d 3e 70 35  ==0) || (pOp->p5
15930 20 26 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46   & OPFLAG_TYPEOF
15940 41 52 47 29 21 3d 30 29 29 0a 20 20 20 20 20 7c  ARG)!=0)).     |
15950 7c 20 28 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  | (len = sqlite3
15960 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
15970 6e 28 74 29 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  n(t))==0.    ){.
15980 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
15990 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66   is irrelevant f
159a0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 31  or.      **    1
159b0 2e 20 74 68 65 20 74 79 70 65 6f 66 28 29 20 66  . the typeof() f
159c0 75 6e 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 2a  unction,.      *
159d0 2a 20 20 20 20 32 2e 20 74 68 65 20 6c 65 6e 67  *    2. the leng
159e0 74 68 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69  th(X) function i
159f0 66 20 58 20 69 73 20 61 20 62 6c 6f 62 2c 20 61  f X is a blob, a
15a00 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 33  nd.      **    3
15a10 2e 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  . if the content
15a20 20 6c 65 6e 67 74 68 20 69 73 20 7a 65 72 6f 2e   length is zero.
15a30 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 77 65 20  .      ** So we 
15a40 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20 75 73  might as well us
15a50 65 20 62 6f 67 75 73 20 63 6f 6e 74 65 6e 74 20  e bogus content 
15a60 72 61 74 68 65 72 20 74 68 61 6e 20 72 65 61 64  rather than read
15a70 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ing.      ** con
15a80 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
15a90 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
15aa0 75 38 20 61 5a 65 72 6f 5b 38 5d 3b 20 20 2f 2a  u8 aZero[8];  /*
15ab0 20 54 68 69 73 20 69 73 20 74 68 65 20 62 6f 67   This is the bog
15ac0 75 73 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  us content */.  
15ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
15ae0 65 72 69 61 6c 47 65 74 28 61 5a 65 72 6f 2c 20  erialGet(aZero, 
15af0 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d  t, pDest);.    }
15b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
15b10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
15b20 72 6f 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20  romBtree(pCrsr, 
15b30 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65 6e  aOffset[p2], len
15b40 2c 20 21 70 43 2d 3e 69 73 54 61 62 6c 65 2c 0a  , !pC->isTable,.
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20     pDest);.     
15b80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b90 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
15ba0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
15bb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
15bc0 65 72 69 61 6c 47 65 74 28 28 63 6f 6e 73 74 20  erialGet((const 
15bd0 75 38 2a 29 70 44 65 73 74 2d 3e 7a 2c 20 74 2c  u8*)pDest->z, t,
15be0 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 70   pDest);.      p
15bf0 44 65 73 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  Dest->flags &= ~
15c00 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 7d  MEM_Ephem;.    }
15c10 0a 20 20 7d 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f  .  }..op_column_
15c20 6f 75 74 3a 0a 20 20 55 50 44 41 54 45 5f 4d 41  out:.  UPDATE_MA
15c30 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74  X_BLOBSIZE(pDest
15c40 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
15c50 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65  ACE(pOp->p3, pDe
15c60 73 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  st);.  break;.}.
15c70 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66 66 69  ./* Opcode: Affi
15c80 6e 69 74 79 20 50 31 20 50 32 20 2a 20 50 34 20  nity P1 P2 * P4 
15c90 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61  *.** Synopsis: a
15ca0 66 66 69 6e 69 74 79 28 72 5b 50 31 40 50 32 5d  ffinity(r[P1@P2]
15cb0 29 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66  ).**.** Apply af
15cc0 66 69 6e 69 74 69 65 73 20 74 6f 20 61 20 72 61  finities to a ra
15cd0 6e 67 65 20 6f 66 20 50 32 20 72 65 67 69 73 74  nge of P2 regist
15ce0 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
15cf0 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  h P1..**.** P4 i
15d00 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  s a string that 
15d10 69 73 20 50 32 20 63 68 61 72 61 63 74 65 72 73  is P2 characters
15d20 20 6c 6f 6e 67 2e 20 54 68 65 20 6e 74 68 20 63   long. The nth c
15d30 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a  haracter of the.
15d40 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61  ** string indica
15d50 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  tes the column a
15d60 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
15d70 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
15d80 74 68 65 20 6e 74 68 0a 2a 2a 20 6d 65 6d 6f 72  the nth.** memor
15d90 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 61  y cell in the ra
15da0 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  nge..*/.case OP_
15db0 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63 6f  Affinity: {.  co
15dc0 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69 6e  nst char *zAffin
15dd0 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61 66  ity;   /* The af
15de0 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70  finity to be app
15df0 6c 69 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 63  lied */.  char c
15e00 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
15e10 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
15e20 68 61 72 61 63 74 65 72 20 6f 66 20 61 66 66 69  haracter of affi
15e30 6e 69 74 79 20 2a 2f 0a 0a 20 20 7a 41 66 66 69  nity */..  zAffi
15e40 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  nity = pOp->p4.z
15e50 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  ;.  assert( zAff
15e60 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61 73  inity!=0 );.  as
15e70 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79 5b  sert( zAffinity[
15e80 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b 0a 20  pOp->p2]==0 );. 
15e90 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
15ea0 70 2d 3e 70 31 5d 3b 0a 20 20 77 68 69 6c 65 28  p->p1];.  while(
15eb0 20 28 63 41 66 66 20 3d 20 2a 28 7a 41 66 66 69   (cAff = *(zAffi
15ec0 6e 69 74 79 2b 2b 29 29 21 3d 30 20 29 7b 0a 20  nity++))!=0 ){. 
15ed0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 20     assert( pIn1 
15ee0 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 28 70 2d 3e  <= &p->aMem[(p->
15ef0 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
15f00 73 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61 73 73  sor)] );.    ass
15f10 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
15f20 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 61 70 70  pIn1) );.    app
15f30 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c  lyAffinity(pIn1,
15f40 20 63 41 66 66 2c 20 65 6e 63 6f 64 69 6e 67 29   cAff, encoding)
15f50 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20  ;.    pIn1++;.  
15f60 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
15f70 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65 52 65 63   Opcode: MakeRec
15f80 6f 72 64 20 50 31 20 50 32 20 50 33 20 50 34 20  ord P1 P2 P3 P4 
15f90 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
15fa0 5b 50 33 5d 3d 6d 6b 72 65 63 28 72 5b 50 31 40  [P3]=mkrec(r[P1@
15fb0 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65  P2]).**.** Conve
15fc0 72 74 20 50 32 20 72 65 67 69 73 74 65 72 73 20  rt P2 registers 
15fd0 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50  beginning with P
15fe0 31 20 69 6e 74 6f 20 74 68 65 20 5b 72 65 63 6f  1 into the [reco
15ff0 72 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20 75 73  rd format].** us
16000 65 20 61 73 20 61 20 64 61 74 61 20 72 65 63 6f  e as a data reco
16010 72 64 20 69 6e 20 61 20 64 61 74 61 62 61 73 65  rd in a database
16020 20 74 61 62 6c 65 20 6f 72 20 61 73 20 61 20 6b   table or as a k
16030 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 64 65  ey.** in an inde
16040 78 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d  x.  The OP_Colum
16050 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20 64 65 63  n opcode can dec
16060 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64 20 6c  ode the record l
16070 61 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d  ater..**.** P4 m
16080 61 79 20 62 65 20 61 20 73 74 72 69 6e 67 20 74  ay be a string t
16090 68 61 74 20 69 73 20 50 32 20 63 68 61 72 61 63  hat is P2 charac
160a0 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68 65 20  ters long.  The 
160b0 6e 74 68 20 63 68 61 72 61 63 74 65 72 20 6f 66  nth character of
160c0 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69   the.** string i
160d0 6e 64 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c  ndicates the col
160e0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61  umn affinity tha
160f0 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
16100 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20   for the nth.** 
16110 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
16120 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  ex key..**.** Th
16130 65 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 63  e mapping from c
16140 68 61 72 61 63 74 65 72 20 74 6f 20 61 66 66 69  haracter to affi
16150 6e 69 74 79 20 69 73 20 67 69 76 65 6e 20 62 79  nity is given by
16160 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
16170 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65 66 69 6e  .** macros defin
16180 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
16190 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69  h..**.** If P4 i
161a0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 20  s NULL then all 
161b0 69 6e 64 65 78 20 66 69 65 6c 64 73 20 68 61 76  index fields hav
161c0 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 42  e the affinity B
161d0 4c 4f 42 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  LOB..*/.case OP_
161e0 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b 0a 20 20  MakeRecord: {.  
161f0 75 38 20 2a 7a 4e 65 77 52 65 63 6f 72 64 3b 20  u8 *zNewRecord; 
16200 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66         /* A buff
16210 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64  er to hold the d
16220 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ata for the new 
16230 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20  record */.  Mem 
16240 2a 70 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  *pRec;          
16250 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 65     /* The new re
16260 63 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20 6e 44  cord */.  u64 nD
16270 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
16280 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
16290 74 65 73 20 6f 66 20 64 61 74 61 20 73 70 61 63  tes of data spac
162a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72 3b  e */.  int nHdr;
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162c0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
162d0 20 6f 66 20 68 65 61 64 65 72 20 73 70 61 63 65   of header space
162e0 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b   */.  i64 nByte;
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16300 44 61 74 61 20 73 70 61 63 65 20 72 65 71 75 69  Data space requi
16310 72 65 64 20 66 6f 72 20 74 68 69 73 20 72 65 63  red for this rec
16320 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 6e 5a 65  ord */.  i64 nZe
16330 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ro;             
16340 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72  /* Number of zer
16350 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  o bytes at the e
16360 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  nd of the record
16370 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 69 6e   */.  int nVarin
16380 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
16390 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
163a0 69 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  in a varint */. 
163b0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
163c0 3b 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20  ;       /* Type 
163d0 66 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  field */.  Mem *
163e0 70 44 61 74 61 30 3b 20 20 20 20 20 20 20 20 20  pData0;         
163f0 20 20 2f 2a 20 46 69 72 73 74 20 66 69 65 6c 64    /* First field
16400 20 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65 64 20   to be combined 
16410 69 6e 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  into the record 
16420 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73 74 3b  */.  Mem *pLast;
16430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
16440 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
16450 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
16460 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20   nField;        
16470 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16480 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72   fields in the r
16490 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
164a0 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20 20 20  *zAffinity;     
164b0 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74    /* The affinit
164c0 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  y string for the
164d0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
164e0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20 20 20   file_format;   
164f0 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f 72 6d      /* File form
16500 61 74 20 74 6f 20 75 73 65 20 66 6f 72 20 65 6e  at to use for en
16510 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
16520 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
16530 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64     /* Space used
16540 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64 5b 5d   in zNewRecord[]
16550 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
16560 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
16570 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65      /* Space use
16580 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64 5b  d in zNewRecord[
16590 5d 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  ] content */.  u
165a0 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
165b0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
165c0 6f 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a 0a 20  of a field */.. 
165d0 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65   /* Assuming the
165e0 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73   record contains
165f0 20 4e 20 66 69 65 6c 64 73 2c 20 74 68 65 20 72   N fields, the r
16600 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 6c 6f 6f  ecord format loo
16610 6b 73 0a 20 20 2a 2a 20 6c 69 6b 65 20 74 68 69  ks.  ** like thi
16620 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d  s:.  **.  ** ---
16630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16670 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68 64 72  -----.  ** | hdr
16680 2d 73 69 7a 65 20 7c 20 74 79 70 65 20 30 20 7c  -size | type 0 |
16690 20 74 79 70 65 20 31 20 7c 20 2e 2e 2e 20 7c 20   type 1 | ... | 
166a0 74 79 70 65 20 4e 2d 31 20 7c 20 64 61 74 61 30  type N-1 | data0
166b0 20 7c 20 2e 2e 2e 20 7c 20 64 61 74 61 20 4e 2d   | ... | data N-
166c0 31 20 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d  1 | .  ** ------
166d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16710 2d 2d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 61 74  --.  **.  ** Dat
16720 61 28 30 29 20 69 73 20 74 61 6b 65 6e 20 66 72  a(0) is taken fr
16730 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  om register P1. 
16740 20 44 61 74 61 28 31 29 20 63 6f 6d 65 73 20 66   Data(1) comes f
16750 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31 2b  rom register P1+
16760 31 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 66 6f  1.  ** and so fo
16770 72 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  rth..  **.  ** E
16780 61 63 68 20 74 79 70 65 20 66 69 65 6c 64 20 69  ach type field i
16790 73 20 61 20 76 61 72 69 6e 74 20 72 65 70 72 65  s a varint repre
167a0 73 65 6e 74 69 6e 67 20 74 68 65 20 73 65 72 69  senting the seri
167b0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 0a  al type of the .
167c0 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69    ** correspondi
167d0 6e 67 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  ng data element 
167e0 28 73 65 65 20 73 71 6c 69 74 65 33 56 64 62 65  (see sqlite3Vdbe
167f0 53 65 72 69 61 6c 54 79 70 65 28 29 29 2e 20 54  SerialType()). T
16800 68 65 0a 20 20 2a 2a 20 68 64 72 2d 73 69 7a 65  he.  ** hdr-size
16810 20 66 69 65 6c 64 20 69 73 20 61 6c 73 6f 20 61   field is also a
16820 20 76 61 72 69 6e 74 20 77 68 69 63 68 20 69 73   varint which is
16830 20 74 68 65 20 6f 66 66 73 65 74 20 66 72 6f 6d   the offset from
16840 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
16850 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72   ** of the recor
16860 64 20 74 6f 20 64 61 74 61 30 2e 0a 20 20 2a 2f  d to data0..  */
16870 0a 20 20 6e 44 61 74 61 20 3d 20 30 3b 20 20 20  .  nData = 0;   
16880 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16890 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
168a0 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 48 64 72   space */.  nHdr
168b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
168c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
168d0 73 20 6f 66 20 68 65 61 64 65 72 20 73 70 61 63  s of header spac
168e0 65 20 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d 20 30  e */.  nZero = 0
168f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
16900 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65  ber of zero byte
16910 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
16920 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
16930 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31  nField = pOp->p1
16940 3b 0a 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20  ;.  zAffinity = 
16950 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73  pOp->p4.z;.  ass
16960 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 26 26  ert( nField>0 &&
16970 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f   pOp->p2>0 && pO
16980 70 2d 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d 28 70  p->p2+nField<=(p
16990 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
169a0 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 70 44  ursor)+1 );.  pD
169b0 61 74 61 30 20 3d 20 26 61 4d 65 6d 5b 6e 46 69  ata0 = &aMem[nFi
169c0 65 6c 64 5d 3b 0a 20 20 6e 46 69 65 6c 64 20 3d  eld];.  nField =
169d0 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c 61 73   pOp->p2;.  pLas
169e0 74 20 3d 20 26 70 44 61 74 61 30 5b 6e 46 69 65  t = &pData0[nFie
169f0 6c 64 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f 66 6f  ld-1];.  file_fo
16a00 72 6d 61 74 20 3d 20 70 2d 3e 6d 69 6e 57 72 69  rmat = p->minWri
16a10 74 65 46 69 6c 65 46 6f 72 6d 61 74 3b 0a 0a 20  teFileFormat;.. 
16a20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 74 68 65   /* Identify the
16a30 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   output register
16a40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
16a50 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 31 20 7c 7c  p->p3<pOp->p1 ||
16a60 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70   pOp->p3>=pOp->p
16a70 31 2b 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 70  1+pOp->p2 );.  p
16a80 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
16a90 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  >p3];.  memAbout
16aa0 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74  ToChange(p, pOut
16ab0 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 6c 79 20 74  );..  /* Apply t
16ac0 68 65 20 72 65 71 75 65 73 74 65 64 20 61 66 66  he requested aff
16ad0 69 6e 69 74 79 20 74 6f 20 61 6c 6c 20 69 6e 70  inity to all inp
16ae0 75 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  uts.  */.  asser
16af0 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61 73 74  t( pData0<=pLast
16b00 20 29 3b 0a 20 20 69 66 28 20 7a 41 66 66 69 6e   );.  if( zAffin
16b10 69 74 79 20 29 7b 0a 20 20 20 20 70 52 65 63 20  ity ){.    pRec 
16b20 3d 20 70 44 61 74 61 30 3b 0a 20 20 20 20 64 6f  = pData0;.    do
16b30 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66 66  {.      applyAff
16b40 69 6e 69 74 79 28 70 52 65 63 2b 2b 2c 20 2a 28  inity(pRec++, *(
16b50 7a 41 66 66 69 6e 69 74 79 2b 2b 29 2c 20 65 6e  zAffinity++), en
16b60 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 61  coding);.      a
16b70 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79  ssert( zAffinity
16b80 5b 30 5d 3d 3d 30 20 7c 7c 20 70 52 65 63 3c 3d  [0]==0 || pRec<=
16b90 70 4c 61 73 74 20 29 3b 0a 20 20 20 20 7d 77 68  pLast );.    }wh
16ba0 69 6c 65 28 20 7a 41 66 66 69 6e 69 74 79 5b 30  ile( zAffinity[0
16bb0 5d 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  ] );.  }..  /* L
16bc0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
16bd0 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 77 69  elements that wi
16be0 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68 65 20 72  ll make up the r
16bf0 65 63 6f 72 64 20 74 6f 20 66 69 67 75 72 65 0a  ecord to figure.
16c00 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20 6d 75 63    ** out how muc
16c10 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
16c20 72 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  red for the new 
16c30 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 70  record..  */.  p
16c40 52 65 63 20 3d 20 70 4c 61 73 74 3b 0a 20 20 64  Rec = pLast;.  d
16c50 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  o{.    assert( m
16c60 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63 29 20  emIsValid(pRec) 
16c70 29 3b 0a 20 20 20 20 70 52 65 63 2d 3e 75 54 65  );.    pRec->uTe
16c80 6d 70 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  mp = serial_type
16c90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
16ca0 72 69 61 6c 54 79 70 65 28 70 52 65 63 2c 20 66  rialType(pRec, f
16cb0 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 26 6c 65 6e  ile_format, &len
16cc0 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d  );.    if( pRec-
16cd0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
16ce0 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  o ){.      if( n
16cf0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
16d00 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
16d10 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70 52 65  emExpandBlob(pRe
16d20 63 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  c) ) goto no_mem
16d30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16d40 20 20 20 20 20 20 20 6e 5a 65 72 6f 20 2b 3d 20         nZero += 
16d50 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pRec->u.nZero;. 
16d60 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 70 52         len -= pR
16d70 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  ec->u.nZero;.   
16d80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
16d90 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20  Data += len;.   
16da0 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
16db0 6c 5f 74 79 70 65 3d 3d 31 32 37 20 29 3b 0a 20  l_type==127 );. 
16dc0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
16dd0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 38 20 29 3b  ial_type==128 );
16de0 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 73 65 72  .    nHdr += ser
16df0 69 61 6c 5f 74 79 70 65 3c 3d 31 32 37 20 3f 20  ial_type<=127 ? 
16e00 31 20 3a 20 73 71 6c 69 74 65 33 56 61 72 69 6e  1 : sqlite3Varin
16e10 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
16e20 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63 3d  );.    if( pRec=
16e30 3d 70 44 61 74 61 30 20 29 20 62 72 65 61 6b 3b  =pData0 ) break;
16e40 0a 20 20 20 20 70 52 65 63 2d 2d 3b 0a 20 20 7d  .    pRec--;.  }
16e50 77 68 69 6c 65 28 31 29 3b 0a 0a 20 20 2f 2a 20  while(1);..  /* 
16e60 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
16e70 32 35 36 34 2d 31 31 36 34 37 20 54 68 65 20 68  2564-11647 The h
16e80 65 61 64 65 72 20 62 65 67 69 6e 73 20 77 69 74  eader begins wit
16e90 68 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e  h a single varin
16ea0 74 0a 20 20 2a 2a 20 77 68 69 63 68 20 64 65 74  t.  ** which det
16eb0 65 72 6d 69 6e 65 73 20 74 68 65 20 74 6f 74 61  ermines the tota
16ec0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
16ed0 73 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  s in the header.
16ee0 20 54 68 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a   The varint.  **
16ef0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 69   value is the si
16f00 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
16f10 20 69 6e 20 62 79 74 65 73 20 69 6e 63 6c 75 64   in bytes includ
16f20 69 6e 67 20 74 68 65 20 73 69 7a 65 20 76 61 72  ing the size var
16f30 69 6e 74 0a 20 20 2a 2a 20 69 74 73 65 6c 66 2e  int.  ** itself.
16f40 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
16f50 6e 48 64 72 3d 3d 31 32 36 20 29 3b 0a 20 20 74  nHdr==126 );.  t
16f60 65 73 74 63 61 73 65 28 20 6e 48 64 72 3d 3d 31  estcase( nHdr==1
16f70 32 37 20 29 3b 0a 20 20 69 66 28 20 6e 48 64 72  27 );.  if( nHdr
16f80 3c 3d 31 32 36 20 29 7b 0a 20 20 20 20 2f 2a 20  <=126 ){.    /* 
16f90 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
16fa0 2a 2f 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 31  */.    nHdr += 1
16fb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
16fc0 2a 20 52 61 72 65 20 63 61 73 65 20 6f 66 20 61  * Rare case of a
16fd0 20 72 65 61 6c 6c 79 20 6c 61 72 67 65 20 68 65   really large he
16fe0 61 64 65 72 20 2a 2f 0a 20 20 20 20 6e 56 61 72  ader */.    nVar
16ff0 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 61 72  int = sqlite3Var
17000 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b 0a 20 20  intLen(nHdr);.  
17010 20 20 6e 48 64 72 20 2b 3d 20 6e 56 61 72 69 6e    nHdr += nVarin
17020 74 3b 0a 20 20 20 20 69 66 28 20 6e 56 61 72 69  t;.    if( nVari
17030 6e 74 3c 73 71 6c 69 74 65 33 56 61 72 69 6e 74  nt<sqlite3Varint
17040 4c 65 6e 28 6e 48 64 72 29 20 29 20 6e 48 64 72  Len(nHdr) ) nHdr
17050 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  ++;.  }.  nByte 
17060 3d 20 6e 48 64 72 2b 6e 44 61 74 61 3b 0a 20 20  = nHdr+nData;.  
17070 69 66 28 20 6e 42 79 74 65 2b 6e 5a 65 72 6f 3e  if( nByte+nZero>
17080 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
17090 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
170a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
170b0 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  big;.  }..  /* M
170c0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 75 74  ake sure the out
170d0 70 75 74 20 72 65 67 69 73 74 65 72 20 68 61 73  put register has
170e0 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
170f0 65 6e 6f 75 67 68 20 74 6f 20 73 74 6f 72 65 20  enough to store 
17100 0a 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 72 65  .  ** the new re
17110 63 6f 72 64 2e 20 54 68 65 20 6f 75 74 70 75 74  cord. The output
17120 20 72 65 67 69 73 74 65 72 20 28 70 4f 70 2d 3e   register (pOp->
17130 70 33 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  p3) is not allow
17140 65 64 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 6e  ed to.  ** be on
17150 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 72  e of the input r
17160 65 67 69 73 74 65 72 73 20 28 62 65 63 61 75 73  egisters (becaus
17170 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
17180 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c  call to.  ** sql
17190 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
171a0 41 6e 64 52 65 73 69 7a 65 28 29 20 63 6f 75 6c  AndResize() coul
171b0 64 20 63 6c 6f 62 62 65 72 20 74 68 65 20 76 61  d clobber the va
171c0 6c 75 65 20 62 65 66 6f 72 65 20 69 74 20 69 73  lue before it is
171d0 20 75 73 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69   used)..  */.  i
171e0 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
171f0 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
17200 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79 74 65  pOut, (int)nByte
17210 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  ) ){.    goto no
17220 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77  _mem;.  }.  zNew
17230 52 65 63 6f 72 64 20 3d 20 28 75 38 20 2a 29 70  Record = (u8 *)p
17240 4f 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72  Out->z;..  /* Wr
17250 69 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 2a  ite the record *
17260 2f 0a 20 20 69 20 3d 20 70 75 74 56 61 72 69 6e  /.  i = putVarin
17270 74 33 32 28 7a 4e 65 77 52 65 63 6f 72 64 2c 20  t32(zNewRecord, 
17280 6e 48 64 72 29 3b 0a 20 20 6a 20 3d 20 6e 48 64  nHdr);.  j = nHd
17290 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  r;.  assert( pDa
172a0 74 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20  ta0<=pLast );.  
172b0 70 52 65 63 20 3d 20 70 44 61 74 61 30 3b 0a 20  pRec = pData0;. 
172c0 20 64 6f 7b 0a 20 20 20 20 73 65 72 69 61 6c 5f   do{.    serial_
172d0 74 79 70 65 20 3d 20 70 52 65 63 2d 3e 75 54 65  type = pRec->uTe
172e0 6d 70 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  mp;.    /* EVIDE
172f0 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 35 32 39 2d  NCE-OF: R-06529-
17300 34 37 33 36 32 20 46 6f 6c 6c 6f 77 69 6e 67 20  47362 Following 
17310 74 68 65 20 73 69 7a 65 20 76 61 72 69 6e 74 20  the size varint 
17320 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  are one or more.
17330 20 20 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61      ** additiona
17340 6c 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 70  l varints, one p
17350 65 72 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  er column. */.  
17360 20 20 69 20 2b 3d 20 70 75 74 56 61 72 69 6e 74    i += putVarint
17370 33 32 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69  32(&zNewRecord[i
17380 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
17390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
173a0 65 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20  erial type */.  
173b0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
173c0 3a 20 52 2d 36 34 35 33 36 2d 35 31 37 32 38 20  : R-64536-51728 
173d0 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 65  The values for e
173e0 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ach column in th
173f0 65 20 72 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20  e record.    ** 
17400 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
17410 6f 77 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  ow the header. *
17420 2f 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74  /.    j += sqlit
17430 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
17440 26 7a 4e 65 77 52 65 63 6f 72 64 5b 6a 5d 2c 20  &zNewRecord[j], 
17450 70 52 65 63 2c 20 73 65 72 69 61 6c 5f 74 79 70  pRec, serial_typ
17460 65 29 3b 20 2f 2a 20 63 6f 6e 74 65 6e 74 20 2a  e); /* content *
17470 2f 0a 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70  /.  }while( (++p
17480 52 65 63 29 3c 3d 70 4c 61 73 74 20 29 3b 0a 20  Rec)<=pLast );. 
17490 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 48 64 72   assert( i==nHdr
174a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3d   );.  assert( j=
174b0 3d 6e 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73  =nByte );..  ass
174c0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
174d0 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  & pOp->p3<=(p->n
174e0 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
174f0 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e  or) );.  pOut->n
17500 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20   = (int)nByte;. 
17510 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
17520 45 4d 5f 42 6c 6f 62 3b 0a 20 20 69 66 28 20 6e  EM_Blob;.  if( n
17530 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70 4f 75 74  Zero ){.    pOut
17540 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e 5a 65 72  ->u.nZero = nZer
17550 6f 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  o;.    pOut->fla
17560 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65 72 6f 3b 0a  gs |= MEM_Zero;.
17570 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20    }.  pOut->enc 
17580 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 20 20  = SQLITE_UTF8;  
17590 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 65 20 62  /* In case the b
175a0 6c 6f 62 20 69 73 20 65 76 65 72 20 63 6f 6e 76  lob is ever conv
175b0 65 72 74 65 64 20 74 6f 20 74 65 78 74 20 2a 2f  erted to text */
175c0 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
175d0 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29  E(pOp->p3, pOut)
175e0 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
175f0 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
17600 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
17610 63 6f 64 65 3a 20 43 6f 75 6e 74 20 50 31 20 50  code: Count P1 P
17620 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
17630 73 69 73 3a 20 72 5b 50 32 5d 3d 63 6f 75 6e 74  sis: r[P2]=count
17640 28 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74  ().**.** Store t
17650 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
17660 72 69 65 73 20 28 61 6e 20 69 6e 74 65 67 65 72  ries (an integer
17670 20 76 61 6c 75 65 29 20 69 6e 20 74 68 65 20 74   value) in the t
17680 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a 2a  able or index .*
17690 2a 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73  * opened by curs
176a0 6f 72 20 50 31 20 69 6e 20 72 65 67 69 73 74 65  or P1 in registe
176b0 72 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  r P2.*/.#ifndef 
176c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
176d0 45 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f 43  ECOUNT.case OP_C
176e0 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  ount: {         
176f0 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 36 34  /* out2 */.  i64
17700 20 6e 45 6e 74 72 79 3b 0a 20 20 42 74 43 75 72   nEntry;.  BtCur
17710 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20 20 61  sor *pCrsr;..  a
17720 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
17730 70 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75 72 54 79  pOp->p1]->eCurTy
17740 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
17750 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  E );.  pCrsr = p
17760 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
17770 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20  ->uc.pCursor;.  
17780 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b  assert( pCrsr );
17790 0a 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b 20 20  .  nEntry = 0;  
177a0 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
177b0 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c  Only used to sil
177c0 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20  ence a warning. 
177d0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
177e0 33 42 74 72 65 65 43 6f 75 6e 74 28 70 43 72 73  3BtreeCount(pCrs
177f0 72 2c 20 26 6e 45 6e 74 72 79 29 3b 0a 20 20 69  r, &nEntry);.  i
17800 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
17810 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
17820 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
17830 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
17840 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
17850 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65 61 6b 3b  nEntry;.  break;
17860 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70  .}.#endif../* Op
17870 63 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e 74 20  code: Savepoint 
17880 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
17890 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  * Open, release 
178a0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  or rollback the 
178b0 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65 64 20  savepoint named 
178c0 62 79 20 70 61 72 61 6d 65 74 65 72 20 50 34 2c  by parameter P4,
178d0 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e   depending.** on
178e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 31   the value of P1
178f0 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  . To open a new 
17900 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 30  savepoint, P1==0
17910 2e 20 54 6f 20 72 65 6c 65 61 73 65 20 28 63 6f  . To release (co
17920 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78 69 73  mmit) an.** exis
17930 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 2c 20  ting savepoint, 
17940 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72 6f 6c  P1==1, or to rol
17950 6c 62 61 63 6b 20 61 6e 20 65 78 69 73 74 69 6e  lback an existin
17960 67 20 73 61 76 65 70 6f 69 6e 74 20 50 31 3d 3d  g savepoint P1==
17970 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 61  2..*/.case OP_Sa
17980 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e 74  vepoint: {.  int
17990 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   p1;            
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
179b0 56 61 6c 75 65 20 6f 66 20 50 31 20 6f 70 65 72  Value of P1 oper
179c0 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  and */.  char *z
179d0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
179e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
179f0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f   of savepoint */
17a00 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
17a10 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65 77 3b  Savepoint *pNew;
17a20 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  .  Savepoint *pS
17a30 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61 76 65  avepoint;.  Save
17a40 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20 20 69  point *pTmp;.  i
17a50 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 3b 0a 20  nt iSavepoint;. 
17a60 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31 20 3d   int ii;..  p1 =
17a70 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e 61 6d   pOp->p1;.  zNam
17a80 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 0a  e = pOp->p4.z;..
17a90 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
17aa0 20 74 68 65 20 70 31 20 70 61 72 61 6d 65 74 65   the p1 paramete
17ab0 72 20 69 73 20 76 61 6c 69 64 2e 20 41 6c 73 6f  r is valid. Also
17ac0 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69   that if there i
17ad0 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 74  s no open.  ** t
17ae0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
17af0 20 74 68 65 72 65 20 63 61 6e 6e 6f 74 20 62 65   there cannot be
17b00 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 2e   any savepoints.
17b10 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
17b20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3d   db->pSavepoint=
17b30 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  =0 || db->autoCo
17b40 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  mmit==0 );.  ass
17b50 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50 4f 49  ert( p1==SAVEPOI
17b60 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d 53 41  NT_BEGIN||p1==SA
17b70 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 7c  VEPOINT_RELEASE|
17b80 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  |p1==SAVEPOINT_R
17b90 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73  OLLBACK );.  ass
17ba0 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f  ert( db->pSavepo
17bb0 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54 72 61  int || db->isTra
17bc0 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
17bd0 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
17be0 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74  ( checkSavepoint
17bf0 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 20 20 61  Count(db) );.  a
17c00 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
17c10 64 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 70 31  der );..  if( p1
17c20 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49  ==SAVEPOINT_BEGI
17c30 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  N ){.    if( db-
17c40 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b  >nVdbeWrite>0 ){
17c50 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20  .      /* A new 
17c60 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 6e 6f 74  savepoint cannot
17c70 20 62 65 20 63 72 65 61 74 65 64 20 69 66 20 74   be created if t
17c80 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
17c90 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20  write .      ** 
17ca0 73 74 61 74 65 6d 65 6e 74 73 20 28 69 2e 65 2e  statements (i.e.
17cb0 20 6f 70 65 6e 20 72 65 61 64 2f 77 72 69 74 65   open read/write
17cc0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
17cd0 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20 20 20 20  b handles)..    
17ce0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
17cf0 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
17d00 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61 76 65  cannot open save
17d10 70 6f 69 6e 74 20 2d 20 53 51 4c 20 73 74 61 74  point - SQL stat
17d20 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
17d30 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ss");.      rc =
17d40 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
17d60 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
17d70 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 0a  rlen30(zName);..
17d80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17d90 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
17da0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
17db0 61 6c 6c 20 69 73 20 4f 6b 20 65 76 65 6e 20 69  all is Ok even i
17dc0 66 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74  f this savepoint
17dd0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 74   is actually a t
17de0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
17df0 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 28 61   ** savepoint (a
17e00 6e 64 20 74 68 65 72 65 66 6f 72 65 20 73 68 6f  nd therefore sho
17e10 75 6c 64 20 6e 6f 74 20 70 72 6f 6d 70 74 20 78  uld not prompt x
17e20 53 61 76 65 70 6f 69 6e 74 28 29 29 20 63 61 6c  Savepoint()) cal
17e30 6c 62 61 63 6b 73 2e 0a 20 20 20 20 20 20 2a 2a  lbacks..      **
17e40 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74 72   If this is a tr
17e50 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
17e60 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  int being opened
17e70 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
17e80 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ed.      ** that
17e90 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73   the db->aVTrans
17ea0 5b 5d 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  [] array is empt
17eb0 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  y.  */.      ass
17ec0 65 72 74 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  ert( db->autoCom
17ed0 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56  mit==0 || db->nV
17ee0 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Trans==0 );.    
17ef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
17f00 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
17f10 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c  SAVEPOINT_BEGIN,
17f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b   db->nStatement+
17f50 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
17f60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17f70 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
17f80 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
17f90 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  or;.#endif..    
17fa0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
17fb0 77 20 73 61 76 65 70 6f 69 6e 74 20 73 74 72 75  w savepoint stru
17fc0 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cture. */.      
17fd0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
17fe0 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
17ff0 73 69 7a 65 6f 66 28 53 61 76 65 70 6f 69 6e 74  sizeof(Savepoint
18000 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  )+nName+1);.    
18010 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
18020 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d        pNew->zNam
18030 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65  e = (char *)&pNe
18040 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  w[1];.        me
18050 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65  mcpy(pNew->zName
18060 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
18070 29 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20  );.    .        
18080 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
18090 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  o open transacti
180a0 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  on, then mark th
180b0 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 0a  is as a special.
180c0 20 20 20 20 20 20 20 20 2a 2a 20 22 74 72 61 6e          ** "tran
180d0 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
180e0 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t". */.        i
180f0 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
18100 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64  t ){.          d
18110 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
18120 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
18130 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
18140 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 20  vepoint = 1;.   
18150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18160 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70        db->nSavep
18170 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  oint++;.        
18180 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  }..        /* Li
18190 6e 6b 20 74 68 65 20 6e 65 77 20 73 61 76 65 70  nk the new savep
181a0 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 64 61  oint into the da
181b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 27 73 20  tabase handle's 
181c0 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  list. */.       
181d0 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 64   pNew->pNext = d
181e0 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20  b->pSavepoint;. 
181f0 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65         db->pSave
18200 70 6f 69 6e 74 20 3d 20 70 4e 65 77 3b 0a 20 20  point = pNew;.  
18210 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44 65 66        pNew->nDef
18220 65 72 72 65 64 43 6f 6e 73 20 3d 20 64 62 2d 3e  erredCons = db->
18230 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20  nDeferredCons;. 
18240 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44 65         pNew->nDe
18250 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
18260 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
18270 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cons;.      }.  
18280 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18290 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b   iSavepoint = 0;
182a0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
182b0 65 20 6e 61 6d 65 64 20 73 61 76 65 70 6f 69 6e  e named savepoin
182c0 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  t. If there is n
182d0 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  o such savepoint
182e0 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a 2a  , then an.    **
182f0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
18300 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
18310 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 0a  r.  */.    for(.
18320 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74        pSavepoint
18330 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
18340 74 3b 20 0a 20 20 20 20 20 20 70 53 61 76 65 70  t; .      pSavep
18350 6f 69 6e 74 20 26 26 20 73 71 6c 69 74 65 33 53  oint && sqlite3S
18360 74 72 49 43 6d 70 28 70 53 61 76 65 70 6f 69 6e  trICmp(pSavepoin
18370 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  t->zName, zName)
18380 3b 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69  ;.      pSavepoi
18390 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt = pSavepoint-
183a0 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20 20  >pNext.    ){.  
183b0 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 2b 2b      iSavepoint++
183c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
183d0 21 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  !pSavepoint ){. 
183e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
183f0 45 72 72 6f 72 28 70 2c 20 22 6e 6f 20 73 75 63  Error(p, "no suc
18400 68 20 73 61 76 65 70 6f 69 6e 74 3a 20 25 73 22  h savepoint: %s"
18410 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
18420 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
18430 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
18440 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
18450 30 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f 49  0 && p1==SAVEPOI
18460 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20  NT_RELEASE ){.  
18470 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
18480 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 6c   possible to rel
18490 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20  ease (commit) a 
184a0 73 61 76 65 70 6f 69 6e 74 20 69 66 20 74 68 65  savepoint if the
184b0 72 65 20 61 72 65 20 0a 20 20 20 20 20 20 2a 2a  re are .      **
184c0 20 61 63 74 69 76 65 20 77 72 69 74 65 20 73 74   active write st
184d0 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20  atements..      
184e0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
184f0 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61  VdbeError(p, "ca
18500 6e 6e 6f 74 20 72 65 6c 65 61 73 65 20 73 61 76  nnot release sav
18510 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20 20 20  epoint - ".     
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d       "SQL statem
18540 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ents in progress
18550 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ");.      rc = S
18560 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
18570 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20 2f 2a  }else{..      /*
18580 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
18590 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 20 69  er or not this i
185a0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
185b0 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 73 6f  savepoint. If so
185c0 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  ,.      ** and t
185d0 68 69 73 20 69 73 20 61 20 52 45 4c 45 41 53 45  his is a RELEASE
185e0 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 74   command, then t
185f0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
18600 61 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  action .      **
18610 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 0a   is committed. .
18620 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18630 6e 74 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  nt isTransaction
18640 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70   = pSavepoint->p
18650 4e 65 78 74 3d 3d 30 20 26 26 20 64 62 2d 3e 69  Next==0 && db->i
18660 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
18670 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 69 66 28  point;.      if(
18680 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 26   isTransaction &
18690 26 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & p1==SAVEPOINT_
186a0 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20  RELEASE ){.     
186b0 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c     if( (rc = sql
186c0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
186d0 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f  p, 1))!=SQLITE_O
186e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
186f0 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
18700 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18710 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
18720 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t = 1;.        i
18730 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  f( sqlite3VdbeHa
18740 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55  lt(p)==SQLITE_BU
18750 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
18760 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f  p->pc = (int)(pO
18770 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20  p - aOp);.      
18780 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
18790 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
187a0 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53    p->rc = rc = S
187b0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
187c0 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f        goto vdbe_
187d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
187e0 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 69 73  }.        db->is
187f0 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
18800 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  oint = 0;.      
18810 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20    rc = p->rc;.  
18820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18830 20 20 20 69 6e 74 20 69 73 53 63 68 65 6d 61 43     int isSchemaC
18840 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 20 20 69  hange;.        i
18850 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e  Savepoint = db->
18860 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 69 53 61  nSavepoint - iSa
18870 76 65 70 6f 69 6e 74 20 2d 20 31 3b 0a 20 20 20  vepoint - 1;.   
18880 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53 41 56       if( p1==SAV
18890 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
188a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 53  ){.          isS
188b0 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64  chemaChange = (d
188c0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
188d0 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
188e0 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  !=0;.          f
188f0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e  or(ii=0; ii<db->
18900 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
18910 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18920 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
18930 43 75 72 73 6f 72 73 28 64 62 2d 3e 61 44 62 5b  Cursors(db->aDb[
18940 69 69 5d 2e 70 42 74 2c 0a 20 20 20 20 20 20 20  ii].pBt,.       
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
18980 4c 42 41 43 4b 2c 0a 20 20 20 20 20 20 20 20 20  LBACK,.         
18990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
189b0 53 63 68 65 6d 61 43 68 61 6e 67 65 3d 3d 30 29  SchemaChange==0)
189c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
189d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
189e0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
189f0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
18a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18a20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 20 3d  isSchemaChange =
18a30 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
18a40 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
18a50 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b  ii<db->nDb; ii++
18a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
18a70 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
18a80 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  vepoint(db->aDb[
18a90 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20 69 53 61  ii].pBt, p1, iSa
18aa0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
18ab0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18ad0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
18ae0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
18af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18b00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
18b10 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 20 29  isSchemaChange )
18b20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
18b30 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
18b40 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
18b50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18b60 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
18b70 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62  sOfConnection(db
18b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
18b90 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
18ba0 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
18bb0 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
18bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18bd0 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67 61 72   .      /* Regar
18be0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
18bf0 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45 41   this is a RELEA
18c00 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c 20  SE or ROLLBACK, 
18c10 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20 20  destroy all .   
18c20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73     ** savepoints
18c30 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65 20 6f   nested inside o
18c40 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
18c50 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f  being operated o
18c60 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  n. */.      whil
18c70 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  e( db->pSavepoin
18c80 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  t!=pSavepoint ){
18c90 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20 3d 20  .        pTmp = 
18ca0 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
18cb0 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76          db->pSav
18cc0 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
18cd0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
18ce0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18cf0 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 64  pTmp);.        d
18d00 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b  b->nSavepoint--;
18d10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18d20 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52 45  /* If it is a RE
18d30 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73 74  LEASE, then dest
18d40 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
18d50 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64  t being operated
18d60 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f   on .      ** to
18d70 6f 2e 20 49 66 20 69 74 20 69 73 20 61 20 52 4f  o. If it is a RO
18d80 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68 65 6e 20  LLBACK TO, then 
18d90 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  set the number o
18da0 66 20 64 65 66 65 72 72 65 64 20 0a 20 20 20 20  f deferred .    
18db0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
18dc0 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72 65 73 65  violations prese
18dd0 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
18de0 73 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  se to the value 
18df0 73 74 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a 20  stored.      ** 
18e00 77 68 65 6e 20 74 68 65 20 73 61 76 65 70 6f 69  when the savepoi
18e10 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 20  nt was created. 
18e20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 31   */.      if( p1
18e30 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
18e40 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ASE ){.        a
18e50 73 73 65 72 74 28 20 70 53 61 76 65 70 6f 69 6e  ssert( pSavepoin
18e60 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  t==db->pSavepoin
18e70 74 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  t );.        db-
18e80 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 53  >pSavepoint = pS
18e90 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3b  avepoint->pNext;
18ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18eb0 44 62 46 72 65 65 28 64 62 2c 20 70 53 61 76 65  DbFree(db, pSave
18ec0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
18ed0 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74 69  if( !isTransacti
18ee0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
18ef0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d  db->nSavepoint--
18f00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18f20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
18f30 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ns = pSavepoint-
18f40 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a  >nDeferredCons;.
18f50 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
18f60 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70  erredImmCons = p
18f70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66 65  Savepoint->nDefe
18f80 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  rredImmCons;.   
18f90 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
18fa0 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 7c  !isTransaction |
18fb0 7c 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | p1==SAVEPOINT_
18fc0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
18fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18fe0 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
18ff0 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e 74  , p1, iSavepoint
19000 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
19010 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19020 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
19030 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
19040 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
19050 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
19060 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20  due_to_error;.. 
19070 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
19080 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d 6d 69 74  code: AutoCommit
19090 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
190a0 2a 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  ** Set the datab
190b0 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  ase auto-commit 
190c0 66 6c 61 67 20 74 6f 20 50 31 20 28 31 20 6f 72  flag to P1 (1 or
190d0 20 30 29 2e 20 49 66 20 50 32 20 69 73 20 74 72   0). If P2 is tr
190e0 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61 63 6b  ue, roll.** back
190f0 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 61   any currently a
19100 63 74 69 76 65 20 62 74 72 65 65 20 74 72 61 6e  ctive btree tran
19110 73 61 63 74 69 6f 6e 73 2e 20 49 66 20 74 68 65  sactions. If the
19120 72 65 20 61 72 65 20 61 6e 79 20 61 63 74 69 76  re are any activ
19130 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61 72 74 20  e.** VMs (apart 
19140 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65 29 2c 20  from this one), 
19150 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41 43 4b 20  then a ROLLBACK 
19160 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d 4d 49 54  fails.  A COMMIT
19170 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20 74 68 65   fails if.** the
19180 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77 72  re are active wr
19190 69 74 69 6e 67 20 56 4d 73 20 6f 72 20 61 63 74  iting VMs or act
191a0 69 76 65 20 56 4d 73 20 74 68 61 74 20 75 73 65  ive VMs that use
191b0 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 0a 2a   shared cache..*
191c0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
191d0 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74 68 65  ction causes the
191e0 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a 2f 0a   VM to halt..*/.
191f0 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
19200 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65 73 69  it: {.  int desi
19210 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20  redAutoCommit;. 
19220 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63 6b 3b 0a   int iRollback;.
19230 0a 20 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  .  desiredAutoCo
19240 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  mmit = pOp->p1;.
19250 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d 20 70 4f    iRollback = pO
19260 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28  p->p2;.  assert(
19270 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
19280 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69 72 65 64  it==1 || desired
19290 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b  AutoCommit==0 );
192a0 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72  .  assert( desir
192b0 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20  edAutoCommit==1 
192c0 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20  || iRollback==0 
192d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
192e0 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 29  >nVdbeActive>0 )
192f0 3b 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 74  ;  /* At least t
19300 68 69 73 20 6f 6e 65 20 56 4d 20 69 73 20 61 63  his one VM is ac
19310 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  tive */.  assert
19320 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
19330 3b 0a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  ;..  if( desired
19340 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e  AutoCommit!=db->
19350 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
19360 20 20 69 66 28 20 69 52 6f 6c 6c 62 61 63 6b 20    if( iRollback 
19370 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19380 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
19390 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  it==1 );.      s
193a0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
193b0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
193c0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
193d0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
193e0 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  it = 1;.    }els
193f0 65 20 69 66 28 20 64 65 73 69 72 65 64 41 75 74  e if( desiredAut
19400 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 6e  oCommit && db->n
19410 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b 0a 20  VdbeWrite>0 ){. 
19420 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
19430 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70 6c  instruction impl
19440 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54 20  ements a COMMIT 
19450 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61 72  and other VMs ar
19460 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20 20 20  e writing.      
19470 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  ** return an err
19480 6f 72 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  or indicating th
19490 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73  at the other VMs
194a0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66   must complete f
194b0 69 72 73 74 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  irst. .      */.
194c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
194d0 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f  eError(p, "canno
194e0 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63  t commit transac
194f0 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20 20  tion - ".       
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65 6e     "SQL statemen
19520 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29  ts in progress")
19530 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
19540 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
19550 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
19560 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  o_error;.    }el
19570 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
19580 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
19590 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f  p, 1))!=SQLITE_O
195a0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
195b0 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
195c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
195d0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 28  ->autoCommit = (
195e0 75 38 29 64 65 73 69 72 65 64 41 75 74 6f 43 6f  u8)desiredAutoCo
195f0 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  mmit;.    }.    
19600 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 48  if( sqlite3VdbeH
19610 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42  alt(p)==SQLITE_B
19620 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  USY ){.      p->
19630 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d  pc = (int)(pOp -
19640 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 64 62 2d   aOp);.      db-
19650 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 28 75  >autoCommit = (u
19660 38 29 28 31 2d 64 65 73 69 72 65 64 41 75 74 6f  8)(1-desiredAuto
19670 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  Commit);.      p
19680 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49  ->rc = rc = SQLI
19690 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67  TE_BUSY;.      g
196a0 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
196b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
196c0 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
196d0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==0 );.    sqli
196e0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
196f0 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  ts(db);.    if( 
19700 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19710 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
19720 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
19730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
19740 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
19750 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 76      }.    goto v
19760 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 7d 65  dbe_return;.  }e
19770 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
19780 56 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 20 20  VdbeError(p,.   
19790 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41 75       (!desiredAu
197a0 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e 6f  toCommit)?"canno
197b0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
197c0 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74  ction within a t
197d0 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20 20  ransaction":(.  
197e0 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63 6b        (iRollback
197f0 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61  )?"cannot rollba
19800 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  ck - no transact
19810 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a 0a  ion is active":.
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69     "cannot commi
19840 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  t - no transacti
19850 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29 3b  on is active"));
19860 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 72  .         .    r
19870 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
19880 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
19890 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
198a0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
198b0 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 6e 73 61  * Opcode: Transa
198c0 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20 50  ction P1 P2 P3 P
198d0 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 65 67 69 6e  4 P5.**.** Begin
198e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
198f0 6e 20 64 61 74 61 62 61 73 65 20 50 31 20 69 66  n database P1 if
19900 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19910 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
19920 20 61 63 74 69 76 65 2e 0a 2a 2a 20 49 66 20 50   active..** If P
19930 32 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  2 is non-zero, t
19940 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
19950 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
19960 65 64 2c 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  ed, or if a .** 
19970 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
19980 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
19990 76 65 2c 20 69 74 20 69 73 20 75 70 67 72 61 64  ve, it is upgrad
199a0 65 64 20 74 6f 20 61 20 77 72 69 74 65 2d 74 72  ed to a write-tr
199b0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66  ansaction..** If
199c0 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74 68 65   P2 is zero, the
199d0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
199e0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2e  tion is started.
199f0 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65  .**.** P1 is the
19a00 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
19a10 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 77  tabase file on w
19a20 68 69 63 68 20 74 68 65 20 74 72 61 6e 73 61 63  hich the transac
19a30 74 69 6f 6e 20 69 73 0a 2a 2a 20 73 74 61 72 74  tion is.** start
19a40 65 64 2e 20 20 49 6e 64 65 78 20 30 20 69 73 20  ed.  Index 0 is 
19a50 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
19a60 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 64 65 78  e file and index
19a70 20 31 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 6c   1 is the.** fil
19a80 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f  e used for tempo
19a90 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e  rary tables.  In
19aa0 64 69 63 65 73 20 6f 66 20 32 20 6f 72 20 6d 6f  dices of 2 or mo
19ab0 72 65 20 61 72 65 20 75 73 65 64 20 66 6f 72 0a  re are used for.
19ac0 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
19ad0 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  bases..**.** If 
19ae0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
19af0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 61  ion is started a
19b00 6e 64 20 74 68 65 20 56 64 62 65 2e 75 73 65 73  nd the Vdbe.uses
19b10 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 66 6c 61 67  StmtJournal flag
19b20 20 69 73 0a 2a 2a 20 74 72 75 65 20 28 74 68 69   is.** true (thi
19b30 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 66  s flag is set if
19b40 20 74 68 65 20 56 64 62 65 20 6d 61 79 20 6d 6f   the Vdbe may mo
19b50 64 69 66 79 20 6d 6f 72 65 20 74 68 61 6e 20 6f  dify more than o
19b60 6e 65 20 72 6f 77 20 61 6e 64 20 6d 61 79 0a 2a  ne row and may.*
19b70 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54  * throw an ABORT
19b80 20 65 78 63 65 70 74 69 6f 6e 29 2c 20 61 20 73   exception), a s
19b90 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
19ba0 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 20 62 65  tion may also be
19bb0 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20 4d 6f 72 65   opened..** More
19bc0 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 61   specifically, a
19bd0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
19be0 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
19bf0 20 69 66 66 20 74 68 65 20 64 61 74 61 62 61 73   iff the databas
19c00 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
19c10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
19c20 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
19c30 6f 64 65 2c 20 6f 72 20 69 66 20 74 68 65 72 65  ode, or if there
19c40 20 61 72 65 20 6f 74 68 65 72 0a 2a 2a 20 61 63   are other.** ac
19c50 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  tive statements.
19c60 20 41 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   A statement tra
19c70 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20  nsaction allows 
19c80 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
19c90 20 62 79 20 74 68 69 73 0a 2a 2a 20 56 44 42 45   by this.** VDBE
19ca0 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
19cb0 63 6b 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ck after an erro
19cc0 72 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  r without having
19cd0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
19ce0 65 0a 2a 2a 20 65 6e 74 69 72 65 20 74 72 61 6e  e.** entire tran
19cf0 73 61 63 74 69 6f 6e 2e 20 49 66 20 6e 6f 20 65  saction. If no e
19d00 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
19d10 72 65 64 2c 20 74 68 65 20 73 74 61 74 65 6d 65  red, the stateme
19d20 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  nt transaction.*
19d30 2a 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  * will automatic
19d40 61 6c 6c 79 20 63 6f 6d 6d 69 74 20 77 68 65 6e  ally commit when
19d50 20 74 68 65 20 56 44 42 45 20 68 61 6c 74 73 2e   the VDBE halts.
19d60 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20  .**.** If P5!=0 
19d70 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65  then this opcode
19d80 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68 65   also checks the
19d90 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
19da0 67 61 69 6e 73 74 20 50 33 0a 2a 2a 20 61 6e 64  gainst P3.** and
19db0 20 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e 65   the schema gene
19dc0 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 61  ration counter a
19dd0 67 61 69 6e 73 74 20 50 34 2e 0a 2a 2a 20 54 68  gainst P4..** Th
19de0 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73  e cookie changes
19df0 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e 65   its value whene
19e00 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
19e10 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e   schema changes.
19e20 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
19e30 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  on is used to de
19e40 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20 74  tect when that t
19e50 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63 68  he cookie has ch
19e60 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68 61  anged.** and tha
19e70 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  t the current pr
19e80 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20 72  ocess needs to r
19e90 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d 61  eread the schema
19ea0 2e 20 20 49 66 20 74 68 65 20 73 63 68 65 6d 61  .  If the schema
19eb0 0a 2a 2a 20 63 6f 6f 6b 69 65 20 69 6e 20 50 33  .** cookie in P3
19ec0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
19ed0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
19ee0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
19ef0 68 65 61 64 65 72 20 6f 72 0a 2a 2a 20 69 66 20  header or.** if 
19f00 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e 65 72  the schema gener
19f10 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ation counter in
19f20 20 50 34 20 64 69 66 66 65 72 73 20 66 72 6f 6d   P4 differs from
19f30 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
19f40 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74  generation count
19f50 65 72 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 49  er, then an SQLI
19f60 54 45 5f 53 43 48 45 4d 41 20 65 72 72 6f 72 20  TE_SCHEMA error 
19f70 69 73 20 72 61 69 73 65 64 20 61 6e 64 20 65 78  is raised and ex
19f80 65 63 75 74 69 6f 6e 0a 2a 2a 20 68 61 6c 74 73  ecution.** halts
19f90 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  .  The sqlite3_s
19fa0 74 65 70 28 29 20 77 72 61 70 70 65 72 20 66 75  tep() wrapper fu
19fb0 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 74 68 65  nction might the
19fc0 6e 20 72 65 70 72 65 70 61 72 65 20 74 68 65 0a  n reprepare the.
19fd0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  ** statement and
19fe0 20 72 65 72 75 6e 20 69 74 20 66 72 6f 6d 20 74   rerun it from t
19ff0 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f  he beginning..*/
1a000 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63  .case OP_Transac
1a010 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65 20  tion: {.  Btree 
1a020 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 4d 65 74  *pBt;.  int iMet
1a030 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e 3b 0a 0a  a;.  int iGen;..
1a040 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
1a050 52 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Reader );.  asse
1a060 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  rt( p->readOnly=
1a070 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 30  =0 || pOp->p2==0
1a080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1a090 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1a0a0 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
1a0b0 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
1a0c0 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
1a0d0 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20  , pOp->p1) );.  
1a0e0 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 26 20 28  if( pOp->p2 && (
1a0f0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a100 54 45 5f 51 75 65 72 79 4f 6e 6c 79 29 21 3d 30  TE_QueryOnly)!=0
1a110 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a120 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1a130 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1a140 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
1a150 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70   pBt = db->aDb[p
1a160 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20 20  Op->p1].pBt;..  
1a170 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 72  if( pBt ){.    r
1a180 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1a190 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
1a1a0 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 74 65  pOp->p2);.    te
1a1b0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
1a1c0 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
1a1d0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1a1e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1a1f0 59 5f 52 45 43 4f 56 45 52 59 20 29 3b 0a 20 20  Y_RECOVERY );.  
1a200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1a220 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
1a230 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
1a240 20 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29     p->pc = (int)
1a250 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20  (pOp - aOp);.   
1a260 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
1a270 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64  .        goto vd
1a280 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  be_return;.     
1a290 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62   }.      goto ab
1a2a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1a2b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1a2c0 20 70 4f 70 2d 3e 70 32 20 26 26 20 70 2d 3e 75   pOp->p2 && p->u
1a2d0 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 0a  sesStmtJournal .
1a2e0 20 20 20 20 20 26 26 20 28 64 62 2d 3e 61 75 74       && (db->aut
1a2f0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
1a300 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 29 20 0a  ->nVdbeRead>1) .
1a310 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
1a320 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1a330 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
1a340 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1a350 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b  iStatement==0 ){
1a360 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1a370 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
1a380 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61 76 65 70  =0 && db->nSavep
1a390 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20  oint>=0 );.     
1a3a0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
1a3b0 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20 70 2d  t++; .        p-
1a3c0 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64 62  >iStatement = db
1a3d0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64  ->nSavepoint + d
1a3e0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20  b->nStatement;. 
1a3f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
1a400 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
1a410 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
1a420 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 70 2d 3e  POINT_BEGIN, p->
1a430 69 53 74 61 74 65 6d 65 6e 74 2d 31 29 3b 0a 20  iStatement-1);. 
1a440 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1a450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a460 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1a470 72 65 65 42 65 67 69 6e 53 74 6d 74 28 70 42 74  reeBeginStmt(pBt
1a480 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 29  , p->iStatement)
1a490 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a4a0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 63 75   /* Store the cu
1a4b0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
1a4c0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
1a4d0 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
1a4e0 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 2a 2a  straint.      **
1a4f0 20 63 6f 75 6e 74 65 72 2e 20 49 66 20 74 68 65   counter. If the
1a500 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1a510 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  action needs to 
1a520 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 0a  be rolled back,.
1a530 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
1a540 75 65 20 6f 66 20 74 68 69 73 20 63 6f 75 6e 74  ue of this count
1a550 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  er needs to be r
1a560 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20 2a 2f  estored too.  */
1a570 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44  .      p->nStmtD
1a580 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65  efCons = db->nDe
1a590 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20  ferredCons;.    
1a5a0 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d    p->nStmtDefImm
1a5b0 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65  Cons = db->nDefe
1a5c0 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  rredImmCons;.   
1a5d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65   }..    /* Gathe
1a5e0 72 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 72  r the schema ver
1a5f0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20  sion number for 
1a600 63 68 65 63 6b 69 6e 67 3a 0a 20 20 20 20 2a 2a  checking:.    **
1a610 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
1a620 4f 46 3a 20 52 2d 30 33 31 38 39 2d 35 31 31 33  OF: R-03189-5113
1a630 35 20 41 73 20 65 61 63 68 20 53 51 4c 20 73 74  5 As each SQL st
1a640 61 74 65 6d 65 6e 74 20 72 75 6e 73 2c 20 74 68  atement runs, th
1a650 65 20 73 63 68 65 6d 61 0a 20 20 20 20 2a 2a 20  e schema.    ** 
1a660 76 65 72 73 69 6f 6e 20 69 73 20 63 68 65 63 6b  version is check
1a670 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
1a680 74 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  t the schema has
1a690 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 73 69 6e   not changed sin
1a6a0 63 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  ce the.    ** SQ
1a6b0 4c 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  L statement was 
1a6c0 70 72 65 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  prepared..    */
1a6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a6e0 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42 54  eGetMeta(pBt, BT
1a6f0 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
1a700 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74  ON, (u32 *)&iMet
1a710 61 29 3b 0a 20 20 20 20 69 47 65 6e 20 3d 20 64  a);.    iGen = d
1a720 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
1a730 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
1a740 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tion;.  }else{. 
1a750 20 20 20 69 47 65 6e 20 3d 20 69 4d 65 74 61 20     iGen = iMeta 
1a760 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
1a770 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c  t( pOp->p5==0 ||
1a780 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1a790 5f 49 4e 54 33 32 20 29 3b 0a 20 20 69 66 28 20  _INT32 );.  if( 
1a7a0 70 4f 70 2d 3e 70 35 20 26 26 20 28 69 4d 65 74  pOp->p5 && (iMet
1a7b0 61 21 3d 70 4f 70 2d 3e 70 33 20 7c 7c 20 69 47  a!=pOp->p3 || iG
1a7c0 65 6e 21 3d 70 4f 70 2d 3e 70 34 2e 69 29 20 29  en!=pOp->p4.i) )
1a7d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1a7e0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
1a7f0 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
1a800 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Msg = sqlite3DbS
1a810 74 72 44 75 70 28 64 62 2c 20 22 64 61 74 61 62  trDup(db, "datab
1a820 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
1a830 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f 2a  hanged");.    /*
1a840 20 49 66 20 74 68 65 20 73 63 68 65 6d 61 2d 63   If the schema-c
1a850 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20 64  ookie from the d
1a860 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 74  atabase file mat
1a870 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ches the cookie 
1a880 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 77  .    ** stored w
1a890 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ith the in-memor
1a8a0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
1a8b0 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2c 20   of the schema, 
1a8c0 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 65  do.    ** not re
1a8d0 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61 20  load the schema 
1a8e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1a8f0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1a900 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75 61 6c     ** If virtual
1a910 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e 20 75  -tables are in u
1a920 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20  se, this is not 
1a930 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61  just an optimiza
1a940 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66 74  tion..    ** Oft
1a950 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73 74 6f  en, v-tables sto
1a960 72 65 20 74 68 65 69 72 20 64 61 74 61 20 69 6e  re their data in
1a970 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74 61   other SQLite ta
1a980 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20 20 20  bles, which.    
1a990 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64 20 66  ** are queried f
1a9a0 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65 78 74  rom within xNext
1a9b0 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76 2d 74  () and other v-t
1a9c0 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75 73 69  able methods usi
1a9d0 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70 61 72  ng.    ** prepar
1a9e0 65 64 20 71 75 65 72 69 65 73 2e 20 49 66 20 73  ed queries. If s
1a9f0 75 63 68 20 61 20 71 75 65 72 79 20 69 73 20 6f  uch a query is o
1aa00 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20 64  ut-of-date, we d
1aa10 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20 20  o not want to.  
1aa20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
1aa30 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1aa40 2c 20 61 73 20 74 68 65 20 75 73 65 72 20 63 6f  , as the user co
1aa50 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  de implementing 
1aa60 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61 62  the.    ** v-tab
1aa70 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  le would have to
1aa80 20 62 65 20 72 65 61 64 79 20 66 6f 72 20 74 68   be ready for th
1aa90 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  e sqlite3_vtab s
1aaa0 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 0a  tructure itself.
1aab0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
1aac0 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65 76 65  alidated wheneve
1aad0 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  r sqlite3_step()
1aae0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
1aaf0 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 61  within .    ** a
1ab00 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e   v-table method.
1ab10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ab20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
1ab30 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
1ab40 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20 29  _cookie!=iMeta )
1ab50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1ab60 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64 62  esetOneSchema(db
1ab70 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
1ab80 7d 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  }.    p->expired
1ab90 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
1aba0 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20  QLITE_SCHEMA;.  
1abb0 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  }.  if( rc ) got
1abc0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1abd0 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
1abe0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61  ../* Opcode: Rea
1abf0 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33  dCookie P1 P2 P3
1ac00 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20   * *.**.** Read 
1ac10 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 33  cookie number P3
1ac20 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 50   from database P
1ac30 31 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 69  1 and write it i
1ac40 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
1ac50 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74 68 65  .** P3==1 is the
1ac60 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e   schema version.
1ac70 20 20 50 33 3d 3d 32 20 69 73 20 74 68 65 20 64    P3==2 is the d
1ac80 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a  atabase format..
1ac90 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 68 65 20  ** P3==3 is the 
1aca0 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65  recommended page
1acb0 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61 6e  r cache size, an
1acc0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d  d so forth.  P1=
1acd0 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61 69  =0 is.** the mai
1ace0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1acf0 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68 65  and P1==1 is the
1ad00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
1ad10 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
1ad20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
1ad30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
1ad40 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f 63  st be a read-loc
1ad50 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1ad60 65 20 28 65 69 74 68 65 72 20 61 20 74 72 61 6e  e (either a tran
1ad70 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  saction.** must 
1ad80 62 65 20 73 74 61 72 74 65 64 20 6f 72 20 74 68  be started or th
1ad90 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
1ada0 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66 6f  pen cursor) befo
1adb0 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20  re.** executing 
1adc0 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
1add0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
1ade0 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20  dCookie: {      
1adf0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
1ae00 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b   */.  int iMeta;
1ae10 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e  .  int iDb;.  in
1ae20 74 20 69 43 6f 6f 6b 69 65 3b 0a 0a 20 20 61 73  t iCookie;..  as
1ae30 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
1ae40 65 72 20 29 3b 0a 20 20 69 44 62 20 3d 20 70 4f  er );.  iDb = pO
1ae50 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b 69 65  p->p1;.  iCookie
1ae60 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73   = pOp->p3;.  as
1ae70 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 53 51  sert( pOp->p3<SQ
1ae80 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54  LITE_N_BTREE_MET
1ae90 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  A );.  assert( i
1aea0 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
1aeb0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
1aec0 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
1aed0 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
1aee0 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
1aef0 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29  >btreeMask, iDb)
1af00 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74   );..  sqlite3Bt
1af10 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d 3e 61  reeGetMeta(db->a
1af20 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 69 43 6f  Db[iDb].pBt, iCo
1af30 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29 26 69 4d  okie, (u32 *)&iM
1af40 65 74 61 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f  eta);.  pOut = o
1af50 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
1af60 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75   pOp);.  pOut->u
1af70 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20 20 62 72  .i = iMeta;.  br
1af80 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1af90 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20 50 31 20  e: SetCookie P1 
1afa0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
1afb0 57 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65  Write the intege
1afc0 72 20 76 61 6c 75 65 20 50 33 20 69 6e 74 6f 20  r value P3 into 
1afd0 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 32  cookie number P2
1afe0 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 2e   of database P1.
1aff0 0a 2a 2a 20 50 32 3d 3d 31 20 69 73 20 74 68 65  .** P2==1 is the
1b000 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e   schema version.
1b010 20 20 50 32 3d 3d 32 20 69 73 20 74 68 65 20 64    P2==2 is the d
1b020 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a  atabase format..
1b030 2a 2a 20 50 32 3d 3d 33 20 69 73 20 74 68 65 20  ** P2==3 is the 
1b040 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65  recommended page
1b050 72 20 63 61 63 68 65 20 0a 2a 2a 20 73 69 7a 65  r cache .** size
1b060 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
1b070 20 50 31 3d 3d 30 20 69 73 20 74 68 65 20 6d 61   P1==0 is the ma
1b080 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1b090 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68   and P1==1 is th
1b0a0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
1b0b0 69 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ile used to stor
1b0c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1b0d0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  es..**.** A tran
1b0e0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1b0f0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 65  started before e
1b100 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 6f 70  xecuting this op
1b110 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  code..*/.case OP
1b120 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 0a 20 20  _SetCookie: {.  
1b130 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72  Db *pDb;.  asser
1b140 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54  t( pOp->p2<SQLIT
1b150 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29  E_N_BTREE_META )
1b160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1b170 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1b180 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  1<db->nDb );.  a
1b190 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73  ssert( DbMaskTes
1b1a0 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
1b1b0 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73  pOp->p1) );.  as
1b1c0 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
1b1d0 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20  y==0 );.  pDb = 
1b1e0 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31  &db->aDb[pOp->p1
1b1f0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ];.  assert( pDb
1b200 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
1b210 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1b220 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1b230 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a   pOp->p1, 0) );.
1b240 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20 61 62    /* See note ab
1b250 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66 74 69  out index shifti
1b260 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43 6f 6f  ng on OP_ReadCoo
1b270 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  kie */.  rc = sq
1b280 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1b290 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20 70  Meta(pDb->pBt, p
1b2a0 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 29  Op->p2, pOp->p3)
1b2b0 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d  ;.  if( pOp->p2=
1b2c0 3d 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45  =BTREE_SCHEMA_VE
1b2d0 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20  RSION ){.    /* 
1b2e0 57 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  When the schema 
1b2f0 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 2c 20  cookie changes, 
1b300 72 65 63 6f 72 64 20 74 68 65 20 6e 65 77 20 63  record the new c
1b310 6f 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ookie internally
1b320 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63   */.    pDb->pSc
1b330 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
1b340 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  kie = pOp->p3;. 
1b350 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
1b360 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
1b370 6e 67 65 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nges;.  }else if
1b380 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45  ( pOp->p2==BTREE
1b390 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b 0a  _FILE_FORMAT ){.
1b3a0 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 63 68      /* Record ch
1b3b0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  anges in the fil
1b3c0 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20  e format */.    
1b3d0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
1b3e0 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 4f 70 2d  le_format = pOp-
1b3f0 3e 70 33 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  >p3;.  }.  if( p
1b400 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b 0a 20 20 20  Op->p1==1 ){.   
1b410 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61   /* Invalidate a
1b420 6c 6c 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ll prepared stat
1b430 65 6d 65 6e 74 73 20 77 68 65 6e 65 76 65 72 20  ements whenever 
1b440 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
1b450 65 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20  e.    ** schema 
1b460 69 73 20 63 68 61 6e 67 65 64 2e 20 20 54 69 63  is changed.  Tic
1b470 6b 65 74 20 23 31 36 34 34 20 2a 2f 0a 20 20 20  ket #1644 */.   
1b480 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
1b490 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
1b4a0 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70  (db);.    p->exp
1b4b0 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ired = 0;.  }.  
1b4c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
1b4d0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1b4e0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1b4f0 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52 65 61   Opcode: OpenRea
1b500 64 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  d P1 P2 P3 P4 P5
1b510 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f  .** Synopsis: ro
1b520 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a 0a  ot=P2 iDb=P3.**.
1b530 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  ** Open a read-o
1b540 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72 20 74  nly cursor for t
1b550 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
1b560 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67  e whose root pag
1b570 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20 61 20  e is.** P2 in a 
1b580 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1b590 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
1b5a0 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
1b5b0 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d 30  by P3. .** P3==0
1b5c0 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
1b5d0 64 61 74 61 62 61 73 65 2c 20 50 33 3d 3d 31 20  database, P3==1 
1b5e0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1b5f0 73 65 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20  se used for .** 
1b600 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
1b610 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65 61 6e 73  , and P3>1 means
1b620 20 75 73 65 64 20 74 68 65 20 63 6f 72 72 65 73   used the corres
1b630 70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68 65 64  ponding attached
1b640 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 47  .** database.  G
1b650 69 76 65 20 74 68 65 20 6e 65 77 20 63 75 72 73  ive the new curs
1b660 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  or an identifier
1b670 20 6f 66 20 50 31 2e 20 20 54 68 65 20 50 31 0a   of P1.  The P1.
1b680 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65 64 20 6e  ** values need n
1b690 6f 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73  ot be contiguous
1b6a0 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61 6c 75   but all P1 valu
1b6b0 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 6d 61  es should be sma
1b6c0 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20  ll integers..** 
1b6d0 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66  It is an error f
1b6e0 6f 72 20 50 31 20 74 6f 20 62 65 20 6e 65 67 61  or P1 to be nega
1b6f0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tive..**.** If P
1b700 35 21 3d 30 20 74 68 65 6e 20 75 73 65 20 74 68  5!=0 then use th
1b710 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
1b720 69 73 74 65 72 20 50 32 20 61 73 20 74 68 65 20  ister P2 as the 
1b730 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f 74 0a 2a  root page, not.*
1b740 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  * the value of P
1b750 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  2 itself..**.** 
1b760 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 61 20  There will be a 
1b770 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1b780 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 65 76   database whenev
1b790 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  er there is an.*
1b7a0 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e 20 20  * open cursor.  
1b7b0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1b7c0 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20 70 72 69  was unlocked pri
1b7d0 6f 72 20 74 6f 20 74 68 69 73 20 69 6e 73 74 72  or to this instr
1b7e0 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 61  uction.** then a
1b7f0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 61 63   read lock is ac
1b800 71 75 69 72 65 64 20 61 73 20 70 61 72 74 20 6f  quired as part o
1b810 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
1b820 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a 2a 20 6c  on.  A read.** l
1b830 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74 68 65 72  ock allows other
1b840 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 72 65   processes to re
1b850 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1b860 62 75 74 20 70 72 6f 68 69 62 69 74 73 0a 2a 2a  but prohibits.**
1b870 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
1b880 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66 79 69 6e  ss from modifyin
1b890 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  g the database. 
1b8a0 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 69   The read lock i
1b8b0 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68  s.** released wh
1b8c0 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
1b8d0 72 65 20 63 6c 6f 73 65 64 2e 20 20 49 66 20 74  re closed.  If t
1b8e0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
1b8f0 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 67  attempts.** to g
1b900 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 62  et a read lock b
1b910 75 74 20 66 61 69 6c 73 2c 20 74 68 65 20 73 63  ut fails, the sc
1b920 72 69 70 74 20 74 65 72 6d 69 6e 61 74 65 73 20  ript terminates 
1b930 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
1b940 45 5f 42 55 53 59 20 65 72 72 6f 72 20 63 6f 64  E_BUSY error cod
1b950 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  e..**.** The P4 
1b960 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74  value may be eit
1b970 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28  her an integer (
1b980 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70  P4_INT32) or a p
1b990 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b  ointer to.** a K
1b9a0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1b9b0 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49   (P4_KEYINFO). I
1b9c0 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65  f it is a pointe
1b9d0 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a  r to a KeyInfo .
1b9e0 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
1b9f0 65 6e 20 73 61 69 64 20 73 74 72 75 63 74 75 72  en said structur
1ba00 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f  e defines the co
1ba10 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74  ntent and collat
1ba20 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ing .** sequence
1ba30 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   of the index be
1ba40 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65  ing opened. Othe
1ba50 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 73 20  rwise, if P4 is 
1ba60 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76  an integer .** v
1ba70 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65 74 20  alue, it is set 
1ba80 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1ba90 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1baa0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  table..**.** See
1bab0 20 61 6c 73 6f 3a 20 4f 70 65 6e 57 72 69 74 65   also: OpenWrite
1bac0 2c 20 52 65 6f 70 65 6e 49 64 78 0a 2a 2f 0a 2f  , ReopenIdx.*/./
1bad0 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6f 70 65 6e  * Opcode: Reopen
1bae0 49 64 78 20 50 31 20 50 32 20 50 33 20 50 34 20  Idx P1 P2 P3 P4 
1baf0 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
1bb00 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a  root=P2 iDb=P3.*
1bb10 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65 6e 49  *.** The ReopenI
1bb20 64 78 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  dx opcode works 
1bb30 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 52 65 61  exactly like Rea
1bb40 64 4f 70 65 6e 20 65 78 63 65 70 74 20 74 68 61  dOpen except tha
1bb50 74 20 69 74 20 66 69 72 73 74 0a 2a 2a 20 63 68  t it first.** ch
1bb60 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
1bb70 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 50 31 20  he cursor on P1 
1bb80 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
1bb90 77 69 74 68 20 61 20 72 6f 6f 74 20 70 61 67 65  with a root page
1bba0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 50 32  .** number of P2
1bbb0 20 61 6e 64 20 69 66 20 69 74 20 69 73 20 74 68   and if it is th
1bbc0 69 73 20 6f 70 63 6f 64 65 20 62 65 63 6f 6d 65  is opcode become
1bbd0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 6e 20 6f  s a no-op.  In o
1bbe0 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 69  ther words,.** i
1bbf0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1bc00 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 64 6f  already open, do
1bc10 20 6e 6f 74 20 72 65 6f 70 65 6e 20 69 74 2e 0a   not reopen it..
1bc20 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65 6e  **.** The Reopen
1bc30 49 64 78 20 6f 70 63 6f 64 65 20 6d 61 79 20 6f  Idx opcode may o
1bc40 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
1bc50 20 50 35 3d 3d 30 20 61 6e 64 20 77 69 74 68 20   P5==0 and with 
1bc60 50 34 20 62 65 69 6e 67 0a 2a 2a 20 61 20 50 34  P4 being.** a P4
1bc70 5f 4b 45 59 49 4e 46 4f 20 6f 62 6a 65 63 74 2e  _KEYINFO object.
1bc80 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74    Furthermore, t
1bc90 68 65 20 50 33 20 76 61 6c 75 65 20 6d 75 73 74  he P3 value must
1bca0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
1bcb0 2a 2a 20 65 76 65 72 79 20 6f 74 68 65 72 20 52  ** every other R
1bcc0 65 6f 70 65 6e 49 64 78 20 6f 72 20 4f 70 65 6e  eopenIdx or Open
1bcd0 52 65 61 64 20 66 6f 72 20 74 68 65 20 73 61 6d  Read for the sam
1bce0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e  e cursor number.
1bcf0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 4f  .**.** See the O
1bd00 70 65 6e 52 65 61 64 20 6f 70 63 6f 64 65 20 64  penRead opcode d
1bd10 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
1bd20 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1bd30 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f  rmation..*/./* O
1bd40 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72 69 74 65  pcode: OpenWrite
1bd50 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
1bd60 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 6f  ** Synopsis: roo
1bd70 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a 0a 2a  t=P2 iDb=P3.**.*
1bd80 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2f 77 72  * Open a read/wr
1bd90 69 74 65 20 63 75 72 73 6f 72 20 6e 61 6d 65 64  ite cursor named
1bda0 20 50 31 20 6f 6e 20 74 68 65 20 74 61 62 6c 65   P1 on the table
1bdb0 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20   or index whose 
1bdc0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
1bdd0 50 32 2e 20 20 4f 72 20 69 66 20 50 35 21 3d 30  P2.  Or if P5!=0
1bde0 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   use the content
1bdf0 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20   of register P2 
1be00 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 72  to find the.** r
1be10 6f 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  oot page..**.** 
1be20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61 79  The P4 value may
1be30 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 69 6e   be either an in
1be40 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32 29  teger (P4_INT32)
1be50 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
1be60 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  .** a KeyInfo st
1be70 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59 49  ructure (P4_KEYI
1be80 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20 61  NFO). If it is a
1be90 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
1bea0 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
1beb0 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64 20 73  ure, then said s
1bec0 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 65 73  tructure defines
1bed0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64   the content and
1bee0 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73   collating .** s
1bef0 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 69  equence of the i
1bf00 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65 6e 65  ndex being opene
1bf10 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1bf20 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65 67 65   P4 is an intege
1bf30 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69 74 20  r .** value, it 
1bf40 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1bf50 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1bf60 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72  in the table, or
1bf70 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65   to the.** large
1bf80 73 74 20 69 6e 64 65 78 20 6f 66 20 61 6e 79 20  st index of any 
1bf90 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
1bfa0 62 6c 65 20 74 68 61 74 20 69 73 20 61 63 74 75  ble that is actu
1bfb0 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ally used..**.**
1bfc0 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
1bfd0 6e 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  n works just lik
1bfe0 65 20 4f 70 65 6e 52 65 61 64 20 65 78 63 65 70  e OpenRead excep
1bff0 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e 73 20  t that it opens 
1c000 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 6e  the cursor.** in
1c010 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f 64 65   read/write mode
1c020 2e 20 20 46 6f 72 20 61 20 67 69 76 65 6e 20 74  .  For a given t
1c030 61 62 6c 65 2c 20 74 68 65 72 65 20 63 61 6e 20  able, there can 
1c040 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72  be one or more r
1c050 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73  ead-only.** curs
1c060 6f 72 73 20 6f 72 20 61 20 73 69 6e 67 6c 65 20  ors or a single 
1c070 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
1c080 72 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 0a  r but not both..
1c090 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 4f  **.** See also O
1c0a0 70 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63 61 73 65  penRead..*/.case
1c0b0 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3a 20 7b   OP_ReopenIdx: {
1c0c0 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
1c0d0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c0e0 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20 20  fo;.  int p2;.  
1c0f0 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 77  int iDb;.  int w
1c100 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65 20 2a  rFlag;.  Btree *
1c110 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  pX;.  VdbeCursor
1c120 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a 70 44   *pCur;.  Db *pD
1c130 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  b;..  assert( pO
1c140 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d  p->p5==0 || pOp-
1c150 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b  >p5==OPFLAG_SEEK
1c160 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
1c170 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
1c180 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 70 43 75  KEYINFO );.  pCu
1c190 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  r = p->apCsr[pOp
1c1a0 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 43 75  ->p1];.  if( pCu
1c1b0 72 20 26 26 20 70 43 75 72 2d 3e 70 67 6e 6f 52  r && pCur->pgnoR
1c1c0 6f 6f 74 3d 3d 28 75 33 32 29 70 4f 70 2d 3e 70  oot==(u32)pOp->p
1c1d0 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
1c1e0 20 70 43 75 72 2d 3e 69 44 62 3d 3d 70 4f 70 2d   pCur->iDb==pOp-
1c1f0 3e 70 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 47  >p3 );      /* G
1c200 75 61 72 61 6e 74 65 65 64 20 62 79 20 74 68 65  uaranteed by the
1c210 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1c220 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  */.    goto open
1c230 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68 69 6e 74  _cursor_set_hint
1c240 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74  s;.  }.  /* If t
1c250 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1c260 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
1c270 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20  or is open on a 
1c280 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 69  different.  ** i
1c290 6e 64 65 78 2c 20 74 68 65 6e 20 66 61 6c 6c 20  ndex, then fall 
1c2a0 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f  through into OP_
1c2b0 4f 70 65 6e 52 65 61 64 20 74 6f 20 66 6f 72 63  OpenRead to forc
1c2c0 65 20 61 20 72 65 6f 70 65 6e 20 2a 2f 0a 63 61  e a reopen */.ca
1c2d0 73 65 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3a 0a  se OP_OpenRead:.
1c2e0 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74  case OP_OpenWrit
1c2f0 65 3a 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  e:..  assert( pO
1c300 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70  p->opcode==OP_Op
1c310 65 6e 57 72 69 74 65 20 7c 7c 20 70 4f 70 2d 3e  enWrite || pOp->
1c320 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35  p5==0 || pOp->p5
1c330 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20  ==OPFLAG_SEEKEQ 
1c340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1c350 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 61  bIsReader );.  a
1c360 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
1c370 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20  de==OP_OpenRead 
1c380 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  || pOp->opcode==
1c390 4f 50 5f 52 65 6f 70 65 6e 49 64 78 0a 20 20 20  OP_ReopenIdx.   
1c3a0 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 65 61         || p->rea
1c3b0 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69  dOnly==0 );..  i
1c3c0 66 28 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  f( p->expired ){
1c3d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c3e0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3b  _ABORT_ROLLBACK;
1c3f0 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
1c400 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1c410 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20 30 3b  }..  nField = 0;
1c420 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  .  pKeyInfo = 0;
1c430 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
1c440 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33  .  iDb = pOp->p3
1c450 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
1c460 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
1c470 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44  b );.  assert( D
1c480 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
1c490 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a  eeMask, iDb) );.
1c4a0 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
1c4b0 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d 20 70 44  [iDb];.  pX = pD
1c4c0 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  b->pBt;.  assert
1c4d0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( pX!=0 );.  if(
1c4e0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1c4f0 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b 0a 20 20  _OpenWrite ){.  
1c500 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47    assert( OPFLAG
1c510 5f 46 4f 52 44 45 4c 45 54 45 3d 3d 42 54 52 45  _FORDELETE==BTRE
1c520 45 5f 46 4f 52 44 45 4c 45 54 45 20 29 3b 0a 20  E_FORDELETE );. 
1c530 20 20 20 77 72 46 6c 61 67 20 3d 20 42 54 52 45     wrFlag = BTRE
1c540 45 5f 57 52 43 53 52 20 7c 20 28 70 4f 70 2d 3e  E_WRCSR | (pOp->
1c550 70 35 20 26 20 4f 50 46 4c 41 47 5f 46 4f 52 44  p5 & OPFLAG_FORD
1c560 45 4c 45 54 45 29 3b 0a 20 20 20 20 61 73 73 65  ELETE);.    asse
1c570 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
1c580 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
1c590 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
1c5a0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
1c5b0 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3c 20 70 2d  file_format < p-
1c5c0 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
1c5d0 6d 61 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  mat ){.      p->
1c5e0 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
1c5f0 61 74 20 3d 20 70 44 62 2d 3e 70 53 63 68 65 6d  at = pDb->pSchem
1c600 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 0a  a->file_format;.
1c610 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1c620 20 20 20 77 72 46 6c 61 67 20 3d 20 30 3b 0a 20     wrFlag = 0;. 
1c630 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35   }.  if( pOp->p5
1c640 20 26 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45   & OPFLAG_P2ISRE
1c650 47 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  G ){.    assert(
1c660 20 70 32 3e 30 20 29 3b 0a 20 20 20 20 61 73 73   p2>0 );.    ass
1c670 65 72 74 28 20 70 32 3c 3d 28 70 2d 3e 6e 4d 65  ert( p2<=(p->nMe
1c680 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
1c690 29 20 29 3b 0a 20 20 20 20 70 49 6e 32 20 3d 20  ) );.    pIn2 = 
1c6a0 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 20 20 61  &aMem[p2];.    a
1c6b0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
1c6c0 64 28 70 49 6e 32 29 20 29 3b 0a 20 20 20 20 61  d(pIn2) );.    a
1c6d0 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66 6c  ssert( (pIn2->fl
1c6e0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
1c6f0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1c700 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
1c710 79 28 70 49 6e 32 29 3b 0a 20 20 20 20 70 32 20  y(pIn2);.    p2 
1c720 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e 75 2e 69  = (int)pIn2->u.i
1c730 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 32 20  ;.    /* The p2 
1c740 76 61 6c 75 65 20 61 6c 77 61 79 73 20 63 6f 6d  value always com
1c750 65 73 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  es from a prior 
1c760 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f  OP_CreateTable o
1c770 70 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 2a 2a  pcode and.    **
1c780 20 74 68 61 74 20 6f 70 63 6f 64 65 20 77 69 6c   that opcode wil
1c790 6c 20 61 6c 77 61 79 73 20 73 65 74 20 74 68 65  l always set the
1c7a0 20 70 32 20 76 61 6c 75 65 20 74 6f 20 32 20 6f   p2 value to 2 o
1c7b0 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73 65 20 66  r more or else f
1c7c0 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ail..    ** If t
1c7d0 68 65 72 65 20 77 65 72 65 20 61 20 66 61 69 6c  here were a fail
1c7e0 75 72 65 2c 20 74 68 65 20 70 72 65 70 61 72 65  ure, the prepare
1c7f0 64 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c  d statement woul
1c800 64 20 68 61 76 65 20 68 61 6c 74 65 64 0a 20 20  d have halted.  
1c810 20 20 2a 2a 20 62 65 66 6f 72 65 20 72 65 61 63    ** before reac
1c820 68 69 6e 67 20 74 68 69 73 20 69 6e 73 74 72 75  hing this instru
1c830 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 73  ction. */.    as
1c840 73 65 72 74 28 20 70 32 3e 3d 32 20 29 3b 0a 20  sert( p2>=2 );. 
1c850 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34   }.  if( pOp->p4
1c860 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
1c870 20 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f   ){.    pKeyInfo
1c880 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
1c890 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nfo;.    assert(
1c8a0 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d   pKeyInfo->enc==
1c8b0 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 20 20 61  ENC(db) );.    a
1c8c0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1c8d0 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20 20 6e  >db==db );.    n
1c8e0 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
1c8f0 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66  ->nField+pKeyInf
1c900 6f 2d 3e 6e 58 46 69 65 6c 64 3b 0a 20 20 7d 65  o->nXField;.  }e
1c910 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 34 74  lse if( pOp->p4t
1c920 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ype==P4_INT32 ){
1c930 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f  .    nField = pO
1c940 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d 0a 20 20 61  p->p4.i;.  }.  a
1c950 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1c960 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1c970 46 69 65 6c 64 3e 3d 30 20 29 3b 0a 20 20 74 65  Field>=0 );.  te
1c980 73 74 63 61 73 65 28 20 6e 46 69 65 6c 64 3d 3d  stcase( nField==
1c990 30 20 29 3b 20 20 2f 2a 20 54 61 62 6c 65 20 77  0 );  /* Table w
1c9a0 69 74 68 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ith INTEGER PRIM
1c9b0 41 52 59 20 4b 45 59 20 61 6e 64 20 6e 6f 74 68  ARY KEY and noth
1c9c0 69 6e 67 20 65 6c 73 65 20 2a 2f 0a 20 20 70 43  ing else */.  pC
1c9d0 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  ur = allocateCur
1c9e0 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
1c9f0 6e 46 69 65 6c 64 2c 20 69 44 62 2c 20 43 55 52  nField, iDb, CUR
1ca00 54 59 50 45 5f 42 54 52 45 45 29 3b 0a 20 20 69  TYPE_BTREE);.  i
1ca10 66 28 20 70 43 75 72 3d 3d 30 20 29 20 67 6f 74  f( pCur==0 ) got
1ca20 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 75 72  o no_mem;.  pCur
1ca30 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
1ca40 20 70 43 75 72 2d 3e 69 73 4f 72 64 65 72 65 64   pCur->isOrdered
1ca50 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 70 67   = 1;.  pCur->pg
1ca60 6e 6f 52 6f 6f 74 20 3d 20 70 32 3b 0a 23 69 66  noRoot = p2;.#if
1ca70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ca80 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
1ca90 3d 20 77 72 46 6c 61 67 3b 0a 23 65 6e 64 69 66  = wrFlag;.#endif
1caa0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1cab0 74 72 65 65 43 75 72 73 6f 72 28 70 58 2c 20 70  treeCursor(pX, p
1cac0 32 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  2, wrFlag, pKeyI
1cad0 6e 66 6f 2c 20 70 43 75 72 2d 3e 75 63 2e 70 43  nfo, pCur->uc.pC
1cae0 75 72 73 6f 72 29 3b 0a 20 20 70 43 75 72 2d 3e  ursor);.  pCur->
1caf0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1cb00 6e 66 6f 3b 0a 20 20 2f 2a 20 53 65 74 20 74 68  nfo;.  /* Set th
1cb10 65 20 56 64 62 65 43 75 72 73 6f 72 2e 69 73 54  e VdbeCursor.isT
1cb20 61 62 6c 65 20 76 61 72 69 61 62 6c 65 2e 20 50  able variable. P
1cb30 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
1cb40 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   of.  ** SQLite 
1cb50 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
1cb60 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 66   the root-page f
1cb70 6c 61 67 73 20 77 65 72 65 20 73 61 6e 65 20 61  lags were sane a
1cb80 74 20 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 2a  t this point.  *
1cb90 2a 20 61 6e 64 20 72 65 70 6f 72 74 20 64 61 74  * and report dat
1cba0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1cbb0 20 69 66 20 74 68 65 79 20 77 65 72 65 20 6e 6f   if they were no
1cbc0 74 2c 20 62 75 74 20 74 68 69 73 20 63 68 65 63  t, but this chec
1cbd0 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69 6e 63 65  k has.  ** since
1cbe0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
1cbf0 62 74 72 65 65 20 6c 61 79 65 72 2e 20 20 2a 2f  btree layer.  */
1cc00 20 20 0a 20 20 70 43 75 72 2d 3e 69 73 54 61 62    .  pCur->isTab
1cc10 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65  le = pOp->p4type
1cc20 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 0a 6f  !=P4_KEYINFO;..o
1cc30 70 65 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68  pen_cursor_set_h
1cc40 69 6e 74 73 3a 0a 20 20 61 73 73 65 72 74 28 20  ints:.  assert( 
1cc50 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 3d 3d  OPFLAG_BULKCSR==
1cc60 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 29  BTREE_BULKLOAD )
1cc70 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c  ;.  assert( OPFL
1cc80 41 47 5f 53 45 45 4b 45 51 3d 3d 42 54 52 45 45  AG_SEEKEQ==BTREE
1cc90 5f 53 45 45 4b 5f 45 51 20 29 3b 0a 20 20 74 65  _SEEK_EQ );.  te
1cca0 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 20  stcase( pOp->p5 
1ccb0 26 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52  & OPFLAG_BULKCSR
1ccc0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1ccd0 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
1cce0 48 49 4e 54 53 0a 20 20 74 65 73 74 63 61 73 65  HINTS.  testcase
1ccf0 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f 50 46 4c  ( pOp->p2 & OPFL
1cd00 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 23 65 6e  AG_SEEKEQ );.#en
1cd10 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
1cd20 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
1cd30 73 28 70 43 75 72 2d 3e 75 63 2e 70 43 75 72 73  s(pCur->uc.pCurs
1cd40 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f     (pOp->p5 & (O
1cd70 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 4f 50  PFLAG_BULKCSR|OP
1cd80 46 4c 41 47 5f 53 45 45 4b 45 51 29 29 29 3b 0a  FLAG_SEEKEQ)));.
1cd90 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1cda0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1cdb0 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  or;.  break;.}..
1cdc0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 45  /* Opcode: OpenE
1cdd0 70 68 65 6d 65 72 61 6c 20 50 31 20 50 32 20 2a  phemeral P1 P2 *
1cde0 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
1cdf0 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a  is: nColumn=P2.*
1ce00 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
1ce10 63 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20 74  cursor P1 to a t
1ce20 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 2e 0a  ransient table..
1ce30 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  ** The cursor is
1ce40 20 61 6c 77 61 79 73 20 6f 70 65 6e 65 64 20 72   always opened r
1ce50 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e 20 69  ead/write even i
1ce60 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64  f .** the main d
1ce70 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
1ce80 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70 68 65 6d  only.  The ephem
1ce90 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73  eral.** table is
1cea0 20 64 65 6c 65 74 65 64 20 61 75 74 6f 6d 61 74   deleted automat
1ceb0 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 20  ically when the 
1cec0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1ced0 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68  ..**.** P2 is th
1cee0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
1cef0 6d 6e 73 20 69 6e 20 74 68 65 20 65 70 68 65 6d  mns in the ephem
1cf00 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  eral table..** T
1cf10 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73  he cursor points
1cf20 20 74 6f 20 61 20 42 54 72 65 65 20 74 61 62 6c   to a BTree tabl
1cf30 65 20 69 66 20 50 34 3d 3d 30 20 61 6e 64 20 74  e if P4==0 and t
1cf40 6f 20 61 20 42 54 72 65 65 20 69 6e 64 65 78 0a  o a BTree index.
1cf50 2a 2a 20 69 66 20 50 34 20 69 73 20 6e 6f 74 20  ** if P4 is not 
1cf60 30 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74  0.  If P4 is not
1cf70 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73   NULL, it points
1cf80 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
1cf90 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20  ructure.** that 
1cfa0 64 65 66 69 6e 65 73 20 74 68 65 20 66 6f 72 6d  defines the form
1cfb0 61 74 20 6f 66 20 6b 65 79 73 20 69 6e 20 74 68  at of keys in th
1cfc0 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  e index..**.** T
1cfd0 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
1cfe0 63 61 6e 20 62 65 20 61 20 6d 61 73 6b 20 6f 66  can be a mask of
1cff0 20 74 68 65 20 42 54 52 45 45 5f 2a 20 66 6c 61   the BTREE_* fla
1d000 67 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 69 6e  gs defined.** in
1d010 20 62 74 72 65 65 2e 68 2e 20 20 54 68 65 73 65   btree.h.  These
1d020 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 20 61   flags control a
1d030 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70  spects of the op
1d040 65 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  eration of.** th
1d050 65 20 62 74 72 65 65 2e 20 20 54 68 65 20 42 54  e btree.  The BT
1d060 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
1d070 20 61 6e 64 20 42 54 52 45 45 5f 53 49 4e 47 4c   and BTREE_SINGL
1d080 45 20 66 6c 61 67 73 20 61 72 65 0a 2a 2a 20 61  E flags are.** a
1d090 64 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  dded automatical
1d0a0 6c 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ly..*/./* Opcode
1d0b0 3a 20 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 20  : OpenAutoindex 
1d0c0 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20  P1 P2 * P4 *.** 
1d0d0 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f 6c 75 6d  Synopsis: nColum
1d0e0 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  n=P2.**.** This 
1d0f0 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 74 68 65  opcode works the
1d100 20 73 61 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e   same as OP_Open
1d110 45 70 68 65 6d 65 72 61 6c 2e 20 20 49 74 20 68  Ephemeral.  It h
1d120 61 73 20 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e  as a.** differen
1d130 74 20 6e 61 6d 65 20 74 6f 20 64 69 73 74 69 6e  t name to distin
1d140 67 75 69 73 68 20 69 74 73 20 75 73 65 2e 20 20  guish its use.  
1d150 54 61 62 6c 65 73 20 63 72 65 61 74 65 64 20 75  Tables created u
1d160 73 69 6e 67 0a 2a 2a 20 62 79 20 74 68 69 73 20  sing.** by this 
1d170 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75  opcode will be u
1d180 73 65 64 20 66 6f 72 20 61 75 74 6f 6d 61 74 69  sed for automati
1d190 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 72  cally created tr
1d1a0 61 6e 73 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  ansient.** indic
1d1b0 65 73 20 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a  es in joins..*/.
1d1c0 63 61 73 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f  case OP_OpenAuto
1d1d0 69 6e 64 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f  index: .case OP_
1d1e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b  OpenEphemeral: {
1d1f0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1d200 43 78 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  Cx;.  KeyInfo *p
1d210 4b 65 79 49 6e 66 6f 3b 0a 0a 20 20 73 74 61 74  KeyInfo;..  stat
1d220 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 76 66 73  ic const int vfs
1d230 46 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 53  Flags = .      S
1d240 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1d250 52 49 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  RITE |.      SQL
1d260 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
1d270 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  |.      SQLITE_O
1d280 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
1d290 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1d2a0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
1d2b0 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  |.      SQLITE_O
1d2c0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
1d2d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1d2e0 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  >p1>=0 );.  asse
1d2f0 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
1d300 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61  ;.  pCx = alloca
1d310 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d  teCursor(p, pOp-
1d320 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31  >p1, pOp->p2, -1
1d330 2c 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 29  , CURTYPE_BTREE)
1d340 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  ;.  if( pCx==0 )
1d350 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
1d360 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  pCx->nullRow = 1
1d370 3b 0a 20 20 70 43 78 2d 3e 69 73 45 70 68 65 6d  ;.  pCx->isEphem
1d380 65 72 61 6c 20 3d 20 31 3b 0a 20 20 72 63 20 3d  eral = 1;.  rc =
1d390 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
1d3a0 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
1d3b0 62 2c 20 26 70 43 78 2d 3e 70 42 74 2c 20 0a 20  b, &pCx->pBt, . 
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 20 20 20 20 20 20 42 54 52 45 45 5f 4f 4d 49         BTREE_OMI
1d3e0 54 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42 54 52 45  T_JOURNAL | BTRE
1d3f0 45 5f 53 49 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e  E_SINGLE | pOp->
1d400 70 35 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20  p5, vfsFlags);. 
1d410 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d420 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1d430 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1d440 54 72 61 6e 73 28 70 43 78 2d 3e 70 42 74 2c 20  Trans(pCx->pBt, 
1d450 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
1d460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d470 20 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73     /* If a trans
1d480 69 65 6e 74 20 69 6e 64 65 78 20 69 73 20 72 65  ient index is re
1d490 71 75 69 72 65 64 2c 20 63 72 65 61 74 65 20 69  quired, create i
1d4a0 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20  t by calling.   
1d4b0 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
1d4c0 43 72 65 61 74 65 54 61 62 6c 65 28 29 20 77 69  CreateTable() wi
1d4d0 74 68 20 74 68 65 20 42 54 52 45 45 5f 42 4c 4f  th the BTREE_BLO
1d4e0 42 4b 45 59 20 66 6c 61 67 20 62 65 66 6f 72 65  BKEY flag before
1d4f0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
1d500 69 74 2e 20 49 66 20 61 20 74 72 61 6e 73 69 65  it. If a transie
1d510 6e 74 20 74 61 62 6c 65 20 69 73 20 72 65 71 75  nt table is requ
1d520 69 72 65 64 2c 20 6a 75 73 74 20 75 73 65 20 74  ired, just use t
1d530 68 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  he.    ** automa
1d540 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
1d550 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1d560 70 61 67 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f  page 1 (an BLOB_
1d570 49 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20  INTKEY table).. 
1d580 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
1d590 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
1d5a0 34 2e 70 4b 65 79 49 6e 66 6f 29 21 3d 30 20 29  4.pKeyInfo)!=0 )
1d5b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f  {.      int pgno
1d5c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d5d0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
1d5e0 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20  KEYINFO );.     
1d5f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1d600 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 43  eeCreateTable(pC
1d610 78 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 42  x->pBt, &pgno, B
1d620 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 7c 20 70  TREE_BLOBKEY | p
1d630 4f 70 2d 3e 70 35 29 3b 20 0a 20 20 20 20 20 20  Op->p5); .      
1d640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d650 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
1d660 65 72 74 28 20 70 67 6e 6f 3d 3d 4d 41 53 54 45  ert( pgno==MASTE
1d670 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20 20 20  R_ROOT+1 );.    
1d680 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
1d690 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  Info->db==db );.
1d6a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d6b0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45  pKeyInfo->enc==E
1d6c0 4e 43 28 64 62 29 20 29 3b 0a 20 20 20 20 20 20  NC(db) );.      
1d6d0 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20    pCx->pKeyInfo 
1d6e0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  = pKeyInfo;.    
1d6f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d700 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d  BtreeCursor(pCx-
1d710 3e 70 42 74 2c 20 70 67 6e 6f 2c 20 42 54 52 45  >pBt, pgno, BTRE
1d720 45 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20  E_WRCSR,.       
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
1d750 6f 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  o, pCx->uc.pCurs
1d760 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
1d770 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20     pCx->isTable 
1d780 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1d790 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d7a0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43  e3BtreeCursor(pC
1d7b0 78 2d 3e 70 42 74 2c 20 4d 41 53 54 45 52 5f 52  x->pBt, MASTER_R
1d7c0 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52 43 53 52  OOT, BTREE_WRCSR
1d7d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 30 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  0, pCx->uc.pCurs
1d800 6f 72 29 3b 0a 20 20 20 20 20 20 70 43 78 2d 3e  or);.      pCx->
1d810 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  isTable = 1;.   
1d820 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20   }.  }.  if( rc 
1d830 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1d840 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43 78  _to_error;.  pCx
1d850 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 70  ->isOrdered = (p
1d860 4f 70 2d 3e 70 35 21 3d 42 54 52 45 45 5f 55 4e  Op->p5!=BTREE_UN
1d870 4f 52 44 45 52 45 44 29 3b 0a 20 20 62 72 65 61  ORDERED);.  brea
1d880 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1d890 20 53 6f 72 74 65 72 4f 70 65 6e 20 50 31 20 50   SorterOpen P1 P
1d8a0 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
1d8b0 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
1d8c0 73 20 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45 70  s like OP_OpenEp
1d8d0 68 65 6d 65 72 61 6c 20 65 78 63 65 70 74 20 74  hemeral except t
1d8e0 68 61 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a 20  hat it opens.** 
1d8f0 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  a transient inde
1d900 78 20 74 68 61 74 20 69 73 20 73 70 65 63 69 66  x that is specif
1d910 69 63 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20  ically designed 
1d920 74 6f 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a 2a  to sort large.**
1d930 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e   tables using an
1d940 20 65 78 74 65 72 6e 61 6c 20 6d 65 72 67 65 2d   external merge-
1d950 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  sort algorithm..
1d960 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1d970 74 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t P3 is non-zero
1d980 2c 20 74 68 65 6e 20 69 74 20 69 6e 64 69 63 61  , then it indica
1d990 74 65 73 20 74 68 61 74 20 74 68 65 20 73 6f 72  tes that the sor
1d9a0 74 65 72 20 6d 61 79 0a 2a 2a 20 61 73 73 75 6d  ter may.** assum
1d9b0 65 20 74 68 61 74 20 61 20 73 74 61 62 6c 65 20  e that a stable 
1d9c0 73 6f 72 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  sort considering
1d9d0 20 74 68 65 20 66 69 72 73 74 20 50 33 20 66 69   the first P3 fi
1d9e0 65 6c 64 73 20 6f 66 20 65 61 63 68 0a 2a 2a 20  elds of each.** 
1d9f0 6b 65 79 20 69 73 20 73 75 66 66 69 63 69 65 6e  key is sufficien
1da00 74 20 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65  t to produce the
1da10 20 72 65 71 75 69 72 65 64 20 72 65 73 75 6c 74   required result
1da20 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  s..*/.case OP_So
1da30 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56 64  rterOpen: {.  Vd
1da40 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a  beCursor *pCx;..
1da50 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1da60 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1>=0 );.  assert
1da70 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( pOp->p2>=0 );.
1da80 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
1da90 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1daa0 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20  1, pOp->p2, -1, 
1dab0 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 29 3b  CURTYPE_SORTER);
1dac0 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20  .  if( pCx==0 ) 
1dad0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
1dae0 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  Cx->pKeyInfo = p
1daf0 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
1db00 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e  .  assert( pCx->
1db10 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62  pKeyInfo->db==db
1db20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1db30 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63  x->pKeyInfo->enc
1db40 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 72  ==ENC(db) );.  r
1db50 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
1db60 6f 72 74 65 72 49 6e 69 74 28 64 62 2c 20 70 4f  orterInit(db, pO
1db70 70 2d 3e 70 33 2c 20 70 43 78 29 3b 0a 20 20 69  p->p3, pCx);.  i
1db80 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
1db90 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1dba0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1dbb0 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e 63 65  Opcode: Sequence
1dbc0 54 65 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Test P1 P2 * * *
1dbd0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
1dbe0 28 20 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72  ( cursor[P1].ctr
1dbf0 2b 2b 20 29 20 70 63 20 3d 20 50 32 0a 2a 2a 0a  ++ ) pc = P2.**.
1dc00 2a 2a 20 50 31 20 69 73 20 61 20 73 6f 72 74 65  ** P1 is a sorte
1dc10 72 20 63 75 72 73 6f 72 2e 20 49 66 20 74 68 65  r cursor. If the
1dc20 20 73 65 71 75 65 6e 63 65 20 63 6f 75 6e 74 65   sequence counte
1dc30 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 7a  r is currently z
1dc40 65 72 6f 2c 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20  ero, jump.** to 
1dc50 50 32 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  P2. Regardless o
1dc60 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
1dc70 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
1dc80 65 6e 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  en, increment th
1dc90 65 0a 2a 2a 20 74 68 65 20 73 65 71 75 65 6e 63  e.** the sequenc
1dca0 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65  e value..*/.case
1dcb0 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74   OP_SequenceTest
1dcc0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1dcd0 20 2a 70 43 3b 0a 20 20 61 73 73 65 72 74 28 20   *pC;.  assert( 
1dce0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1dcf0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1dd00 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
1dd10 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1dd20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72  assert( isSorter
1dd30 28 70 43 29 20 29 3b 0a 20 20 69 66 28 20 28 70  (pC) );.  if( (p
1dd40 43 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 29 3d 3d  C->seqCount++)==
1dd50 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
1dd60 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
1dd70 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1dd80 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75 64 6f 20  ode: OpenPseudo 
1dd90 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
1dda0 53 79 6e 6f 70 73 69 73 3a 20 50 33 20 63 6f 6c  Synopsis: P3 col
1ddb0 75 6d 6e 73 20 69 6e 20 72 5b 50 32 5d 0a 2a 2a  umns in r[P2].**
1ddc0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63  .** Open a new c
1ddd0 75 72 73 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  ursor that point
1dde0 73 20 74 6f 20 61 20 66 61 6b 65 20 74 61 62 6c  s to a fake tabl
1ddf0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1de00 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20  a single.** row 
1de10 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 6f  of data.  The co
1de20 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20 6f 6e  ntent of that on
1de30 65 20 72 6f 77 20 69 73 20 74 68 65 20 63 6f 6e  e row is the con
1de40 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  tent of memory.*
1de50 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20  * register P2.  
1de60 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1de70 63 75 72 73 6f 72 20 50 31 20 62 65 63 6f 6d 65  cursor P1 become
1de80 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74  s an alias for t
1de90 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c 6f 62 20  he .** MEM_Blob 
1dea0 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e 65  content containe
1deb0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
1dec0 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64 6f  ..**.** A pseudo
1ded0 2d 74 61 62 6c 65 20 63 72 65 61 74 65 64 20 62  -table created b
1dee0 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  y this opcode is
1def0 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20   used to hold a 
1df00 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75  single.** row ou
1df10 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 73 6f  tput from the so
1df20 72 74 65 72 20 73 6f 20 74 68 61 74 20 74 68 65  rter so that the
1df30 20 72 6f 77 20 63 61 6e 20 62 65 20 64 65 63 6f   row can be deco
1df40 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 69  mposed into.** i
1df50 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e  ndividual column
1df60 73 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 43  s using the OP_C
1df70 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e 20 20 54  olumn opcode.  T
1df80 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
1df90 6f 64 65 0a 2a 2a 20 69 73 20 74 68 65 20 6f 6e  ode.** is the on
1dfa0 6c 79 20 63 75 72 73 6f 72 20 6f 70 63 6f 64 65  ly cursor opcode
1dfb0 20 74 68 61 74 20 77 6f 72 6b 73 20 77 69 74 68   that works with
1dfc0 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
1dfd0 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 74 68 65  .**.** P3 is the
1dfe0 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1dff0 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 73  s in the records
1e000 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
1e010 6f 72 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70  ored by.** the p
1e020 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a  seudo-table..*/.
1e030 63 61 73 65 20 4f 50 5f 4f 70 65 6e 50 73 65 75  case OP_OpenPseu
1e040 64 6f 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  do: {.  VdbeCurs
1e050 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73 65  or *pCx;..  asse
1e060 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
1e070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1e080 3e 70 33 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20  >p3>=0 );.  pCx 
1e090 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
1e0a0 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  (p, pOp->p1, pOp
1e0b0 2d 3e 70 33 2c 20 2d 31 2c 20 43 55 52 54 59 50  ->p3, -1, CURTYP
1e0c0 45 5f 50 53 45 55 44 4f 29 3b 0a 20 20 69 66 28  E_PSEUDO);.  if(
1e0d0 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
1e0e0 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75  o_mem;.  pCx->nu
1e0f0 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78  llRow = 1;.  pCx
1e100 2d 3e 75 63 2e 70 73 65 75 64 6f 54 61 62 6c 65  ->uc.pseudoTable
1e110 52 65 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  Reg = pOp->p2;. 
1e120 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20   pCx->isTable = 
1e130 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  1;.  assert( pOp
1e140 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 62 72 65  ->p5==0 );.  bre
1e150 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1e160 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a  : Close P1 * * *
1e170 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61   *.**.** Close a
1e180 20 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73   cursor previous
1e190 6c 79 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e  ly opened as P1.
1e1a0 20 20 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a    If P1 is not.*
1e1b0 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  * currently open
1e1c0 2c 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  , this instructi
1e1d0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1e1e0 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a  /.case OP_Close:
1e1f0 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
1e200 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1e210 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
1e220 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  .  sqlite3VdbeFr
1e230 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61  eeCursor(p, p->a
1e240 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a  pCsr[pOp->p1]);.
1e250 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e    p->apCsr[pOp->
1e260 70 31 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  p1] = 0;.  break
1e270 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1e280 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
1e290 5f 55 53 45 44 5f 4d 41 53 4b 0a 2f 2a 20 4f 70  _USED_MASK./* Op
1e2a0 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 73 55 73 65  code: ColumnsUse
1e2b0 64 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  d P1 * * P4 *.**
1e2c0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1e2d0 28 77 68 69 63 68 20 6f 6e 6c 79 20 65 78 69 73  (which only exis
1e2e0 74 73 20 69 66 20 53 51 4c 69 74 65 20 77 61 73  ts if SQLite was
1e2f0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a   compiled with.*
1e300 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1e310 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
1e320 29 20 69 64 65 6e 74 69 66 69 65 73 20 77 68 69  ) identifies whi
1e330 63 68 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ch columns of th
1e340 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1e350 64 65 78 20 66 6f 72 20 63 75 72 73 6f 72 20 50  dex for cursor P
1e360 31 20 61 72 65 20 75 73 65 64 2e 20 20 50 34 20  1 are used.  P4 
1e370 69 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  is a 64-bit inte
1e380 67 65 72 0a 2a 2a 20 28 50 34 5f 49 4e 54 36 34  ger.** (P4_INT64
1e390 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 66  ) in which the f
1e3a0 69 72 73 74 20 36 33 20 62 69 74 73 20 61 72 65  irst 63 bits are
1e3b0 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 6f 66   one for each of
1e3c0 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 36 33   the.** first 63
1e3d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1e3e0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
1e3f0 68 61 74 20 61 72 65 20 61 63 74 75 61 6c 6c 79  hat are actually
1e400 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20   used.** by the 
1e410 63 75 72 73 6f 72 2e 20 20 54 68 65 20 68 69 67  cursor.  The hig
1e420 68 2d 6f 72 64 65 72 20 62 69 74 20 69 73 20 73  h-order bit is s
1e430 65 74 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  et if any column
1e440 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 36 34   after.** the 64
1e450 74 68 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 63  th is used..*/.c
1e460 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  ase OP_ColumnsUs
1e470 65 64 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  ed: {.  VdbeCurs
1e480 6f 72 20 2a 70 43 3b 0a 20 20 70 43 20 3d 20 70  or *pC;.  pC = p
1e490 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1e4a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1e4b0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
1e4c0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 2d  E_BTREE );.  pC-
1e4d0 3e 6d 61 73 6b 55 73 65 64 20 3d 20 2a 28 75 36  >maskUsed = *(u6
1e4e0 34 2a 29 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b  4*)pOp->p4.pI64;
1e4f0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
1e500 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  if../* Opcode: S
1e510 65 65 6b 47 45 20 50 31 20 50 32 20 50 33 20 50  eekGE P1 P2 P3 P
1e520 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
1e530 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
1e540 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
1e550 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
1e560 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
1e570 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
1e580 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
1e590 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
1e5a0 67 69 73 74 65 72 20 50 33 20 61 73 20 74 68 65  gister P3 as the
1e5b0 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72   key.  If cursor
1e5c0 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1e5d0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1e5e0 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1e5f0 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1e600 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1e610 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1e620 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1e630 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1e640 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1e650 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1e660 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
1e670 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72  he smallest entr
1e680 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72  y that .** is gr
1e690 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1e6a0 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
1e6b0 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
1e6c0 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a  re no records .*
1e6d0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  * greater than o
1e6e0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
1e6f0 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74  ey and P2 is not
1e700 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70   zero, then jump
1e710 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66   to P2..**.** If
1e720 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 77   the cursor P1 w
1e730 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  as opened using 
1e740 74 68 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45  the OPFLAG_SEEKE
1e750 51 20 66 6c 61 67 2c 20 74 68 65 6e 20 74 68 69  Q flag, then thi
1e760 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c  s.** opcode will
1e770 20 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20   always land on 
1e780 61 20 72 65 63 6f 72 64 20 74 68 61 74 20 65 71  a record that eq
1e790 75 61 6c 6c 79 20 65 71 75 61 6c 73 20 74 68 65  ually equals the
1e7a0 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65   key, or.** else
1e7b0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
1e7c0 79 20 74 6f 20 50 32 2e 20 20 57 68 65 6e 20 74  y to P2.  When t
1e7d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 4f 50 46  he cursor is OPF
1e7e0 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74 68 69 73  LAG_SEEKEQ, this
1e7f0 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74 20  .** opcode must 
1e800 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  be followed by a
1e810 6e 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77  n IdxLE opcode w
1e820 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 72 67  ith the same arg
1e830 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49  uments..** The I
1e840 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c  dxLE opcode will
1e850 20 62 65 20 73 6b 69 70 70 65 64 20 69 66 20 74   be skipped if t
1e860 68 69 73 20 6f 70 63 6f 64 65 20 73 75 63 63 65  his opcode succe
1e870 65 64 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20  eds, but the.** 
1e880 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c  IdxLE opcode wil
1e890 6c 20 62 65 20 75 73 65 64 20 6f 6e 20 73 75 62  l be used on sub
1e8a0 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65  sequent loop ite
1e8b0 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
1e8c0 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
1e8d0 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e  s the cursor con
1e8e0 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20  figured to move 
1e8f0 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  in forward order
1e900 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65  ,.** from the be
1e910 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74  ginning toward t
1e920 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65  he end.  In othe
1e930 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72  r words, the cur
1e940 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67  sor is.** config
1e950 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74  ured to use Next
1e960 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a  , not Prev..**.*
1e970 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1e980 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65  d, NotFound, See
1e990 6b 4c 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65  kLt, SeekGt, See
1e9a0 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  kLe.*/./* Opcode
1e9b0 3a 20 53 65 65 6b 47 54 20 50 31 20 50 32 20 50  : SeekGT P1 P2 P
1e9c0 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
1e9d0 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d  is: key=r[P3@P4]
1e9e0 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1e9f0 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1ea00 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1ea10 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1ea20 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1ea30 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1ea40 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1ea50 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
1ea60 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1ea70 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1ea80 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1ea90 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1eaa0 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1eab0 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1eac0 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1ead0 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1eae0 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1eaf0 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1eb00 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
1eb10 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72  he smallest entr
1eb20 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72  y that .** is gr
1eb30 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b  eater than the k
1eb40 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65  ey value. If the
1eb50 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64  re are no record
1eb60 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  s greater than .
1eb70 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50  ** the key and P
1eb80 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  2 is not zero, t
1eb90 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
1eba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
1ebb0 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  e leaves the cur
1ebc0 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74  sor configured t
1ebd0 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77 61 72  o move in forwar
1ebe0 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d  d order,.** from
1ebf0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 74   the beginning t
1ec00 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e 20 20  oward the end.  
1ec10 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1ec20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a  the cursor is.**
1ec30 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
1ec40 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65  se Next, not Pre
1ec50 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  v..**.** See als
1ec60 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
1ec70 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b  nd, SeekLt, Seek
1ec80 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a  Ge, SeekLe.*/./*
1ec90 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 54 20   Opcode: SeekLT 
1eca0 50 31 20 50 32 20 50 33 20 50 34 20 2a 20 0a 2a  P1 P2 P3 P4 * .*
1ecb0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
1ecc0 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49  r[P3@P4].**.** I
1ecd0 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1ece0 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62  rs to an SQL tab
1ecf0 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20  le (B-Tree that 
1ed00 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79  uses integer key
1ed10 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20  s), .** use the 
1ed20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1ed30 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49  r P3 as a key. I
1ed40 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1ed50 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c  rs .** to an SQL
1ed60 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20   index, then P3 
1ed70 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
1ed80 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72  an array of P4 r
1ed90 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61  egisters .** tha
1eda0 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e  t are used as an
1edb0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
1edc0 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f  key. .**.** Repo
1edd0 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31  sition cursor P1
1ede0 20 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69   so that  it poi
1edf0 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65  nts to the large
1ee00 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  st entry that .*
1ee10 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  * is less than t
1ee20 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66  he key value. If
1ee30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
1ee40 63 6f 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20  cords less than 
1ee50 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20  .** the key and 
1ee60 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P2 is not zero, 
1ee70 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
1ee80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
1ee90 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  de leaves the cu
1eea0 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20  rsor configured 
1eeb0 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 65 72  to move in rever
1eec0 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f  se order,.** fro
1eed0 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61 72 64  m the end toward
1eee0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20   the beginning. 
1eef0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1ef00 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a   the cursor is.*
1ef10 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  * configured to 
1ef20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65  use Prev, not Ne
1ef30 78 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  xt..**.** See al
1ef40 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f  so: Found, NotFo
1ef50 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53 65 65  und, SeekGt, See
1ef60 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f  kGe, SeekLe.*/./
1ef70 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 45  * Opcode: SeekLE
1ef80 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
1ef90 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
1efa0 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49  r[P3@P4].**.** I
1efb0 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1efc0 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62  rs to an SQL tab
1efd0 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20  le (B-Tree that 
1efe0 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79  uses integer key
1eff0 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20  s), .** use the 
1f000 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1f010 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49  r P3 as a key. I
1f020 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1f030 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c  rs .** to an SQL
1f040 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20   index, then P3 
1f050 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
1f060 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72  an array of P4 r
1f070 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61  egisters .** tha
1f080 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e  t are used as an
1f090 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
1f0a0 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f  key. .**.** Repo
1f0b0 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31  sition cursor P1
1f0c0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1f0d0 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  ts to the larges
1f0e0 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  t entry that .**
1f0f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1f100 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
1f110 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72  y value. If ther
1f120 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1f130 20 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 6f   .** less than o
1f140 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
1f150 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74  ey and P2 is not
1f160 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70   zero, then jump
1f170 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68   to P2..**.** Th
1f180 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
1f190 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66   the cursor conf
1f1a0 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69  igured to move i
1f1b0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2c  n reverse order,
1f1c0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  .** from the end
1f1d0 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 67 69   toward the begi
1f1e0 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72  nning.  In other
1f1f0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73   words, the curs
1f200 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75  or is.** configu
1f210 72 65 64 20 74 6f 20 75 73 65 20 50 72 65 76 2c  red to use Prev,
1f220 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a   not Next..**.**
1f230 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 50   If the cursor P
1f240 31 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69  1 was opened usi
1f250 6e 67 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 45  ng the OPFLAG_SE
1f260 45 4b 45 51 20 66 6c 61 67 2c 20 74 68 65 6e 20  EKEQ flag, then 
1f270 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77  this.** opcode w
1f280 69 6c 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64 20  ill always land 
1f290 6f 6e 20 61 20 72 65 63 6f 72 64 20 74 68 61 74  on a record that
1f2a0 20 65 71 75 61 6c 6c 79 20 65 71 75 61 6c 73 20   equally equals 
1f2b0 74 68 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65  the key, or.** e
1f2c0 6c 73 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  lse jump immedia
1f2d0 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 57 68 65  tely to P2.  Whe
1f2e0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1f2f0 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74  OPFLAG_SEEKEQ, t
1f300 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75  his.** opcode mu
1f310 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62  st be followed b
1f320 79 20 61 6e 20 49 64 78 47 45 20 6f 70 63 6f 64  y an IdxGE opcod
1f330 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
1f340 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68  arguments..** Th
1f350 65 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77  e IdxGE opcode w
1f360 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69  ill be skipped i
1f370 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20 73 75  f this opcode su
1f380 63 63 65 65 64 73 2c 20 62 75 74 20 74 68 65 0a  cceeds, but the.
1f390 2a 2a 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20  ** IdxGE opcode 
1f3a0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e 20  will be used on 
1f3b0 73 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20  subsequent loop 
1f3c0 69 74 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  iterations..**.*
1f3d0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1f3e0 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65  d, NotFound, See
1f3f0 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65  kGt, SeekGe, See
1f400 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  kLt.*/.case OP_S
1f410 65 65 6b 4c 54 3a 20 20 20 20 20 20 20 20 20 2f  eekLT:         /
1f420 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63  * jump, in3 */.c
1f430 61 73 65 20 4f 50 5f 53 65 65 6b 4c 45 3a 20 20  ase OP_SeekLE:  
1f440 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
1f450 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  in3 */.case OP_S
1f460 65 65 6b 47 45 3a 20 20 20 20 20 20 20 20 20 2f  eekGE:         /
1f470 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63  * jump, in3 */.c
1f480 61 73 65 20 4f 50 5f 53 65 65 6b 47 54 3a 20 7b  ase OP_SeekGT: {
1f490 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
1f4a0 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  in3 */.  int res
1f4b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
1f4c0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
1f4d0 20 2a 2f 0a 20 20 69 6e 74 20 6f 63 3b 20 20 20   */.  int oc;   
1f4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
1f4f0 64 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  de */.  VdbeCurs
1f500 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68  or *pC;    /* Th
1f510 65 20 63 75 72 73 6f 72 20 74 6f 20 73 65 65 6b  e cursor to seek
1f520 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1f530 63 6f 72 64 20 72 3b 20 20 2f 2a 20 54 68 65 20  cord r;  /* The 
1f540 6b 65 79 20 74 6f 20 73 65 65 6b 20 66 6f 72 20  key to seek for 
1f550 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
1f560 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f570 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 72 20  r of columns or 
1f580 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 6b 65  fields in the ke
1f590 79 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b  y */.  i64 iKey;
1f5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f5b0 20 72 6f 77 69 64 20 77 65 20 61 72 65 20 74 6f   rowid we are to
1f5c0 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e   seek to */.  in
1f5d0 74 20 65 71 4f 6e 6c 79 3b 20 20 20 20 20 20 20  t eqOnly;       
1f5e0 20 2f 2a 20 4f 6e 6c 79 20 69 6e 74 65 72 65 73   /* Only interes
1f5f0 74 65 64 20 69 6e 20 3d 3d 20 72 65 73 75 6c 74  ted in == result
1f600 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1f610 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1f620 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
1f630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1f640 70 2d 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43  p->p2!=0 );.  pC
1f650 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
1f660 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
1f670 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
1f680 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
1f690 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
1f6a0 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53  ;.  assert( OP_S
1f6b0 65 65 6b 4c 45 20 3d 3d 20 4f 50 5f 53 65 65 6b  eekLE == OP_Seek
1f6c0 4c 54 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74  LT+1 );.  assert
1f6d0 28 20 4f 50 5f 53 65 65 6b 47 45 20 3d 3d 20 4f  ( OP_SeekGE == O
1f6e0 50 5f 53 65 65 6b 4c 54 2b 32 20 29 3b 0a 20 20  P_SeekLT+2 );.  
1f6f0 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47  assert( OP_SeekG
1f700 54 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 33  T == OP_SeekLT+3
1f710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f720 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 3b 0a 20  ->isOrdered );. 
1f730 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
1f740 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
1f750 6f 63 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  oc = pOp->opcode
1f760 3b 0a 20 20 65 71 4f 6e 6c 79 20 3d 20 30 3b 0a  ;.  eqOnly = 0;.
1f770 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
1f780 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
1f790 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65  _DEBUG.  pC->see
1f7a0 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  kOp = pOp->opcod
1f7b0 65 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  e;.#endif..  if(
1f7c0 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a   pC->isTable ){.
1f7d0 20 20 20 20 2f 2a 20 54 68 65 20 42 54 52 45 45      /* The BTREE
1f7e0 5f 53 45 45 4b 5f 45 51 20 66 6c 61 67 20 69 73  _SEEK_EQ flag is
1f7f0 20 6f 6e 6c 79 20 73 65 74 20 6f 6e 20 69 6e 64   only set on ind
1f800 65 78 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20  ex cursors */.  
1f810 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f820 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 48  3BtreeCursorHasH
1f830 69 6e 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  int(pC->uc.pCurs
1f840 6f 72 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45  or, BTREE_SEEK_E
1f850 51 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  Q)==0 );..    /*
1f860 20 54 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   The input value
1f870 20 69 6e 20 50 33 20 6d 69 67 68 74 20 62 65 20   in P3 might be 
1f880 6f 66 20 61 6e 79 20 74 79 70 65 3a 20 69 6e 74  of any type: int
1f890 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69  eger, real, stri
1f8a0 6e 67 2c 0a 20 20 20 20 2a 2a 20 62 6c 6f 62 2c  ng,.    ** blob,
1f8b0 20 6f 72 20 4e 55 4c 4c 2e 20 20 42 75 74 20 69   or NULL.  But i
1f8c0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e  t needs to be an
1f8d0 20 69 6e 74 65 67 65 72 20 62 65 66 6f 72 65 20   integer before 
1f8e0 77 65 20 63 61 6e 20 64 6f 0a 20 20 20 20 2a 2a  we can do.    **
1f8f0 20 74 68 65 20 73 65 65 6b 2c 20 73 6f 20 63 6f   the seek, so co
1f900 6e 76 65 72 74 20 69 74 2e 20 2a 2f 0a 20 20 20  nvert it. */.   
1f910 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
1f920 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 69 66 28 20  p->p3];.    if( 
1f930 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 28  (pIn3->flags & (
1f940 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
1f950 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f  |MEM_Str))==MEM_
1f960 53 74 72 20 29 7b 0a 20 20 20 20 20 20 61 70 70  Str ){.      app
1f970 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
1f980 79 28 70 49 6e 33 2c 20 30 29 3b 0a 20 20 20 20  y(pIn3, 0);.    
1f990 7d 0a 20 20 20 20 69 4b 65 79 20 3d 20 73 71 6c  }.    iKey = sql
1f9a0 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
1f9b0 28 70 49 6e 33 29 3b 0a 0a 20 20 20 20 2f 2a 20  (pIn3);..    /* 
1f9c0 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
1f9d0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e  could not be con
1f9e0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69  verted into an i
1f9f0 6e 74 65 67 65 72 20 77 69 74 68 6f 75 74 0a 20  nteger without. 
1fa00 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69 6e     ** loss of in
1fa10 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20  formation, then 
1fa20 73 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  special processi
1fa30 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 2e  ng is required..
1fa40 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49  . */.    if( (pI
1fa50 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
1fa60 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Int)==0 ){.     
1fa70 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
1fa80 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30  s & MEM_Real)==0
1fa90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
1faa0 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 63  f the P3 value c
1fab0 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  annot be convert
1fac0 65 64 20 69 6e 74 6f 20 61 6e 79 20 6b 69 6e 64  ed into any kind
1fad0 20 6f 66 20 61 20 6e 75 6d 62 65 72 2c 0a 20 20   of a number,.  
1fae0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
1faf0 65 20 73 65 65 6b 20 69 73 20 6e 6f 74 20 70 6f  e seek is not po
1fb00 73 73 69 62 6c 65 2c 20 73 6f 20 6a 75 6d 70 20  ssible, so jump 
1fb10 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20  to P2 */.       
1fb20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
1fb30 28 31 2c 32 29 3b 20 67 6f 74 6f 20 6a 75 6d 70  (1,2); goto jump
1fb40 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20 20  _to_p2;.        
1fb50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1fb60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1fb70 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 69 4b  approximation iK
1fb80 65 79 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ey is larger tha
1fb90 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 61  n the actual rea
1fba0 6c 20 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a  l search.      *
1fbb0 2a 20 74 65 72 6d 2c 20 73 75 62 73 74 69 74 75  * term, substitu
1fbc0 74 65 20 3e 3d 20 66 6f 72 20 3e 20 61 6e 64 20  te >= for > and 
1fbd0 3c 20 66 6f 72 20 3c 3d 2e 20 65 2e 67 2e 20 69  < for <=. e.g. i
1fbe0 66 20 74 68 65 20 73 65 61 72 63 68 20 74 65 72  f the search ter
1fbf0 6d 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 34 2e  m.      ** is 4.
1fc00 39 20 61 6e 64 20 74 68 65 20 69 6e 74 65 67 65  9 and the intege
1fc10 72 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  r approximation 
1fc20 35 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  5:.      **.    
1fc30 20 20 2a 2a 20 20 20 20 20 20 20 20 28 78 20 3e    **        (x >
1fc40 20 20 34 2e 39 29 20 20 20 20 2d 3e 20 20 20 20    4.9)    ->    
1fc50 20 28 78 20 3e 3d 20 35 29 0a 20 20 20 20 20 20   (x >= 5).      
1fc60 2a 2a 20 20 20 20 20 20 20 20 28 78 20 3c 3d 20  **        (x <= 
1fc70 34 2e 39 29 20 20 20 20 2d 3e 20 20 20 20 20 28  4.9)    ->     (
1fc80 78 20 3c 20 20 35 29 0a 20 20 20 20 20 20 2a 2f  x <  5).      */
1fc90 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d  .      if( pIn3-
1fca0 3e 75 2e 72 3c 28 64 6f 75 62 6c 65 29 69 4b 65  >u.r<(double)iKe
1fcb0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
1fcc0 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 45 3d 3d  ert( OP_SeekGE==
1fcd0 28 4f 50 5f 53 65 65 6b 47 54 2d 31 29 20 29 3b  (OP_SeekGT-1) );
1fce0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fcf0 20 4f 50 5f 53 65 65 6b 4c 54 3d 3d 28 4f 50 5f   OP_SeekLT==(OP_
1fd00 53 65 65 6b 4c 45 2d 31 29 20 29 3b 0a 20 20 20  SeekLE-1) );.   
1fd10 20 20 20 20 20 61 73 73 65 72 74 28 20 28 4f 50       assert( (OP
1fd20 5f 53 65 65 6b 4c 45 20 26 20 30 78 30 30 30 31  _SeekLE & 0x0001
1fd30 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 20 26 20  )==(OP_SeekGT & 
1fd40 30 78 30 30 30 31 29 20 29 3b 0a 20 20 20 20 20  0x0001) );.     
1fd50 20 20 20 69 66 28 20 28 6f 63 20 26 20 30 78 30     if( (oc & 0x0
1fd60 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 54  001)==(OP_SeekGT
1fd70 20 26 20 30 78 30 30 30 31 29 20 29 20 6f 63 2d   & 0x0001) ) oc-
1fd80 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  -;.      }..    
1fd90 20 20 2f 2a 20 49 66 20 74 68 65 20 61 70 70 72    /* If the appr
1fda0 6f 78 69 6d 61 74 69 6f 6e 20 69 4b 65 79 20 69  oximation iKey i
1fdb0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
1fdc0 68 65 20 61 63 74 75 61 6c 20 72 65 61 6c 20 73  he actual real s
1fdd0 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  earch.      ** t
1fde0 65 72 6d 2c 20 73 75 62 73 74 69 74 75 74 65 20  erm, substitute 
1fdf0 3c 3d 20 66 6f 72 20 3c 20 61 6e 64 20 3e 20 66  <= for < and > f
1fe00 6f 72 20 3e 3d 2e 20 20 2a 2f 0a 20 20 20 20 20  or >=.  */.     
1fe10 20 65 6c 73 65 20 69 66 28 20 70 49 6e 33 2d 3e   else if( pIn3->
1fe20 75 2e 72 3e 28 64 6f 75 62 6c 65 29 69 4b 65 79  u.r>(double)iKey
1fe30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1fe40 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 3d 3d 28  rt( OP_SeekLE==(
1fe50 4f 50 5f 53 65 65 6b 4c 54 2b 31 29 20 29 3b 0a  OP_SeekLT+1) );.
1fe60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1fe70 4f 50 5f 53 65 65 6b 47 54 3d 3d 28 4f 50 5f 53  OP_SeekGT==(OP_S
1fe80 65 65 6b 47 45 2b 31 29 20 29 3b 0a 20 20 20 20  eekGE+1) );.    
1fe90 20 20 20 20 61 73 73 65 72 74 28 20 28 4f 50 5f      assert( (OP_
1fea0 53 65 65 6b 4c 54 20 26 20 30 78 30 30 30 31 29  SeekLT & 0x0001)
1feb0 3d 3d 28 4f 50 5f 53 65 65 6b 47 45 20 26 20 30  ==(OP_SeekGE & 0
1fec0 78 30 30 30 31 29 20 29 3b 0a 20 20 20 20 20 20  x0001) );.      
1fed0 20 20 69 66 28 20 28 6f 63 20 26 20 30 78 30 30    if( (oc & 0x00
1fee0 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54 20  01)==(OP_SeekLT 
1fef0 26 20 30 78 30 30 30 31 29 20 29 20 6f 63 2b 2b  & 0x0001) ) oc++
1ff00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
1ff10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ff20 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
1ff30 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43 75 72  cked(pC->uc.pCur
1ff40 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 69 4b 65  sor, 0, (u64)iKe
1ff50 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  y, 0, &res);.   
1ff60 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65   pC->movetoTarge
1ff70 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55 73  t = iKey;  /* Us
1ff80 65 64 20 62 79 20 4f 50 5f 44 65 6c 65 74 65 20  ed by OP_Delete 
1ff90 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  */.    if( rc!=S
1ffa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ffb0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1ffc0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
1ffd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ffe0 20 46 6f 72 20 61 20 63 75 72 73 6f 72 20 77 69   For a cursor wi
1fff0 74 68 20 74 68 65 20 42 54 52 45 45 5f 53 45 45  th the BTREE_SEE
20000 4b 5f 45 51 20 68 69 6e 74 2c 20 6f 6e 6c 79 20  K_EQ hint, only 
20010 74 68 65 20 4f 50 5f 53 65 65 6b 47 45 20 61 6e  the OP_SeekGE an
20020 64 0a 20 20 20 20 2a 2a 20 4f 50 5f 53 65 65 6b  d.    ** OP_Seek
20030 4c 45 20 6f 70 63 6f 64 65 73 20 61 72 65 20 61  LE opcodes are a
20040 6c 6c 6f 77 65 64 2c 20 61 6e 64 20 74 68 65 73  llowed, and thes
20050 65 20 6d 75 73 74 20 62 65 20 69 6d 6d 65 64 69  e must be immedi
20060 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 65 64 0a 20  ately followed. 
20070 20 20 20 2a 2a 20 62 79 20 61 6e 20 4f 50 5f 49     ** by an OP_I
20080 64 78 47 54 20 6f 72 20 4f 50 5f 49 64 78 4c 54  dxGT or OP_IdxLT
20090 20 6f 70 63 6f 64 65 2c 20 72 65 73 70 65 63 74   opcode, respect
200a0 69 76 65 6c 79 2c 20 77 69 74 68 20 74 68 65 20  ively, with the 
200b0 73 61 6d 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  same key..    */
200c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
200d0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 48 69  BtreeCursorHasHi
200e0 6e 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  nt(pC->uc.pCurso
200f0 72 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51  r, BTREE_SEEK_EQ
20100 29 20 29 7b 0a 20 20 20 20 20 20 65 71 4f 6e 6c  ) ){.      eqOnl
20110 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  y = 1;.      ass
20120 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
20130 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 70  ==OP_SeekGE || p
20140 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
20150 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  eekLE );.      a
20160 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 6f 70  ssert( pOp[1].op
20170 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 7c  code==OP_IdxLT |
20180 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d  | pOp[1].opcode=
20190 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
201a0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31     assert( pOp[1
201b0 5d 2e 70 31 3d 3d 70 4f 70 5b 30 5d 2e 70 31 20  ].p1==pOp[0].p1 
201c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
201d0 20 70 4f 70 5b 31 5d 2e 70 32 3d 3d 70 4f 70 5b   pOp[1].p2==pOp[
201e0 30 5d 2e 70 32 20 29 3b 0a 20 20 20 20 20 20 61  0].p2 );.      a
201f0 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 33  ssert( pOp[1].p3
20200 3d 3d 70 4f 70 5b 30 5d 2e 70 33 20 29 3b 0a 20  ==pOp[0].p3 );. 
20210 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
20220 5b 31 5d 2e 70 34 2e 69 3d 3d 70 4f 70 5b 30 5d  [1].p4.i==pOp[0]
20230 2e 70 34 2e 69 20 29 3b 0a 20 20 20 20 7d 0a 0a  .p4.i );.    }..
20240 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70      nField = pOp
20250 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 61 73 73 65  ->p4.i;.    asse
20260 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
20270 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20  =P4_INT32 );.   
20280 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e   assert( nField>
20290 30 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49  0 );.    r.pKeyI
202a0 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
202b0 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64  fo;.    r.nField
202c0 20 3d 20 28 75 31 36 29 6e 46 69 65 6c 64 3b 0a   = (u16)nField;.
202d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  .    /* The next
202e0 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20 63 6f   line of code co
202f0 6d 70 75 74 65 73 20 61 73 20 66 6f 6c 6c 6f 77  mputes as follow
20300 73 2c 20 6f 6e 6c 79 20 66 61 73 74 65 72 3a 0a  s, only faster:.
20310 20 20 20 20 2a 2a 20 20 20 69 66 28 20 6f 63 3d      **   if( oc=
20320 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20 6f 63  =OP_SeekGT || oc
20330 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 7b 0a 20  ==OP_SeekLE ){. 
20340 20 20 20 2a 2a 20 20 20 20 20 72 2e 64 65 66 61     **     r.defa
20350 75 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a 20 20 20  ult_rc = -1;.   
20360 20 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20   **   }else{.   
20370 20 2a 2a 20 20 20 20 20 72 2e 64 65 66 61 75 6c   **     r.defaul
20380 74 5f 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 2a  t_rc = +1;.    *
20390 2a 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20  *   }.    */.   
203a0 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20   r.default_rc = 
203b0 28 28 31 20 26 20 28 6f 63 20 2d 20 4f 50 5f 53  ((1 & (oc - OP_S
203c0 65 65 6b 4c 54 29 29 20 3f 20 2d 31 20 3a 20 2b  eekLT)) ? -1 : +
203d0 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
203e0 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c  oc!=OP_SeekGT ||
203f0 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d   r.default_rc==-
20400 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
20410 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 45 20 7c   oc!=OP_SeekLE |
20420 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  | r.default_rc==
20430 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
20440 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 45 20  ( oc!=OP_SeekGE 
20450 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d  || r.default_rc=
20460 3d 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =+1 );.    asser
20470 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 54  t( oc!=OP_SeekLT
20480 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63   || r.default_rc
20490 3d 3d 2b 31 20 29 3b 0a 0a 20 20 20 20 72 2e 61  ==+1 );..    r.a
204a0 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
204b0 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  >p3];.#ifdef SQL
204c0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20  ITE_DEBUG.    { 
204d0 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20  int i; for(i=0; 
204e0 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  i<r.nField; i++)
204f0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
20500 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20  lid(&r.aMem[i]) 
20510 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20  ); }.#endif.    
20520 72 2e 65 71 53 65 65 6e 20 3d 20 30 3b 0a 20 20  r.eqSeen = 0;.  
20530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20540 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
20550 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  d(pC->uc.pCursor
20560 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73  , &r, 0, 0, &res
20570 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20590 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
205a0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
205b0 0a 20 20 20 20 69 66 28 20 65 71 4f 6e 6c 79 20  .    if( eqOnly 
205c0 26 26 20 72 2e 65 71 53 65 65 6e 3d 3d 30 20 29  && r.eqSeen==0 )
205d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
205e0 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  res!=0 );.      
205f0 67 6f 74 6f 20 73 65 65 6b 5f 6e 6f 74 5f 66 6f  goto seek_not_fo
20600 75 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  und;.    }.  }. 
20610 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
20620 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63  eto = 0;.  pC->c
20630 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
20640 48 45 5f 53 54 41 4c 45 3b 0a 23 69 66 64 65 66  HE_STALE;.#ifdef
20650 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
20660 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
20670 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
20680 69 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47  if( oc>=OP_SeekG
20690 45 20 29 7b 20 20 61 73 73 65 72 74 28 20 6f 63  E ){  assert( oc
206a0 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 6f  ==OP_SeekGE || o
206b0 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a  c==OP_SeekGT );.
206c0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 7c 7c      if( res<0 ||
206d0 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d 3d   (res==0 && oc==
206e0 4f 50 5f 53 65 65 6b 47 54 29 20 29 7b 0a 20 20  OP_SeekGT) ){.  
206f0 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20      res = 0;.   
20700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
20710 74 72 65 65 4e 65 78 74 28 70 43 2d 3e 75 63 2e  treeNext(pC->uc.
20720 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
20730 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20740 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
20750 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
20760 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
20770 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20      res = 0;.   
20780 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
20790 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53  assert( oc==OP_S
207a0 65 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekLT || oc==OP_
207b0 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 69 66  SeekLE );.    if
207c0 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73 3d  ( res>0 || (res=
207d0 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65  =0 && oc==OP_See
207e0 6b 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 72 65  kLT) ){.      re
207f0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
20800 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
20810 65 76 69 6f 75 73 28 70 43 2d 3e 75 63 2e 70 43  evious(pC->uc.pC
20820 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
20830 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20840 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
20850 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
20860 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20870 20 20 2f 2a 20 72 65 73 20 6d 69 67 68 74 20 62    /* res might b
20880 65 20 6e 65 67 61 74 69 76 65 20 62 65 63 61 75  e negative becau
20890 73 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  se the table is 
208a0 65 6d 70 74 79 2e 20 20 43 68 65 63 6b 20 74 6f  empty.  Check to
208b0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
208c0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
208d0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
208e0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42    res = sqlite3B
208f0 74 72 65 65 45 6f 66 28 70 43 2d 3e 75 63 2e 70  treeEof(pC->uc.p
20900 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
20910 20 7d 0a 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e   }.seek_not_foun
20920 64 3a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  d:.  assert( pOp
20930 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 56 64 62 65  ->p2>0 );.  Vdbe
20940 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
20950 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73  =0,2);.  if( res
20960 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d   ){.    goto jum
20970 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65  p_to_p2;.  }else
20980 20 69 66 28 20 65 71 4f 6e 6c 79 20 29 7b 0a 20   if( eqOnly ){. 
20990 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31     assert( pOp[1
209a0 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ].opcode==OP_Idx
209b0 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63  LT || pOp[1].opc
209c0 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b  ode==OP_IdxGT );
209d0 0a 20 20 20 20 70 4f 70 2b 2b 3b 20 2f 2a 20 53  .    pOp++; /* S
209e0 6b 69 70 20 74 68 65 20 4f 50 5f 49 64 78 4c 74  kip the OP_IdxLt
209f0 20 6f 72 20 4f 50 5f 49 64 78 47 54 20 74 68 61   or OP_IdxGT tha
20a00 74 20 66 6f 6c 6c 6f 77 73 20 2a 2f 0a 20 20 7d  t follows */.  }
20a10 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
20a20 4f 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31  Opcode: Found P1
20a30 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53   P2 P3 P4 *.** S
20a40 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
20a50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50  3@P4].**.** If P
20a60 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74  4==0 then regist
20a70 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c  er P3 holds a bl
20a80 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ob constructed b
20a90 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49  y MakeRecord.  I
20aa0 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72  f.** P4>0 then r
20ab0 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68  egister P3 is th
20ac0 65 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65  e first of P4 re
20ad0 67 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72  gisters that for
20ae0 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a  m an unpacked.**
20af0 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43   record..**.** C
20b00 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61  ursor P1 is on a
20b10 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20  n index btree.  
20b20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64  If the record id
20b30 65 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61  entified by P3 a
20b40 6e 64 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72  nd P4.** is a pr
20b50 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72  efix of any entr
20b60 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a  y in P1 then a j
20b70 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50  ump is made to P
20b80 32 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c  2 and.** P1 is l
20b90 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
20ba0 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74  the matching ent
20bb0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  ry..**.** This o
20bc0 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20  peration leaves 
20bd0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20  the cursor in a 
20be0 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63  state where it c
20bf0 61 6e 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65  an be.** advance
20c00 64 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64  d in the forward
20c10 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 54 68 65   direction.  The
20c20 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   Next instructio
20c30 6e 20 77 69 6c 6c 20 77 6f 72 6b 2c 0a 2a 2a 20  n will work,.** 
20c40 62 75 74 20 6e 6f 74 20 74 68 65 20 50 72 65 76  but not the Prev
20c50 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
20c60 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f  .** See also: No
20c70 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69  tFound, NoConfli
20c80 63 74 2c 20 4e 6f 74 45 78 69 73 74 73 2e 20 53  ct, NotExists. S
20c90 65 65 6b 47 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  eekGe.*/./* Opco
20ca0 64 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20  de: NotFound P1 
20cb0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
20cc0 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
20cd0 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  @P4].**.** If P4
20ce0 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65  ==0 then registe
20cf0 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f  r P3 holds a blo
20d00 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  b constructed by
20d10 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66   MakeRecord.  If
20d20 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65  .** P4>0 then re
20d30 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
20d40 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67   first of P4 reg
20d50 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d  isters that form
20d60 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20   an unpacked.** 
20d70 72 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43  record..** .** C
20d80 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61  ursor P1 is on a
20d90 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20  n index btree.  
20da0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64  If the record id
20db0 65 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61  entified by P3 a
20dc0 6e 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74 20  nd P4.** is not 
20dd0 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 61 6e  the prefix of an
20de0 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68  y entry in P1 th
20df0 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  en a jump is mad
20e00 65 20 74 6f 20 50 32 2e 20 20 49 66 20 50 31 20  e to P2.  If P1 
20e10 0a 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e  .** does contain
20e20 20 61 6e 20 65 6e 74 72 79 20 77 68 6f 73 65 20   an entry whose 
20e30 70 72 65 66 69 78 20 6d 61 74 63 68 65 73 20 74  prefix matches t
20e40 68 65 20 50 33 2f 50 34 20 72 65 63 6f 72 64 20  he P3/P4 record 
20e50 74 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20  then control.** 
20e60 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f  falls through to
20e70 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
20e80 63 74 69 6f 6e 20 61 6e 64 20 50 31 20 69 73 20  ction and P1 is 
20e90 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
20ea0 20 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 67   the.** matching
20eb0 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
20ec0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61  is operation lea
20ed0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69  ves the cursor i
20ee0 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20  n a state where 
20ef0 69 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  it cannot be.** 
20f00 61 64 76 61 6e 63 65 64 20 69 6e 20 65 69 74 68  advanced in eith
20f10 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49  er direction.  I
20f20 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
20f30 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76  he Next and Prev
20f40 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e  .** opcodes do n
20f50 6f 74 20 77 6f 72 6b 20 61 66 74 65 72 20 74 68  ot work after th
20f60 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
20f70 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
20f80 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20  und, NotExists, 
20f90 4e 6f 43 6f 6e 66 6c 69 63 74 0a 2a 2f 0a 2f 2a  NoConflict.*/./*
20fa0 20 4f 70 63 6f 64 65 3a 20 4e 6f 43 6f 6e 66 6c   Opcode: NoConfl
20fb0 69 63 74 20 50 31 20 50 32 20 50 33 20 50 34 20  ict P1 P2 P3 P4 
20fc0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
20fd0 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
20fe0 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20  * If P4==0 then 
20ff0 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64  register P3 hold
21000 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75  s a blob constru
21010 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f  cted by MakeReco
21020 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20  rd.  If.** P4>0 
21030 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33  then register P3
21040 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66   is the first of
21050 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68   P4 registers th
21060 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  at form an unpac
21070 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a  ked.** record..*
21080 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20  * .** Cursor P1 
21090 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  is on an index b
210a0 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65  tree.  If the re
210b0 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20  cord identified 
210c0 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20  by P3 and P4.** 
210d0 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
210e0 4c 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20 69 6d  L value, jump im
210f0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
21100 20 20 49 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f    If all terms o
21110 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  f the.** record 
21120 61 72 65 20 6e 6f 74 2d 4e 55 4c 4c 20 74 68 65  are not-NULL the
21130 6e 20 61 20 63 68 65 63 6b 20 69 73 20 64 6f 6e  n a check is don
21140 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  e to determine i
21150 66 20 61 6e 79 20 72 6f 77 20 69 6e 20 74 68 65  f any row in the
21160 0a 2a 2a 20 50 31 20 69 6e 64 65 78 20 62 74 72  .** P1 index btr
21170 65 65 20 68 61 73 20 61 20 6d 61 74 63 68 69 6e  ee has a matchin
21180 67 20 6b 65 79 20 70 72 65 66 69 78 2e 20 20 49  g key prefix.  I
21190 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
211a0 61 74 63 68 65 73 2c 20 6a 75 6d 70 0a 2a 2a 20  atches, jump.** 
211b0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
211c0 32 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  2.  If there is 
211d0 61 20 6d 61 74 63 68 2c 20 66 61 6c 6c 20 74 68  a match, fall th
211e0 72 6f 75 67 68 20 61 6e 64 20 6c 65 61 76 65 20  rough and leave 
211f0 74 68 65 20 50 31 0a 2a 2a 20 63 75 72 73 6f 72  the P1.** cursor
21200 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
21210 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e 0a 2a   matching row..*
21220 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
21230 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 4f   is similar to O
21240 50 5f 4e 6f 74 46 6f 75 6e 64 20 77 69 74 68 20  P_NotFound with 
21250 74 68 65 20 65 78 63 65 70 74 69 6f 6e 73 20 74  the exceptions t
21260 68 61 74 20 74 68 65 0a 2a 2a 20 62 72 61 6e 63  hat the.** branc
21270 68 20 69 73 20 61 6c 77 61 79 73 20 74 61 6b 65  h is always take
21280 6e 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  n if any part of
21290 20 74 68 65 20 73 65 61 72 63 68 20 6b 65 79 20   the search key 
212a0 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  input is NULL..*
212b0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74  *.** This operat
212c0 69 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20 63  ion leaves the c
212d0 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65  ursor in a state
212e0 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74   where it cannot
212f0 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20   be.** advanced 
21300 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74  in either direct
21310 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
21320 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61  ords, the Next a
21330 6e 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64  nd Prev.** opcod
21340 65 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61  es do not work a
21350 66 74 65 72 20 74 68 69 73 20 6f 70 65 72 61 74  fter this operat
21360 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ion..**.** See a
21370 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 46  lso: NotFound, F
21380 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 0a  ound, NotExists.
21390 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 43 6f 6e  */.case OP_NoCon
213a0 66 6c 69 63 74 3a 20 20 20 20 20 2f 2a 20 6a 75  flict:     /* ju
213b0 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  mp, in3 */.case 
213c0 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20  OP_NotFound:    
213d0 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
213e0 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64  */.case OP_Found
213f0 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
21400 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74  mp, in3 */.  int
21410 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a   alreadyExists;.
21420 20 20 69 6e 74 20 74 61 6b 65 4a 75 6d 70 3b 0a    int takeJump;.
21430 20 20 69 6e 74 20 69 69 3b 0a 20 20 56 64 62 65    int ii;.  Vdbe
21440 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e  Cursor *pC;.  in
21450 74 20 72 65 73 3b 0a 20 20 63 68 61 72 20 2a 70  t res;.  char *p
21460 46 72 65 65 3b 0a 20 20 55 6e 70 61 63 6b 65 64  Free;.  Unpacked
21470 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
21480 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
21490 64 20 72 3b 0a 20 20 63 68 61 72 20 61 54 65 6d  d r;.  char aTem
214a0 70 52 65 63 5b 52 4f 55 4e 44 38 28 73 69 7a 65  pRec[ROUND8(size
214b0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
214c0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
214d0 29 2a 34 20 2b 20 37 5d 3b 0a 0a 23 69 66 64 65  )*4 + 7];..#ifde
214e0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
214f0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21  if( pOp->opcode!
21500 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29  =OP_NoConflict )
21510 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63   sqlite3_found_c
21520 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
21530 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
21540 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
21550 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
21560 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
21570 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b  ype==P4_INT32 );
21580 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
21590 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
215a0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 23 69  ert( pC!=0 );.#i
215b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
215c0 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d  G.  pC->seekOp =
215d0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65   pOp->opcode;.#e
215e0 6e 64 69 66 0a 20 20 70 49 6e 33 20 3d 20 26 61  ndif.  pIn3 = &a
215f0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
21600 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
21610 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
21620 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
21630 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
21640 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
21650 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29  pC->isTable==0 )
21660 3b 0a 20 20 70 46 72 65 65 20 3d 20 30 3b 0a 20  ;.  pFree = 0;. 
21670 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30   if( pOp->p4.i>0
21680 20 29 7b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e   ){.    r.pKeyIn
21690 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66  fo = pC->pKeyInf
216a0 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20  o;.    r.nField 
216b0 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69  = (u16)pOp->p4.i
216c0 3b 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 70  ;.    r.aMem = p
216d0 49 6e 33 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  In3;.#ifdef SQLI
216e0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72  TE_DEBUG.    for
216f0 28 69 69 3d 30 3b 20 69 69 3c 72 2e 6e 46 69 65  (ii=0; ii<r.nFie
21700 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ld; ii++){.     
21710 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
21720 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 69 5d 29  lid(&r.aMem[ii])
21730 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21740 28 20 28 72 2e 61 4d 65 6d 5b 69 69 5d 2e 66 6c  ( (r.aMem[ii].fl
21750 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
21760 3d 30 20 7c 7c 20 72 2e 61 4d 65 6d 5b 69 69 5d  =0 || r.aMem[ii]
21770 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  .n==0 );.      i
21780 66 28 20 69 69 20 29 20 52 45 47 49 53 54 45 52  f( ii ) REGISTER
21790 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2b 69  _TRACE(pOp->p3+i
217a0 69 2c 20 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 3b  i, &r.aMem[ii]);
217b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
217c0 20 20 70 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a    pIdxKey = &r;.
217d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
217e0 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
217f0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
21800 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70  ecord(.        p
21810 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 54 65  C->pKeyInfo, aTe
21820 6d 70 52 65 63 2c 20 73 69 7a 65 6f 66 28 61 54  mpRec, sizeof(aT
21830 65 6d 70 52 65 63 29 2c 20 26 70 46 72 65 65 0a  empRec), &pFree.
21840 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
21850 49 64 78 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f  IdxKey==0 ) goto
21860 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73   no_mem;.    ass
21870 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ert( pIn3->flags
21880 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
21890 20 20 20 28 76 6f 69 64 29 45 78 70 61 6e 64 42     (void)ExpandB
218a0 6c 6f 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 73  lob(pIn3);.    s
218b0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
218c0 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49  Unpack(pC->pKeyI
218d0 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49  nfo, pIn3->n, pI
218e0 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b  n3->z, pIdxKey);
218f0 0a 20 20 7d 0a 20 20 70 49 64 78 4b 65 79 2d 3e  .  }.  pIdxKey->
21900 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a  default_rc = 0;.
21910 20 20 74 61 6b 65 4a 75 6d 70 20 3d 20 30 3b 0a    takeJump = 0;.
21920 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
21930 65 3d 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74  e==OP_NoConflict
21940 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74   ){.    /* For t
21950 68 65 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74  he OP_NoConflict
21960 20 6f 70 63 6f 64 65 2c 20 74 61 6b 65 20 74 68   opcode, take th
21970 65 20 6a 75 6d 70 20 69 66 20 61 6e 79 20 6f 66  e jump if any of
21980 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 70 75   the.    ** inpu
21990 74 20 66 69 65 6c 64 73 20 61 72 65 20 4e 55 4c  t fields are NUL
219a0 4c 2c 20 73 69 6e 63 65 20 61 6e 79 20 6b 65 79  L, since any key
219b0 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 77 69 6c   with a NULL wil
219c0 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  l not.    ** con
219d0 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 66 6f 72  flict */.    for
219e0 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78 4b 65  (ii=0; ii<pIdxKe
219f0 79 2d 3e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29  y->nField; ii++)
21a00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  {.      if( pIdx
21a10 4b 65 79 2d 3e 61 4d 65 6d 5b 69 69 5d 2e 66 6c  Key->aMem[ii].fl
21a20 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
21a30 7b 0a 20 20 20 20 20 20 20 20 74 61 6b 65 4a 75  {.        takeJu
21a40 6d 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  mp = 1;.        
21a50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
21a60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
21a70 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
21a80 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75  toUnpacked(pC->u
21a90 63 2e 70 43 75 72 73 6f 72 2c 20 70 49 64 78 4b  c.pCursor, pIdxK
21aa0 65 79 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b  ey, 0, 0, &res);
21ab0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
21ac0 28 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 69  (db, pFree);.  i
21ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21ae0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f   ){.    goto abo
21af0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
21b00 0a 20 20 7d 0a 20 20 70 43 2d 3e 73 65 65 6b 52  .  }.  pC->seekR
21b10 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20 61  esult = res;.  a
21b20 6c 72 65 61 64 79 45 78 69 73 74 73 20 3d 20 28  lreadyExists = (
21b30 72 65 73 3d 3d 30 29 3b 0a 20 20 70 43 2d 3e 6e  res==0);.  pC->n
21b40 75 6c 6c 52 6f 77 20 3d 20 31 2d 61 6c 72 65 61  ullRow = 1-alrea
21b50 64 79 45 78 69 73 74 73 3b 0a 20 20 70 43 2d 3e  dyExists;.  pC->
21b60 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
21b70 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   0;.  pC->cacheS
21b80 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
21b90 41 4c 45 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ALE;.  if( pOp->
21ba0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64  opcode==OP_Found
21bb0 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e   ){.    VdbeBran
21bc0 63 68 54 61 6b 65 6e 28 61 6c 72 65 61 64 79 45  chTaken(alreadyE
21bd0 78 69 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20 20  xists!=0,2);.   
21be0 20 69 66 28 20 61 6c 72 65 61 64 79 45 78 69 73   if( alreadyExis
21bf0 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  ts ) goto jump_t
21c00 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  o_p2;.  }else{. 
21c10 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
21c20 65 6e 28 74 61 6b 65 4a 75 6d 70 7c 7c 61 6c 72  en(takeJump||alr
21c30 65 61 64 79 45 78 69 73 74 73 3d 3d 30 2c 32 29  eadyExists==0,2)
21c40 3b 0a 20 20 20 20 69 66 28 20 74 61 6b 65 4a 75  ;.    if( takeJu
21c50 6d 70 20 7c 7c 20 21 61 6c 72 65 61 64 79 45 78  mp || !alreadyEx
21c60 69 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70  ists ) goto jump
21c70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
21c80 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
21c90 65 3a 20 53 65 65 6b 52 6f 77 69 64 20 50 31 20  e: SeekRowid P1 
21ca0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
21cb0 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b  opsis: intkey=r[
21cc0 50 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  P3].**.** P1 is 
21cd0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
21ce0 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61 6e  ursor open on an
21cf0 20 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65 65   SQL table btree
21d00 20 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a 2a   (with integer.*
21d10 2a 20 6b 65 79 73 29 2e 20 20 49 66 20 72 65 67  * keys).  If reg
21d20 69 73 74 65 72 20 50 33 20 64 6f 65 73 20 6e 6f  ister P3 does no
21d30 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
21d40 65 67 65 72 20 6f 72 20 69 66 20 50 31 20 64 6f  eger or if P1 do
21d50 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69  es not.** contai
21d60 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20  n a record with 
21d70 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 6a 75  rowid P3 then ju
21d80 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
21d90 6f 20 50 32 2e 20 20 0a 2a 2a 20 4f 72 2c 20 69  o P2.  .** Or, i
21da0 66 20 50 32 20 69 73 20 30 2c 20 72 61 69 73 65  f P2 is 0, raise
21db0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
21dc0 50 54 20 65 72 72 6f 72 2e 20 49 66 20 50 31 20  PT error. If P1 
21dd0 64 6f 65 73 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  does contain.** 
21de0 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 72 6f  a record with ro
21df0 77 69 64 20 50 33 20 74 68 65 6e 20 0a 2a 2a 20  wid P3 then .** 
21e00 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f 72  leave the cursor
21e10 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 61   pointing at tha
21e20 74 20 72 65 63 6f 72 64 20 61 6e 64 20 66 61 6c  t record and fal
21e30 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
21e40 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63   next.** instruc
21e50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
21e60 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70 63  OP_NotExists opc
21e70 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ode performs the
21e80 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 2c   same operation,
21e90 20 62 75 74 20 77 69 74 68 20 4f 50 5f 4e 6f 74   but with OP_Not
21ea0 45 78 69 73 74 73 0a 2a 2a 20 74 68 65 20 50 33  Exists.** the P3
21eb0 20 72 65 67 69 73 74 65 72 20 6d 75 73 74 20 62   register must b
21ec0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
21ed0 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67  contain an integ
21ee0 65 72 20 76 61 6c 75 65 2e 20 20 57 69 74 68 20  er value.  With 
21ef0 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 2c 20  this.** opcode, 
21f00 72 65 67 69 73 74 65 72 20 50 33 20 6d 69 67 68  register P3 migh
21f10 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  t not contain an
21f20 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
21f30 54 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20  The OP_NotFound 
21f40 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20  opcode performs 
21f50 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69  the same operati
21f60 6f 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65  on on index btre
21f70 65 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69  es.** (with arbi
21f80 74 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75  trary multi-valu
21f90 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54  e keys)..**.** T
21fa0 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
21fb0 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20  s the cursor in 
21fc0 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  a state where it
21fd0 20 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e   cannot be advan
21fe0 63 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72  ced.** in either
21ff0 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20   direction.  In 
22000 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
22010 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f   Next and Prev o
22020 70 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e  pcodes will.** n
22030 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e  ot work followin
22040 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a  g this opcode..*
22050 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
22060 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
22070 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b  NoConflict, Seek
22080 52 6f 77 69 64 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  Rowid.*/./* Opco
22090 64 65 3a 20 4e 6f 74 45 78 69 73 74 73 20 50 31  de: NotExists P1
220a0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
220b0 6e 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72  nopsis: intkey=r
220c0 5b 50 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  [P3].**.** P1 is
220d0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
220e0 63 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61  cursor open on a
220f0 6e 20 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65  n SQL table btre
22100 65 20 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a  e (with integer.
22110 2a 2a 20 6b 65 79 73 29 2e 20 20 50 33 20 69 73  ** keys).  P3 is
22120 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69   an integer rowi
22130 64 2e 20 20 49 66 20 50 31 20 64 6f 65 73 20 6e  d.  If P1 does n
22140 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 63  ot contain a rec
22150 6f 72 64 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  ord with.** rowi
22160 64 20 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69  d P3 then jump i
22170 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
22180 2e 20 20 4f 72 2c 20 69 66 20 50 32 20 69 73 20  .  Or, if P2 is 
22190 30 2c 20 72 61 69 73 65 20 61 6e 0a 2a 2a 20 53  0, raise an.** S
221a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
221b0 72 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20  ror. If P1 does 
221c0 63 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64  contain a record
221d0 20 77 69 74 68 20 72 6f 77 69 64 20 50 33 20 74   with rowid P3 t
221e0 68 65 6e 20 0a 2a 2a 20 6c 65 61 76 65 20 74 68  hen .** leave th
221f0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
22200 67 20 61 74 20 74 68 61 74 20 72 65 63 6f 72 64  g at that record
22210 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67   and fall throug
22220 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a  h to the next.**
22230 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
22240 0a 2a 2a 20 54 68 65 20 4f 50 5f 53 65 65 6b 52  .** The OP_SeekR
22250 6f 77 69 64 20 6f 70 63 6f 64 65 20 70 65 72 66  owid opcode perf
22260 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70  orms the same op
22270 65 72 61 74 69 6f 6e 20 62 75 74 20 61 6c 73 6f  eration but also
22280 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 50   allows the.** P
22290 33 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f  3 register to co
222a0 6e 74 61 69 6e 20 61 20 6e 6f 6e 2d 69 6e 74 65  ntain a non-inte
222b0 67 65 72 20 76 61 6c 75 65 2c 20 69 6e 20 77 68  ger value, in wh
222c0 69 63 68 20 63 61 73 65 20 74 68 65 20 6a 75 6d  ich case the jum
222d0 70 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74  p is.** always t
222e0 61 6b 65 6e 2e 20 20 54 68 69 73 20 6f 70 63 6f  aken.  This opco
222f0 64 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  de requires that
22300 20 50 33 20 61 6c 77 61 79 73 20 63 6f 6e 74 61   P3 always conta
22310 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  in an integer..*
22320 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 46  *.** The OP_NotF
22330 6f 75 6e 64 20 6f 70 63 6f 64 65 20 70 65 72 66  ound opcode perf
22340 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70  orms the same op
22350 65 72 61 74 69 6f 6e 20 6f 6e 20 69 6e 64 65 78  eration on index
22360 20 62 74 72 65 65 73 0a 2a 2a 20 28 77 69 74 68   btrees.** (with
22370 20 61 72 62 69 74 72 61 72 79 20 6d 75 6c 74 69   arbitrary multi
22380 2d 76 61 6c 75 65 20 6b 65 79 73 29 2e 0a 2a 2a  -value keys)..**
22390 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
223a0 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
223b0 72 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65  r in a state whe
223c0 72 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20  re it cannot be 
223d0 61 64 76 61 6e 63 65 64 0a 2a 2a 20 69 6e 20 65  advanced.** in e
223e0 69 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e  ither direction.
223f0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
22400 2c 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50  , the Next and P
22410 72 65 76 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c  rev opcodes will
22420 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 6c  .** not work fol
22430 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 63 6f  lowing this opco
22440 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  de..**.** See al
22450 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f  so: Found, NotFo
22460 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c  und, NoConflict,
22470 20 53 65 65 6b 52 6f 77 69 64 0a 2a 2f 0a 63 61   SeekRowid.*/.ca
22480 73 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 3a  se OP_SeekRowid:
22490 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
224a0 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64 62 65  p, in3 */.  Vdbe
224b0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
224c0 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
224d0 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 36 34 20   int res;.  u64 
224e0 69 4b 65 79 3b 0a 0a 20 20 70 49 6e 33 20 3d 20  iKey;..  pIn3 = 
224f0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
22500 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61    if( (pIn3->fla
22510 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
22520 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66 66   ){.    applyAff
22530 69 6e 69 74 79 28 70 49 6e 33 2c 20 53 51 4c 49  inity(pIn3, SQLI
22540 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20  TE_AFF_NUMERIC, 
22550 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 69  encoding);.    i
22560 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
22570 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 20  & MEM_Int)==0 ) 
22580 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
22590 0a 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  .  }.  /* Fall t
225a0 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 4e  hrough into OP_N
225b0 6f 74 45 78 69 73 74 73 20 2a 2f 0a 63 61 73 65  otExists */.case
225c0 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 3a 20 20   OP_NotExists:  
225d0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
225e0 20 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 33 20 3d   in3 */.  pIn3 =
225f0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
22600 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d  .  assert( pIn3-
22610 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
22620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
22630 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
22640 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
22650 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
22660 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
22670 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 23  sert( pC!=0 );.#
22680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22690 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20  UG.  pC->seekOp 
226a0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  = 0;.#endif.  as
226b0 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
226c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
226d0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
226e0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
226f0 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70  pCrsr = pC->uc.p
22700 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
22710 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 20  ( pCrsr!=0 );.  
22720 72 65 73 20 3d 20 30 3b 0a 20 20 69 4b 65 79 20  res = 0;.  iKey 
22730 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 72  = pIn3->u.i;.  r
22740 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22750 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
22760 43 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20 30  Crsr, 0, iKey, 0
22770 2c 20 26 72 65 73 29 3b 0a 20 20 61 73 73 65 72  , &res);.  asser
22780 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
22790 20 7c 7c 20 72 65 73 3d 3d 30 20 29 3b 0a 20 20   || res==0 );.  
227a0 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
227b0 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55 73 65   = iKey;  /* Use
227c0 64 20 62 79 20 4f 50 5f 44 65 6c 65 74 65 20 2a  d by OP_Delete *
227d0 2f 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  /.  pC->nullRow 
227e0 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65  = 0;.  pC->cache
227f0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
22800 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 64 65 66 65  TALE;.  pC->defe
22810 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
22820 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
22830 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 70  n(res!=0,2);.  p
22840 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20  C->seekResult = 
22850 72 65 73 3b 0a 20 20 69 66 28 20 72 65 73 21 3d  res;.  if( res!=
22860 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
22870 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22880 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
22890 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  2==0 ){.      rc
228a0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
228b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
228c0 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75  e{.      goto ju
228d0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a  mp_to_p2;.    }.
228e0 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67    }.  if( rc ) g
228f0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
22900 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
22910 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
22920 65 71 75 65 6e 63 65 20 50 31 20 50 32 20 2a 20  equence P1 P2 * 
22930 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
22940 20 72 5b 50 32 5d 3d 63 75 72 73 6f 72 5b 50 31   r[P2]=cursor[P1
22950 5d 2e 63 74 72 2b 2b 0a 2a 2a 0a 2a 2a 20 46 69  ].ctr++.**.** Fi
22960 6e 64 20 74 68 65 20 6e 65 78 74 20 61 76 61 69  nd the next avai
22970 6c 61 62 6c 65 20 73 65 71 75 65 6e 63 65 20 6e  lable sequence n
22980 75 6d 62 65 72 20 66 6f 72 20 63 75 72 73 6f 72  umber for cursor
22990 20 50 31 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68   P1..** Write th
229a0 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65  e sequence numbe
229b0 72 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  r into register 
229c0 50 32 2e 0a 2a 2a 20 54 68 65 20 73 65 71 75 65  P2..** The seque
229d0 6e 63 65 20 6e 75 6d 62 65 72 20 6f 6e 20 74 68  nce number on th
229e0 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 63 72  e cursor is incr
229f0 65 6d 65 6e 74 65 64 20 61 66 74 65 72 20 74 68  emented after th
22a00 69 73 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  is.** instructio
22a10 6e 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  n.  .*/.case OP_
22a20 53 65 71 75 65 6e 63 65 3a 20 7b 20 20 20 20 20  Sequence: {     
22a30 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
22a40 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
22a50 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
22a60 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
22a70 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
22a80 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d 30 20 29 3b  r[pOp->p1]!=0 );
22a90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  .  assert( p->ap
22aa0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 65 43  Csr[pOp->p1]->eC
22ab0 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f  urType!=CURTYPE_
22ac0 56 54 41 42 20 29 3b 0a 20 20 70 4f 75 74 20 3d  VTAB );.  pOut =
22ad0 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
22ae0 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
22af0 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72 5b  >u.i = p->apCsr[
22b00 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f 75  pOp->p1]->seqCou
22b10 6e 74 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  nt++;.  break;.}
22b20 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65  .../* Opcode: Ne
22b30 77 52 6f 77 69 64 20 50 31 20 50 32 20 50 33 20  wRowid P1 P2 P3 
22b40 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
22b50 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a   r[P2]=rowid.**.
22b60 2a 2a 20 47 65 74 20 61 20 6e 65 77 20 69 6e 74  ** Get a new int
22b70 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75 6d 62  eger record numb
22b80 65 72 20 28 61 2e 6b 2e 61 20 22 72 6f 77 69 64  er (a.k.a "rowid
22b90 22 29 20 75 73 65 64 20 61 73 20 74 68 65 20 6b  ") used as the k
22ba0 65 79 20 74 6f 20 61 20 74 61 62 6c 65 2e 0a 2a  ey to a table..*
22bb0 2a 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  * The record num
22bc0 62 65 72 20 69 73 20 6e 6f 74 20 70 72 65 76 69  ber is not previ
22bd0 6f 75 73 6c 79 20 75 73 65 64 20 61 73 20 61 20  ously used as a 
22be0 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  key in the datab
22bf0 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  ase.** table tha
22c00 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e  t cursor P1 poin
22c10 74 73 20 74 6f 2e 20 20 54 68 65 20 6e 65 77 20  ts to.  The new 
22c20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73  record number is
22c30 20 77 72 69 74 74 65 6e 0a 2a 2a 20 77 72 69 74   written.** writ
22c40 74 65 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20  ten to register 
22c50 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 3e  P2..**.** If P3>
22c60 30 20 74 68 65 6e 20 50 33 20 69 73 20 61 20 72  0 then P3 is a r
22c70 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
22c80 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 74 68 69  oot frame of thi
22c90 73 20 56 44 42 45 20 74 68 61 74 20 68 6f 6c 64  s VDBE that hold
22ca0 73 20 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  s .** the larges
22cb0 74 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e  t previously gen
22cc0 65 72 61 74 65 64 20 72 65 63 6f 72 64 20 6e 75  erated record nu
22cd0 6d 62 65 72 2e 20 4e 6f 20 6e 65 77 20 72 65 63  mber. No new rec
22ce0 6f 72 64 20 6e 75 6d 62 65 72 73 20 61 72 65 0a  ord numbers are.
22cf0 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ** allowed to be
22d00 20 6c 65 73 73 20 74 68 61 6e 20 74 68 69 73 20   less than this 
22d10 76 61 6c 75 65 2e 20 57 68 65 6e 20 74 68 69 73  value. When this
22d20 20 76 61 6c 75 65 20 72 65 61 63 68 65 73 20 69   value reaches i
22d30 74 73 20 6d 61 78 69 6d 75 6d 2c 20 0a 2a 2a 20  ts maximum, .** 
22d40 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65  an SQLITE_FULL e
22d50 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65  rror is generate
22d60 64 2e 20 54 68 65 20 50 33 20 72 65 67 69 73 74  d. The P3 regist
22d70 65 72 20 69 73 20 75 70 64 61 74 65 64 20 77 69  er is updated wi
22d80 74 68 20 74 68 65 20 27 0a 2a 2a 20 67 65 6e 65  th the '.** gene
22d90 72 61 74 65 64 20 72 65 63 6f 72 64 20 6e 75 6d  rated record num
22da0 62 65 72 2e 20 54 68 69 73 20 50 33 20 6d 65 63  ber. This P3 mec
22db0 68 61 6e 69 73 6d 20 69 73 20 75 73 65 64 20 74  hanism is used t
22dc0 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d 65 6e 74  o help implement
22dd0 20 74 68 65 0a 2a 2a 20 41 55 54 4f 49 4e 43 52   the.** AUTOINCR
22de0 45 4d 45 4e 54 20 66 65 61 74 75 72 65 2e 0a 2a  EMENT feature..*
22df0 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 77 52 6f 77  /.case OP_NewRow
22e00 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  id: {           
22e10 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 36 34  /* out2 */.  i64
22e20 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   v;             
22e30 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
22e40 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62 65 43 75  owid */.  VdbeCu
22e50 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20 20  rsor *pC;       
22e60 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 61   /* Cursor of ta
22e70 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 6e  ble to get the n
22e80 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  ew rowid */.  in
22e90 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
22ea0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
22eb0 66 20 61 6e 20 73 71 6c 69 74 65 33 42 74 72 65  f an sqlite3Btre
22ec0 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20 69 6e 74  eLast() */.  int
22ed0 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
22ee0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 74      /* Counter t
22ef0 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
22f00 65 72 20 6f 66 20 73 65 61 72 63 68 65 73 20 2a  er of searches *
22f10 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20  /.  Mem *pMem;  
22f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22f30 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6c  gister holding l
22f40 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72  argest rowid for
22f50 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a   AUTOINCREMENT *
22f60 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70  /.  VdbeFrame *p
22f70 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a 20 52 6f  Frame;     /* Ro
22f80 6f 74 20 66 72 61 6d 65 20 6f 66 20 56 44 42 45  ot frame of VDBE
22f90 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b 0a 20 20   */..  v = 0;.  
22fa0 72 65 73 20 3d 20 30 3b 0a 20 20 70 4f 75 74 20  res = 0;.  pOut 
22fb0 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
22fc0 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73 65  (p, pOp);.  asse
22fd0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
22fe0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
22ff0 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
23000 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
23010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
23020 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
23030 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
23040 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
23050 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
23060 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 7b  Cursor!=0 );.  {
23070 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  .    /* The next
23080 20 72 6f 77 69 64 20 6f 72 20 72 65 63 6f 72 64   rowid or record
23090 20 6e 75 6d 62 65 72 20 28 64 69 66 66 65 72 65   number (differe
230a0 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
230b0 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 74 68 69   same.    ** thi
230c0 6e 67 29 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ng) is obtained 
230d0 69 6e 20 61 20 74 77 6f 2d 73 74 65 70 20 61 6c  in a two-step al
230e0 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a  gorithm..    **.
230f0 20 20 20 20 2a 2a 20 46 69 72 73 74 20 77 65 20      ** First we 
23100 61 74 74 65 6d 70 74 20 74 6f 20 66 69 6e 64 20  attempt to find 
23110 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73  the largest exis
23120 74 69 6e 67 20 72 6f 77 69 64 20 61 6e 64 20 61  ting rowid and a
23130 64 64 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 74 6f  dd one.    ** to
23140 20 74 68 61 74 2e 20 20 42 75 74 20 69 66 20 74   that.  But if t
23150 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
23160 69 6e 67 20 72 6f 77 69 64 20 69 73 20 61 6c 72  ing rowid is alr
23170 65 61 64 79 20 74 68 65 20 6d 61 78 69 6d 75 6d  eady the maximum
23180 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 76 65  .    ** positive
23190 20 69 6e 74 65 67 65 72 2c 20 77 65 20 68 61 76   integer, we hav
231a0 65 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67  e to fall throug
231b0 68 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a  h to the second.
231c0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 69 6c 69      ** probabili
231d0 73 74 69 63 20 61 6c 67 6f 72 69 74 68 6d 0a 20  stic algorithm. 
231e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
231f0 20 73 65 63 6f 6e 64 20 61 6c 67 6f 72 69 74 68   second algorith
23200 6d 20 69 73 20 74 6f 20 73 65 6c 65 63 74 20 61  m is to select a
23210 20 72 6f 77 69 64 20 61 74 20 72 61 6e 64 6f 6d   rowid at random
23220 20 61 6e 64 20 73 65 65 20 69 66 0a 20 20 20 20   and see if.    
23230 2a 2a 20 69 74 20 61 6c 72 65 61 64 79 20 65 78  ** it already ex
23240 69 73 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ists in the tabl
23250 65 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  e.  If it does n
23260 6f 74 20 65 78 69 73 74 2c 20 77 65 20 68 61 76  ot exist, we hav
23270 65 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64  e.    ** succeed
23280 65 64 2e 20 20 49 66 20 74 68 65 20 72 61 6e 64  ed.  If the rand
23290 6f 6d 20 72 6f 77 69 64 20 64 6f 65 73 20 65 78  om rowid does ex
232a0 69 73 74 2c 20 77 65 20 73 65 6c 65 63 74 20 61  ist, we select a
232b0 20 6e 65 77 20 6f 6e 65 0a 20 20 20 20 2a 2a 20   new one.    ** 
232c0 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2c 20 75  and try again, u
232d0 70 20 74 6f 20 31 30 30 20 74 69 6d 65 73 2e 0a  p to 100 times..
232e0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
232f0 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29  t( pC->isTable )
23300 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
23310 5f 33 32 42 49 54 5f 52 4f 57 49 44 0a 23 20 20  _32BIT_ROWID.#  
23320 20 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49   define MAX_ROWI
23330 44 20 30 78 37 66 66 66 66 66 66 66 0a 23 65 6c  D 0x7fffffff.#el
23340 73 65 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63  se.    /* Some c
23350 6f 6d 70 69 6c 65 72 73 20 63 6f 6d 70 6c 61 69  ompilers complai
23360 6e 20 61 62 6f 75 74 20 63 6f 6e 73 74 61 6e 74  n about constant
23370 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 30 78  s of the form 0x
23380 37 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66  7fffffffffffffff
23390 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 73 20  ..    ** Others 
233a0 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20 30  complain about 0
233b0 78 37 66 66 66 66 66 66 66 66 66 66 66 66 66 66  x7ffffffffffffff
233c0 66 66 4c 4c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ffLL.  The follo
233d0 77 69 6e 67 20 6d 61 63 72 6f 20 73 65 65 6d 73  wing macro seems
233e0 0a 20 20 20 20 2a 2a 20 74 6f 20 70 72 6f 76 69  .    ** to provi
233f0 64 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  de the constant 
23400 77 68 69 6c 65 20 6d 61 6b 69 6e 67 20 61 6c 6c  while making all
23410 20 63 6f 6d 70 69 6c 65 72 73 20 68 61 70 70 79   compilers happy
23420 2e 0a 20 20 20 20 2a 2f 0a 23 20 20 20 64 65 66  ..    */.#   def
23430 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 20 28  ine MAX_ROWID  (
23440 69 36 34 29 28 20 28 28 28 75 36 34 29 30 78 37  i64)( (((u64)0x7
23450 66 66 66 66 66 66 66 29 3c 3c 33 32 29 20 7c 20  fffffff)<<32) | 
23460 28 75 36 34 29 30 78 66 66 66 66 66 66 66 66 20  (u64)0xffffffff 
23470 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ).#endif..    if
23480 28 20 21 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d  ( !pC->useRandom
23490 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 72  Rowid ){.      r
234a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
234b0 4c 61 73 74 28 70 43 2d 3e 75 63 2e 70 43 75 72  Last(pC->uc.pCur
234c0 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
234d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
234e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
234f0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
23500 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
23510 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b        if( res ){
23520 0a 20 20 20 20 20 20 20 20 76 20 3d 20 31 3b 20  .        v = 1; 
23530 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 31    /* IMP: R-6191
23540 34 2d 34 38 30 37 34 20 2a 2f 0a 20 20 20 20 20  4-48074 */.     
23550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23560 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
23570 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
23580 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  d(pC->uc.pCursor
23590 29 20 29 3b 0a 20 20 20 20 20 20 20 20 76 20 3d  ) );.        v =
235a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
235b0 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70  egerKey(pC->uc.p
235c0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
235d0 20 69 66 28 20 76 3e 3d 4d 41 58 5f 52 4f 57 49   if( v>=MAX_ROWI
235e0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  D ){.          p
235f0 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69  C->useRandomRowi
23600 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  d = 1;.        }
23610 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23620 76 2b 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  v++;   /* IMP: R
23630 2d 32 39 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a  -29538-34987 */.
23640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23650 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  }.    }..#ifndef
23660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
23670 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 69  OINCREMENT.    i
23680 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20  f( pOp->p3 ){.  
23690 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68      /* Assert th
236a0 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64  at P3 is a valid
236b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f   memory cell. */
236c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
236d0 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20  Op->p3>0 );.    
236e0 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
236f0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  ){.        for(p
23700 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
23710 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
23720 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
23730 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20  >pParent);.     
23740 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61     /* Assert tha
23750 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20  t P3 is a valid 
23760 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a  memory cell. */.
23770 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23780 70 4f 70 2d 3e 70 33 3c 3d 70 46 72 61 6d 65 2d  pOp->p3<=pFrame-
23790 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 20  >nMem );.       
237a0 20 70 4d 65 6d 20 3d 20 26 70 46 72 61 6d 65 2d   pMem = &pFrame-
237b0 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  >aMem[pOp->p3];.
237c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
237d0 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74       /* Assert t
237e0 68 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69  hat P3 is a vali
237f0 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a  d memory cell. *
23800 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
23810 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  ( pOp->p3<=(p->n
23820 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
23830 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  or) );.        p
23840 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
23850 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  >p3];.        me
23860 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
23870 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , pMem);.      }
23880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
23890 65 6d 49 73 56 61 6c 69 64 28 70 4d 65 6d 29 20  emIsValid(pMem) 
238a0 29 3b 0a 0a 20 20 20 20 20 20 52 45 47 49 53 54  );..      REGIST
238b0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
238c0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , pMem);.      s
238d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
238e0 65 67 65 72 69 66 79 28 70 4d 65 6d 29 3b 0a 20  egerify(pMem);. 
238f0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d       assert( (pM
23900 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
23910 49 6e 74 29 21 3d 30 20 29 3b 20 20 2f 2a 20 6d  Int)!=0 );  /* m
23920 65 6d 28 50 33 29 20 68 6f 6c 64 73 20 61 6e 20  em(P3) holds an 
23930 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
23940 20 69 66 28 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d   if( pMem->u.i==
23950 4d 41 58 5f 52 4f 57 49 44 20 7c 7c 20 70 43 2d  MAX_ROWID || pC-
23960 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20  >useRandomRowid 
23970 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
23980 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f  SQLITE_FULL;   /
23990 2a 20 49 4d 50 3a 20 52 2d 31 32 32 37 35 2d 36  * IMP: R-12275-6
239a0 31 33 33 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  1338 */.        
239b0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
239c0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
239d0 0a 20 20 20 20 20 20 69 66 28 20 76 3c 70 4d 65  .      if( v<pMe
239e0 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20 20 20  m->u.i+1 ){.    
239f0 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
23a00 69 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  i + 1;.      }. 
23a10 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
23a20 20 76 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   v;.    }.#endif
23a30 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 75 73 65  .    if( pC->use
23a40 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20  RandomRowid ){. 
23a50 20 20 20 20 20 2f 2a 20 49 4d 50 4c 45 4d 45 4e       /* IMPLEMEN
23a60 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 37 36  TATION-OF: R-076
23a70 37 37 2d 34 31 38 38 31 20 49 66 20 74 68 65 20  77-41881 If the 
23a80 6c 61 72 67 65 73 74 20 52 4f 57 49 44 20 69 73  largest ROWID is
23a90 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 20 20   equal to the.  
23aa0 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 70      ** largest p
23ab0 6f 73 73 69 62 6c 65 20 69 6e 74 65 67 65 72 20  ossible integer 
23ac0 28 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  (922337203685477
23ad0 35 38 30 37 29 20 74 68 65 6e 20 74 68 65 20 64  5807) then the d
23ae0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
23af0 20 65 6e 67 69 6e 65 20 73 74 61 72 74 73 20 70   engine starts p
23b00 69 63 6b 69 6e 67 20 70 6f 73 69 74 69 76 65 20  icking positive 
23b10 63 61 6e 64 69 64 61 74 65 20 52 4f 57 49 44 73  candidate ROWIDs
23b20 20 61 74 20 72 61 6e 64 6f 6d 20 75 6e 74 69 6c   at random until
23b30 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 66 69 6e  .      ** it fin
23b40 64 73 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e  ds one that is n
23b50 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73  ot previously us
23b60 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ed. */.      ass
23b70 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20  ert( pOp->p3==0 
23b80 29 3b 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74  );  /* We cannot
23b90 20 62 65 20 69 6e 20 72 61 6e 64 6f 6d 20 72 6f   be in random ro
23ba0 77 69 64 20 6d 6f 64 65 20 69 66 20 74 68 69 73  wid mode if this
23bb0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20   is.            
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 20 2a 2a 20 61 6e 20 41 55 54 4f 49 4e 43 52 45   ** an AUTOINCRE
23be0 4d 45 4e 54 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  MENT table. */. 
23bf0 20 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20       cnt = 0;.  
23c00 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
23c10 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
23c20 73 73 28 73 69 7a 65 6f 66 28 76 29 2c 20 26 76  ss(sizeof(v), &v
23c30 29 3b 0a 20 20 20 20 20 20 20 20 76 20 26 3d 20  );.        v &= 
23c40 28 4d 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20  (MAX_ROWID>>1); 
23c50 76 2b 2b 3b 20 20 2f 2a 20 45 6e 73 75 72 65 20  v++;  /* Ensure 
23c60 74 68 61 74 20 76 20 69 73 20 67 72 65 61 74 65  that v is greate
23c70 72 20 74 68 61 6e 20 7a 65 72 6f 20 2a 2f 0a 20  r than zero */. 
23c80 20 20 20 20 20 7d 77 68 69 6c 65 28 20 20 28 28       }while(  ((
23c90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23ca0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
23cb0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
23cc0 30 2c 20 28 75 36 34 29 76 2c 0a 20 20 20 20 20  0, (u64)v,.     
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26              0, &
23d00 72 65 73 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  res))==SQLITE_OK
23d10 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
23d20 20 28 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20   (res==0).      
23d30 20 20 20 20 20 20 26 26 20 28 2b 2b 63 6e 74 3c        && (++cnt<
23d40 31 30 30 29 29 3b 0a 20 20 20 20 20 20 69 66 28  100));.      if(
23d50 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
23d60 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
23d70 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
23d80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
23d90 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f  SQLITE_FULL;   /
23da0 2a 20 49 4d 50 3a 20 52 2d 33 38 32 31 39 2d 35  * IMP: R-38219-5
23db0 33 30 30 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  3002 */.        
23dc0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
23dd0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
23de0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76  .      assert( v
23df0 3e 30 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d  >0 );  /* EV: R-
23e00 34 30 38 31 32 2d 30 33 35 37 30 20 2a 2f 0a 20  40812-03570 */. 
23e10 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 64 65 66     }.    pC->def
23e20 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
23e30 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
23e40 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
23e50 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  LE;.  }.  pOut->
23e60 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b  u.i = v;.  break
23e70 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
23e80 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20  Insert P1 P2 P3 
23e90 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
23ea0 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 20  s: intkey=r[P3] 
23eb0 64 61 74 61 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a  data=r[P2].**.**
23ec0 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
23ed0 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
23ee0 66 20 63 75 72 73 6f 72 20 50 31 2e 20 20 41 20  f cursor P1.  A 
23ef0 6e 65 77 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20  new entry is.** 
23f00 63 72 65 61 74 65 64 20 69 66 20 69 74 20 64 6f  created if it do
23f10 65 73 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78  esn't already ex
23f20 69 73 74 20 6f 72 20 74 68 65 20 64 61 74 61 20  ist or the data 
23f30 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  for an existing.
23f40 2a 2a 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72  ** entry is over
23f50 77 72 69 74 74 65 6e 2e 20 20 54 68 65 20 64 61  written.  The da
23f60 74 61 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  ta is the value 
23f70 4d 45 4d 5f 42 6c 6f 62 20 73 74 6f 72 65 64 20  MEM_Blob stored 
23f80 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6e  in register.** n
23f90 75 6d 62 65 72 20 50 32 2e 20 54 68 65 20 6b 65  umber P2. The ke
23fa0 79 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  y is stored in r
23fb0 65 67 69 73 74 65 72 20 50 33 2e 20 54 68 65 20  egister P3. The 
23fc0 6b 65 79 20 6d 75 73 74 0a 2a 2a 20 62 65 20 61  key must.** be a
23fd0 20 4d 45 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20   MEM_Int..**.** 
23fe0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43  If the OPFLAG_NC
23ff0 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 35  HANGE flag of P5
24000 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
24010 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75  e row change cou
24020 6e 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65  nt is.** increme
24030 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73 65 20  nted (otherwise 
24040 6e 6f 74 29 2e 20 20 49 66 20 74 68 65 20 4f 50  not).  If the OP
24050 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 66  FLAG_LASTROWID f
24060 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74  lag of P5 is set
24070 2c 0a 2a 2a 20 74 68 65 6e 20 72 6f 77 69 64 20  ,.** then rowid 
24080 69 73 20 73 74 6f 72 65 64 20 66 6f 72 20 73 75  is stored for su
24090 62 73 65 71 75 65 6e 74 20 72 65 74 75 72 6e 20  bsequent return 
240a0 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  by the.** sqlite
240b0 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
240c0 77 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 28  wid() function (
240d0 6f 74 68 65 72 77 69 73 65 20 69 74 20 69 73 20  otherwise it is 
240e0 75 6e 6d 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a  unmodified)..**.
240f0 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
24100 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66  _USESEEKRESULT f
24110 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74  lag of P5 is set
24120 20 61 6e 64 20 69 66 20 74 68 65 20 72 65 73 75   and if the resu
24130 6c 74 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 61 73  lt of.** the las
24140 74 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  t seek operation
24150 20 28 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f   (OP_NotExists o
24160 72 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 29 20  r OP_SeekRowid) 
24170 77 61 73 20 61 20 73 75 63 63 65 73 73 2c 0a 2a  was a success,.*
24180 2a 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 6f  * then this.** o
24190 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  peration will no
241a0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 66 69 6e  t attempt to fin
241b0 64 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  d the appropriat
241c0 65 20 72 6f 77 20 62 65 66 6f 72 65 20 64 6f 69  e row before doi
241d0 6e 67 0a 2a 2a 20 74 68 65 20 69 6e 73 65 72 74  ng.** the insert
241e0 20 62 75 74 20 77 69 6c 6c 20 69 6e 73 74 65 61   but will instea
241f0 64 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  d overwrite the 
24200 72 6f 77 20 74 68 61 74 20 74 68 65 20 63 75 72  row that the cur
24210 73 6f 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  sor is.** curren
24220 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  tly pointing to.
24230 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 20 74 68    Presumably, th
24240 65 20 70 72 69 6f 72 20 4f 50 5f 4e 6f 74 45 78  e prior OP_NotEx
24250 69 73 74 73 20 6f 72 0a 2a 2a 20 4f 50 5f 53 65  ists or.** OP_Se
24260 65 6b 52 6f 77 69 64 20 6f 70 63 6f 64 65 0a 2a  ekRowid opcode.*
24270 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * has already po
24280 73 69 74 69 6f 6e 65 64 20 74 68 65 20 63 75 72  sitioned the cur
24290 73 6f 72 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  sor correctly.  
242a0 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
242b0 69 7a 61 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ization.** that 
242c0 62 6f 6f 73 74 73 20 70 65 72 66 6f 72 6d 61 6e  boosts performan
242d0 63 65 20 62 79 20 61 76 6f 69 64 69 6e 67 20 72  ce by avoiding r
242e0 65 64 75 6e 64 61 6e 74 20 73 65 65 6b 73 2e 0a  edundant seeks..
242f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
24300 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66 6c 61  LAG_ISUPDATE fla
24310 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
24320 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 70 61  his opcode is pa
24330 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55 50 44 41  rt of an.** UPDA
24340 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f  TE operation.  O
24350 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
24360 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 29 20   flag is clear) 
24370 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65  then this opcode
24380 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66 20 61  .** is part of a
24390 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  n INSERT operati
243a0 6f 6e 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  on.  The differe
243b0 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69 6d 70 6f  nce is only impo
243c0 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  rtant to.** the 
243d0 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a 2a 2a 0a  update hook..**.
243e0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 50 34 20  ** Parameter P4 
243f0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 20 54  may point to a T
24400 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
24410 6f 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  or may be NULL. 
24420 49 66 20 69 74 20 69 73 20 0a 2a 2a 20 6e 6f 74  If it is .** not
24430 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
24440 75 70 64 61 74 65 2d 68 6f 6f 6b 20 28 73 71 6c  update-hook (sql
24450 69 74 65 33 2e 78 55 70 64 61 74 65 43 61 6c 6c  ite3.xUpdateCall
24460 62 61 63 6b 29 20 69 73 20 69 6e 76 6f 6b 65 64  back) is invoked
24470 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   .** following a
24480 20 73 75 63 63 65 73 73 66 75 6c 20 69 6e 73 65   successful inse
24490 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41 52 4e 49  rt..**.** (WARNI
244a0 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50 31 20 69  NG/TODO: If P1 i
244b0 73 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73 6f  s a pseudo-curso
244c0 72 20 61 6e 64 20 50 32 20 69 73 20 64 79 6e 61  r and P2 is dyna
244d0 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  mically.** alloc
244e0 61 74 65 64 2c 20 74 68 65 6e 20 6f 77 6e 65 72  ated, then owner
244f0 73 68 69 70 20 6f 66 20 50 32 20 69 73 20 74 72  ship of P2 is tr
24500 61 6e 73 66 65 72 72 65 64 20 74 6f 20 74 68 65  ansferred to the
24510 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 0a 2a   pseudo-cursor.*
24520 2a 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 50  * and register P
24530 32 20 62 65 63 6f 6d 65 73 20 65 70 68 65 6d 65  2 becomes epheme
24540 72 61 6c 2e 20 20 49 66 20 74 68 65 20 63 75 72  ral.  If the cur
24550 73 6f 72 20 69 73 20 63 68 61 6e 67 65 64 2c 20  sor is changed, 
24560 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
24570 72 65 67 69 73 74 65 72 20 50 32 20 77 69 6c 6c  register P2 will
24580 20 74 68 65 6e 20 63 68 61 6e 67 65 2e 20 20 4d   then change.  M
24590 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 64 6f  ake sure this do
245a0 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75 73 65 20  es not.** cause 
245b0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 29 0a 2a  any problems.).*
245c0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
245d0 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73  ction only works
245e0 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20 54 68 65   on tables.  The
245f0 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 73 74   equivalent inst
24600 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 69  ruction.** for i
24610 6e 64 69 63 65 73 20 69 73 20 4f 50 5f 49 64 78  ndices is OP_Idx
24620 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70  Insert..*/./* Op
24630 63 6f 64 65 3a 20 49 6e 73 65 72 74 49 6e 74 20  code: InsertInt 
24640 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
24650 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b  * Synopsis: intk
24660 65 79 3d 50 33 20 64 61 74 61 3d 72 5b 50 32 5d  ey=P3 data=r[P2]
24670 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
24680 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 4f  s exactly like O
24690 50 5f 49 6e 73 65 72 74 20 65 78 63 65 70 74 20  P_Insert except 
246a0 74 68 61 74 20 74 68 65 20 6b 65 79 20 69 73 20  that the key is 
246b0 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76  the.** integer v
246c0 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20 74 68 65  alue P3, not the
246d0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
246e0 74 65 67 65 72 20 73 74 6f 72 65 64 20 69 6e 20  teger stored in 
246f0 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a  register P3..*/.
24700 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a 20  case OP_Insert: 
24710 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 49  .case OP_InsertI
24720 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44 61  nt: {.  Mem *pDa
24730 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d  ta;       /* MEM
24740 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 64 61   cell holding da
24750 74 61 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ta for the recor
24760 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  d to be inserted
24770 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65 79 3b   */.  Mem *pKey;
24780 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63          /* MEM c
24790 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20  ell holding key 
247a0 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
247b0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
247c0 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72  *pC;   /* Cursor
247d0 20 74 6f 20 74 61 62 6c 65 20 69 6e 74 6f 20 77   to table into w
247e0 68 69 63 68 20 69 6e 73 65 72 74 20 69 73 20 77  hich insert is w
247f0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
24800 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a  seekResult;   /*
24810 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72   Result of prior
24820 20 73 65 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f   seek or 0 if no
24830 20 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66   USESEEKRESULT f
24840 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  lag */.  const c
24850 68 61 72 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61  har *zDb;  /* da
24860 74 61 62 61 73 65 20 6e 61 6d 65 20 2d 20 75 73  tabase name - us
24870 65 64 20 62 79 20 74 68 65 20 75 70 64 61 74 65  ed by the update
24880 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54 61 62 6c 65   hook */.  Table
24890 20 2a 70 54 61 62 3b 20 20 20 20 20 20 2f 2a 20   *pTab;      /* 
248a0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
248b0 2d 20 75 73 65 64 20 62 79 20 75 70 64 61 74 65  - used by update
248c0 20 61 6e 64 20 70 72 65 2d 75 70 64 61 74 65 20   and pre-update 
248d0 68 6f 6f 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6f  hooks */.  int o
248e0 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
248f0 4f 70 63 6f 64 65 20 66 6f 72 20 75 70 64 61 74  Opcode for updat
24900 65 20 68 6f 6f 6b 3a 20 53 51 4c 49 54 45 5f 55  e hook: SQLITE_U
24910 50 44 41 54 45 20 6f 72 20 53 51 4c 49 54 45 5f  PDATE or SQLITE_
24920 49 4e 53 45 52 54 20 2a 2f 0a 20 20 42 74 72 65  INSERT */.  Btre
24930 65 50 61 79 6c 6f 61 64 20 78 3b 20 20 20 2f 2a  ePayload x;   /*
24940 20 50 61 79 6c 6f 61 64 20 74 6f 20 62 65 20 69   Payload to be i
24950 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 6f 70  nserted */..  op
24960 20 3d 20 30 3b 0a 20 20 70 44 61 74 61 20 3d 20   = 0;.  pData = 
24970 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
24980 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
24990 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
249a0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
249b0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
249c0 69 64 28 70 44 61 74 61 29 20 29 3b 0a 20 20 70  id(pData) );.  p
249d0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
249e0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
249f0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
24a00 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
24a10 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
24a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
24a30 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
24a40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
24a50 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  isTable );.  ass
24a60 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
24a70 3d 3d 50 34 5f 54 41 42 4c 45 20 7c 7c 20 70 4f  ==P4_TABLE || pO
24a80 70 2d 3e 70 34 74 79 70 65 3e 3d 50 34 5f 53 54  p->p4type>=P4_ST
24a90 41 54 49 43 20 29 3b 0a 20 20 52 45 47 49 53 54  ATIC );.  REGIST
24aa0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
24ab0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 69 66 28  , pData);..  if(
24ac0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
24ad0 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 70  _Insert ){.    p
24ae0 4b 65 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Key = &aMem[pOp-
24af0 3e 70 33 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  >p3];.    assert
24b00 28 20 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26 20  ( pKey->flags & 
24b10 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 61  MEM_Int );.    a
24b20 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
24b30 64 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 52  d(pKey) );.    R
24b40 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
24b50 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b 0a 20 20  p->p3, pKey);.  
24b60 20 20 78 2e 6e 4b 65 79 20 3d 20 70 4b 65 79 2d    x.nKey = pKey-
24b70 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  >u.i;.  }else{. 
24b80 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
24b90 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 72  opcode==OP_Inser
24ba0 74 49 6e 74 20 29 3b 0a 20 20 20 20 78 2e 6e 4b  tInt );.    x.nK
24bb0 65 79 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  ey = pOp->p3;.  
24bc0 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  }..  if( pOp->p4
24bd0 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26  type==P4_TABLE &
24be0 26 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f  & HAS_UPDATE_HOO
24bf0 4b 28 64 62 29 20 29 7b 0a 20 20 20 20 61 73 73  K(db) ){.    ass
24c00 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65  ert( pC->isTable
24c10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24c20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20  pC->iDb>=0 );.  
24c30 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
24c40 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  pC->iDb].zDbSNam
24c50 65 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4f  e;.    pTab = pO
24c60 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20 20 20 20  p->p4.pTab;.    
24c70 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64  assert( HasRowid
24c80 28 70 54 61 62 29 20 29 3b 0a 20 20 20 20 6f 70  (pTab) );.    op
24c90 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f   = ((pOp->p5 & O
24ca0 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20  PFLAG_ISUPDATE) 
24cb0 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ? SQLITE_UPDATE 
24cc0 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  : SQLITE_INSERT)
24cd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24ce0 54 61 62 20 3d 20 30 3b 20 2f 2a 20 4e 6f 74 20  Tab = 0; /* Not 
24cf0 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65  needed.  Silence
24d00 20 61 20 63 6f 6d 69 6c 65 72 20 77 61 72 6e 69   a comiler warni
24d10 6e 67 2e 20 2a 2f 0a 20 20 20 20 7a 44 62 20 3d  ng. */.    zDb =
24d20 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64   0;  /* Not need
24d30 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63  ed.  Silence a c
24d40 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e  ompiler warning.
24d50 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20   */.  }..#ifdef 
24d60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
24d70 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f  EUPDATE_HOOK.  /
24d80 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65  * Invoke the pre
24d90 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20 69 66  -update hook, if
24da0 20 61 6e 79 20 2a 2f 0a 20 20 69 66 28 20 64 62   any */.  if( db
24db0 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
24dc0 62 61 63 6b 20 0a 20 20 20 26 26 20 70 4f 70 2d  back .   && pOp-
24dd0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c  >p4type==P4_TABL
24de0 45 0a 20 20 20 26 26 20 21 28 70 4f 70 2d 3e 70  E.   && !(pOp->p
24df0 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  5 & OPFLAG_ISUPD
24e00 41 54 45 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ATE).  ){.    sq
24e10 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61  lite3VdbePreUpda
24e20 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 20 53 51  teHook(p, pC, SQ
24e30 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 7a 44 62  LITE_INSERT, zDb
24e40 2c 20 70 54 61 62 2c 20 78 2e 6e 4b 65 79 2c 20  , pTab, x.nKey, 
24e50 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 7d 0a 23 65  pOp->p2);.  }.#e
24e60 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 70 2d  ndif..  if( pOp-
24e70 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48  >p5 & OPFLAG_NCH
24e80 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67  ANGE ) p->nChang
24e90 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  e++;.  if( pOp->
24ea0 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c 41 53 54  p5 & OPFLAG_LAST
24eb0 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c 61 73 74  ROWID ) db->last
24ec0 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f 77 69  Rowid = lastRowi
24ed0 64 20 3d 20 78 2e 6e 4b 65 79 3b 0a 20 20 69 66  d = x.nKey;.  if
24ee0 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26  ( pData->flags &
24ef0 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
24f00 20 78 2e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20   x.pData = 0;.  
24f10 20 20 78 2e 6e 44 61 74 61 20 3d 20 30 3b 0a 20    x.nData = 0;. 
24f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
24f30 72 74 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73  rt( pData->flags
24f40 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d   & (MEM_Blob|MEM
24f50 5f 53 74 72 29 20 29 3b 0a 20 20 20 20 78 2e 70  _Str) );.    x.p
24f60 44 61 74 61 20 3d 20 70 44 61 74 61 2d 3e 7a 3b  Data = pData->z;
24f70 0a 20 20 20 20 78 2e 6e 44 61 74 61 20 3d 20 70  .    x.nData = p
24f80 44 61 74 61 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 73  Data->n;.  }.  s
24f90 65 65 6b 52 65 73 75 6c 74 20 3d 20 28 28 70 4f  eekResult = ((pO
24fa0 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55  p->p5 & OPFLAG_U
24fb0 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20  SESEEKRESULT) ? 
24fc0 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a  pC->seekResult :
24fd0 20 30 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61   0);.  if( pData
24fe0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
24ff0 72 6f 20 29 7b 0a 20 20 20 20 78 2e 6e 5a 65 72  ro ){.    x.nZer
25000 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65  o = pData->u.nZe
25010 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ro;.  }else{.   
25020 20 78 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   x.nZero = 0;.  
25030 7d 0a 20 20 78 2e 70 4b 65 79 20 3d 20 30 3b 0a  }.  x.pKey = 0;.
25040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
25050 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 75 63  reeInsert(pC->uc
25060 2e 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20 20  .pCursor, &x,.  
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25080 20 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35          (pOp->p5
25090 20 26 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44   & OPFLAG_APPEND
250a0 29 21 3d 30 2c 20 73 65 65 6b 52 65 73 75 6c 74  )!=0, seekResult
250b0 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 64 65 66 65  .  );.  pC->defe
250c0 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
250d0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
250e0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
250f0 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
25100 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66  e update-hook if
25110 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
25120 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
25130 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
25140 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64  ;.  if( db->xUpd
25150 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 6f  ateCallback && o
25160 70 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 55 70  p ){.    db->xUp
25170 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d  dateCallback(db-
25180 3e 70 55 70 64 61 74 65 41 72 67 2c 20 6f 70 2c  >pUpdateArg, op,
25190 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   zDb, pTab->zNam
251a0 65 2c 20 78 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a  e, x.nKey);.  }.
251b0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
251c0 70 63 6f 64 65 3a 20 44 65 6c 65 74 65 20 50 31  pcode: Delete P1
251d0 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
251e0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 72 65  ** Delete the re
251f0 63 6f 72 64 20 61 74 20 77 68 69 63 68 20 74 68  cord at which th
25200 65 20 50 31 20 63 75 72 73 6f 72 20 69 73 20 63  e P1 cursor is c
25210 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
25220 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
25230 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
25240 49 4f 4e 20 62 69 74 20 6f 66 20 74 68 65 20 50  ION bit of the P
25250 35 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  5 parameter is s
25260 65 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  et, then.** the 
25270 63 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 6c  cursor will be l
25280 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
25290 20 65 69 74 68 65 72 20 74 68 65 20 6e 65 78 74   either the next
252a0 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73   or the previous
252b0 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 20 74 68  .** record in th
252c0 65 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69  e table. If it i
252d0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
252e0 61 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f  at the next reco
252f0 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  rd, then.** the 
25300 6e 65 78 74 20 4e 65 78 74 20 69 6e 73 74 72 75  next Next instru
25310 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20  ction will be a 
25320 6e 6f 2d 6f 70 2e 20 41 73 20 61 20 72 65 73 75  no-op. As a resu
25330 6c 74 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  lt, in this case
25340 0a 2a 2a 20 69 74 20 69 73 20 6f 6b 20 74 6f 20  .** it is ok to 
25350 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72 64 20  delete a record 
25360 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 4e 65  from within a Ne
25370 78 74 20 6c 6f 6f 70 2e 20 49 66 20 0a 2a 2a 20  xt loop. If .** 
25380 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
25390 49 4f 4e 20 62 69 74 20 6f 66 20 50 35 20 69 73  ION bit of P5 is
253a0 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65   clear, then the
253b0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 0a   cursor will be.
253c0 2a 2a 20 6c 65 66 74 20 69 6e 20 61 6e 20 75 6e  ** left in an un
253d0 64 65 66 69 6e 65 64 20 73 74 61 74 65 2e 0a 2a  defined state..*
253e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
253f0 41 47 5f 41 55 58 44 45 4c 45 54 45 20 62 69 74  AG_AUXDELETE bit
25400 20 69 73 20 73 65 74 20 6f 6e 20 50 35 2c 20 74   is set on P5, t
25410 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68  hat indicates th
25420 61 74 20 74 68 69 73 0a 2a 2a 20 64 65 6c 65 74  at this.** delet
25430 65 20 6f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  e one of several
25440 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
25450 20 64 65 6c 65 74 69 6e 67 20 61 20 74 61 62 6c   deleting a tabl
25460 65 20 72 6f 77 20 61 6e 64 20 61 6c 6c 20 69 74  e row and all it
25470 73 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  s.** associated 
25480 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 20 20  index entries.  
25490 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
254a0 68 6f 73 65 20 64 65 6c 65 74 65 73 20 69 73 20  hose deletes is 
254b0 74 68 65 20 22 70 72 69 6d 61 72 79 22 0a 2a 2a  the "primary".**
254c0 20 64 65 6c 65 74 65 2e 20 20 54 68 65 20 6f 74   delete.  The ot
254d0 68 65 72 73 20 61 72 65 20 61 6c 6c 20 6f 6e 20  hers are all on 
254e0 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45  OPFLAG_FORDELETE
254f0 20 63 75 72 73 6f 72 73 20 6f 72 20 65 6c 73 65   cursors or else
25500 20 61 72 65 0a 2a 2a 20 6d 61 72 6b 65 64 20 77   are.** marked w
25510 69 74 68 20 74 68 65 20 41 55 58 44 45 4c 45 54  ith the AUXDELET
25520 45 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  E flag..**.** If
25530 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
25540 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 32 20 28  NGE flag of P2 (
25550 4e 42 3a 20 50 32 20 6e 6f 74 20 50 35 29 20 69  NB: P2 not P5) i
25560 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
25570 72 6f 77 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f  row.** change co
25580 75 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  unt is increment
25590 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f  ed (otherwise no
255a0 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73  t)..**.** P1 mus
255b0 74 20 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d  t not be pseudo-
255c0 74 61 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74  table.  It has t
255d0 6f 20 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c  o be a real tabl
255e0 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70  e with.** multip
255f0 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49  le rows..**.** I
25600 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f P4 is not NULL
25610 20 74 68 65 6e 20 69 74 20 70 6f 69 6e 74 73 20   then it points 
25620 74 6f 20 61 20 54 61 62 6c 65 20 6f 62 6a 65 63  to a Table objec
25630 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
25640 65 69 74 68 65 72 20 0a 2a 2a 20 74 68 65 20 75  either .** the u
25650 70 64 61 74 65 20 6f 72 20 70 72 65 2d 75 70 64  pdate or pre-upd
25660 61 74 65 20 68 6f 6f 6b 2c 20 6f 72 20 62 6f 74  ate hook, or bot
25670 68 2c 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65  h, may be invoke
25680 64 2e 20 54 68 65 20 50 31 20 63 75 72 73 6f 72  d. The P1 cursor
25690 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20 62 65   must.** have be
256a0 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 20 75 73  en positioned us
256b0 69 6e 67 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20  ing OP_NotFound 
256c0 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
256d0 67 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 6e  g this opcode in
256e0 20 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20   .** this case. 
256f0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 66  Specifically, if
25700 20 6f 6e 65 20 69 73 20 63 6f 6e 66 69 67 75 72   one is configur
25710 65 64 2c 20 74 68 65 20 70 72 65 2d 75 70 64 61  ed, the pre-upda
25720 74 65 20 68 6f 6f 6b 20 69 73 20 0a 2a 2a 20 69  te hook is .** i
25730 6e 76 6f 6b 65 64 20 69 66 20 50 34 20 69 73 20  nvoked if P4 is 
25740 6e 6f 74 20 4e 55 4c 4c 2e 20 54 68 65 20 75 70  not NULL. The up
25750 64 61 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e 76  date-hook is inv
25760 6f 6b 65 64 20 69 66 20 6f 6e 65 20 69 73 20 63  oked if one is c
25770 6f 6e 66 69 67 75 72 65 64 2c 20 0a 2a 2a 20 50  onfigured, .** P
25780 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  4 is not NULL, a
25790 6e 64 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43  nd the OPFLAG_NC
257a0 48 41 4e 47 45 20 66 6c 61 67 20 69 73 20 73 65  HANGE flag is se
257b0 74 20 69 6e 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49  t in P2..**.** I
257c0 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55  f the OPFLAG_ISU
257d0 50 44 41 54 45 20 66 6c 61 67 20 69 73 20 73 65  PDATE flag is se
257e0 74 20 69 6e 20 50 32 2c 20 74 68 65 6e 20 50 33  t in P2, then P3
257f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64   contains the ad
25800 64 72 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20  dress.** of the 
25810 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
25820 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
25830 6c 75 65 20 74 68 61 74 20 74 68 65 20 72 6f 77  lue that the row
25840 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20 77 69  id of the row wi
25850 6c 6c 0a 2a 2a 20 62 65 20 73 65 74 20 74 6f 20  ll.** be set to 
25860 62 79 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a  by the update..*
25870 2f 0a 63 61 73 65 20 4f 50 5f 44 65 6c 65 74 65  /.case OP_Delete
25880 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
25890 20 2a 70 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *pC;.  const ch
258a0 61 72 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65  ar *zDb;.  Table
258b0 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 6f 70   *pTab;.  int op
258c0 66 6c 61 67 73 3b 0a 0a 20 20 6f 70 66 6c 61 67  flags;..  opflag
258d0 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61  s = pOp->p2;.  a
258e0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
258f0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
25900 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
25910 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
25920 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
25930 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
25940 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
25950 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
25960 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75  .  assert( pC->u
25970 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
25980 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
25990 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
259a0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
259b0 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 4f  E_DEBUG.  if( pO
259c0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41  p->p4type==P4_TA
259d0 42 4c 45 20 26 26 20 48 61 73 52 6f 77 69 64 28  BLE && HasRowid(
259e0 70 4f 70 2d 3e 70 34 2e 70 54 61 62 29 20 26 26  pOp->p4.pTab) &&
259f0 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 7b 0a 20   pOp->p5==0 ){. 
25a00 20 20 20 2f 2a 20 49 66 20 70 35 20 69 73 20 7a     /* If p5 is z
25a10 65 72 6f 2c 20 74 68 65 20 73 65 65 6b 20 6f 70  ero, the seek op
25a20 65 72 61 74 69 6f 6e 20 74 68 61 74 20 70 6f 73  eration that pos
25a30 69 74 69 6f 6e 65 64 20 74 68 65 20 63 75 72 73  itioned the curs
25a40 6f 72 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  or prior to.    
25a50 2a 2a 20 4f 50 5f 44 65 6c 65 74 65 20 77 69 6c  ** OP_Delete wil
25a60 6c 20 68 61 76 65 20 61 6c 73 6f 20 73 65 74 20  l have also set 
25a70 74 68 65 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61  the pC->movetoTa
25a80 72 67 65 74 20 66 69 65 6c 64 20 74 6f 20 74 68  rget field to th
25a90 65 20 72 6f 77 69 64 20 6f 66 0a 20 20 20 20 2a  e rowid of.    *
25aa0 2a 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 69  * the row that i
25ab0 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  s being deleted 
25ac0 2a 2f 0a 20 20 20 20 69 36 34 20 69 4b 65 79 20  */.    i64 iKey 
25ad0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
25ae0 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e  tegerKey(pC->uc.
25af0 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 61 73  pCursor);.    as
25b00 73 65 72 74 28 20 70 43 2d 3e 6d 6f 76 65 74 6f  sert( pC->moveto
25b10 54 61 72 67 65 74 3d 3d 69 4b 65 79 20 29 3b 0a  Target==iKey );.
25b20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
25b30 20 49 66 20 74 68 65 20 75 70 64 61 74 65 2d 68   If the update-h
25b40 6f 6f 6b 20 6f 72 20 70 72 65 2d 75 70 64 61 74  ook or pre-updat
25b50 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69  e-hook will be i
25b60 6e 76 6f 6b 65 64 2c 20 73 65 74 20 7a 44 62 20  nvoked, set zDb 
25b70 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  to.  ** the name
25b80 20 6f 66 20 74 68 65 20 64 62 20 74 6f 20 70 61   of the db to pa
25b90 73 73 20 61 73 20 74 6f 20 69 74 2e 20 41 6c 73  ss as to it. Als
25ba0 6f 20 73 65 74 20 6c 6f 63 61 6c 20 70 54 61 62  o set local pTab
25bb0 20 74 6f 20 61 20 63 6f 70 79 0a 20 20 2a 2a 20   to a copy.  ** 
25bc0 6f 66 20 70 34 2e 70 54 61 62 2e 20 46 69 6e 61  of p4.pTab. Fina
25bd0 6c 6c 79 2c 20 69 66 20 70 35 20 69 73 20 74 72  lly, if p5 is tr
25be0 75 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  ue, indicating t
25bf0 68 61 74 20 74 68 69 73 20 63 75 72 73 6f 72 20  hat this cursor 
25c00 77 61 73 0a 20 20 2a 2a 20 6c 61 73 74 20 6d 6f  was.  ** last mo
25c10 76 65 64 20 77 69 74 68 20 4f 50 5f 4e 65 78 74  ved with OP_Next
25c20 20 6f 72 20 4f 50 5f 50 72 65 76 2c 20 6e 6f 74   or OP_Prev, not
25c30 20 53 65 65 6b 20 6f 72 20 4e 6f 74 46 6f 75 6e   Seek or NotFoun
25c40 64 2c 20 73 65 74 20 0a 20 20 2a 2a 20 56 64 62  d, set .  ** Vdb
25c50 65 43 75 72 73 6f 72 2e 6d 6f 76 65 74 6f 54 61  eCursor.movetoTa
25c60 72 67 65 74 20 74 6f 20 74 68 65 20 63 75 72 72  rget to the curr
25c70 65 6e 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20  ent rowid.  */. 
25c80 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
25c90 3d 3d 50 34 5f 54 41 42 4c 45 20 26 26 20 48 41  ==P4_TABLE && HA
25ca0 53 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 28 64 62  S_UPDATE_HOOK(db
25cb0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
25cc0 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20   pC->iDb>=0 );. 
25cd0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
25ce0 70 34 2e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  p4.pTab!=0 );.  
25cf0 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
25d00 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  pC->iDb].zDbSNam
25d10 65 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4f  e;.    pTab = pO
25d20 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20 20 20 20  p->p4.pTab;.    
25d30 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f  if( (pOp->p5 & O
25d40 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49  PFLAG_SAVEPOSITI
25d50 4f 4e 29 21 3d 30 20 26 26 20 70 43 2d 3e 69 73  ON)!=0 && pC->is
25d60 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70  Table ){.      p
25d70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20  C->movetoTarget 
25d80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
25d90 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e  tegerKey(pC->uc.
25da0 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  pCursor);.    }.
25db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62    }else{.    zDb
25dc0 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 6f 74 20 6e   = 0;   /* Not n
25dd0 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20  eeded.  Silence 
25de0 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  a compiler warni
25df0 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  ng. */.    pTab 
25e00 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65  = 0;  /* Not nee
25e10 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20  ded.  Silence a 
25e20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
25e30 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66  . */.  }..#ifdef
25e40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
25e50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
25e60 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72  /* Invoke the pr
25e70 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66  e-update-hook if
25e80 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
25e90 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61  if( db->xPreUpda
25ea0 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f  teCallback && pO
25eb0 70 2d 3e 70 34 2e 70 54 61 62 20 26 26 20 48 61  p->p4.pTab && Ha
25ec0 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
25ed0 20 20 20 20 61 73 73 65 72 74 28 20 21 28 6f 70      assert( !(op
25ee0 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 49  flags & OPFLAG_I
25ef0 53 55 50 44 41 54 45 29 20 7c 7c 20 28 61 4d 65  SUPDATE) || (aMe
25f00 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 66 6c 61 67 73  m[pOp->p3].flags
25f10 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 3b 0a 20   & MEM_Int) );. 
25f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
25f30 65 55 70 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70  eUpdateHook(p, p
25f40 43 2c 0a 20 20 20 20 20 20 20 20 28 6f 70 66 6c  C,.        (opfl
25f50 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 49 53 55  ags & OPFLAG_ISU
25f60 50 44 41 54 45 29 20 3f 20 53 51 4c 49 54 45 5f  PDATE) ? SQLITE_
25f70 55 50 44 41 54 45 20 3a 20 53 51 4c 49 54 45 5f  UPDATE : SQLITE_
25f80 44 45 4c 45 54 45 2c 20 0a 20 20 20 20 20 20 20  DELETE, .       
25f90 20 7a 44 62 2c 20 70 54 61 62 2c 20 70 43 2d 3e   zDb, pTab, pC->
25fa0 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 0a 20 20  movetoTarget,.  
25fb0 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 0a 20 20        pOp->p3.  
25fc0 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f    );.  }.  if( o
25fd0 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  pflags & OPFLAG_
25fe0 49 53 4e 4f 4f 50 20 29 20 62 72 65 61 6b 3b 0a  ISNOOP ) break;.
25ff0 23 65 6e 64 69 66 0a 20 0a 20 20 2f 2a 20 4f 6e  #endif. .  /* On
26000 6c 79 20 66 6c 61 67 73 20 74 68 61 74 20 63 61  ly flags that ca
26010 6e 20 62 65 20 73 65 74 20 61 72 65 20 53 41 56  n be set are SAV
26020 45 50 4f 49 53 54 49 4f 4e 20 61 6e 64 20 41 55  EPOISTION and AU
26030 58 44 45 4c 45 54 45 20 2a 2f 20 0a 20 20 61 73  XDELETE */ .  as
26040 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26  sert( (pOp->p5 &
26050 20 7e 28 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f   ~(OPFLAG_SAVEPO
26060 53 49 54 49 4f 4e 7c 4f 50 46 4c 41 47 5f 41 55  SITION|OPFLAG_AU
26070 58 44 45 4c 45 54 45 29 29 3d 3d 30 20 29 3b 0a  XDELETE))==0 );.
26080 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47    assert( OPFLAG
26090 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 3d 3d 42  _SAVEPOSITION==B
260a0 54 52 45 45 5f 53 41 56 45 50 4f 53 49 54 49 4f  TREE_SAVEPOSITIO
260b0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  N );.  assert( O
260c0 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 3d  PFLAG_AUXDELETE=
260d0 3d 42 54 52 45 45 5f 41 55 58 44 45 4c 45 54 45  =BTREE_AUXDELETE
260e0 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
260f0 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
26100 2d 3e 70 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  ->pFrame==0 ){. 
26110 20 20 20 69 66 28 20 70 43 2d 3e 69 73 45 70 68     if( pC->isEph
26120 65 6d 65 72 61 6c 3d 3d 30 0a 20 20 20 20 20 20  emeral==0.      
26130 20 20 26 26 20 28 70 4f 70 2d 3e 70 35 20 26 20    && (pOp->p5 & 
26140 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45  OPFLAG_AUXDELETE
26150 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
26160 28 70 43 2d 3e 77 72 46 6c 61 67 20 26 20 4f 50  (pC->wrFlag & OP
26170 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3d  FLAG_FORDELETE)=
26180 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
26190 20 20 6e 45 78 74 72 61 44 65 6c 65 74 65 2b 2b    nExtraDelete++
261a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
261b0 70 4f 70 2d 3e 70 32 20 26 20 4f 50 46 4c 41 47  pOp->p2 & OPFLAG
261c0 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20  _NCHANGE ){.    
261d0 20 20 6e 45 78 74 72 61 44 65 6c 65 74 65 2d 2d    nExtraDelete--
261e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
261f0 69 66 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  if..  rc = sqlit
26200 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70 43  e3BtreeDelete(pC
26210 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 70 4f  ->uc.pCursor, pO
26220 70 2d 3e 70 35 29 3b 0a 20 20 70 43 2d 3e 63 61  p->p5);.  pC->ca
26230 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
26240 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 72  E_STALE;.  if( r
26250 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
26260 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20  ue_to_error;..  
26270 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70  /* Invoke the up
26280 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71  date-hook if req
26290 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
262a0 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  opflags & OPFLAG
262b0 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20  _NCHANGE ){.    
262c0 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20  p->nChange++;.  
262d0 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74    if( db->xUpdat
262e0 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 48 61 73  eCallback && Has
262f0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
26300 20 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65       db->xUpdate
26310 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70  Callback(db->pUp
26320 64 61 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f  dateArg, SQLITE_
26330 44 45 4c 45 54 45 2c 20 7a 44 62 2c 20 70 54 61  DELETE, zDb, pTa
26340 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
26350 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61      pC->movetoTa
26360 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73  rget);.      ass
26370 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20  ert( pC->iDb>=0 
26380 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26390 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f  break;.}./* Opco
263a0 64 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a  de: ResetCount *
263b0 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54   * * * *.**.** T
263c0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
263d0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69  change counter i
263e0 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
263f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
26400 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ** change counte
26410 72 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73  r (returned by s
26420 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
26430 74 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  to sqlite3_chang
26440 65 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74  es())..** Then t
26450 68 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20  he VMs internal 
26460 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72  change counter r
26470 65 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54  esets to 0..** T
26480 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
26490 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
264a0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65  .*/.case OP_Rese
264b0 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69  tCount: {.  sqli
264c0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
264d0 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
264e0 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  );.  p->nChange 
264f0 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
26500 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74  ./* Opcode: Sort
26510 65 72 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20  erCompare P1 P2 
26520 50 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69  P3 P4.** Synopsi
26530 73 3a 20 69 66 20 6b 65 79 28 50 31 29 21 3d 74  s: if key(P1)!=t
26540 72 69 6d 28 72 5b 50 33 5d 2c 50 34 29 20 67 6f  rim(r[P3],P4) go
26550 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69  to P2.**.** P1 i
26560 73 20 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f  s a sorter curso
26570 72 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  r. This instruct
26580 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 61 20 70  ion compares a p
26590 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20  refix of the.** 
265a0 72 65 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20 72  record blob in r
265b0 65 67 69 73 74 65 72 20 50 33 20 61 67 61 69 6e  egister P3 again
265c0 73 74 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  st a prefix of t
265d0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  he entry that .*
265e0 2a 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  * the sorter cur
265f0 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
26600 69 6e 74 73 20 74 6f 2e 20 20 4f 6e 6c 79 20 74  ints to.  Only t
26610 68 65 20 66 69 72 73 74 20 50 34 20 66 69 65 6c  he first P4 fiel
26620 64 73 0a 2a 2a 20 6f 66 20 72 5b 50 33 5d 20 61  ds.** of r[P3] a
26630 6e 64 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  nd the sorter re
26640 63 6f 72 64 20 61 72 65 20 63 6f 6d 70 61 72 65  cord are compare
26650 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  d..**.** If eith
26660 65 72 20 50 33 20 6f 72 20 74 68 65 20 73 6f 72  er P3 or the sor
26670 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  ter contains a N
26680 55 4c 4c 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68  ULL in one of th
26690 65 69 72 20 73 69 67 6e 69 66 69 63 61 6e 74 0a  eir significant.
266a0 2a 2a 20 66 69 65 6c 64 73 20 28 6e 6f 74 20 63  ** fields (not c
266b0 6f 75 6e 74 69 6e 67 20 74 68 65 20 50 34 20 66  ounting the P4 f
266c0 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64  ields at the end
266d0 20 77 68 69 63 68 20 61 72 65 20 69 67 6e 6f 72   which are ignor
266e0 65 64 29 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed) then.** the 
266f0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73  comparison is as
26700 73 75 6d 65 64 20 74 6f 20 62 65 20 65 71 75 61  sumed to be equa
26710 6c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68  l..**.** Fall th
26720 72 6f 75 67 68 20 74 6f 20 6e 65 78 74 20 69 6e  rough to next in
26730 73 74 72 75 63 74 69 6f 6e 20 69 66 20 74 68 65  struction if the
26740 20 74 77 6f 20 72 65 63 6f 72 64 73 20 63 6f 6d   two records com
26750 70 61 72 65 20 65 71 75 61 6c 20 74 6f 0a 2a 2a  pare equal to.**
26760 20 65 61 63 68 20 6f 74 68 65 72 2e 20 20 4a 75   each other.  Ju
26770 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 79  mp to P2 if they
26780 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a   are different..
26790 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65  */.case OP_Sorte
267a0 72 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64  rCompare: {.  Vd
267b0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
267c0 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
267d0 4b 65 79 43 6f 6c 3b 0a 0a 20 20 70 43 20 3d 20  KeyCol;..  pC = 
267e0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
267f0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  ];.  assert( isS
26800 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 61  orter(pC) );.  a
26810 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
26820 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
26830 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
26840 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6e 4b 65 79 43  Op->p3];.  nKeyC
26850 6f 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ol = pOp->p4.i;.
26860 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20    res = 0;.  rc 
26870 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
26880 74 65 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70  terCompare(pC, p
26890 49 6e 33 2c 20 6e 4b 65 79 43 6f 6c 2c 20 26 72  In3, nKeyCol, &r
268a0 65 73 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  es);.  VdbeBranc
268b0 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29  hTaken(res!=0,2)
268c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
268d0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
268e0 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 20  rror;.  if( res 
268f0 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
26900 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a  2;.  break;.};..
26910 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
26920 72 44 61 74 61 20 50 31 20 50 32 20 50 33 20 2a  rData P1 P2 P3 *
26930 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
26940 72 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a  r[P2]=data.**.**
26950 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69   Write into regi
26960 73 74 65 72 20 50 32 20 74 68 65 20 63 75 72 72  ster P2 the curr
26970 65 6e 74 20 73 6f 72 74 65 72 20 64 61 74 61 20  ent sorter data 
26980 66 6f 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f  for sorter curso
26990 72 20 50 31 2e 0a 2a 2a 20 54 68 65 6e 20 63 6c  r P1..** Then cl
269a0 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  ear the column h
269b0 65 61 64 65 72 20 63 61 63 68 65 20 6f 6e 20 63  eader cache on c
269c0 75 72 73 6f 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  ursor P3..**.** 
269d0 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e  This opcode is n
269e0 6f 72 6d 61 6c 6c 79 20 75 73 65 20 74 6f 20 6d  ormally use to m
269f0 6f 76 65 20 61 20 72 65 63 6f 72 64 20 6f 75 74  ove a record out
26a00 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 61   of the sorter a
26a10 6e 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 67  nd into.** a reg
26a20 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 68  ister that is th
26a30 65 20 73 6f 75 72 63 65 20 66 6f 72 20 61 20 70  e source for a p
26a40 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73  seudo-table curs
26a50 6f 72 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  or created using
26a60 0a 2a 2a 20 4f 70 65 6e 50 73 65 75 64 6f 2e 20  .** OpenPseudo. 
26a70 20 54 68 61 74 20 70 73 65 75 64 6f 2d 74 61 62   That pseudo-tab
26a80 6c 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  le cursor is the
26a90 20 6f 6e 65 20 74 68 61 74 20 69 73 20 69 64 65   one that is ide
26aa0 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
26ab0 72 61 6d 65 74 65 72 20 50 33 2e 20 20 43 6c 65  rameter P3.  Cle
26ac0 61 72 69 6e 67 20 74 68 65 20 50 33 20 63 6f 6c  aring the P3 col
26ad0 75 6d 6e 20 63 61 63 68 65 20 61 73 20 70 61 72  umn cache as par
26ae0 74 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65  t of this opcode
26af0 20 73 61 76 65 73 0a 2a 2a 20 75 73 20 66 72 6f   saves.** us fro
26b00 6d 20 68 61 76 69 6e 67 20 74 6f 20 69 73 73 75  m having to issu
26b10 65 20 61 20 73 65 70 61 72 61 74 65 20 4e 75 6c  e a separate Nul
26b20 6c 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e  lRow instruction
26b30 20 74 6f 20 63 6c 65 61 72 20 74 68 61 74 20 63   to clear that c
26b40 61 63 68 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ache..*/.case OP
26b50 5f 53 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20  _SorterData: {. 
26b60 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
26b70 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ..  pOut = &aMem
26b80 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20  [pOp->p2];.  pC 
26b90 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
26ba0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69  p1];.  assert( i
26bb0 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20  sSorter(pC) );. 
26bc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
26bd0 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43  eSorterRowkey(pC
26be0 2c 20 70 4f 75 74 29 3b 0a 20 20 61 73 73 65 72  , pOut);.  asser
26bf0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
26c00 20 7c 7c 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73   || (pOut->flags
26c10 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a   & MEM_Blob) );.
26c20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
26c30 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
26c40 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
26c50 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
26c60 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
26c70 3b 0a 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  ;.  p->apCsr[pOp
26c80 2d 3e 70 33 5d 2d 3e 63 61 63 68 65 53 74 61 74  ->p3]->cacheStat
26c90 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
26ca0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
26cb0 20 4f 70 63 6f 64 65 3a 20 52 6f 77 44 61 74 61   Opcode: RowData
26cc0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
26cd0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
26ce0 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  data.**.** Write
26cf0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
26d00 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72  2 the complete r
26d10 6f 77 20 64 61 74 61 20 66 6f 72 20 63 75 72 73  ow data for curs
26d20 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20  or P1..** There 
26d30 69 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61  is no interpreta
26d40 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
26d50 2e 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73  .  .** It is jus
26d60 74 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68  t copied onto th
26d70 65 20 50 32 20 72 65 67 69 73 74 65 72 20 65 78  e P2 register ex
26d80 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20  actly as .** it 
26d90 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
26da0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26db0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63  *.** If the P1 c
26dc0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f  ursor must be po
26dd0 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
26de0 64 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c  d row (not a NUL
26df0 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72  L row).** of a r
26e00 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  eal table, not a
26e10 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a   pseudo-table..*
26e20 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  /./* Opcode: Row
26e30 4b 65 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Key P1 P2 * * *.
26e40 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
26e50 32 5d 3d 6b 65 79 0a 2a 2a 0a 2a 2a 20 57 72 69  2]=key.**.** Wri
26e60 74 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  te into register
26e70 20 50 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   P2 the complete
26e80 20 72 6f 77 20 6b 65 79 20 66 6f 72 20 63 75 72   row key for cur
26e90 73 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65  sor P1..** There
26ea0 20 69 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74   is no interpret
26eb0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
26ec0 61 2e 20 20 0a 2a 2a 20 54 68 65 20 6b 65 79 20  a.  .** The key 
26ed0 69 73 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74  is copied onto t
26ee0 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20 65  he P2 register e
26ef0 78 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74  xactly as .** it
26f00 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
26f10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
26f20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
26f30 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70  cursor must be p
26f40 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
26f50 69 64 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55  id row (not a NU
26f60 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20  LL row).** of a 
26f70 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
26f80 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  a pseudo-table..
26f90 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 4b 65  */.case OP_RowKe
26fa0 79 3a 0a 63 61 73 65 20 4f 50 5f 52 6f 77 44 61  y:.case OP_RowDa
26fb0 74 61 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  ta: {.  VdbeCurs
26fc0 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73  or *pC;.  BtCurs
26fd0 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 75 33 32  or *pCrsr;.  u32
26fe0 20 6e 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61   n;..  pOut = &a
26ff0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
27000 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
27010 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a  (p, pOut);..  /*
27020 20 4e 6f 74 65 20 74 68 61 74 20 52 6f 77 4b 65   Note that RowKe
27030 79 20 61 6e 64 20 52 6f 77 44 61 74 61 20 61 72  y and RowData ar
27040 65 20 72 65 61 6c 6c 79 20 65 78 61 63 74 6c 79  e really exactly
27050 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 72 75   the same instru
27060 63 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72  ction */.  asser
27070 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
27080 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
27090 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
270a0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
270b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
270c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
270d0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
270e0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
270f0 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
27100 70 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pC)==0 );.  asse
27110 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20  rt( pC->isTable 
27120 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  || pOp->opcode!=
27130 4f 50 5f 52 6f 77 44 61 74 61 20 29 3b 0a 20 20  OP_RowData );.  
27140 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
27150 62 6c 65 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 6f  ble==0 || pOp->o
27160 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 44 61 74  pcode==OP_RowDat
27170 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
27180 43 2d 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29 3b  C->nullRow==0 );
27190 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75  .  assert( pC->u
271a0 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
271b0 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63    pCrsr = pC->uc
271c0 2e 70 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20  .pCursor;..  /* 
271d0 54 68 65 20 4f 50 5f 52 6f 77 4b 65 79 20 61 6e  The OP_RowKey an
271e0 64 20 4f 50 5f 52 6f 77 44 61 74 61 20 6f 70 63  d OP_RowData opc
271f0 6f 64 65 73 20 61 6c 77 61 79 73 20 66 6f 6c 6c  odes always foll
27200 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20  ow OP_NotExists 
27210 6f 72 0a 20 20 2a 2a 20 4f 50 5f 53 65 65 6b 52  or.  ** OP_SeekR
27220 6f 77 69 64 20 6f 72 20 4f 50 5f 52 65 77 69 6e  owid or OP_Rewin
27230 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74 68 20 6e  d/Op_Next with n
27240 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 69 6e  o intervening in
27250 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  structions.  ** 
27260 74 68 61 74 20 6d 69 67 68 74 20 69 6e 76 61 6c  that might inval
27270 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  idate the cursor
27280 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 77  ..  ** If this w
27290 68 65 72 65 20 6e 6f 74 20 74 68 65 20 63 61 73  here not the cas
272a0 65 2c 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  e, on of the fol
272b0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 73  lowing assert()s
272c0 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 66 61 69 6c  .  ** would fail
272d0 2e 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 65  .  Should this e
272e0 76 65 72 20 63 68 61 6e 67 65 20 28 62 65 63 61  ver change (beca
272f0 75 73 65 20 6f 66 20 63 68 61 6e 67 65 73 20 69  use of changes i
27300 6e 20 74 68 65 20 63 6f 64 65 0a 20 20 2a 2a 20  n the code.  ** 
27310 67 65 6e 65 72 61 74 6f 72 29 20 74 68 65 6e 20  generator) then 
27320 74 68 65 20 66 69 78 20 77 6f 75 6c 64 20 62 65  the fix would be
27330 20 74 6f 20 69 6e 73 65 72 74 20 61 20 63 61 6c   to insert a cal
27340 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  l to.  ** sqlite
27350 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
27360 6f 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  o()..  */.  asse
27370 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
27380 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61  Moveto==0 );.  a
27390 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
273a0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
273b0 28 70 43 72 73 72 29 20 29 3b 0a 23 69 66 20 30  (pCrsr) );.#if 0
273c0 20 20 2f 2a 20 4e 6f 74 20 72 65 71 75 69 72 65    /* Not require
273d0 64 20 64 75 65 20 74 6f 20 74 68 65 20 70 72 65  d due to the pre
273e0 76 69 6f 75 73 20 74 6f 20 61 73 73 65 72 74 28  vious to assert(
273f0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
27400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
27410 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70  beCursorMoveto(p
27420 43 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  C);.  if( rc!=SQ
27430 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
27440 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
27450 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 20 3d  r;.#endif..  n =
27460 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
27470 6c 6f 61 64 53 69 7a 65 28 70 43 72 73 72 29 3b  loadSize(pCrsr);
27480 0a 20 20 69 66 28 20 6e 3e 28 75 33 32 29 64 62  .  if( n>(u32)db
27490 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
274a0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
274b0 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69  .    goto too_bi
274c0 67 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  g;.  }.  testcas
274d0 65 28 20 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28  e( n==0 );.  if(
274e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
274f0 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4f  learAndResize(pO
27500 75 74 2c 20 4d 41 58 28 6e 2c 33 32 29 29 20 29  ut, MAX(n,32)) )
27510 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65  {.    goto no_me
27520 6d 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e  m;.  }.  pOut->n
27530 20 3d 20 6e 3b 0a 20 20 4d 65 6d 53 65 74 54 79   = n;.  MemSetTy
27540 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
27550 5f 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 70 43  _Blob);.  if( pC
27560 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  ->isTable==0 ){.
27570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27580 42 74 72 65 65 4b 65 79 28 70 43 72 73 72 2c 20  BtreeKey(pCrsr, 
27590 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e 7a 29 3b 0a  0, n, pOut->z);.
275a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
275b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  = sqlite3BtreeDa
275c0 74 61 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20  ta(pCrsr, 0, n, 
275d0 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 0a 20 20  pOut->z);.  }.  
275e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
275f0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
27600 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
27610 53 51 4c 49 54 45 5f 55 54 46 38 3b 20 20 2f 2a  SQLITE_UTF8;  /*
27620 20 49 6e 20 63 61 73 65 20 74 68 65 20 62 6c 6f   In case the blo
27630 62 20 69 73 20 65 76 65 72 20 63 61 73 74 20 74  b is ever cast t
27640 6f 20 74 65 78 74 20 2a 2f 0a 20 20 55 50 44 41  o text */.  UPDA
27650 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
27660 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53 54 45  pOut);.  REGISTE
27670 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
27680 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b   pOut);.  break;
27690 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
276a0 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  owid P1 P2 * * *
276b0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
276c0 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  P2]=rowid.**.** 
276d0 53 74 6f 72 65 20 69 6e 20 72 65 67 69 73 74 65  Store in registe
276e0 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20  r P2 an integer 
276f0 77 68 69 63 68 20 69 73 20 74 68 65 20 6b 65 79  which is the key
27700 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e   of the table en
27710 74 72 79 20 74 68 61 74 0a 2a 2a 20 50 31 20 69  try that.** P1 i
27720 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
27730 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63  t to..**.** P1 c
27740 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  an be either an 
27750 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
27760 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
27770 65 2e 20 20 54 68 65 72 65 20 75 73 65 64 20 74  e.  There used t
27780 6f 0a 2a 2a 20 62 65 20 61 20 73 65 70 61 72 61  o.** be a separa
27790 74 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f 70 63  te OP_VRowid opc
277a0 6f 64 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ode for use with
277b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c   virtual tables,
277c0 20 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f 6e 65   but this.** one
277d0 20 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f 72 6b   opcode now work
277e0 73 20 66 6f 72 20 62 6f 74 68 20 74 61 62 6c 65  s for both table
277f0 20 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73 65 20   types..*/.case 
27800 4f 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20 20 20  OP_Rowid: {     
27810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
27820 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ut2 */.  VdbeCur
27830 73 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34 20 76  sor *pC;.  i64 v
27840 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
27850 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74   *pVtab;.  const
27860 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
27870 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70 4f 75  *pModule;..  pOu
27880 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
27890 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73  se(p, pOp);.  as
278a0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
278b0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
278c0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
278d0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
278e0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
278f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
27900 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43   pC->eCurType!=C
27910 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c  URTYPE_PSEUDO ||
27920 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a   pC->nullRow );.
27930 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f    if( pC->nullRo
27940 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  w ){.    pOut->f
27950 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
27960 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65  .    break;.  }e
27970 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65 66 65  lse if( pC->defe
27980 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
27990 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f    v = pC->moveto
279a0 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20  Target;.#ifndef 
279b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
279c0 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65  UALTABLE.  }else
279d0 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54 79 70   if( pC->eCurTyp
279e0 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20  e==CURTYPE_VTAB 
279f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
27a00 43 2d 3e 75 63 2e 70 56 43 75 72 21 3d 30 20 29  C->uc.pVCur!=0 )
27a10 3b 0a 20 20 20 20 70 56 74 61 62 20 3d 20 70 43  ;.    pVtab = pC
27a20 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61  ->uc.pVCur->pVta
27a30 62 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 20 3d  b;.    pModule =
27a40 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b   pVtab->pModule;
27a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 6f  .    assert( pMo
27a60 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29 3b 0a  dule->xRowid );.
27a70 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65      rc = pModule
27a80 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 75 63 2e  ->xRowid(pC->uc.
27a90 70 56 43 75 72 2c 20 26 76 29 3b 0a 20 20 20 20  pVCur, &v);.    
27aa0 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
27ab0 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
27ac0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27ad0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
27ae0 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66 20  o_error;.#endif 
27af0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
27b00 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20  IRTUALTABLE */. 
27b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
27b20 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
27b30 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
27b40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27b50 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
27b60 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
27b70 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
27b80 73 74 6f 72 65 28 70 43 29 3b 0a 20 20 20 20 69  store(pC);.    i
27b90 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
27ba0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
27bb0 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c  .    if( pC->nul
27bc0 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 4f  lRow ){.      pO
27bd0 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
27be0 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
27bf0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 20 3d  k;.    }.    v =
27c00 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
27c10 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70  egerKey(pC->uc.p
27c20 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  Cursor);.  }.  p
27c30 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20  Out->u.i = v;.  
27c40 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
27c50 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31 20  ode: NullRow P1 
27c60 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f  * * * *.**.** Mo
27c70 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 50 31  ve the cursor P1
27c80 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20   to a null row. 
27c90 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   Any OP_Column o
27ca0 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61  perations.** tha
27cb0 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20 74 68  t occur while th
27cc0 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 20 74  e cursor is on t
27cd0 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c 6c  he null row will
27ce0 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74 65   always.** write
27cf0 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65   a NULL..*/.case
27d00 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20   OP_NullRow: {. 
27d10 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
27d20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
27d30 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
27d40 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
27d50 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
27d60 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
27d70 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
27d80 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  C->nullRow = 1;.
27d90 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
27da0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
27db0 0a 20 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54  .  if( pC->eCurT
27dc0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
27dd0 45 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  EE ){.    assert
27de0 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
27df0 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
27e00 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
27e10 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  or(pC->uc.pCurso
27e20 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  r);.  }.  break;
27e30 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  .}../* Opcode: L
27e40 61 73 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ast P1 P2 P3 * *
27e50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
27e60 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64  use of the Rowid
27e70 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 50 72   or Column or Pr
27e80 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ev instruction f
27e90 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72  or P1 .** will r
27ea0 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74  efer to the last
27eb0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
27ec0 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
27ed0 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65  index..** If the
27ee0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
27ef0 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32 3e  is empty and P2>
27f00 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d  0, then jump imm
27f10 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
27f20 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f 72  ** If P2 is 0 or
27f30 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   if the table or
27f40 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d   index is not em
27f50 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  pty, fall throug
27f60 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c  h.** to the foll
27f70 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  owing instructio
27f80 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  n..**.** This op
27f90 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
27fa0 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65  cursor configure
27fb0 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76  d to move in rev
27fc0 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66  erse order,.** f
27fd0 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61  rom the end towa
27fe0 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  rd the beginning
27ff0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
28000 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  s, the cursor is
28010 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74  .** configured t
28020 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20  o use Prev, not 
28030 4e 65 78 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Next..*/.case OP
28040 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20  _Last: {        
28050 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
28060 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
28070 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
28080 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
28090 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
280a0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
280b0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
280c0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
280d0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
280e0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
280f0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
28100 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
28110 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63    pCrsr = pC->uc
28120 2e 70 43 75 72 73 6f 72 3b 0a 20 20 72 65 73 20  .pCursor;.  res 
28130 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
28140 43 72 73 72 21 3d 30 20 29 3b 0a 20 20 72 63 20  Crsr!=0 );.  rc 
28150 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  = sqlite3BtreeLa
28160 73 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  st(pCrsr, &res);
28170 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  .  pC->nullRow =
28180 20 28 75 38 29 72 65 73 3b 0a 20 20 70 43 2d 3e   (u8)res;.  pC->
28190 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
281a0 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   0;.  pC->cacheS
281b0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
281c0 41 4c 45 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52  ALE;.  pC->seekR
281d0 65 73 75 6c 74 20 3d 20 70 4f 70 2d 3e 70 33 3b  esult = pOp->p3;
281e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
281f0 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f  EBUG.  pC->seekO
28200 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 23 65 6e  p = OP_Last;.#en
28210 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 20 67  dif.  if( rc ) g
28220 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
28230 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 4f  _error;.  if( pO
28240 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 56  p->p2>0 ){.    V
28250 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72  dbeBranchTaken(r
28260 65 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66  es!=0,2);.    if
28270 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d  ( res ) goto jum
28280 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
28290 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63  reak;.}.../* Opc
282a0 6f 64 65 3a 20 53 6f 72 74 20 50 31 20 50 32 20  ode: Sort P1 P2 
282b0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  * * *.**.** This
282c0 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 65 78 61   opcode does exa
282d0 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 74 68  ctly the same th
282e0 69 6e 67 20 61 73 20 4f 50 5f 52 65 77 69 6e 64  ing as OP_Rewind
282f0 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20   except that.** 
28300 69 74 20 69 6e 63 72 65 6d 65 6e 74 73 20 61 6e  it increments an
28310 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 67 6c   undocumented gl
28320 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 75 73  obal variable us
28330 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a  ed for testing..
28340 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67 20 69 73  **.** Sorting is
28350 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62 79   accomplished by
28360 20 77 72 69 74 69 6e 67 20 72 65 63 6f 72 64 73   writing records
28370 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
28380 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 72  index,.** then r
28390 65 77 69 6e 64 69 6e 67 20 74 68 61 74 20 69 6e  ewinding that in
283a0 64 65 78 20 61 6e 64 20 70 6c 61 79 69 6e 67 20  dex and playing 
283b0 69 74 20 62 61 63 6b 20 66 72 6f 6d 20 62 65 67  it back from beg
283c0 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64  inning to.** end
283d0 2e 20 20 57 65 20 75 73 65 20 74 68 65 20 4f 50  .  We use the OP
283e0 5f 53 6f 72 74 20 6f 70 63 6f 64 65 20 69 6e 73  _Sort opcode ins
283f0 74 65 61 64 20 6f 66 20 4f 50 5f 52 65 77 69 6e  tead of OP_Rewin
28400 64 20 74 6f 20 64 6f 20 74 68 65 0a 2a 2a 20 72  d to do the.** r
28410 65 77 69 6e 64 69 6e 67 20 73 6f 20 74 68 61 74  ewinding so that
28420 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
28430 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 69 6e 63  able will be inc
28440 72 65 6d 65 6e 74 65 64 20 61 6e 64 0a 2a 2a 20  remented and.** 
28450 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73  regression tests
28460 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 77   can determine w
28470 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
28480 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 0a 2a  e optimizer is.*
28490 2a 20 63 6f 72 72 65 63 74 6c 79 20 6f 70 74 69  * correctly opti
284a0 6d 69 7a 69 6e 67 20 6f 75 74 20 73 6f 72 74 73  mizing out sorts
284b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
284c0 74 65 72 53 6f 72 74 3a 20 20 20 20 2f 2a 20 6a  terSort:    /* j
284d0 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ump */.case OP_S
284e0 6f 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ort: {        /*
284f0 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64 65 66 20   jump */.#ifdef 
28500 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
28510 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
28520 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  ++;.  sqlite3_se
28530 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23 65  arch_count--;.#e
28540 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f 75 6e 74  ndif.  p->aCount
28550 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  er[SQLITE_STMTST
28560 41 54 55 53 5f 53 4f 52 54 5d 2b 2b 3b 0a 20 20  ATUS_SORT]++;.  
28570 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
28580 69 6e 74 6f 20 4f 50 5f 52 65 77 69 6e 64 20 2a  into OP_Rewind *
28590 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  /.}./* Opcode: R
285a0 65 77 69 6e 64 20 50 31 20 50 32 20 2a 20 2a 20  ewind P1 P2 * * 
285b0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
285c0 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69   use of the Rowi
285d0 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e  d or Column or N
285e0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
285f0 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20  for P1 .** will 
28600 72 65 66 65 72 20 74 6f 20 74 68 65 20 66 69 72  refer to the fir
28610 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
28620 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
28630 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74  r index..** If t
28640 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
28650 78 20 69 73 20 65 6d 70 74 79 2c 20 6a 75 6d 70  x is empty, jump
28660 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
28670 50 32 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  P2..** If the ta
28680 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
28690 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20  not empty, fall 
286a0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 66  through to the f
286b0 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 69 6e 73  ollowing .** ins
286c0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
286d0 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76  This opcode leav
286e0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  es the cursor co
286f0 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65  nfigured to move
28700 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65   in forward orde
28710 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62  r,.** from the b
28720 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20  eginning toward 
28730 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68  the end.  In oth
28740 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75  er words, the cu
28750 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69  rsor is.** confi
28760 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78  gured to use Nex
28770 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2f 0a  t, not Prev..*/.
28780 63 61 73 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20  case OP_Rewind: 
28790 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
287a0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
287b0 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
287c0 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
287d0 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
287e0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
287f0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
28800 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
28810 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
28820 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
28830 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74    assert( isSort
28840 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70  er(pC)==(pOp->op
28850 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 53  code==OP_SorterS
28860 6f 72 74 29 20 29 3b 0a 20 20 72 65 73 20 3d 20  ort) );.  res = 
28870 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
28880 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65  _DEBUG.  pC->see
28890 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
288a0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73  .#endif.  if( is
288b0 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20  Sorter(pC) ){.  
288c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
288d0 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 70  beSorterRewind(p
288e0 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73  C, &res);.  }els
288f0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
28900 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
28910 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
28920 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63    pCrsr = pC->uc
28930 2e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 61 73  .pCursor;.    as
28940 73 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20  sert( pCrsr );. 
28950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
28960 74 72 65 65 46 69 72 73 74 28 70 43 72 73 72 2c  treeFirst(pCrsr,
28970 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e   &res);.    pC->
28980 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
28990 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68   0;.    pC->cach
289a0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
289b0 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28  STALE;.  }.  if(
289c0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
289d0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
289e0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28   pC->nullRow = (
289f0 75 38 29 72 65 73 3b 0a 20 20 61 73 73 65 72 74  u8)res;.  assert
28a00 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70  ( pOp->p2>0 && p
28a10 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b  Op->p2<p->nOp );
28a20 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
28a30 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20  en(res!=0,2);.  
28a40 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a  if( res ) goto j
28a50 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
28a60 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 63  ak;.}../*.** Opc
28a70 6f 64 65 3a 20 45 73 74 52 6f 77 43 6e 74 20 50  ode: EstRowCnt P
28a80 31 20 50 32 20 50 33 20 2a 20 2a 20 2a 0a 2a 2a  1 P2 P3 * * *.**
28a90 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
28aa0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
28ab0 65 73 20 69 6e 20 62 74 72 65 65 20 66 6f 72 20  es in btree for 
28ac0 63 75 72 73 6f 72 20 50 31 20 64 6f 20 61 20 70  cursor P1 do a p
28ad0 72 6f 70 6f 72 74 69 6f 6e 61 6c 0a 2a 2a 20 73  roportional.** s
28ae0 65 65 6b 20 74 6f 20 6f 66 20 50 33 2e 20 20 53  eek to of P3.  S
28af0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
28b00 61 73 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f  as a floating po
28b10 69 6e 74 20 76 61 6c 75 65 20 69 6e 20 50 32 2e  int value in P2.
28b20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 73 74 52  .*/.case OP_EstR
28b30 6f 77 43 6e 74 3a 20 7b 20 20 2f 2a 20 6f 75 74  owCnt: {  /* out
28b40 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  2 */.  VdbeCurso
28b50 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
28b60 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
28b70 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69  rc;.  sqlite3_ui
28b80 6e 74 36 34 20 6e 20 3d 20 30 3b 0a 0a 20 20 61  nt64 n = 0;..  a
28b90 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
28ba0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
28bb0 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
28bc0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
28bd0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
28be0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
28bf0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
28c00 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70  pCrsr = pC->uc.p
28c10 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
28c20 28 20 70 43 72 73 72 20 29 3b 0a 20 20 72 63 20  ( pCrsr );.  rc 
28c30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
28c40 76 65 74 6f 50 72 6f 70 6f 72 74 69 6f 6e 61 6c  vetoProportional
28c50 28 70 43 72 73 72 2c 20 70 4f 70 2d 3e 70 33 2c  (pCrsr, pOp->p3,
28c60 20 26 6e 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &n);.  if( rc )
28c70 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
28c80 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75 74  to_error;.  pOut
28c90 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
28ca0 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
28cb0 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52  t->flags = MEM_R
28cc0 65 61 6c 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 72  eal;.  pOut->u.r
28cd0 20 3d 20 6e 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c   = n;.  pC->null
28ce0 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 64  Row = 0;.  pC->d
28cf0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
28d00 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
28d10 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
28d20 4c 45 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  LE;.  break;.}..
28d30 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20  /* Opcode: Next 
28d40 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
28d50 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72  *.** Advance cur
28d60 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69  sor P1 so that i
28d70 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
28d80 6e 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61  next key/data pa
28d90 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62  ir in its.** tab
28da0 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66  le or index.  If
28db0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
28dc0 72 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69  re key/value pai
28dd0 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  rs then fall thr
28de0 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
28df0 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
28e00 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68  tion.  But if th
28e10 65 20 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65  e cursor advance
28e20 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
28e30 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  .** jump immedia
28e40 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  tely to P2..**.*
28e50 2a 20 54 68 65 20 4e 65 78 74 20 6f 70 63 6f 64  * The Next opcod
28e60 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
28e70 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65  following an See
28e80 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 0a  kGT, SeekGE, or.
28e90 2a 2a 20 4f 50 5f 52 65 77 69 6e 64 20 6f 70 63  ** OP_Rewind opc
28ea0 6f 64 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69  ode used to posi
28eb0 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e  tion the cursor.
28ec0 20 20 4e 65 78 74 20 69 73 20 6e 6f 74 20 61 6c    Next is not al
28ed0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c  lowed.** to foll
28ee0 6f 77 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c  ow SeekLT, SeekL
28ef0 45 2c 20 6f 72 20 4f 50 5f 4c 61 73 74 2e 0a 2a  E, or OP_Last..*
28f00 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73  *.** The P1 curs
28f10 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61  or must be for a
28f20 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74   real table, not
28f30 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
28f40 20 20 50 31 20 6d 75 73 74 20 68 61 76 65 0a 2a    P1 must have.*
28f50 2a 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 70 72  * been opened pr
28f60 69 6f 72 20 74 6f 20 74 68 69 73 20 6f 70 63 6f  ior to this opco
28f70 64 65 20 6f 72 20 74 68 65 20 70 72 6f 67 72 61  de or the progra
28f80 6d 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  m will segfault.
28f90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76 61  .**.** The P3 va
28fa0 6c 75 65 20 69 73 20 61 20 68 69 6e 74 20 74 6f  lue is a hint to
28fb0 20 74 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   the btree imple
28fc0 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20 50 33  mentation. If P3
28fd0 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  ==1, that.** mea
28fe0 6e 73 20 50 31 20 69 73 20 61 6e 20 53 51 4c 20  ns P1 is an SQL 
28ff0 69 6e 64 65 78 20 61 6e 64 20 74 68 61 74 20 74  index and that t
29000 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
29010 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a  could have been.
29020 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  ** omitted if th
29030 61 74 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  at index had bee
29040 6e 20 75 6e 69 71 75 65 2e 20 20 50 33 20 69 73  n unique.  P3 is
29050 20 75 73 75 61 6c 6c 79 20 30 2e 20 20 50 33 20   usually 0.  P3 
29060 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65 69 74  is.** always eit
29070 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a 0a 2a  her 0 or 1..**.*
29080 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f  * P4 is always o
29090 66 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43  f type P4_ADVANC
290a0 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  E. The function 
290b0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74  pointer points t
290c0 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
290d0 65 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eNext()..**.** I
290e0 66 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65  f P5 is positive
290f0 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73   and the jump is
29100 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65   taken, then eve
29110 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75  nt counter.** nu
29120 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65  mber P5-1 in the
29130 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
29140 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ent is increment
29150 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ed..**.** See al
29160 73 6f 3a 20 50 72 65 76 2c 20 4e 65 78 74 49 66  so: Prev, NextIf
29170 4f 70 65 6e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  Open.*/./* Opcod
29180 65 3a 20 4e 65 78 74 49 66 4f 70 65 6e 20 50 31  e: NextIfOpen P1
29190 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
291a0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77  ** This opcode w
291b0 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4e  orks just like N
291c0 65 78 74 20 65 78 63 65 70 74 20 74 68 61 74 20  ext except that 
291d0 69 66 20 63 75 72 73 6f 72 20 50 31 20 69 73 20  if cursor P1 is 
291e0 6e 6f 74 0a 2a 2a 20 6f 70 65 6e 20 69 74 20 62  not.** open it b
291f0 65 68 61 76 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ehaves a no-op..
29200 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72  */./* Opcode: Pr
29210 65 76 20 50 31 20 50 32 20 50 33 20 50 34 20 50  ev P1 P2 P3 P4 P
29220 35 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75 70 20  5.**.** Back up 
29230 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
29240 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
29250 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f  he previous key/
29260 64 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73  data pair in its
29270 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  .** table or ind
29280 65 78 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ex.  If there is
29290 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b 65 79   no previous key
292a0 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65  /value pairs the
292b0 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a  n fall through.*
292c0 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * to the followi
292d0 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ng instruction. 
292e0 20 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73   But if the curs
292f0 6f 72 20 62 61 63 6b 75 70 20 77 61 73 20 73 75  or backup was su
29300 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d  ccessful,.** jum
29310 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
29320 20 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68   P2..**.**.** Th
29330 65 20 50 72 65 76 20 6f 70 63 6f 64 65 20 69 73  e Prev opcode is
29340 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 6c 6c   only valid foll
29350 6f 77 69 6e 67 20 61 6e 20 53 65 65 6b 4c 54 2c  owing an SeekLT,
29360 20 53 65 65 6b 4c 45 2c 20 6f 72 0a 2a 2a 20 4f   SeekLE, or.** O
29370 50 5f 4c 61 73 74 20 6f 70 63 6f 64 65 20 75 73  P_Last opcode us
29380 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
29390 68 65 20 63 75 72 73 6f 72 2e 20 20 50 72 65 76  he cursor.  Prev
293a0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a   is not allowed.
293b0 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53 65 65  ** to follow See
293c0 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 20  kGT, SeekGE, or 
293d0 4f 50 5f 52 65 77 69 6e 64 2e 0a 2a 2a 0a 2a 2a  OP_Rewind..**.**
293e0 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
293f0 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61  ust be for a rea
29400 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70  l table, not a p
29410 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49 66  seudo-table.  If
29420 20 50 31 20 69 73 0a 2a 2a 20 6e 6f 74 20 6f 70   P1 is.** not op
29430 65 6e 20 74 68 65 6e 20 74 68 65 20 62 65 68 61  en then the beha
29440 76 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65  vior is undefine
29450 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20  d..**.** The P3 
29460 76 61 6c 75 65 20 69 73 20 61 20 68 69 6e 74 20  value is a hint 
29470 74 6f 20 74 68 65 20 62 74 72 65 65 20 69 6d 70  to the btree imp
29480 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20  lementation. If 
29490 50 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d  P3==1, that.** m
294a0 65 61 6e 73 20 50 31 20 69 73 20 61 6e 20 53 51  eans P1 is an SQ
294b0 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 61 74  L index and that
294c0 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
294d0 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  n could have bee
294e0 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20  n.** omitted if 
294f0 74 68 61 74 20 69 6e 64 65 78 20 68 61 64 20 62  that index had b
29500 65 65 6e 20 75 6e 69 71 75 65 2e 20 20 50 33 20  een unique.  P3 
29510 69 73 20 75 73 75 61 6c 6c 79 20 30 2e 20 20 50  is usually 0.  P
29520 33 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65  3 is.** always e
29530 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a  ither 0 or 1..**
29540 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73  .** P4 is always
29550 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41   of type P4_ADVA
29560 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f  NCE. The functio
29570 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  n pointer points
29580 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
29590 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 0a 2a  reePrevious()..*
295a0 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f  *.** If P5 is po
295b0 73 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a  sitive and the j
295c0 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68  ump is taken, th
295d0 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72  en event counter
295e0 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20  .** number P5-1 
295f0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
29600 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63  statement is inc
29610 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 2f 2a 20  remented..*/./* 
29620 4f 70 63 6f 64 65 3a 20 50 72 65 76 49 66 4f 70  Opcode: PrevIfOp
29630 65 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50  en P1 P2 P3 P4 P
29640 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  5.**.** This opc
29650 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ode works just l
29660 69 6b 65 20 50 72 65 76 20 65 78 63 65 70 74 20  ike Prev except 
29670 74 68 61 74 20 69 66 20 63 75 72 73 6f 72 20 50  that if cursor P
29680 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 6e  1 is not.** open
29690 20 69 74 20 62 65 68 61 76 65 73 20 61 20 6e 6f   it behaves a no
296a0 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  -op..*/.case OP_
296b0 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 20 20 2f  SorterNext: {  /
296c0 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65  * jump */.  Vdbe
296d0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e  Cursor *pC;.  in
296e0 74 20 72 65 73 3b 0a 0a 20 20 70 43 20 3d 20 70  t res;..  pC = p
296f0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
29700 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
29710 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 72 65  rter(pC) );.  re
29720 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  s = 0;.  rc = sq
29730 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 4e  lite3VdbeSorterN
29740 65 78 74 28 64 62 2c 20 70 43 2c 20 26 72 65 73  ext(db, pC, &res
29750 29 3b 0a 20 20 67 6f 74 6f 20 6e 65 78 74 5f 74  );.  goto next_t
29760 61 69 6c 3b 0a 63 61 73 65 20 4f 50 5f 50 72 65  ail;.case OP_Pre
29770 76 49 66 4f 70 65 6e 3a 20 20 20 20 2f 2a 20 6a  vIfOpen:    /* j
29780 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  ump */.case OP_N
29790 65 78 74 49 66 4f 70 65 6e 3a 20 20 20 20 2f 2a  extIfOpen:    /*
297a0 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70   jump */.  if( p
297b0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
297c0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f  ==0 ) break;.  /
297d0 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
297e0 2f 0a 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20  /.case OP_Prev: 
297f0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
29800 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74   */.case OP_Next
29810 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  :          /* ju
29820 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  mp */.  assert( 
29830 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
29840 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
29850 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
29860 70 2d 3e 70 35 3c 41 72 72 61 79 53 69 7a 65 28  p->p5<ArraySize(
29870 70 2d 3e 61 43 6f 75 6e 74 65 72 29 20 29 3b 0a  p->aCounter) );.
29880 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
29890 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 72 65 73 20  pOp->p1];.  res 
298a0 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73  = pOp->p3;.  ass
298b0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
298c0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
298d0 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
298e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
298f0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
29900 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65  _BTREE );.  asse
29910 72 74 28 20 72 65 73 3d 3d 30 20 7c 7c 20 28 72  rt( res==0 || (r
29920 65 73 3d 3d 31 20 26 26 20 70 43 2d 3e 69 73 54  es==1 && pC->isT
29930 61 62 6c 65 3d 3d 30 29 20 29 3b 0a 20 20 74 65  able==0) );.  te
29940 73 74 63 61 73 65 28 20 72 65 73 3d 3d 31 20 29  stcase( res==1 )
29950 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
29960 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74  >opcode!=OP_Next
29970 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76   || pOp->p4.xAdv
29980 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72  ance==sqlite3Btr
29990 65 65 4e 65 78 74 20 29 3b 0a 20 20 61 73 73 65  eeNext );.  asse
299a0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21  rt( pOp->opcode!
299b0 3d 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d  =OP_Prev || pOp-
299c0 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71  >p4.xAdvance==sq
299d0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
299e0 75 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  us );.  assert( 
299f0 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f  pOp->opcode!=OP_
29a00 4e 65 78 74 49 66 4f 70 65 6e 20 7c 7c 20 70 4f  NextIfOpen || pO
29a10 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d  p->p4.xAdvance==
29a20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
29a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
29a40 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72  p->opcode!=OP_Pr
29a50 65 76 49 66 4f 70 65 6e 20 7c 7c 20 70 4f 70 2d  evIfOpen || pOp-
29a60 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71  >p4.xAdvance==sq
29a70 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
29a80 75 73 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4e  us);..  /* The N
29a90 65 78 74 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e  ext opcode is on
29aa0 6c 79 20 75 73 65 64 20 61 66 74 65 72 20 53 65  ly used after Se
29ab0 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 61 6e  ekGT, SeekGE, an
29ac0 64 20 52 65 77 69 6e 64 2e 0a 20 20 2a 2a 20 54  d Rewind..  ** T
29ad0 68 65 20 50 72 65 76 20 6f 70 63 6f 64 65 20 69  he Prev opcode i
29ae0 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 66 74 65  s only used afte
29af0 72 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45  r SeekLT, SeekLE
29b00 2c 20 61 6e 64 20 4c 61 73 74 2e 20 2a 2f 0a 20  , and Last. */. 
29b10 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
29b20 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c  code!=OP_Next ||
29b30 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
29b40 5f 4e 65 78 74 49 66 4f 70 65 6e 0a 20 20 20 20  _NextIfOpen.    
29b50 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70     || pC->seekOp
29b60 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20 70  ==OP_SeekGT || p
29b70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65  C->seekOp==OP_Se
29b80 65 6b 47 45 0a 20 20 20 20 20 20 20 7c 7c 20 70  ekGE.       || p
29b90 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65  C->seekOp==OP_Re
29ba0 77 69 6e 64 20 7c 7c 20 70 43 2d 3e 73 65 65 6b  wind || pC->seek
29bb0 4f 70 3d 3d 4f 50 5f 46 6f 75 6e 64 29 3b 0a 20  Op==OP_Found);. 
29bc0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
29bd0 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 20 7c 7c  code!=OP_Prev ||
29be0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
29bf0 5f 50 72 65 76 49 66 4f 70 65 6e 0a 20 20 20 20  _PrevIfOpen.    
29c00 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70     || pC->seekOp
29c10 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 70  ==OP_SeekLT || p
29c20 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65  C->seekOp==OP_Se
29c30 65 6b 4c 45 0a 20 20 20 20 20 20 20 7c 7c 20 70  ekLE.       || p
29c40 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61  C->seekOp==OP_La
29c50 73 74 20 29 3b 0a 0a 20 20 72 63 20 3d 20 70 4f  st );..  rc = pO
29c60 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 28 70  p->p4.xAdvance(p
29c70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26  C->uc.pCursor, &
29c80 72 65 73 29 3b 0a 6e 65 78 74 5f 74 61 69 6c 3a  res);.next_tail:
29c90 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
29ca0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
29cb0 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
29cc0 6b 65 6e 28 72 65 73 3d 3d 30 2c 32 29 3b 0a 20  ken(res==0,2);. 
29cd0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
29ce0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
29cf0 72 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  r;.  if( res==0 
29d00 29 7b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52  ){.    pC->nullR
29d10 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  ow = 0;.    p->a
29d20 43 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e 70 35 5d  Counter[pOp->p5]
29d30 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ++;.#ifdef SQLIT
29d40 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
29d50 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
29d60 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 67 6f  +;.#endif.    go
29d70 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e  to jump_to_p2_an
29d80 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65  d_check_for_inte
29d90 72 72 75 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrupt;.  }else{.
29da0 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
29db0 3d 20 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20  = 1;.  }.  goto 
29dc0 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72  check_for_interr
29dd0 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  upt;.}../* Opcod
29de0 65 3a 20 49 64 78 49 6e 73 65 72 74 20 50 31 20  e: IdxInsert P1 
29df0 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a 20 53 79  P2 P3 * P5.** Sy
29e00 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32  nopsis: key=r[P2
29e10 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ].**.** Register
29e20 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c   P2 holds an SQL
29e30 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20   index key made 
29e40 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b  using the.** Mak
29e50 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74  eRecord instruct
29e60 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63 6f  ions.  This opco
29e70 64 65 20 77 72 69 74 65 73 20 74 68 61 74 20 6b  de writes that k
29e80 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69  ey.** into the i
29e90 6e 64 65 78 20 50 31 2e 20 20 44 61 74 61 20 66  ndex P1.  Data f
29ea0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 69 73 20  or the entry is 
29eb0 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73  nil..**.** P3 is
29ec0 20 61 20 66 6c 61 67 20 74 68 61 74 20 70 72 6f   a flag that pro
29ed0 76 69 64 65 73 20 61 20 68 69 6e 74 20 74 6f 20  vides a hint to 
29ee0 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
29ef0 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 69 6e   that this.** in
29f00 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20 74  sert is likely t
29f10 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e 0a  o be an append..
29f20 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73 20  **.** If P5 has 
29f30 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  the OPFLAG_NCHAN
29f40 47 45 20 62 69 74 20 73 65 74 2c 20 74 68 65 6e  GE bit set, then
29f50 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
29f60 74 65 72 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d  ter is.** increm
29f70 65 6e 74 65 64 20 62 79 20 74 68 69 73 20 69 6e  ented by this in
29f80 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 74  struction.  If t
29f90 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  he OPFLAG_NCHANG
29fa0 45 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c 0a  E bit is clear,.
29fb0 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  ** then the chan
29fc0 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20 75 6e  ge counter is un
29fd0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
29fe0 66 20 50 35 20 68 61 73 20 74 68 65 20 4f 50 46  f P5 has the OPF
29ff0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
2a000 54 20 62 69 74 20 73 65 74 2c 20 74 68 65 6e 20  T bit set, then 
2a010 74 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  the cursor must 
2a020 68 61 76 65 0a 2a 2a 20 6a 75 73 74 20 64 6f 6e  have.** just don
2a030 65 20 61 20 73 65 65 6b 20 74 6f 20 74 68 65 20  e a seek to the 
2a040 73 70 6f 74 20 77 68 65 72 65 20 74 68 65 20 6e  spot where the n
2a050 65 77 20 65 6e 74 72 79 20 69 73 20 74 6f 20 62  ew entry is to b
2a060 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 20 54  e inserted..** T
2a070 68 69 73 20 66 6c 61 67 20 61 76 6f 69 64 73 20  his flag avoids 
2a080 64 6f 69 6e 67 20 61 6e 20 65 78 74 72 61 20 73  doing an extra s
2a090 65 65 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eek..**.** This 
2a0a0 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79  instruction only
2a0b0 20 77 6f 72 6b 73 20 66 6f 72 20 69 6e 64 69 63   works for indic
2a0c0 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c  es.  The equival
2a0d0 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ent instruction.
2a0e0 2a 2a 20 66 6f 72 20 74 61 62 6c 65 73 20 69 73  ** for tables is
2a0f0 20 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f   OP_Insert..*/./
2a100 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72  * Opcode: Sorter
2a110 49 6e 73 65 72 74 20 50 31 20 50 32 20 2a 20 2a  Insert P1 P2 * *
2a120 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
2a130 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20  key=r[P2].**.** 
2a140 52 65 67 69 73 74 65 72 20 50 32 20 68 6f 6c 64  Register P2 hold
2a150 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b  s an SQL index k
2a160 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68  ey made using th
2a170 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20  e.** MakeRecord 
2a180 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54  instructions.  T
2a190 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69 74 65  his opcode write
2a1a0 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e  s that key.** in
2a1b0 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 50 31  to the sorter P1
2a1c0 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  .  Data for the 
2a1d0 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2f  entry is nil..*/
2a1e0 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 49  .case OP_SorterI
2a1f0 6e 73 65 72 74 3a 20 20 20 20 20 20 20 2f 2a 20  nsert:       /* 
2a200 69 6e 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  in2 */.case OP_I
2a210 64 78 49 6e 73 65 72 74 3a 20 7b 20 20 20 20 20  dxInsert: {     
2a220 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
2a230 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
2a240 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 78 3b   BtreePayload x;
2a250 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
2a260 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2a270 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2a280 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2a290 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2a2a0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
2a2b0 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
2a2c0 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64  pC)==(pOp->opcod
2a2d0 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  e==OP_SorterInse
2a2e0 72 74 29 20 29 3b 0a 20 20 70 49 6e 32 20 3d 20  rt) );.  pIn2 = 
2a2f0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
2a300 20 20 61 73 73 65 72 74 28 20 70 49 6e 32 2d 3e    assert( pIn2->
2a310 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
2a320 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
2a330 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  5 & OPFLAG_NCHAN
2a340 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b  GE ) p->nChange+
2a350 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  +;.  assert( pC-
2a360 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
2a370 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 4f 70 2d  PE_BTREE || pOp-
2a380 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74  >opcode==OP_Sort
2a390 65 72 49 6e 73 65 72 74 20 29 3b 0a 20 20 61 73  erInsert );.  as
2a3a0 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
2a3b0 65 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 45  e==0 );.  rc = E
2a3c0 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b  xpandBlob(pIn2);
2a3d0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2a3e0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2a3f0 72 6f 72 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ror;.  if( pOp->
2a400 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65  opcode==OP_Sorte
2a410 72 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 72  rInsert ){.    r
2a420 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
2a430 6f 72 74 65 72 57 72 69 74 65 28 70 43 2c 20 70  orterWrite(pC, p
2a440 49 6e 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  In2);.  }else{. 
2a450 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70 49 6e 32     x.nKey = pIn2
2a460 2d 3e 6e 3b 0a 20 20 20 20 78 2e 70 4b 65 79 20  ->n;.    x.pKey 
2a470 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20 20 20 20 72  = pIn2->z;.    r
2a480 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2a490 49 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e 70 43  Insert(pC->uc.pC
2a4a0 75 72 73 6f 72 2c 20 26 78 2c 20 70 4f 70 2d 3e  ursor, &x, pOp->
2a4b0 70 33 2c 20 0a 20 20 20 20 20 20 20 20 28 28 70  p3, .        ((p
2a4c0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
2a4d0 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f  USESEEKRESULT) ?
2a4e0 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
2a4f0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
2a500 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
2a510 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
2a520 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  0 );.    pC->cac
2a530 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
2a540 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66  _STALE;.  }.  if
2a550 28 20 72 63 29 20 67 6f 74 6f 20 61 62 6f 72 74  ( rc) goto abort
2a560 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2a570 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2a580 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65 20  code: IdxDelete 
2a590 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
2a5a0 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2a5b0 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  P2@P3].**.** The
2a5c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33 20 72   content of P3 r
2a5d0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
2a5e0 67 20 61 74 20 72 65 67 69 73 74 65 72 20 50 32  g at register P2
2a5f0 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70 61   form.** an unpa
2a600 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
2a610 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 6d 6f  This opcode remo
2a620 76 65 73 20 74 68 61 74 20 65 6e 74 72 79 20 66  ves that entry f
2a630 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65  rom the .** inde
2a640 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73  x opened by curs
2a650 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f  or P1..*/.case O
2a660 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b 0a 20  P_IdxDelete: {. 
2a670 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
2a680 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
2a690 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  sr;.  int res;. 
2a6a0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2a6b0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r;..  assert( pO
2a6c0 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61 73 73  p->p3>0 );.  ass
2a6d0 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26  ert( pOp->p2>0 &
2a6e0 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
2a6f0 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
2a700 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
2a710 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2a720 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
2a730 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
2a740 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
2a750 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
2a760 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
2a770 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
2a780 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
2a790 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  E );.  pCrsr = p
2a7a0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20  C->uc.pCursor;. 
2a7b0 20 61 73 73 65 72 74 28 20 70 43 72 73 72 21 3d   assert( pCrsr!=
2a7c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2a7d0 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 72  Op->p5==0 );.  r
2a7e0 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
2a7f0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e 46  pKeyInfo;.  r.nF
2a800 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d  ield = (u16)pOp-
2a810 3e 70 33 3b 0a 20 20 72 2e 64 65 66 61 75 6c 74  >p3;.  r.default
2a820 5f 72 63 20 3d 20 30 3b 0a 20 20 72 2e 61 4d 65  _rc = 0;.  r.aMe
2a830 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
2a840 32 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  2];.  rc = sqlit
2a850 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
2a860 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72 2c  acked(pCrsr, &r,
2a870 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20   0, 0, &res);.  
2a880 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2a890 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2a8a0 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ;.  if( res==0 )
2a8b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2a8c0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70 43  e3BtreeDelete(pC
2a8d0 72 73 72 2c 20 42 54 52 45 45 5f 41 55 58 44 45  rsr, BTREE_AUXDE
2a8e0 4c 45 54 45 29 3b 0a 20 20 20 20 69 66 28 20 72  LETE);.    if( r
2a8f0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2a900 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
2a910 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64  .  assert( pC->d
2a920 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
2a930 20 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   );.  pC->cacheS
2a940 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
2a950 41 4c 45 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ALE;.  break;.}.
2a960 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
2a970 20 50 31 20 2a 20 50 33 20 50 34 20 2a 0a 2a 2a   P1 * P3 P4 *.**
2a980 20 53 79 6e 6f 70 73 69 73 3a 20 4d 6f 76 65 20   Synopsis: Move 
2a990 50 33 20 74 6f 20 50 31 2e 72 6f 77 69 64 0a 2a  P3 to P1.rowid.*
2a9a0 2a 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20 6f 70  *.** P1 is an op
2a9b0 65 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  en index cursor 
2a9c0 61 6e 64 20 50 33 20 69 73 20 61 20 63 75 72 73  and P3 is a curs
2a9d0 6f 72 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  or on the corres
2a9e0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65  ponding.** table
2a9f0 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64  .  This opcode d
2aa00 6f 65 73 20 61 20 64 65 66 65 72 72 65 64 20 73  oes a deferred s
2aa10 65 65 6b 20 6f 66 20 74 68 65 20 50 33 20 74 61  eek of the P3 ta
2aa20 62 6c 65 20 63 75 72 73 6f 72 0a 2a 2a 20 74 6f  ble cursor.** to
2aa30 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 63 6f   the row that co
2aa40 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
2aa50 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
2aa60 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P1..**.** This i
2aa70 73 20 61 20 64 65 66 65 72 72 65 64 20 73 65 65  s a deferred see
2aa80 6b 2e 20 20 4e 6f 74 68 69 6e 67 20 61 63 74 75  k.  Nothing actu
2aa90 61 6c 6c 79 20 68 61 70 70 65 6e 73 20 75 6e 74  ally happens unt
2aaa0 69 6c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  il.** the cursor
2aab0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
2aac0 20 61 20 72 65 63 6f 72 64 2e 20 20 54 68 61 74   a record.  That
2aad0 20 77 61 79 2c 20 69 66 20 6e 6f 20 72 65 61 64   way, if no read
2aae0 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75  s.** occur, no u
2aaf0 6e 6e 65 63 65 73 73 61 72 79 20 49 2f 4f 20 68  nnecessary I/O h
2ab00 61 70 70 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 50 34  appens..**.** P4
2ab10 20 6d 61 79 20 62 65 20 61 6e 20 61 72 72 61 79   may be an array
2ab20 20 6f 66 20 69 6e 74 65 67 65 72 73 20 28 74 79   of integers (ty
2ab30 70 65 20 50 34 5f 49 4e 54 41 52 52 41 59 29 20  pe P4_INTARRAY) 
2ab40 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e  containing.** on
2ab50 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
2ab60 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 50   column in the P
2ab70 33 20 74 61 62 6c 65 2e 20 20 49 66 20 61 72 72  3 table.  If arr
2ab80 61 79 20 65 6e 74 72 79 20 61 28 69 29 0a 2a 2a  ay entry a(i).**
2ab90 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2aba0 65 6e 20 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d  en reading colum
2abb0 6e 20 61 28 69 29 2d 31 20 66 72 6f 6d 20 63 75  n a(i)-1 from cu
2abc0 72 73 6f 72 20 50 33 20 69 73 20 0a 2a 2a 20 65  rsor P3 is .** e
2abd0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 70 65 72  quivalent to per
2abe0 66 6f 72 6d 69 6e 67 20 74 68 65 20 64 65 66 65  forming the defe
2abf0 72 72 65 64 20 73 65 65 6b 20 61 6e 64 20 74 68  rred seek and th
2ac00 65 6e 20 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d  en reading colum
2ac10 6e 20 69 20 0a 2a 2a 20 66 72 6f 6d 20 50 31 2e  n i .** from P1.
2ac20 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
2ac30 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  on is stored in 
2ac40 50 33 20 61 6e 64 20 75 73 65 64 20 74 6f 20 72  P3 and used to r
2ac50 65 64 69 72 65 63 74 0a 2a 2a 20 72 65 61 64 73  edirect.** reads
2ac60 20 61 67 61 69 6e 73 74 20 50 33 20 6f 76 65 72   against P3 over
2ac70 20 74 6f 20 50 31 2c 20 74 68 75 73 20 70 6f 73   to P1, thus pos
2ac80 73 69 62 6c 79 20 61 76 6f 69 64 69 6e 67 20 74  sibly avoiding t
2ac90 68 65 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 73 65  he need to.** se
2aca0 65 6b 20 61 6e 64 20 72 65 61 64 20 63 75 72 73  ek and read curs
2acb0 6f 72 20 50 33 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  or P3..*/./* Opc
2acc0 6f 64 65 3a 20 49 64 78 52 6f 77 69 64 20 50 31  ode: IdxRowid P1
2acd0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
2ace0 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77  opsis: r[P2]=row
2acf0 69 64 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69  id.**.** Write i
2ad00 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20  nto register P2 
2ad10 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
2ad20 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
2ad30 72 79 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ry in the record
2ad40 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f   at.** the end o
2ad50 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20  f the index key 
2ad60 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75  pointed to by cu
2ad70 72 73 6f 72 20 50 31 2e 20 20 54 68 69 73 20 69  rsor P1.  This i
2ad80 6e 74 65 67 65 72 20 73 68 6f 75 6c 64 20 62 65  nteger should be
2ad90 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66  .** the rowid of
2ada0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
2adb0 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 69   to which this i
2adc0 6e 64 65 78 20 65 6e 74 72 79 20 70 6f 69 6e 74  ndex entry point
2add0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  s..**.** See als
2ade0 6f 3a 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65  o: Rowid, MakeRe
2adf0 63 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  cord..*/.case OP
2ae00 5f 53 65 65 6b 3a 0a 63 61 73 65 20 4f 50 5f 49  _Seek:.case OP_I
2ae10 64 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  dxRowid: {      
2ae20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
2ae30 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
2ae40 2a 70 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pC;            
2ae50 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 69 6e      /* The P1 in
2ae60 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  dex cursor */.  
2ae70 56 64 62 65 43 75 72 73 6f 72 20 2a 70 54 61 62  VdbeCursor *pTab
2ae80 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Cur;           /
2ae90 2a 20 54 68 65 20 50 32 20 74 61 62 6c 65 20 63  * The P2 table c
2aea0 75 72 73 6f 72 20 28 4f 50 5f 53 65 65 6b 20 6f  ursor (OP_Seek o
2aeb0 6e 6c 79 29 20 2a 2f 0a 20 20 69 36 34 20 72 6f  nly) */.  i64 ro
2aec0 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2aed0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2aee0 64 20 74 68 61 74 20 50 31 20 63 75 72 72 65 6e  d that P1 curren
2aef0 74 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 0a  t points to */..
2af00 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2af10 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2af20 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
2af30 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
2af40 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2af50 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
2af60 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
2af70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
2af80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2af90 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
2afa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2afb0 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  >isTable==0 );. 
2afc0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
2afd0 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
2afe0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 2d  ;.  assert( !pC-
2aff0 3e 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70 4f 70 2d  >nullRow || pOp-
2b000 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52  >opcode==OP_IdxR
2b010 6f 77 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  owid );..  /* Th
2b020 65 20 49 64 78 52 6f 77 69 64 20 61 6e 64 20 53  e IdxRowid and S
2b030 65 65 6b 20 6f 70 63 6f 64 65 73 20 61 72 65 20  eek opcodes are 
2b040 63 6f 6d 62 69 6e 65 64 20 62 65 63 61 75 73 65  combined because
2b050 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 61 6c   of the commonal
2b060 69 74 79 0a 20 20 2a 2a 20 6f 66 20 73 71 6c 69  ity.  ** of sqli
2b070 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73  te3VdbeCursorRes
2b080 74 6f 72 65 28 29 20 61 6e 64 20 73 71 6c 69 74  tore() and sqlit
2b090 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 29  e3VdbeIdxRowid()
2b0a0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
2b0b0 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73  te3VdbeCursorRes
2b0c0 74 6f 72 65 28 70 43 29 3b 0a 0a 20 20 2f 2a 20  tore(pC);..  /* 
2b0d0 73 71 6c 69 74 65 33 56 62 65 43 75 72 73 6f 72  sqlite3VbeCursor
2b0e0 52 65 73 74 6f 72 65 28 29 20 63 61 6e 20 6f 6e  Restore() can on
2b0f0 6c 79 20 66 61 69 6c 20 69 66 20 74 68 65 20 72  ly fail if the r
2b100 65 63 6f 72 64 20 68 61 73 20 62 65 65 6e 20 64  ecord has been d
2b110 65 6c 65 74 65 64 0a 20 20 2a 2a 20 6f 75 74 20  eleted.  ** out 
2b120 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
2b130 75 72 73 6f 72 2e 20 20 54 68 61 74 20 77 69 6c  ursor.  That wil
2b140 6c 20 6e 65 76 65 72 20 68 61 70 70 65 6e 73 20  l never happens 
2b150 66 6f 72 20 61 6e 20 49 64 78 52 6f 77 69 64 0a  for an IdxRowid.
2b160 20 20 2a 2a 20 6f 72 20 53 65 65 6b 20 6f 70 63    ** or Seek opc
2b170 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ode */.  if( NEV
2b180 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  ER(rc!=SQLITE_OK
2b190 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
2b1a0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20  ue_to_error;..  
2b1b0 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77  if( !pC->nullRow
2b1c0 20 29 7b 0a 20 20 20 20 72 6f 77 69 64 20 3d 20   ){.    rowid = 
2b1d0 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65  0;  /* Not neede
2b1e0 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f  d.  Only used to
2b1f0 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69   silence a warni
2b200 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
2b210 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
2b220 77 69 64 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70  wid(db, pC->uc.p
2b230 43 75 72 73 6f 72 2c 20 26 72 6f 77 69 64 29 3b  Cursor, &rowid);
2b240 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2b250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b260 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2b270 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  o_error;.    }. 
2b280 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
2b290 64 65 3d 3d 4f 50 5f 53 65 65 6b 20 29 7b 0a 20  de==OP_Seek ){. 
2b2a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
2b2b0 2d 3e 70 33 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p3>=0 && pOp->
2b2c0 70 33 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p3<p->nCursor );
2b2d0 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 20 3d  .      pTabCur =
2b2e0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2b2f0 33 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  3];.      assert
2b300 28 20 70 54 61 62 43 75 72 21 3d 30 20 29 3b 0a  ( pTabCur!=0 );.
2b310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2b320 61 62 43 75 72 2d 3e 65 43 75 72 54 79 70 65 3d  abCur->eCurType=
2b330 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2b340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2b350 70 54 61 62 43 75 72 2d 3e 75 63 2e 70 43 75 72  pTabCur->uc.pCur
2b360 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
2b370 61 73 73 65 72 74 28 20 70 54 61 62 43 75 72 2d  assert( pTabCur-
2b380 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
2b390 20 20 70 54 61 62 43 75 72 2d 3e 6e 75 6c 6c 52    pTabCur->nullR
2b3a0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54  ow = 0;.      pT
2b3b0 61 62 43 75 72 2d 3e 6d 6f 76 65 74 6f 54 61 72  abCur->movetoTar
2b3c0 67 65 74 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20  get = rowid;.   
2b3d0 20 20 20 70 54 61 62 43 75 72 2d 3e 64 65 66 65     pTabCur->defe
2b3e0 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 31 3b 0a  rredMoveto = 1;.
2b3f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
2b400 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
2b410 54 41 52 52 41 59 20 7c 7c 20 70 4f 70 2d 3e 70  TARRAY || pOp->p
2b420 34 2e 61 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  4.ai==0 );.     
2b430 20 70 54 61 62 43 75 72 2d 3e 61 41 6c 74 4d 61   pTabCur->aAltMa
2b440 70 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  p = pOp->p4.ai;.
2b450 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 70        pTabCur->p
2b460 41 6c 74 43 75 72 73 6f 72 20 3d 20 70 43 3b 0a  AltCursor = pC;.
2b470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b480 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
2b490 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
2b4a0 20 20 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20        pOut->u.i 
2b4b0 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 70  = rowid;.      p
2b4c0 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
2b4d0 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  _Int;.    }.  }e
2b4e0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2b4f0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2b500 5f 49 64 78 52 6f 77 69 64 20 29 3b 0a 20 20 20  _IdxRowid );.   
2b510 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2b520 65 74 4e 75 6c 6c 28 26 61 4d 65 6d 5b 70 4f 70  etNull(&aMem[pOp
2b530 2d 3e 70 32 5d 29 3b 0a 20 20 7d 0a 20 20 62 72  ->p2]);.  }.  br
2b540 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2b550 65 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 50  e: IdxGE P1 P2 P
2b560 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
2b570 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34  sis: key=r[P3@P4
2b580 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72  ].**.** The P4 r
2b590 65 67 69 73 74 65 72 20 76 61 6c 75 65 73 20 62  egister values b
2b5a0 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33  eginning with P3
2b5b0 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65   form an unpacke
2b5c0 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20  d index .** key 
2b5d0 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20 50  that omits the P
2b5e0 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 43 6f 6d  RIMARY KEY.  Com
2b5f0 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61  pare this key va
2b600 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  lue against the 
2b610 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50  index .** that P
2b620 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
2b630 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
2b640 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  ring the PRIMARY
2b650 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 20 0a 2a   KEY or ROWID .*
2b660 2a 20 66 69 65 6c 64 73 20 61 74 20 74 68 65 20  * fields at the 
2b670 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  end..**.** If th
2b680 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79  e P1 index entry
2b690 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2b6a0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
2b6b0 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68   key value.** th
2b6c0 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  en jump to P2.  
2b6d0 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74  Otherwise fall t
2b6e0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
2b6f0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  xt instruction..
2b700 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64  */./* Opcode: Id
2b710 78 47 54 20 50 31 20 50 32 20 50 33 20 50 34 20  xGT P1 P2 P3 P4 
2b720 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
2b730 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a  key=r[P3@P4].**.
2b740 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74  ** The P4 regist
2b750 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e  er values beginn
2b760 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d  ing with P3 form
2b770 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64   an unpacked ind
2b780 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20  ex .** key that 
2b790 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52  omits the PRIMAR
2b7a0 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20  Y KEY.  Compare 
2b7b0 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61  this key value a
2b7c0 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78  gainst the index
2b7d0 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20   .** that P1 is 
2b7e0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2b7f0 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20  ng to, ignoring 
2b800 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
2b810 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65  or ROWID .** fie
2b820 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  lds at the end..
2b830 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
2b840 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67  index entry is g
2b850 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2b860 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74 68 65  key value.** the
2b870 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 4f  n jump to P2.  O
2b880 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68  therwise fall th
2b890 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
2b8a0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  t instruction..*
2b8b0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78  /./* Opcode: Idx
2b8c0 4c 54 20 50 31 20 50 32 20 50 33 20 50 34 20 50  LT P1 P2 P3 P4 P
2b8d0 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  5.** Synopsis: k
2b8e0 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
2b8f0 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65  * The P4 registe
2b900 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69  r values beginni
2b910 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20  ng with P3 form 
2b920 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
2b930 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f  x .** key that o
2b940 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59  mits the PRIMARY
2b950 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20   KEY or ROWID.  
2b960 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79  Compare this key
2b970 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a   value against.*
2b980 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
2b990 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79   P1 is currently
2b9a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67   pointing to, ig
2b9b0 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41  noring the PRIMA
2b9c0 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57  RY KEY or.** ROW
2b9d0 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64  ID on the P1 ind
2b9e0 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ex..**.** If the
2b9f0 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20   P1 index entry 
2ba00 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
2ba10 20 6b 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20   key value then 
2ba20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f  jump to P2..** O
2ba30 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68  therwise fall th
2ba40 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
2ba50 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  t instruction..*
2ba60 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78  /./* Opcode: Idx
2ba70 4c 45 20 50 31 20 50 32 20 50 33 20 50 34 20 50  LE P1 P2 P3 P4 P
2ba80 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  5.** Synopsis: k
2ba90 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
2baa0 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65  * The P4 registe
2bab0 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69  r values beginni
2bac0 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20  ng with P3 form 
2bad0 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
2bae0 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f  x .** key that o
2baf0 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59  mits the PRIMARY
2bb00 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e 20 20   KEY or ROWID.  
2bb10 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79  Compare this key
2bb20 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 0a 2a   value against.*
2bb30 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
2bb40 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79   P1 is currently
2bb50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67   pointing to, ig
2bb60 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41  noring the PRIMA
2bb70 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52 4f 57  RY KEY or.** ROW
2bb80 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69 6e 64  ID on the P1 ind
2bb90 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ex..**.** If the
2bba0 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20   P1 index entry 
2bbb0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
2bbc0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
2bbd0 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70   value then jump
2bbe0 0a 2a 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65 72  .** to P2. Other
2bbf0 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
2bc00 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
2bc10 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
2bc20 73 65 20 4f 50 5f 49 64 78 4c 45 3a 20 20 20 20  se OP_IdxLE:    
2bc30 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2bc40 0a 63 61 73 65 20 4f 50 5f 49 64 78 47 54 3a 20  .case OP_IdxGT: 
2bc50 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
2bc60 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c   */.case OP_IdxL
2bc70 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  T:          /* j
2bc80 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ump */.case OP_I
2bc90 64 78 47 45 3a 20 20 7b 20 20 20 20 20 20 20 2f  dxGE:  {       /
2bca0 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65  * jump */.  Vdbe
2bcb0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e  Cursor *pC;.  in
2bcc0 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65  t res;.  Unpacke
2bcd0 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73  dRecord r;..  as
2bce0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2bcf0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2bd00 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2bd10 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2bd20 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2bd30 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2bd40 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29   pC->isOrdered )
2bd50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2bd60 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
2bd70 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
2bd80 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
2bd90 73 6f 72 21 3d 30 29 3b 0a 20 20 61 73 73 65 72  sor!=0);.  asser
2bda0 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  t( pC->deferredM
2bdb0 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73  oveto==0 );.  as
2bdc0 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30  sert( pOp->p5==0
2bdd0 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29   || pOp->p5==1 )
2bde0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2bdf0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
2be00 32 20 29 3b 0a 20 20 72 2e 70 4b 65 79 49 6e 66  2 );.  r.pKeyInf
2be10 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  o = pC->pKeyInfo
2be20 3b 0a 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28  ;.  r.nField = (
2be30 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  u16)pOp->p4.i;. 
2be40 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2be50 3c 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20  <OP_IdxLT ){.   
2be60 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2be70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c  code==OP_IdxLE |
2be80 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
2be90 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 72  P_IdxGT );.    r
2bea0 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d 31  .default_rc = -1
2beb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2bec0 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
2bed0 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20  de==OP_IdxGE || 
2bee0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2bef0 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 72 2e 64  IdxLT );.    r.d
2bf00 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20  efault_rc = 0;. 
2bf10 20 7d 0a 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61   }.  r.aMem = &a
2bf20 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69  Mem[pOp->p3];.#i
2bf30 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2bf40 47 0a 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72  G.  { int i; for
2bf50 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64  (i=0; i<r.nField
2bf60 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d  ; i++) assert( m
2bf70 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65  emIsValid(&r.aMe
2bf80 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69  m[i]) ); }.#endi
2bf90 66 0a 20 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a  f.  res = 0;  /*
2bfa0 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 4f 6e   Not needed.  On
2bfb0 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c 65 6e  ly used to silen
2bfc0 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f  ce a warning. */
2bfd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
2bfe0 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
2bff0 28 64 62 2c 20 70 43 2c 20 26 72 2c 20 26 72 65  (db, pC, &r, &re
2c000 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 4f  s);.  assert( (O
2c010 50 5f 49 64 78 4c 45 26 31 29 3d 3d 28 4f 50 5f  P_IdxLE&1)==(OP_
2c020 49 64 78 4c 54 26 31 29 20 26 26 20 28 4f 50 5f  IdxLT&1) && (OP_
2c030 49 64 78 47 45 26 31 29 3d 3d 28 4f 50 5f 49 64  IdxGE&1)==(OP_Id
2c040 78 47 54 26 31 29 20 29 3b 0a 20 20 69 66 28 20  xGT&1) );.  if( 
2c050 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 26 31 29 3d  (pOp->opcode&1)=
2c060 3d 28 4f 50 5f 49 64 78 4c 54 26 31 29 20 29 7b  =(OP_IdxLT&1) ){
2c070 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
2c080 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
2c090 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  LE || pOp->opcod
2c0a0 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20  e==OP_IdxLT );. 
2c0b0 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20     res = -res;. 
2c0c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2c0d0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
2c0e0 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20 70 4f 70  =OP_IdxGE || pOp
2c0f0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
2c100 47 54 20 29 3b 0a 20 20 20 20 72 65 73 2b 2b 3b  GT );.    res++;
2c110 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63  .  }.  VdbeBranc
2c120 68 54 61 6b 65 6e 28 72 65 73 3e 30 2c 32 29 3b  hTaken(res>0,2);
2c130 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2c140 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2c150 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 3e 30  ror;.  if( res>0
2c160 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
2c170 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
2c180 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 73 74 72  /* Opcode: Destr
2c190 6f 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  oy P1 P2 P3 * *.
2c1a0 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  **.** Delete an 
2c1b0 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 20  entire database 
2c1c0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77  table or index w
2c1d0 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69  hose root page i
2c1e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
2c1f0 2a 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  * file is given 
2c200 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  by P1..**.** The
2c210 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 65 73   table being des
2c220 74 72 6f 79 65 64 20 69 73 20 69 6e 20 74 68 65  troyed is in the
2c230 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
2c240 69 6c 65 20 69 66 20 50 33 3d 3d 30 2e 20 20 49  ile if P3==0.  I
2c250 66 0a 2a 2a 20 50 33 3d 3d 31 20 74 68 65 6e 20  f.** P3==1 then 
2c260 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
2c270 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20  clear is in the 
2c280 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2c290 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20  se file.** that 
2c2a0 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
2c2b0 20 74 61 62 6c 65 73 20 63 72 65 61 74 65 20 75   tables create u
2c2c0 73 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50  sing CREATE TEMP
2c2d0 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a  ORARY TABLE..**.
2c2e0 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
2c2f0 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e   is enabled then
2c300 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2c310 74 68 61 74 20 61 6e 6f 74 68 65 72 20 72 6f 6f  that another roo
2c320 74 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20  t page.** might 
2c330 62 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68  be moved into th
2c340 65 20 6e 65 77 6c 79 20 64 65 6c 65 74 65 64 20  e newly deleted 
2c350 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 6f 72 64  root page in ord
2c360 65 72 20 74 6f 20 6b 65 65 70 20 61 6c 6c 0a 2a  er to keep all.*
2c370 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 63 6f 6e  * root pages con
2c380 74 69 67 75 6f 75 73 20 61 74 20 74 68 65 20 62  tiguous at the b
2c390 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2c3a0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 66  database.  The f
2c3b0 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c 75 65 20 6f  ormer.** value o
2c3c0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2c3d0 74 68 61 74 20 6d 6f 76 65 64 20 2d 20 69 74 73  that moved - its
2c3e0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 74 68   value before th
2c3f0 65 20 6d 6f 76 65 20 6f 63 63 75 72 72 65 64 20  e move occurred 
2c400 2d 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69  -.** is stored i
2c410 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20  n register P2.  
2c420 49 66 20 6e 6f 20 70 61 67 65 20 0a 2a 2a 20 6d  If no page .** m
2c430 6f 76 65 6d 65 6e 74 20 77 61 73 20 72 65 71 75  ovement was requ
2c440 69 72 65 64 20 28 62 65 63 61 75 73 65 20 74 68  ired (because th
2c450 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
2c460 6f 70 70 65 64 20 77 61 73 20 61 6c 72 65 61 64  opped was alread
2c470 79 20 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 6f  y .** the last o
2c480 6e 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ne in the databa
2c490 73 65 29 20 74 68 65 6e 20 61 20 7a 65 72 6f 20  se) then a zero 
2c4a0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
2c4b0 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 49 66 20  ister P2..** If 
2c4c0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 64 69  AUTOVACUUM is di
2c4d0 73 61 62 6c 65 64 20 74 68 65 6e 20 61 20 7a 65  sabled then a ze
2c4e0 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ro is stored in 
2c4f0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
2c500 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43 6c 65  ** See also: Cle
2c510 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65  ar.*/.case OP_De
2c520 73 74 72 6f 79 3a 20 7b 20 20 20 20 20 2f 2a 20  stroy: {     /* 
2c530 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  out2 */.  int iM
2c540 6f 76 65 64 3b 0a 20 20 69 6e 74 20 69 44 62 3b  oved;.  int iDb;
2c550 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
2c560 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
2c570 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2c580 31 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75  1 );.  pOut = ou
2c590 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
2c5a0 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  pOp);.  pOut->fl
2c5b0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
2c5c0 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 52    if( db->nVdbeR
2c5d0 65 61 64 20 3e 20 64 62 2d 3e 6e 56 44 65 73 74  ead > db->nVDest
2c5e0 72 6f 79 2b 31 20 29 7b 0a 20 20 20 20 72 63 20  roy+1 ){.    rc 
2c5f0 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  = SQLITE_LOCKED;
2c600 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
2c610 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
2c620 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
2c630 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
2c640 65 6c 73 65 7b 0a 20 20 20 20 69 44 62 20 3d 20  else{.    iDb = 
2c650 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61 73 73  pOp->p3;.    ass
2c660 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28  ert( DbMaskTest(
2c670 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44  p->btreeMask, iD
2c680 62 29 20 29 3b 0a 20 20 20 20 69 4d 6f 76 65 64  b) );.    iMoved
2c690 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65   = 0;  /* Not ne
2c6a0 65 64 65 64 2e 20 20 4f 6e 6c 79 20 74 6f 20 73  eded.  Only to s
2c6b0 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67  ilence a warning
2c6c0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
2c6d0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
2c6e0 62 6c 65 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ble(db->aDb[iDb]
2c6f0 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 26  .pBt, pOp->p1, &
2c700 69 4d 6f 76 65 64 29 3b 0a 20 20 20 20 70 4f 75  iMoved);.    pOu
2c710 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  t->flags = MEM_I
2c720 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e  nt;.    pOut->u.
2c730 69 20 3d 20 69 4d 6f 76 65 64 3b 0a 20 20 20 20  i = iMoved;.    
2c740 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2c750 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2c760 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2c770 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2c780 0a 20 20 20 20 69 66 28 20 69 4d 6f 76 65 64 21  .    if( iMoved!
2c790 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2c7a0 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
2c7b0 28 64 62 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64  (db, iDb, iMoved
2c7c0 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
2c7d0 20 20 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74    /* All OP_Dest
2c7e0 72 6f 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  roy operations o
2c7f0 63 63 75 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ccur on the same
2c800 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20   btree */.      
2c810 61 73 73 65 72 74 28 20 72 65 73 65 74 53 63 68  assert( resetSch
2c820 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c  emaOnFault==0 ||
2c830 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61   resetSchemaOnFa
2c840 75 6c 74 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20  ult==iDb+1 );.  
2c850 20 20 20 20 72 65 73 65 74 53 63 68 65 6d 61 4f      resetSchemaO
2c860 6e 46 61 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a  nFault = iDb+1;.
2c870 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2c880 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
2c890 4f 70 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31  Opcode: Clear P1
2c8a0 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c   P2 P3.**.** Del
2c8b0 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73  ete all contents
2c8c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2c8d0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2c8e0 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a  whose root page.
2c8f0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
2c900 73 65 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  se file is given
2c910 20 62 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e   by P1.  But, un
2c920 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f  like Destroy, do
2c930 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   not.** remove t
2c940 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
2c950 78 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  x from the datab
2c960 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2c970 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
2c980 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20  clear is in the 
2c990 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
2c9a0 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66  le if P2==0.  If
2c9b0 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74  .** P2==1 then t
2c9c0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63  he table to be c
2c9d0 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61  lear is in the a
2c9e0 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2c9f0 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69  e file.** that i
2ca00 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
2ca10 74 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73  tables create us
2ca20 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f  ing CREATE TEMPO
2ca30 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  RARY TABLE..**.*
2ca40 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75  * If the P3 valu
2ca50 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
2ca60 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65  hen the table re
2ca70 66 65 72 72 65 64 20 74 6f 20 6d 75 73 74 20 62  ferred to must b
2ca80 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74  e an.** intkey t
2ca90 61 62 6c 65 20 28 61 6e 20 53 51 4c 20 74 61 62  able (an SQL tab
2caa0 6c 65 2c 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78  le, not an index
2cab0 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ). In this case 
2cac0 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 0a  the row change .
2cad0 2a 2a 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72  ** count is incr
2cae0 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e  emented by the n
2caf0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2cb00 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2cb10 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66   cleared. .** If
2cb20 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74   P3 is greater t
2cb30 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
2cb40 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
2cb50 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69  in register P3 i
2cb60 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d  s.** also increm
2cb70 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
2cb80 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2cb90 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
2cba0 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  leared..**.** Se
2cbb0 65 20 61 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a  e also: Destroy.
2cbc0 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 65 61 72  */.case OP_Clear
2cbd0 3a 20 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67  : {.  int nChang
2cbe0 65 3b 0a 20 0a 20 20 6e 43 68 61 6e 67 65 20 3d  e;. .  nChange =
2cbf0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
2cc00 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
2cc10 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
2cc20 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  Test(p->btreeMas
2cc30 6b 2c 20 70 4f 70 2d 3e 70 32 29 20 29 3b 0a 20  k, pOp->p2) );. 
2cc40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2cc50 65 65 43 6c 65 61 72 54 61 62 6c 65 28 0a 20 20  eeClearTable(.  
2cc60 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d      db->aDb[pOp-
2cc70 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70  >p2].pBt, pOp->p
2cc80 31 2c 20 28 70 4f 70 2d 3e 70 33 20 3f 20 26 6e  1, (pOp->p3 ? &n
2cc90 43 68 61 6e 67 65 20 3a 20 30 29 0a 20 20 29 3b  Change : 0).  );
2cca0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29  .  if( pOp->p3 )
2ccb0 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65  {.    p->nChange
2ccc0 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20   += nChange;.   
2ccd0 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29   if( pOp->p3>0 )
2cce0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ccf0 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d  memIsValid(&aMem
2cd00 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20  [pOp->p3]) );.  
2cd10 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
2cd20 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f  ange(p, &aMem[pO
2cd30 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 61  p->p3]);.      a
2cd40 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69  Mem[pOp->p3].u.i
2cd50 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20   += nChange;.   
2cd60 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20   }.  }.  if( rc 
2cd70 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2cd80 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
2cd90 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2cda0 3a 20 52 65 73 65 74 53 6f 72 74 65 72 20 50 31  : ResetSorter P1
2cdb0 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44   * * * *.**.** D
2cdc0 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e  elete all conten
2cdd0 74 73 20 66 72 6f 6d 20 74 68 65 20 65 70 68 65  ts from the ephe
2cde0 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 72 20 73  meral table or s
2cdf0 6f 72 74 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  orter.** that is
2ce00 20 6f 70 65 6e 20 6f 6e 20 63 75 72 73 6f 72 20   open on cursor 
2ce10 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  P1..**.** This o
2ce20 70 63 6f 64 65 20 6f 6e 6c 79 20 77 6f 72 6b 73  pcode only works
2ce30 20 66 6f 72 20 63 75 72 73 6f 72 73 20 75 73 65   for cursors use
2ce40 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 61 6e  d for sorting an
2ce50 64 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 74 68  d.** opened with
2ce60 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2ce70 6c 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72 4f 70  l or OP_SorterOp
2ce80 65 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  en..*/.case OP_R
2ce90 65 73 65 74 53 6f 72 74 65 72 3a 20 7b 0a 20 20  esetSorter: {.  
2cea0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
2ceb0 20 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d   .  assert( pOp-
2cec0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2ced0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2cee0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2cef0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2cf00 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69  rt( pC!=0 );.  i
2cf10 66 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20  f( isSorter(pC) 
2cf20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2cf30 62 65 53 6f 72 74 65 72 52 65 73 65 74 28 64 62  beSorterReset(db
2cf40 2c 20 70 43 2d 3e 75 63 2e 70 53 6f 72 74 65 72  , pC->uc.pSorter
2cf50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2cf60 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
2cf70 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
2cf80 52 45 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  REE );.    asser
2cf90 74 28 20 70 43 2d 3e 69 73 45 70 68 65 6d 65 72  t( pC->isEphemer
2cfa0 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  al );.    rc = s
2cfb0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2cfc0 54 61 62 6c 65 4f 66 43 75 72 73 6f 72 28 70 43  TableOfCursor(pC
2cfd0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
2cfe0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2cff0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2d000 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ror;.  }.  break
2d010 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2d020 43 72 65 61 74 65 54 61 62 6c 65 20 50 31 20 50  CreateTable P1 P
2d030 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
2d040 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 6f 74 20  sis: r[P2]=root 
2d050 69 44 62 3d 50 31 0a 2a 2a 0a 2a 2a 20 41 6c 6c  iDb=P1.**.** All
2d060 6f 63 61 74 65 20 61 20 6e 65 77 20 74 61 62 6c  ocate a new tabl
2d070 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
2d080 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
2d090 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a  1==0 or in the.*
2d0a0 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2d0b0 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d  base file if P1=
2d0c0 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74 74 61  =1 or in an atta
2d0d0 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69 66  ched database if
2d0e0 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69 74 65  .** P1>1.  Write
2d0f0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
2d100 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
2d110 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72   table into.** r
2d120 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a  egister P2.**.**
2d130 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2d140 62 65 74 77 65 65 6e 20 61 20 74 61 62 6c 65 20  between a table 
2d150 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69 73 20  and an index is 
2d160 74 68 69 73 3a 20 20 41 20 74 61 62 6c 65 20 6d  this:  A table m
2d170 75 73 74 0a 2a 2a 20 68 61 76 65 20 61 20 34 2d  ust.** have a 4-
2d180 62 79 74 65 20 69 6e 74 65 67 65 72 20 6b 65 79  byte integer key
2d190 20 61 6e 64 20 63 61 6e 20 68 61 76 65 20 61 72   and can have ar
2d1a0 62 69 74 72 61 72 79 20 64 61 74 61 2e 20 20 41  bitrary data.  A
2d1b0 6e 20 69 6e 64 65 78 0a 2a 2a 20 68 61 73 20 61  n index.** has a
2d1c0 6e 20 61 72 62 69 74 72 61 72 79 20 6b 65 79 20  n arbitrary key 
2d1d0 62 75 74 20 6e 6f 20 64 61 74 61 2e 0a 2a 2a 0a  but no data..**.
2d1e0 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43 72 65  ** See also: Cre
2d1f0 61 74 65 49 6e 64 65 78 0a 2a 2f 0a 2f 2a 20 4f  ateIndex.*/./* O
2d200 70 63 6f 64 65 3a 20 43 72 65 61 74 65 49 6e 64  pcode: CreateInd
2d210 65 78 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ex P1 P2 * * *.*
2d220 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
2d230 5d 3d 72 6f 6f 74 20 69 44 62 3d 50 31 0a 2a 2a  ]=root iDb=P1.**
2d240 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
2d250 65 77 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  ew index in the 
2d260 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
2d270 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69  le if P1==0 or i
2d280 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61  n the.** auxilia
2d290 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2d2a0 20 69 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20   if P1==1 or in 
2d2b0 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
2d2c0 62 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e  base if.** P1>1.
2d2d0 20 20 57 72 69 74 65 20 74 68 65 20 72 6f 6f 74    Write the root
2d2e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2d2f0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e  the new table in
2d300 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  to.** register P
2d310 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64 6f 63  2..**.** See doc
2d320 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 20 4f 50  umentation on OP
2d330 5f 43 72 65 61 74 65 54 61 62 6c 65 20 66 6f 72  _CreateTable for
2d340 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2d350 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  rmation..*/.case
2d360 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3a   OP_CreateIndex:
2d370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2d380 75 74 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  ut2 */.case OP_C
2d390 72 65 61 74 65 54 61 62 6c 65 3a 20 7b 20 20 20  reateTable: {   
2d3a0 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
2d3b0 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20  /.  int pgno;.  
2d3c0 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 44 62 20  int flags;.  Db 
2d3d0 2a 70 44 62 3b 0a 0a 20 20 70 4f 75 74 20 3d 20  *pDb;..  pOut = 
2d3e0 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
2d3f0 2c 20 70 4f 70 29 3b 0a 20 20 70 67 6e 6f 20 3d  , pOp);.  pgno =
2d400 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   0;.  assert( pO
2d410 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2d420 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
2d430 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
2d440 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
2d450 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20  , pOp->p1) );.  
2d460 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
2d470 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20  nly==0 );.  pDb 
2d480 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  = &db->aDb[pOp->
2d490 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
2d4a0 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  Db->pBt!=0 );.  
2d4b0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2d4c0 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20  =OP_CreateTable 
2d4d0 29 7b 0a 20 20 20 20 2f 2a 20 66 6c 61 67 73 20  ){.    /* flags 
2d4e0 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 20  = BTREE_INTKEY; 
2d4f0 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 42  */.    flags = B
2d500 54 52 45 45 5f 49 4e 54 4b 45 59 3b 0a 20 20 7d  TREE_INTKEY;.  }
2d510 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20  else{.    flags 
2d520 3d 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 3b  = BTREE_BLOBKEY;
2d530 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
2d540 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
2d550 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c 20 26 70  ble(pDb->pBt, &p
2d560 67 6e 6f 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  gno, flags);.  i
2d570 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
2d580 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2d590 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70  .  pOut->u.i = p
2d5a0 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  gno;.  break;.}.
2d5b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 73  ./* Opcode: Pars
2d5c0 65 53 63 68 65 6d 61 20 50 31 20 2a 20 2a 20 50  eSchema P1 * * P
2d5d0 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61  4 *.**.** Read a
2d5e0 6e 64 20 70 61 72 73 65 20 61 6c 6c 20 65 6e 74  nd parse all ent
2d5f0 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 53 51  ries from the SQ
2d600 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
2d610 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31  e of database P1
2d620 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68 20 74  .** that match t
2d630 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2d640 50 34 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  P4. .**.** This 
2d650 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74  opcode invokes t
2d660 68 65 20 70 61 72 73 65 72 20 74 6f 20 63 72 65  he parser to cre
2d670 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
2d680 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a 2a 20 74 68  l machine,.** th
2d690 65 6e 20 72 75 6e 73 20 74 68 65 20 6e 65 77 20  en runs the new 
2d6a0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
2d6b0 20 20 49 74 20 69 73 20 74 68 75 73 20 61 20 72    It is thus a r
2d6c0 65 2d 65 6e 74 72 61 6e 74 20 6f 70 63 6f 64 65  e-entrant opcode
2d6d0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72  ..*/.case OP_Par
2d6e0 73 65 53 63 68 65 6d 61 3a 20 7b 0a 20 20 69 6e  seSchema: {.  in
2d6f0 74 20 69 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63  t iDb;.  const c
2d700 68 61 72 20 2a 7a 4d 61 73 74 65 72 3b 0a 20 20  har *zMaster;.  
2d710 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 49 6e  char *zSql;.  In
2d720 69 74 44 61 74 61 20 69 6e 69 74 44 61 74 61 3b  itData initData;
2d730 0a 0a 20 20 2f 2a 20 41 6e 79 20 70 72 65 70 61  ..  /* Any prepa
2d740 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74 68  red statement th
2d750 61 74 20 69 6e 76 6f 6b 65 73 20 74 68 69 73 20  at invokes this 
2d760 6f 70 63 6f 64 65 20 77 69 6c 6c 20 68 6f 6c 64  opcode will hold
2d770 20 6d 75 74 65 78 65 73 0a 20 20 2a 2a 20 6f 6e   mutexes.  ** on
2d780 20 65 76 65 72 79 20 62 74 72 65 65 2e 20 20 54   every btree.  T
2d790 68 69 73 20 69 73 20 61 20 70 72 65 72 65 71 75  his is a prerequ
2d7a0 69 73 69 74 65 20 66 6f 72 20 69 6e 76 6f 6b 69  isite for invoki
2d7b0 6e 67 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ng .  ** sqlite3
2d7c0 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 29 2e 0a  InitCallback()..
2d7d0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2d7e0 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
2d7f0 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  Db=0; iDb<db->nD
2d800 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 61  b; iDb++){.    a
2d810 73 73 65 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c  ssert( iDb==1 ||
2d820 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2d830 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44 62 5b  dsMutex(db->aDb[
2d840 69 44 62 5d 2e 70 42 74 29 20 29 3b 0a 20 20 7d  iDb].pBt) );.  }
2d850 0a 23 65 6e 64 69 66 0a 0a 20 20 69 44 62 20 3d  .#endif..  iDb =
2d860 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65   pOp->p1;.  asse
2d870 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
2d880 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
2d890 73 73 65 72 74 28 20 44 62 48 61 73 50 72 6f 70  ssert( DbHasProp
2d8a0 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
2d8b0 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
2d8c0 3b 0a 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  ;.  /* Used to b
2d8d0 65 20 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  e a conditional 
2d8e0 2a 2f 20 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  */ {.    zMaster
2d8f0 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
2d900 69 44 62 29 3b 0a 20 20 20 20 69 6e 69 74 44 61  iDb);.    initDa
2d910 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  ta.db = db;.    
2d920 69 6e 69 74 44 61 74 61 2e 69 44 62 20 3d 20 70  initData.iDb = p
2d930 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69 6e 69 74  Op->p1;.    init
2d940 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20  Data.pzErrMsg = 
2d950 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20  &p->zErrMsg;.   
2d960 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d   zSql = sqlite3M
2d970 50 72 69 6e 74 66 28 64 62 2c 0a 20 20 20 20 20  Printf(db,.     
2d980 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
2d990 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20 46 52  rootpage, sql FR
2d9a0 4f 4d 20 27 25 71 27 2e 25 73 20 57 48 45 52 45  OM '%q'.%s WHERE
2d9b0 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77   %s ORDER BY row
2d9c0 69 64 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  id",.       db->
2d9d0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
2d9e0 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d  e, zMaster, pOp-
2d9f0 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20  >p4.z);.    if( 
2da00 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
2da10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2da20 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  EM_BKPT;.    }el
2da30 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2da40 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
2da50 3d 30 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =0 );.      db->
2da60 69 6e 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a 20  init.busy = 1;. 
2da70 20 20 20 20 20 69 6e 69 74 44 61 74 61 2e 72 63       initData.rc
2da80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2da90 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
2daa0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
2dab0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2dac0 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2dad0 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61  l, sqlite3InitCa
2dae0 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74  llback, &initDat
2daf0 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  a, 0);.      if(
2db00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2db10 20 72 63 20 3d 20 69 6e 69 74 44 61 74 61 2e 72   rc = initData.r
2db20 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2db30 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
2db40 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74  ;.      db->init
2db50 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 7d  .busy = 0;.    }
2db60 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
2db70 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
2db80 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
2db90 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20  nection(db);.   
2dba0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2dbb0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 67  NOMEM ){.      g
2dbc0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
2dbd0 7d 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  }.    goto abort
2dbe0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2dbf0 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a   }.  break;  .}.
2dc00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2dc10 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
2dc20 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 6f  E)./* Opcode: Lo
2dc30 61 64 41 6e 61 6c 79 73 69 73 20 50 31 20 2a 20  adAnalysis P1 * 
2dc40 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64  * * *.**.** Read
2dc50 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
2dc60 31 20 74 61 62 6c 65 20 66 6f 72 20 64 61 74 61  1 table for data
2dc70 62 61 73 65 20 50 31 20 61 6e 64 20 6c 6f 61 64  base P1 and load
2dc80 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
2dc90 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 6e  of that table in
2dca0 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
2dcb0 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
2dcc0 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
2dcd0 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61 6c 79 73  se.** the analys
2dce0 69 73 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  is to be used wh
2dcf0 65 6e 20 70 72 65 70 61 72 69 6e 67 20 61 6c 6c  en preparing all
2dd00 20 73 75 62 73 65 71 75 65 6e 74 20 71 75 65 72   subsequent quer
2dd10 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ies..*/.case OP_
2dd20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a 20 7b 0a  LoadAnalysis: {.
2dd30 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2dd40 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2dd50 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 72 63 20  db->nDb );.  rc 
2dd60 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69  = sqlite3Analysi
2dd70 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70 2d 3e 70  sLoad(db, pOp->p
2dd80 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  1);.  if( rc ) g
2dd90 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2dda0 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
2ddb0 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
2ddc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2ddd0 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f 0a  MIT_ANALYZE) */.
2dde0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70  ./* Opcode: Drop
2ddf0 54 61 62 6c 65 20 50 31 20 2a 20 2a 20 50 34 20  Table P1 * * P4 
2de00 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  *.**.** Remove t
2de10 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d  he internal (in-
2de20 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72  memory) data str
2de30 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73  uctures that des
2de40 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 61 62  cribe.** the tab
2de50 6c 65 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64  le named P4 in d
2de60 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69  atabase P1.  Thi
2de70 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  s is called afte
2de80 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  r a table.** is 
2de90 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73  dropped from dis
2dea0 6b 20 28 75 73 69 6e 67 20 74 68 65 20 44 65 73  k (using the Des
2deb0 74 72 6f 79 20 6f 70 63 6f 64 65 29 20 69 6e 20  troy opcode) in 
2dec0 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a  order to keep .*
2ded0 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  * the internal r
2dee0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2def0 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63   the.** schema c
2df00 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77  onsistent with w
2df10 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a  hat is on disk..
2df20 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54  */.case OP_DropT
2df30 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65  able: {.  sqlite
2df40 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
2df50 54 61 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e 70  Table(db, pOp->p
2df60 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
2df70 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2df80 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64 65 78 20  code: DropIndex 
2df90 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2dfa0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74  * Remove the int
2dfb0 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79  ernal (in-memory
2dfc0 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  ) data structure
2dfd0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a  s that describe.
2dfe0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  ** the index nam
2dff0 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73  ed P4 in databas
2e000 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63  e P1.  This is c
2e010 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69  alled after an i
2e020 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70 70  ndex.** is dropp
2e030 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 75 73  ed from disk (us
2e040 69 6e 67 20 74 68 65 20 44 65 73 74 72 6f 79 20  ing the Destroy 
2e050 6f 70 63 6f 64 65 29 0a 2a 2a 20 69 6e 20 6f 72  opcode).** in or
2e060 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
2e070 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
2e080 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
2e090 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74  * schema consist
2e0a0 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73  ent with what is
2e0b0 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73   on disk..*/.cas
2e0c0 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 3a 20  e OP_DropIndex: 
2e0d0 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  {.  sqlite3Unlin
2e0e0 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
2e0f0 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  db, pOp->p1, pOp
2e100 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b  ->p4.z);.  break
2e110 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2e120 44 72 6f 70 54 72 69 67 67 65 72 20 50 31 20 2a  DropTrigger P1 *
2e130 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   * P4 *.**.** Re
2e140 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61  move the interna
2e150 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61  l (in-memory) da
2e160 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74 68  ta structures th
2e170 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74  at describe.** t
2e180 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 64  he trigger named
2e190 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20   P4 in database 
2e1a0 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c  P1.  This is cal
2e1b0 6c 65 64 20 61 66 74 65 72 20 61 20 74 72 69 67  led after a trig
2e1c0 67 65 72 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65  ger.** is droppe
2e1d0 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 75 73 69  d from disk (usi
2e1e0 6e 67 20 74 68 65 20 44 65 73 74 72 6f 79 20 6f  ng the Destroy o
2e1f0 70 63 6f 64 65 29 20 69 6e 20 6f 72 64 65 72 20  pcode) in order 
2e200 74 6f 20 6b 65 65 70 20 0a 2a 2a 20 74 68 65 20  to keep .** the 
2e210 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
2e220 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
2e230 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74  * schema consist
2e240 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73  ent with what is
2e250 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73   on disk..*/.cas
2e260 65 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72  e OP_DropTrigger
2e270 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c  : {.  sqlite3Unl
2e280 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67  inkAndDeleteTrig
2e290 67 65 72 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  ger(db, pOp->p1,
2e2a0 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62   pOp->p4.z);.  b
2e2b0 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  reak;.}...#ifnde
2e2c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2e2d0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
2e2e0 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 72 69   Opcode: Integri
2e2f0 74 79 43 6b 20 50 31 20 50 32 20 50 33 20 50 34  tyCk P1 P2 P3 P4
2e300 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20   P5.**.** Do an 
2e310 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20  analysis of the 
2e320 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64  currently open d
2e330 61 74 61 62 61 73 65 2e 20 20 53 74 6f 72 65 20  atabase.  Store 
2e340 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  in.** register P
2e350 31 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e  1 the text of an
2e360 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 64   error message d
2e370 65 73 63 72 69 62 69 6e 67 20 61 6e 79 20 70 72  escribing any pr
2e380 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f  oblems..** If no
2e390 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
2e3a0 75 6e 64 2c 20 73 74 6f 72 65 20 61 20 4e 55 4c  und, store a NUL
2e3b0 4c 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  L in register P1
2e3c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69  ..**.** The regi
2e3d0 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73  ster P3 contains
2e3e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
2e3f0 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65  ber of allowed e
2e400 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73  rrors..** At mos
2e410 74 20 72 65 67 28 50 33 29 20 65 72 72 6f 72 73  t reg(P3) errors
2e420 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
2e430 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  d..** In other w
2e440 6f 72 64 73 2c 20 74 68 65 20 61 6e 61 6c 79 73  ords, the analys
2e450 69 73 20 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e  is stops as soon
2e460 20 61 73 20 72 65 67 28 50 31 29 20 65 72 72 6f   as reg(P1) erro
2e470 72 73 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e  rs are .** seen.
2e480 20 20 52 65 67 28 50 31 29 20 69 73 20 75 70 64    Reg(P1) is upd
2e490 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 75  ated with the nu
2e4a0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72  mber of errors r
2e4b0 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  emaining..**.** 
2e4c0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  The root page nu
2e4d0 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 74 61 62  mbers of all tab
2e4e0 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  les in the datab
2e4f0 61 73 65 20 61 72 65 20 69 6e 74 65 67 65 72 73  ase are integers
2e500 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 50 34  .** stored in P4
2e510 5f 49 4e 54 41 52 52 41 59 20 61 72 67 75 6d 65  _INTARRAY argume
2e520 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20  nt..**.** If P5 
2e530 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
2e540 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65 20 6f   check is done o
2e550 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
2e560 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2e570 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e 20 64  , not the main d
2e580 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2e590 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
2e5a0 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
2e5b0 6d 65 6e 74 20 74 68 65 20 69 6e 74 65 67 72 69  ment the integri
2e5c0 74 79 5f 63 68 65 63 6b 20 70 72 61 67 6d 61 2e  ty_check pragma.
2e5d0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65  .*/.case OP_Inte
2e5e0 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69 6e 74  grityCk: {.  int
2e5f0 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20   nRoot;      /* 
2e600 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  Number of tables
2e610 20 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e 75 6d   to check.  (Num
2e620 62 65 72 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  ber of root page
2e630 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  s.) */.  int *aR
2e640 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72 72 61  oot;     /* Arra
2e650 79 20 6f 66 20 72 6f 6f 74 70 61 67 65 20 6e 75  y of rootpage nu
2e660 6d 62 65 72 73 20 66 6f 72 20 74 61 62 6c 65 73  mbers for tables
2e670 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a   to be checked *
2e680 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20  /.  int nErr;   
2e690 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e6a0 20 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65 64   errors reported
2e6b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
2e6c0 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2e6d0 20 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f 72   the error repor
2e6e0 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72  t */.  Mem *pnEr
2e6f0 72 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  r;     /* Regist
2e700 65 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  er keeping track
2e710 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69   of errors remai
2e720 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ning */..  asser
2e730 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
2e740 29 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70  );.  nRoot = pOp
2e750 2d 3e 70 32 3b 0a 20 20 61 52 6f 6f 74 20 3d 20  ->p2;.  aRoot = 
2e760 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 61 73  pOp->p4.ai;.  as
2e770 73 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29 3b  sert( nRoot>0 );
2e780 0a 20 20 61 73 73 65 72 74 28 20 61 52 6f 6f 74  .  assert( aRoot
2e790 5b 6e 52 6f 6f 74 5d 3d 3d 30 20 29 3b 0a 20 20  [nRoot]==0 );.  
2e7a0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
2e7b0 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  0 && pOp->p3<=(p
2e7c0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
2e7d0 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 6e 45 72  ursor) );.  pnEr
2e7e0 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  r = &aMem[pOp->p
2e7f0 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  3];.  assert( (p
2e800 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 4d 45  nErr->flags & ME
2e810 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 61  M_Int)!=0 );.  a
2e820 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66  ssert( (pnErr->f
2e830 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c  lags & (MEM_Str|
2e840 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29 3b  MEM_Blob))==0 );
2e850 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
2e860 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2e870 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e  rt( pOp->p5<db->
2e880 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
2e890 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
2e8a0 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70  treeMask, pOp->p
2e8b0 35 29 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  5) );.  z = sqli
2e8c0 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74  te3BtreeIntegrit
2e8d0 79 43 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70  yCheck(db->aDb[p
2e8e0 4f 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f  Op->p5].pBt, aRo
2e8f0 6f 74 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20  ot, nRoot,.     
2e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e910 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
2e920 29 70 6e 45 72 72 2d 3e 75 2e 69 2c 20 26 6e 45  )pnErr->u.i, &nE
2e930 72 72 29 3b 0a 20 20 70 6e 45 72 72 2d 3e 75 2e  rr);.  pnErr->u.
2e940 69 20 2d 3d 20 6e 45 72 72 3b 0a 20 20 73 71 6c  i -= nErr;.  sql
2e950 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
2e960 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69 66 28 20  ll(pIn1);.  if( 
2e970 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nErr==0 ){.    a
2e980 73 73 65 72 74 28 20 7a 3d 3d 30 20 29 3b 0a 20  ssert( z==0 );. 
2e990 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d 3d 30 20   }else if( z==0 
2e9a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  ){.    goto no_m
2e9b0 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
2e9c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2e9d0 65 74 53 74 72 28 70 49 6e 31 2c 20 7a 2c 20 2d  etStr(pIn1, z, -
2e9e0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
2e9f0 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
2ea00 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f   }.  UPDATE_MAX_
2ea10 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a  BLOBSIZE(pIn1);.
2ea20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2ea30 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 49 6e 31  ngeEncoding(pIn1
2ea40 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 62  , encoding);.  b
2ea50 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
2ea60 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
2ea70 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
2ea80 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  ../* Opcode: Row
2ea90 53 65 74 41 64 64 20 50 31 20 50 32 20 2a 20 2a  SetAdd P1 P2 * *
2eaa0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
2eab0 72 6f 77 73 65 74 28 50 31 29 3d 72 5b 50 32 5d  rowset(P1)=r[P2]
2eac0 0a 2a 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68  .**.** Insert th
2ead0 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
2eae0 68 65 6c 64 20 62 79 20 72 65 67 69 73 74 65 72  held by register
2eaf0 20 50 32 20 69 6e 74 6f 20 61 20 62 6f 6f 6c 65   P2 into a boole
2eb00 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 68 65 6c 64  an index.** held
2eb10 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
2eb20 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 73 73 65 72 74  .**.** An assert
2eb30 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 50 32 20  ion fails if P2 
2eb40 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
2eb50 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f  r..*/.case OP_Ro
2eb60 77 53 65 74 41 64 64 3a 20 7b 20 20 20 20 20 20  wSetAdd: {      
2eb70 20 2f 2a 20 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a   /* in1, in2 */.
2eb80 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
2eb90 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20  Op->p1];.  pIn2 
2eba0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
2ebb0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e  ;.  assert( (pIn
2ebc0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  2->flags & MEM_I
2ebd0 6e 74 29 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  nt)!=0 );.  if( 
2ebe0 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
2ebf0 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 7b  EM_RowSet)==0 ){
2ec00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ec10 4d 65 6d 53 65 74 52 6f 77 53 65 74 28 70 49 6e  MemSetRowSet(pIn
2ec20 31 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e  1);.    if( (pIn
2ec30 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
2ec40 6f 77 53 65 74 29 3d 3d 30 20 29 20 67 6f 74 6f  owSet)==0 ) goto
2ec50 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73   no_mem;.  }.  s
2ec60 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65  qlite3RowSetInse
2ec70 72 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53  rt(pIn1->u.pRowS
2ec80 65 74 2c 20 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a  et, pIn2->u.i);.
2ec90 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2eca0 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 52 65 61  pcode: RowSetRea
2ecb0 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
2ecc0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
2ecd0 5d 3d 72 6f 77 73 65 74 28 50 31 29 0a 2a 2a 0a  ]=rowset(P1).**.
2ece0 2a 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73  ** Extract the s
2ecf0 6d 61 6c 6c 65 73 74 20 76 61 6c 75 65 20 66 72  mallest value fr
2ed00 6f 6d 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78  om boolean index
2ed10 20 50 31 20 61 6e 64 20 70 75 74 20 74 68 61 74   P1 and put that
2ed20 20 76 61 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72   value into.** r
2ed30 65 67 69 73 74 65 72 20 50 33 2e 20 20 4f 72 2c  egister P3.  Or,
2ed40 20 69 66 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65   if boolean inde
2ed50 78 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c  x P1 is initiall
2ed60 79 20 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50  y empty, leave P
2ed70 33 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61  3.** unchanged a
2ed80 6e 64 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  nd jump to instr
2ed90 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61  uction P2..*/.ca
2eda0 73 65 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64  se OP_RowSetRead
2edb0 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  : {       /* jum
2edc0 70 2c 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a  p, in1, out3 */.
2edd0 20 20 69 36 34 20 76 61 6c 3b 0a 0a 20 20 70 49    i64 val;..  pI
2ede0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
2edf0 70 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  p1];.  if( (pIn1
2ee00 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
2ee10 77 53 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20  wSet)==0 .   || 
2ee20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78  sqlite3RowSetNex
2ee30 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65  t(pIn1->u.pRowSe
2ee40 74 2c 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b  t, &val)==0.  ){
2ee50 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c  .    /* The bool
2ee60 65 61 6e 20 69 6e 64 65 78 20 69 73 20 65 6d 70  ean index is emp
2ee70 74 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ty */.    sqlite
2ee80 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
2ee90 70 49 6e 31 29 3b 0a 20 20 20 20 56 64 62 65 42  pIn1);.    VdbeB
2eea0 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b  ranchTaken(1,2);
2eeb0 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
2eec0 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66  o_p2_and_check_f
2eed0 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20  or_interrupt;.  
2eee0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20  }else{.    /* A 
2eef0 76 61 6c 75 65 20 77 61 73 20 70 75 6c 6c 65 64  value was pulled
2ef00 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
2ef10 2a 2f 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  */.    VdbeBranc
2ef20 68 54 61 6b 65 6e 28 30 2c 32 29 3b 0a 20 20 20  hTaken(0,2);.   
2ef30 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2ef40 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f  etInt64(&aMem[pO
2ef50 70 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b 0a 20 20  p->p3], val);.  
2ef60 7d 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66  }.  goto check_f
2ef70 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a  or_interrupt;.}.
2ef80 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53  ./* Opcode: RowS
2ef90 65 74 54 65 73 74 20 50 31 20 50 32 20 50 33 20  etTest P1 P2 P3 
2efa0 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P4.** Synopsis: 
2efb0 69 66 20 72 5b 50 33 5d 20 69 6e 20 72 6f 77 73  if r[P3] in rows
2efc0 65 74 28 50 31 29 20 67 6f 74 6f 20 50 32 0a 2a  et(P1) goto P2.*
2efd0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33  *.** Register P3
2efe0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
2eff0 6f 6c 64 20 61 20 36 34 2d 62 69 74 20 69 6e 74  old a 64-bit int
2f000 65 67 65 72 20 76 61 6c 75 65 2e 20 49 66 20 72  eger value. If r
2f010 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 63 6f  egister P1.** co
2f020 6e 74 61 69 6e 73 20 61 20 52 6f 77 53 65 74 20  ntains a RowSet 
2f030 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
2f040 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 63 6f  RowSet object co
2f050 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
2f060 6c 75 65 20 68 65 6c 64 20 69 6e 20 50 33 2c 20  lue held in P3, 
2f070 6a 75 6d 70 20 74 6f 20 72 65 67 69 73 74 65 72  jump to register
2f080 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   P2. Otherwise, 
2f090 69 6e 73 65 72 74 20 74 68 65 0a 2a 2a 20 69 6e  insert the.** in
2f0a0 74 65 67 65 72 20 69 6e 20 50 33 20 69 6e 74 6f  teger in P3 into
2f0b0 20 74 68 65 20 52 6f 77 53 65 74 20 61 6e 64 20   the RowSet and 
2f0c0 63 6f 6e 74 69 6e 75 65 20 6f 6e 20 74 6f 20 74  continue on to t
2f0d0 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 70 63 6f 64  he.** next opcod
2f0e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f 77  e..**.** The Row
2f0f0 53 65 74 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  Set object is op
2f100 74 69 6d 69 7a 65 64 20 66 6f 72 20 74 68 65 20  timized for the 
2f110 63 61 73 65 20 77 68 65 72 65 20 73 75 63 63 65  case where succe
2f120 73 73 69 76 65 20 73 65 74 73 0a 2a 2a 20 6f 66  ssive sets.** of
2f130 20 69 6e 74 65 67 65 72 73 2c 20 77 68 65 72 65   integers, where
2f140 20 65 61 63 68 20 73 65 74 20 63 6f 6e 74 61 69   each set contai
2f150 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 73  ns no duplicates
2f160 2e 20 45 61 63 68 20 73 65 74 0a 2a 2a 20 6f 66  . Each set.** of
2f170 20 76 61 6c 75 65 73 20 69 73 20 69 64 65 6e 74   values is ident
2f180 69 66 69 65 64 20 62 79 20 61 20 75 6e 69 71 75  ified by a uniqu
2f190 65 20 50 34 20 76 61 6c 75 65 2e 20 54 68 65 20  e P4 value. The 
2f1a0 66 69 72 73 74 20 73 65 74 0a 2a 2a 20 6d 75 73  first set.** mus
2f1b0 74 20 68 61 76 65 20 50 34 3d 3d 30 2c 20 74 68  t have P4==0, th
2f1c0 65 20 66 69 6e 61 6c 20 73 65 74 20 50 34 3d 2d  e final set P4=-
2f1d0 31 2e 20 20 50 34 20 6d 75 73 74 20 62 65 20 65  1.  P4 must be e
2f1e0 69 74 68 65 72 20 2d 31 20 6f 72 0a 2a 2a 20 6e  ither -1 or.** n
2f1f0 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 20 46 6f  on-negative.  Fo
2f200 72 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76  r non-negative v
2f210 61 6c 75 65 73 20 6f 66 20 50 34 20 6f 6e 6c 79  alues of P4 only
2f220 20 74 68 65 20 6c 6f 77 65 72 20 34 0a 2a 2a 20   the lower 4.** 
2f230 62 69 74 73 20 61 72 65 20 73 69 67 6e 69 66 69  bits are signifi
2f240 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cant..**.** This
2f250 20 61 6c 6c 6f 77 73 20 6f 70 74 69 6d 69 7a 61   allows optimiza
2f260 74 69 6f 6e 73 3a 20 28 61 29 20 77 68 65 6e 20  tions: (a) when 
2f270 50 34 3d 3d 30 20 74 68 65 72 65 20 69 73 20 6e  P4==0 there is n
2f280 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 0a 2a  o need to test.*
2f290 2a 20 74 68 65 20 72 6f 77 73 65 74 20 6f 62 6a  * the rowset obj
2f2a0 65 63 74 20 66 6f 72 20 50 33 2c 20 61 73 20 69  ect for P3, as i
2f2b0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
2f2c0 6e 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 69  not to contain i
2f2d0 74 2c 0a 2a 2a 20 28 62 29 20 77 68 65 6e 20 50  t,.** (b) when P
2f2e0 34 3d 3d 2d 31 20 74 68 65 72 65 20 69 73 20 6e  4==-1 there is n
2f2f0 6f 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74  o need to insert
2f300 20 74 68 65 20 76 61 6c 75 65 2c 20 61 73 20 69   the value, as i
2f310 74 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20  t will.** never 
2f320 62 65 20 74 65 73 74 65 64 20 66 6f 72 2c 20 61  be tested for, a
2f330 6e 64 20 28 63 29 20 77 68 65 6e 20 61 20 76 61  nd (c) when a va
2f340 6c 75 65 20 74 68 61 74 20 69 73 20 70 61 72 74  lue that is part
2f350 20 6f 66 20 73 65 74 20 58 20 69 73 0a 2a 2a 20   of set X is.** 
2f360 69 6e 73 65 72 74 65 64 2c 20 74 68 65 72 65 20  inserted, there 
2f370 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
2f380 61 72 63 68 20 74 6f 20 73 65 65 20 69 66 20 74  arch to see if t
2f390 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 77 61  he same value wa
2f3a0 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
2f3b0 69 6e 73 65 72 74 65 64 20 61 73 20 70 61 72 74  inserted as part
2f3c0 20 6f 66 20 73 65 74 20 58 20 28 6f 6e 6c 79 20   of set X (only 
2f3d0 69 66 20 69 74 20 77 61 73 20 70 72 65 76 69 6f  if it was previo
2f3e0 75 73 6c 79 0a 2a 2a 20 69 6e 73 65 72 74 65 64  usly.** inserted
2f3f0 20 61 73 20 70 61 72 74 20 6f 66 20 73 6f 6d 65   as part of some
2f400 20 6f 74 68 65 72 20 73 65 74 29 2e 0a 2a 2f 0a   other set)..*/.
2f410 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 54 65  case OP_RowSetTe
2f420 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  st: {           
2f430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
2f440 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20  p, in1, in3 */. 
2f450 20 69 6e 74 20 69 53 65 74 3b 0a 20 20 69 6e 74   int iSet;.  int
2f460 20 65 78 69 73 74 73 3b 0a 0a 20 20 70 49 6e 31   exists;..  pIn1
2f470 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
2f480 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  ];.  pIn3 = &aMe
2f490 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 53  m[pOp->p3];.  iS
2f4a0 65 74 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  et = pOp->p4.i;.
2f4b0 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e    assert( pIn3->
2f4c0 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
2f4d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
2f4e0 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  is anything othe
2f4f0 72 20 74 68 61 6e 20 61 20 72 6f 77 73 65 74 20  r than a rowset 
2f500 6f 62 6a 65 63 74 20 69 6e 20 6d 65 6d 6f 72 79  object in memory
2f510 20 63 65 6c 6c 20 50 31 2c 0a 20 20 2a 2a 20 64   cell P1,.  ** d
2f520 65 6c 65 74 65 20 69 74 20 6e 6f 77 20 61 6e 64  elete it now and
2f530 20 69 6e 69 74 69 61 6c 69 7a 65 20 50 31 20 77   initialize P1 w
2f540 69 74 68 20 61 6e 20 65 6d 70 74 79 20 72 6f 77  ith an empty row
2f550 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  set.  */.  if( (
2f560 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
2f570 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a  M_RowSet)==0 ){.
2f580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
2f590 65 6d 53 65 74 52 6f 77 53 65 74 28 70 49 6e 31  emSetRowSet(pIn1
2f5a0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 31  );.    if( (pIn1
2f5b0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
2f5c0 77 53 65 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20  wSet)==0 ) goto 
2f5d0 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 61  no_mem;.  }..  a
2f5e0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
2f5f0 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a  pe==P4_INT32 );.
2f600 20 20 61 73 73 65 72 74 28 20 69 53 65 74 3d 3d    assert( iSet==
2f610 2d 31 20 7c 7c 20 69 53 65 74 3e 3d 30 20 29 3b  -1 || iSet>=0 );
2f620 0a 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20  .  if( iSet ){. 
2f630 20 20 20 65 78 69 73 74 73 20 3d 20 73 71 6c 69     exists = sqli
2f640 74 65 33 52 6f 77 53 65 74 54 65 73 74 28 70 49  te3RowSetTest(pI
2f650 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 69  n1->u.pRowSet, i
2f660 53 65 74 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b  Set, pIn3->u.i);
2f670 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
2f680 61 6b 65 6e 28 65 78 69 73 74 73 21 3d 30 2c 32  aken(exists!=0,2
2f690 29 3b 0a 20 20 20 20 69 66 28 20 65 78 69 73 74  );.    if( exist
2f6a0 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  s ) goto jump_to
2f6b0 5f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _p2;.  }.  if( i
2f6c0 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  Set>=0 ){.    sq
2f6d0 6c 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72  lite3RowSetInser
2f6e0 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65  t(pIn1->u.pRowSe
2f6f0 74 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20  t, pIn3->u.i);. 
2f700 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a   }.  break;.}...
2f710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f720 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20  MIT_TRIGGER../* 
2f730 4f 70 63 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20  Opcode: Program 
2f740 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
2f750 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65  *.** Execute the
2f760 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
2f770 20 70 61 73 73 65 64 20 61 73 20 50 34 20 28 74   passed as P4 (t
2f780 79 70 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ype P4_SUBPROGRA
2f790 4d 29 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f  M). .**.** P1 co
2f7a0 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65  ntains the addre
2f7b0 73 73 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ss of the memory
2f7c0 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61   cell that conta
2f7d0 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 6d 65  ins the first me
2f7e0 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  mory .** cell in
2f7f0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 76 61 6c   an array of val
2f800 75 65 73 20 75 73 65 64 20 61 73 20 61 72 67 75  ues used as argu
2f810 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 73 75 62  ments to the sub
2f820 2d 70 72 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a  -program. P2 .**
2f830 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64   contains the ad
2f840 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
2f850 20 69 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   if the sub-prog
2f860 72 61 6d 20 74 68 72 6f 77 73 20 61 6e 20 49 47  ram throws an IG
2f870 4e 4f 52 45 20 0a 2a 2a 20 65 78 63 65 70 74 69  NORE .** excepti
2f880 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 52 41 49  on using the RAI
2f890 53 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52  SE() function. R
2f8a0 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61  egister P3 conta
2f8b0 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ins the address 
2f8c0 0a 2a 2a 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  .** of a memory 
2f8d0 63 65 6c 6c 20 69 6e 20 74 68 69 73 20 28 74 68  cell in this (th
2f8e0 65 20 70 61 72 65 6e 74 29 20 56 4d 20 74 68 61  e parent) VM tha
2f8f0 74 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  t is used to all
2f900 6f 63 61 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65  ocate the .** me
2f910 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 62 79  mory required by
2f920 20 74 68 65 20 73 75 62 2d 76 64 62 65 20 61 74   the sub-vdbe at
2f930 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20   runtime..**.** 
2f940 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
2f950 74 6f 20 74 68 65 20 56 4d 20 63 6f 6e 74 61 69  to the VM contai
2f960 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72  ning the trigger
2f970 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
2f980 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P5 is non-zer
2f990 6f 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69 76  o, then recursiv
2f9a0 65 20 70 72 6f 67 72 61 6d 20 69 6e 76 6f 63 61  e program invoca
2f9b0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2e  tion is enabled.
2f9c0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67  .*/.case OP_Prog
2f9d0 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ram: {        /*
2f9e0 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e   jump */.  int n
2f9f0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
2fa00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2fa10 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
2fa20 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d   for sub-program
2fa30 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fa50 20 42 79 74 65 73 20 6f 66 20 72 75 6e 74 69 6d   Bytes of runtim
2fa60 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
2fa70 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72 61 6d   for sub-program
2fa80 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20   */.  Mem *pRt; 
2fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2faa0 20 52 65 67 69 73 74 65 72 20 74 6f 20 61 6c 6c   Register to all
2fab0 6f 63 61 74 65 20 72 75 6e 74 69 6d 65 20 73 70  ocate runtime sp
2fac0 61 63 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ace */.  Mem *pM
2fad0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
2fae0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
2faf0 61 74 65 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f  ate through memo
2fb00 72 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65  ry cells */.  Me
2fb10 6d 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  m *pEnd;        
2fb20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65        /* Last me
2fb30 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77  mory cell in new
2fb40 20 61 72 72 61 79 20 2a 2f 0a 20 20 56 64 62 65   array */.  Vdbe
2fb50 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20  Frame *pFrame;  
2fb60 20 20 20 20 2f 2a 20 4e 65 77 20 76 64 62 65 20      /* New vdbe 
2fb70 66 72 61 6d 65 20 74 6f 20 65 78 65 63 75 74 65  frame to execute
2fb80 20 69 6e 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   in */.  SubProg
2fb90 72 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20  ram *pProgram;  
2fba0 20 2f 2a 20 53 75 62 2d 70 72 6f 67 72 61 6d 20   /* Sub-program 
2fbb0 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20  to execute */.  
2fbc0 76 6f 69 64 20 2a 74 3b 20 20 20 20 20 20 20 20  void *t;        
2fbd0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e          /* Token
2fbe0 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74 72 69   identifying tri
2fbf0 67 67 65 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67  gger */..  pProg
2fc00 72 61 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ram = pOp->p4.pP
2fc10 72 6f 67 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20  rogram;.  pRt = 
2fc20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
2fc30 20 20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72    assert( pProgr
2fc40 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 0a  am->nOp>0 );.  .
2fc50 20 20 2f 2a 20 49 66 20 74 68 65 20 70 35 20 66    /* If the p5 f
2fc60 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
2fc70 65 6e 20 72 65 63 75 72 73 69 76 65 20 69 6e 76  en recursive inv
2fc80 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67  ocation of trigg
2fc90 65 72 73 20 69 73 20 0a 20 20 2a 2a 20 64 69 73  ers is .  ** dis
2fca0 61 62 6c 65 64 20 66 6f 72 20 62 61 63 6b 77 61  abled for backwa
2fcb0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2fcc0 79 20 28 70 35 20 69 73 20 73 65 74 20 69 66 20  y (p5 is set if 
2fcd0 74 68 69 73 20 73 75 62 2d 70 72 6f 67 72 61 6d  this sub-program
2fce0 0a 20 20 2a 2a 20 69 73 20 72 65 61 6c 6c 79 20  .  ** is really 
2fcf0 61 20 74 72 69 67 67 65 72 2c 20 6e 6f 74 20 61  a trigger, not a
2fd00 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74   foreign key act
2fd10 69 6f 6e 2c 20 61 6e 64 20 74 68 65 20 66 6c 61  ion, and the fla
2fd20 67 20 73 65 74 0a 20 20 2a 2a 20 61 6e 64 20 63  g set.  ** and c
2fd30 6c 65 61 72 65 64 20 62 79 20 74 68 65 20 22 50  leared by the "P
2fd40 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f  RAGMA recursive_
2fd50 74 72 69 67 67 65 72 73 22 20 63 6f 6d 6d 61 6e  triggers" comman
2fd60 64 20 69 73 20 63 6c 65 61 72 29 2e 0a 20 20 2a  d is clear)..  *
2fd70 2a 20 0a 20 20 2a 2a 20 49 74 20 69 73 20 72 65  * .  ** It is re
2fd80 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61 74 69  cursive invocati
2fd90 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73 2c 20  on of triggers, 
2fda0 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65 6c  at the SQL level
2fdb0 2c 20 74 68 61 74 20 69 73 20 0a 20 20 2a 2a 20  , that is .  ** 
2fdc0 64 69 73 61 62 6c 65 64 2e 20 49 6e 20 73 6f 6d  disabled. In som
2fdd0 65 20 63 61 73 65 73 20 61 20 73 69 6e 67 6c 65  e cases a single
2fde0 20 74 72 69 67 67 65 72 20 6d 61 79 20 67 65 6e   trigger may gen
2fdf0 65 72 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20  erate more than 
2fe00 6f 6e 65 20 0a 20 20 2a 2a 20 53 75 62 50 72 6f  one .  ** SubPro
2fe10 67 72 61 6d 20 28 69 66 20 74 68 65 20 74 72 69  gram (if the tri
2fe20 67 67 65 72 20 6d 61 79 20 62 65 20 65 78 65 63  gger may be exec
2fe30 75 74 65 64 20 77 69 74 68 20 6d 6f 72 65 20 74  uted with more t
2fe40 68 61 6e 20 6f 6e 65 20 64 69 66 66 65 72 65 6e  han one differen
2fe50 74 20 0a 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c  t .  ** ON CONFL
2fe60 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 29 2e 20  ICT algorithm). 
2fe70 53 75 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63  SubProgram struc
2fe80 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
2fe90 20 77 69 74 68 20 61 0a 20 20 2a 2a 20 73 69 6e   with a.  ** sin
2fea0 67 6c 65 20 74 72 69 67 67 65 72 20 61 6c 6c 20  gle trigger all 
2feb0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76 61  have the same va
2fec0 6c 75 65 20 66 6f 72 20 74 68 65 20 53 75 62 50  lue for the SubP
2fed0 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e 20 0a 20 20  rogram.token .  
2fee0 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
2fef0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29  .  if( pOp->p5 )
2ff00 7b 0a 20 20 20 20 74 20 3d 20 70 50 72 6f 67 72  {.    t = pProgr
2ff10 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 66  am->token;.    f
2ff20 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
2ff30 61 6d 65 3b 20 70 46 72 61 6d 65 20 26 26 20 70  ame; pFrame && p
2ff40 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 21 3d 74 3b  Frame->token!=t;
2ff50 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
2ff60 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66  pParent);.    if
2ff70 28 20 70 46 72 61 6d 65 20 29 20 62 72 65 61 6b  ( pFrame ) break
2ff80 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
2ff90 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e 61 4c 69 6d  nFrame>=db->aLim
2ffa0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
2ffb0 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d 20 29  TRIGGER_DEPTH] )
2ffc0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2ffd0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
2ffe0 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
2fff0 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c   "too many level
30000 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63  s of trigger rec
30010 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f  ursion");.    go
30020 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
30030 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  error;.  }..  /*
30040 20 52 65 67 69 73 74 65 72 20 70 52 74 20 69 73   Register pRt is
30050 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
30060 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  he memory requir
30070 65 64 20 74 6f 20 73 61 76 65 20 74 68 65 20 73  ed to save the s
30080 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
30090 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d   current program
300a0 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  , and the memory
300b0 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75 6e   required at run
300c0 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74 65 0a  time to execute.
300d0 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72    ** the trigger
300e0 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74 68 69   program. If thi
300f0 73 20 74 72 69 67 67 65 72 20 68 61 73 20 62 65  s trigger has be
30100 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72 65 2c  en fired before,
30110 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20   then pRt .  ** 
30120 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  is already alloc
30130 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
30140 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e 69 74   it must be init
30150 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69  ialized.  */.  i
30160 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d  f( (pRt->flags&M
30170 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20 29 7b 0a  EM_Frame)==0 ){.
30180 20 20 20 20 2f 2a 20 53 75 62 50 72 6f 67 72 61      /* SubProgra
30190 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20 74 6f  m.nMem is set to
301a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
301b0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73 65 64  emory cells used
301c0 20 62 79 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   by the .    ** 
301d0 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69  program stored i
301e0 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70  n SubProgram.aOp
301f0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65  . As well as the
30200 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20  se, one memory. 
30210 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65     ** cell is re
30220 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
30230 63 75 72 73 6f 72 20 75 73 65 64 20 62 79 20 74  cursor used by t
30240 68 65 20 70 72 6f 67 72 61 6d 2e 20 53 65 74 20  he program. Set 
30250 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
30260 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20  iable nMem (and 
30270 6c 61 74 65 72 2c 20 56 64 62 65 46 72 61 6d 65  later, VdbeFrame
30280 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74  .nChildMem) to t
30290 68 69 73 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a  his value..    *
302a0 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72  /.    nMem = pPr
302b0 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50  ogram->nMem + pP
302c0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20  rogram->nCsr;.  
302d0 20 20 61 73 73 65 72 74 28 20 6e 4d 65 6d 3e 30    assert( nMem>0
302e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   );.    if( pPro
302f0 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30 20 29 20  gram->nCsr==0 ) 
30300 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 6e 42 79 74  nMem++;.    nByt
30310 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
30320 66 28 56 64 62 65 46 72 61 6d 65 29 29 0a 20 20  f(VdbeFrame)).  
30330 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 6e 4d              + nM
30340 65 6d 20 2a 20 73 69 7a 65 6f 66 28 4d 65 6d 29  em * sizeof(Mem)
30350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b  .              +
30360 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 20   pProgram->nCsr 
30370 2a 20 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  * sizeof(VdbeCur
30380 73 6f 72 20 2a 29 3b 0a 20 20 20 20 70 46 72 61  sor *);.    pFra
30390 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
303a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
303b0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 46  te);.    if( !pF
303c0 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 67 6f  rame ){.      go
303d0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
303e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
303f0 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 74 29 3b  MemRelease(pRt);
30400 0a 20 20 20 20 70 52 74 2d 3e 66 6c 61 67 73 20  .    pRt->flags 
30410 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b 0a 20 20 20  = MEM_Frame;.   
30420 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65 20 3d   pRt->u.pFrame =
30430 20 70 46 72 61 6d 65 3b 0a 0a 20 20 20 20 70 46   pFrame;..    pF
30440 72 61 6d 65 2d 3e 76 20 3d 20 70 3b 0a 20 20 20  rame->v = p;.   
30450 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d   pFrame->nChildM
30460 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 70  em = nMem;.    p
30470 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72  Frame->nChildCsr
30480 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73   = pProgram->nCs
30490 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 70  r;.    pFrame->p
304a0 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  c = (int)(pOp - 
304b0 61 4f 70 29 3b 0a 20 20 20 20 70 46 72 61 6d 65  aOp);.    pFrame
304c0 2d 3e 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d  ->aMem = p->aMem
304d0 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4d  ;.    pFrame->nM
304e0 65 6d 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20  em = p->nMem;.  
304f0 20 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 20    pFrame->apCsr 
30500 3d 20 70 2d 3e 61 70 43 73 72 3b 0a 20 20 20 20  = p->apCsr;.    
30510 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 20  pFrame->nCursor 
30520 3d 20 70 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  = p->nCursor;.  
30530 20 20 70 46 72 61 6d 65 2d 3e 61 4f 70 20 3d 20    pFrame->aOp = 
30540 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 70 46 72 61  p->aOp;.    pFra
30550 6d 65 2d 3e 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  me->nOp = p->nOp
30560 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 74 6f  ;.    pFrame->to
30570 6b 65 6e 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  ken = pProgram->
30580 74 6f 6b 65 6e 3b 0a 23 69 66 64 65 66 20 53 51  token;.#ifdef SQ
30590 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
305a0 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20  _SCANSTATUS.    
305b0 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 20 3d  pFrame->anExec =
305c0 20 70 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64   p->anExec;.#end
305d0 69 66 0a 0a 20 20 20 20 70 45 6e 64 20 3d 20 26  if..    pEnd = &
305e0 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72  VdbeFrameMem(pFr
305f0 61 6d 65 29 5b 70 46 72 61 6d 65 2d 3e 6e 43 68  ame)[pFrame->nCh
30600 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20 20 66 6f 72  ildMem];.    for
30610 28 70 4d 65 6d 3d 56 64 62 65 46 72 61 6d 65 4d  (pMem=VdbeFrameM
30620 65 6d 28 70 46 72 61 6d 65 29 3b 20 70 4d 65 6d  em(pFrame); pMem
30630 21 3d 70 45 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b  !=pEnd; pMem++){
30640 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
30650 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
30660 65 64 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ed;.      pMem->
30670 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
30680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 72 61   }else{.    pFra
30690 6d 65 20 3d 20 70 52 74 2d 3e 75 2e 70 46 72 61  me = pRt->u.pFra
306a0 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  me;.    assert( 
306b0 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 70  pProgram->nMem+p
306c0 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70  Program->nCsr==p
306d0 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Frame->nChildMem
306e0 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50   .        || (pP
306f0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30 20  rogram->nCsr==0 
30700 26 26 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65  && pProgram->nMe
30710 6d 2b 31 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68  m+1==pFrame->nCh
30720 69 6c 64 4d 65 6d 29 20 29 3b 0a 20 20 20 20 61  ildMem) );.    a
30730 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
30740 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e  >nCsr==pFrame->n
30750 43 68 69 6c 64 43 73 72 20 29 3b 0a 20 20 20 20  ChildCsr );.    
30760 61 73 73 65 72 74 28 20 28 69 6e 74 29 28 70 4f  assert( (int)(pO
30770 70 20 2d 20 61 4f 70 29 3d 3d 70 46 72 61 6d 65  p - aOp)==pFrame
30780 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 70  ->pc );.  }..  p
30790 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 70 46  ->nFrame++;.  pF
307a0 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  rame->pParent = 
307b0 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 46 72  p->pFrame;.  pFr
307c0 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  ame->lastRowid =
307d0 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 70 46   lastRowid;.  pF
307e0 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  rame->nChange = 
307f0 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70 46  p->nChange;.  pF
30800 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 20  rame->nDbChange 
30810 3d 20 70 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65  = p->db->nChange
30820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 61  ;.  assert( pFra
30830 6d 65 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20  me->pAuxData==0 
30840 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  );.  pFrame->pAu
30850 78 44 61 74 61 20 3d 20 70 2d 3e 70 41 75 78 44  xData = p->pAuxD
30860 61 74 61 3b 0a 20 20 70 2d 3e 70 41 75 78 44 61  ata;.  p->pAuxDa
30870 74 61 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 68  ta = 0;.  p->nCh
30880 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  ange = 0;.  p->p
30890 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a  Frame = pFrame;.
308a0 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d    p->aMem = aMem
308b0 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
308c0 70 46 72 61 6d 65 29 3b 0a 20 20 70 2d 3e 6e 4d  pFrame);.  p->nM
308d0 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  em = pFrame->nCh
308e0 69 6c 64 4d 65 6d 3b 0a 20 20 70 2d 3e 6e 43 75  ildMem;.  p->nCu
308f0 72 73 6f 72 20 3d 20 28 75 31 36 29 70 46 72 61  rsor = (u16)pFra
30900 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 0a 20  me->nChildCsr;. 
30910 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 56 64 62   p->apCsr = (Vdb
30920 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
30930 5b 70 2d 3e 6e 4d 65 6d 5d 3b 0a 20 20 70 2d 3e  [p->nMem];.  p->
30940 61 4f 70 20 3d 20 61 4f 70 20 3d 20 70 50 72 6f  aOp = aOp = pPro
30950 67 72 61 6d 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e  gram->aOp;.  p->
30960 6e 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  nOp = pProgram->
30970 6e 4f 70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  nOp;.#ifdef SQLI
30980 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
30990 43 41 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61  CANSTATUS.  p->a
309a0 6e 45 78 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  nExec = 0;.#endi
309b0 66 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 2d  f.  pOp = &aOp[-
309c0 31 5d 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  1];..  break;.}.
309d0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61  ./* Opcode: Para
309e0 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  m P1 P2 * * *.**
309f0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
30a00 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65  is only ever pre
30a10 73 65 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67  sent in sub-prog
30a20 72 61 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20  rams called via 
30a30 74 68 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72  the .** OP_Progr
30a40 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  am instruction. 
30a50 43 6f 70 79 20 61 20 76 61 6c 75 65 20 63 75 72  Copy a value cur
30a60 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
30a70 20 61 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65   a memory .** ce
30a80 6c 6c 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e  ll of the callin
30a90 67 20 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65  g (parent) frame
30aa0 20 74 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74   to cell P2 in t
30ab0 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
30ac0 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
30ad0 61 63 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ace. This is use
30ae0 64 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f  d by trigger pro
30af0 67 72 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20  grams to access 
30b00 74 68 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e  the new.* .** an
30b10 64 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a  d old.* values..
30b20 2a 2a 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73  **.** The addres
30b30 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e  s of the cell in
30b40 20 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d   the parent fram
30b50 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
30b60 62 79 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65  by adding.** the
30b70 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
30b80 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
30b90 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
30ba0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
30bb0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50  .** calling OP_P
30bc0 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69  rogram instructi
30bd0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  on..*/.case OP_P
30be0 61 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20  aram: {         
30bf0 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56    /* out2 */.  V
30c00 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
30c10 3b 0a 20 20 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20  ;.  Mem *pIn;.  
30c20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
30c30 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
30c40 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72   pFrame = p->pFr
30c50 61 6d 65 3b 0a 20 20 70 49 6e 20 3d 20 26 70 46  ame;.  pIn = &pF
30c60 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  rame->aMem[pOp->
30c70 70 31 20 2b 20 70 46 72 61 6d 65 2d 3e 61 4f 70  p1 + pFrame->aOp
30c80 5b 70 46 72 61 6d 65 2d 3e 70 63 5d 2e 70 31 5d  [pFrame->pc].p1]
30c90 3b 20 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64  ;   .  sqlite3Vd
30ca0 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
30cb0 28 70 4f 75 74 2c 20 70 49 6e 2c 20 4d 45 4d 5f  (pOut, pIn, MEM_
30cc0 45 70 68 65 6d 29 3b 0a 20 20 62 72 65 61 6b 3b  Ephem);.  break;
30cd0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69  .}..#endif /* #i
30ce0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30cf0 54 5f 54 52 49 47 47 45 52 20 2a 2f 0a 0a 23 69  T_TRIGGER */..#i
30d00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30d10 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 2f 2a  T_FOREIGN_KEY./*
30d20 20 4f 70 63 6f 64 65 3a 20 46 6b 43 6f 75 6e 74   Opcode: FkCount
30d30 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  er P1 P2 * * *.*
30d40 2a 20 53 79 6e 6f 70 73 69 73 3a 20 66 6b 63 74  * Synopsis: fkct
30d50 72 5b 50 31 5d 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20  r[P1]+=P2.**.** 
30d60 49 6e 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e  Increment a "con
30d70 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22  straint counter"
30d80 20 62 79 20 50 32 20 28 50 32 20 6d 61 79 20 62   by P2 (P2 may b
30d90 65 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f  e negative or po
30da0 73 69 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50  sitive)..** If P
30db0 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  1 is non-zero, t
30dc0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73  he database cons
30dd0 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69  traint counter i
30de0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a  s incremented .*
30df0 2a 20 28 64 65 66 65 72 72 65 64 20 66 6f 72 65  * (deferred fore
30e00 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
30e10 6e 74 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  nts). Otherwise,
30e20 20 69 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20   if P1 is zero, 
30e30 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
30e40 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63  t counter is inc
30e50 72 65 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69  remented (immedi
30e60 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
30e70 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f  constraints)..*/
30e80 0a 63 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74  .case OP_FkCount
30e90 65 72 3a 20 7b 0a 20 20 69 66 28 20 64 62 2d 3e  er: {.  if( db->
30ea0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  flags & SQLITE_D
30eb0 65 66 65 72 46 4b 73 20 29 7b 0a 20 20 20 20 64  eferFKs ){.    d
30ec0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
30ed0 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  ons += pOp->p2;.
30ee0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
30ef0 3e 70 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >p1 ){.    db->n
30f00 44 65 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20  DeferredCons += 
30f10 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65  pOp->p2;.  }else
30f20 7b 0a 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73  {.    p->nFkCons
30f30 74 72 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70  traint += pOp->p
30f40 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
30f50 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b  }../* Opcode: Fk
30f60 49 66 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a  IfZero P1 P2 * *
30f70 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
30f80 69 66 20 66 6b 63 74 72 5b 50 31 5d 3d 3d 30 20  if fkctr[P1]==0 
30f90 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68  goto P2.**.** Th
30fa0 69 73 20 6f 70 63 6f 64 65 20 74 65 73 74 73 20  is opcode tests 
30fb0 69 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  if a foreign key
30fc0 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e   constraint-coun
30fd0 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
30fe0 20 7a 65 72 6f 2e 0a 2a 2a 20 49 66 20 73 6f 2c   zero..** If so,
30ff0 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
31000 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77 69  tion P2. Otherwi
31010 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  se, fall through
31020 20 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a   to the next .**
31030 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
31040 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e  .** If P1 is non
31050 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
31060 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
31070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
31080 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72  nstraint-counter
31090 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 28 74 68 65  .** is zero (the
310a0 20 6f 6e 65 20 74 68 61 74 20 63 6f 75 6e 74 73   one that counts
310b0 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
310c0 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29  aint violations)
310d0 2e 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 7a 65  . If P1 is.** ze
310e0 72 6f 2c 20 74 68 65 20 6a 75 6d 70 20 69 73 20  ro, the jump is 
310f0 74 61 6b 65 6e 20 69 66 20 74 68 65 20 73 74 61  taken if the sta
31100 74 65 6d 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  tement constrain
31110 74 2d 63 6f 75 6e 74 65 72 20 69 73 20 7a 65 72  t-counter is zer
31120 6f 0a 2a 2a 20 28 69 6d 6d 65 64 69 61 74 65 20  o.** (immediate 
31130 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
31140 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
31150 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46  s)..*/.case OP_F
31160 6b 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20  kIfZero: {      
31170 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
31180 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  if( pOp->p1 ){. 
31190 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
311a0 65 6e 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  en(db->nDeferred
311b0 43 6f 6e 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e  Cons==0 && db->n
311c0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d  DeferredImmCons=
311d0 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20  =0, 2);.    if( 
311e0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
311f0 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66  s==0 && db->nDef
31200 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20  erredImmCons==0 
31210 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
31220 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
31230 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
31240 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
31250 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65  ==0 && db->nDefe
31260 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20  rredImmCons==0, 
31270 32 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  2);.    if( p->n
31280 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20  FkConstraint==0 
31290 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
312a0 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74  ImmCons==0 ) got
312b0 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
312c0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
312d0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
312e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
312f0 47 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64  GN_KEY */..#ifnd
31300 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31310 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20  UTOINCREMENT./* 
31320 4f 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50  Opcode: MemMax P
31330 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
31340 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 6d 61  nopsis: r[P1]=ma
31350 78 28 72 5b 50 31 5d 2c 72 5b 50 32 5d 29 0a 2a  x(r[P1],r[P2]).*
31360 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 72 65 67  *.** P1 is a reg
31370 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 6f 6f  ister in the roo
31380 74 20 66 72 61 6d 65 20 6f 66 20 74 68 69 73 20  t frame of this 
31390 56 4d 20 28 74 68 65 20 72 6f 6f 74 20 66 72 61  VM (the root fra
313a0 6d 65 20 69 73 0a 2a 2a 20 64 69 66 66 65 72 65  me is.** differe
313b0 6e 74 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  nt from the curr
313c0 65 6e 74 20 66 72 61 6d 65 20 69 66 20 74 68 69  ent frame if thi
313d0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
313e0 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 0a   being executed.
313f0 2a 2a 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d  ** within a sub-
31400 70 72 6f 67 72 61 6d 29 2e 20 53 65 74 20 74 68  program). Set th
31410 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
31420 74 65 72 20 50 31 20 74 6f 20 74 68 65 20 6d 61  ter P1 to the ma
31430 78 69 6d 75 6d 20 6f 66 20 0a 2a 2a 20 69 74 73  ximum of .** its
31440 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
31450 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  nd the value in 
31460 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
31470 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
31480 69 6f 6e 20 74 68 72 6f 77 73 20 61 6e 20 65 72  ion throws an er
31490 72 6f 72 20 69 66 20 74 68 65 20 6d 65 6d 6f 72  ror if the memor
314a0 79 20 63 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e  y cell is not in
314b0 69 74 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  itially.** an in
314c0 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f  teger..*/.case O
314d0 50 5f 4d 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20  P_MemMax: {     
314e0 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
314f0 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
31500 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  ;.  if( p->pFram
31510 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 46 72  e ){.    for(pFr
31520 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
31530 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
31540 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
31550 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 70 49 6e  Parent);.    pIn
31560 31 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65  1 = &pFrame->aMe
31570 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65  m[pOp->p1];.  }e
31580 6c 73 65 7b 0a 20 20 20 20 70 49 6e 31 20 3d 20  lse{.    pIn1 = 
31590 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
315a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65    }.  assert( me
315b0 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29  mIsValid(pIn1) )
315c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
315d0 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
315e0 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1);.  pIn2 = &aM
315f0 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73  em[pOp->p2];.  s
31600 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
31610 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20  egerify(pIn2);. 
31620 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70   if( pIn1->u.i<p
31630 49 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70  In2->u.i){.    p
31640 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d  In1->u.i = pIn2-
31650 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61  >u.i;.  }.  brea
31660 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
31670 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
31680 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20  NCREMENT */../* 
31690 4f 70 63 6f 64 65 3a 20 49 66 50 6f 73 20 50 31  Opcode: IfPos P1
316a0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
316b0 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d  nopsis: if r[P1]
316c0 3e 30 20 74 68 65 6e 20 72 5b 50 31 5d 2d 3d 50  >0 then r[P1]-=P
316d0 33 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a  3, goto P2.**.**
316e0 20 52 65 67 69 73 74 65 72 20 50 31 20 6d 75 73   Register P1 mus
316f0 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
31700 65 67 65 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20  eger..** If the 
31710 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
31720 72 20 50 31 20 69 73 20 31 20 6f 72 20 67 72 65  r P1 is 1 or gre
31730 61 74 65 72 2c 20 73 75 62 74 72 61 63 74 20 50  ater, subtract P
31740 33 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 76 61  3 from the.** va
31750 6c 75 65 20 69 6e 20 50 31 20 61 6e 64 20 6a 75  lue in P1 and ju
31760 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
31770 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  If the initial v
31780 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
31790 20 50 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e   P1 is less than
317a0 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20   1, then the.** 
317b0 76 61 6c 75 65 20 69 73 20 75 6e 63 68 61 6e 67  value is unchang
317c0 65 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 70  ed and control p
317d0 61 73 73 65 73 20 74 68 72 6f 75 67 68 20 74 6f  asses through to
317e0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
317f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
31800 50 5f 49 66 50 6f 73 3a 20 7b 20 20 20 20 20 20  P_IfPos: {      
31810 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
31820 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
31830 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
31840 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
31850 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64  &MEM_Int );.  Vd
31860 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 70  beBranchTaken( p
31870 49 6e 31 2d 3e 75 2e 69 3e 30 2c 20 32 29 3b 0a  In1->u.i>0, 2);.
31880 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e    if( pIn1->u.i>
31890 30 20 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75  0 ){.    pIn1->u
318a0 2e 69 20 2d 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  .i -= pOp->p3;. 
318b0 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
318c0 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
318d0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
318e0 66 66 73 65 74 4c 69 6d 69 74 20 50 31 20 50 32  ffsetLimit P1 P2
318f0 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
31900 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20  sis: if r[P1]>0 
31910 74 68 65 6e 20 72 5b 50 32 5d 3d 72 5b 50 31 5d  then r[P2]=r[P1]
31920 2b 6d 61 78 28 30 2c 72 5b 50 33 5d 29 20 65 6c  +max(0,r[P3]) el
31930 73 65 20 72 5b 50 32 5d 3d 28 2d 31 29 0a 2a 2a  se r[P2]=(-1).**
31940 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
31950 70 65 72 66 6f 72 6d 73 20 61 20 63 6f 6d 6d 6f  performs a commo
31960 6e 6c 79 20 75 73 65 64 20 63 6f 6d 70 75 74 61  nly used computa
31970 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
31980 77 69 74 68 0a 2a 2a 20 4c 49 4d 49 54 20 61 6e  with.** LIMIT an
31990 64 20 4f 46 46 53 45 54 20 70 72 6f 63 65 73 73  d OFFSET process
319a0 2e 20 20 72 5b 50 31 5d 20 68 6f 6c 64 73 20 74  .  r[P1] holds t
319b0 68 65 20 6c 69 6d 69 74 20 63 6f 75 6e 74 65 72  he limit counter
319c0 2e 20 20 72 5b 50 33 5d 0a 2a 2a 20 68 6f 6c 64  .  r[P3].** hold
319d0 73 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  s the offset cou
319e0 6e 74 65 72 2e 20 20 54 68 65 20 6f 70 63 6f 64  nter.  The opcod
319f0 65 20 63 6f 6d 70 75 74 65 73 20 74 68 65 20 63  e computes the c
31a00 6f 6d 62 69 6e 65 64 20 76 61 6c 75 65 0a 2a 2a  ombined value.**
31a10 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   of the LIMIT an
31a20 64 20 4f 46 46 53 45 54 20 61 6e 64 20 73 74 6f  d OFFSET and sto
31a30 72 65 73 20 74 68 61 74 20 76 61 6c 75 65 20 69  res that value i
31a40 6e 20 72 5b 50 32 5d 2e 20 20 54 68 65 20 72 5b  n r[P2].  The r[
31a50 50 32 5d 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 6d  P2].** value com
31a60 70 75 74 65 64 20 69 73 20 74 68 65 20 74 6f 74  puted is the tot
31a70 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
31a80 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
31a90 20 74 6f 20 62 65 0a 2a 2a 20 76 69 73 69 74 65   to be.** visite
31aa0 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  d in order to co
31ab0 6d 70 6c 65 74 65 20 74 68 65 20 71 75 65 72 79  mplete the query
31ac0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 5b 50 33 5d  ..**.** If r[P3]
31ad0 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
31ae0 74 69 76 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  tive, that means
31af0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 46 46   there is no OFF
31b00 53 45 54 0a 2a 2a 20 61 6e 64 20 72 5b 50 32 5d  SET.** and r[P2]
31b10 20 69 73 20 73 65 74 20 74 6f 20 62 65 20 74 68   is set to be th
31b20 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4c  e value of the L
31b30 49 4d 49 54 2c 20 72 5b 50 31 5d 2e 0a 2a 2a 0a  IMIT, r[P1]..**.
31b40 2a 2a 20 69 66 20 72 5b 50 31 5d 20 69 73 20 7a  ** if r[P1] is z
31b50 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c  ero or negative,
31b60 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72   that means ther
31b70 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 0a 2a 2a  e is no LIMIT.**
31b80 20 61 6e 64 20 72 5b 50 32 5d 20 69 73 20 73 65   and r[P2] is se
31b90 74 20 74 6f 20 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20  t to -1. .**.** 
31ba0 4f 74 68 65 72 77 69 73 65 2c 20 72 5b 50 32 5d  Otherwise, r[P2]
31bb0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
31bc0 75 6d 20 6f 66 20 72 5b 50 31 5d 20 61 6e 64 20  um of r[P1] and 
31bd0 72 5b 50 33 5d 2e 0a 2a 2f 0a 63 61 73 65 20 4f  r[P3]..*/.case O
31be0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 3a 20 7b  P_OffsetLimit: {
31bf0 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32      /* in1, out2
31c00 2c 20 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 31 20  , in3 */.  pIn1 
31c10 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
31c20 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ;.  pIn3 = &aMem
31c30 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4f 75  [pOp->p3];.  pOu
31c40 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
31c50 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73  se(p, pOp);.  as
31c60 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67  sert( pIn1->flag
31c70 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
31c80 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
31c90 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
31ca0 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
31cb0 70 49 6e 31 2d 3e 75 2e 69 3c 3d 30 20 3f 20 2d  pIn1->u.i<=0 ? -
31cc0 31 20 3a 20 70 49 6e 31 2d 3e 75 2e 69 2b 28 70  1 : pIn1->u.i+(p
31cd0 49 6e 33 2d 3e 75 2e 69 3e 30 3f 70 49 6e 33 2d  In3->u.i>0?pIn3-
31ce0 3e 75 2e 69 3a 30 29 3b 0a 20 20 62 72 65 61 6b  >u.i:0);.  break
31cf0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
31d00 49 66 4e 6f 74 5a 65 72 6f 20 50 31 20 50 32 20  IfNotZero P1 P2 
31d10 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
31d20 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d 30 20  is: if r[P1]!=0 
31d30 74 68 65 6e 20 72 5b 50 31 5d 2d 3d 50 33 2c 20  then r[P1]-=P3, 
31d40 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65  goto P2.**.** Re
31d50 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 63  gister P1 must c
31d60 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
31d70 72 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 74 65  r.  If the conte
31d80 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
31d90 31 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  1 is.** initiall
31da0 79 20 6e 6f 6e 7a 65 72 6f 2c 20 74 68 65 6e 20  y nonzero, then 
31db0 73 75 62 74 72 61 63 74 20 50 33 20 66 72 6f 6d  subtract P3 from
31dc0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
31dd0 67 69 73 74 65 72 20 50 31 20 61 6e 64 0a 2a 2a  gister P1 and.**
31de0 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 49 66   jump to P2.  If
31df0 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
31e00 69 6e 69 74 69 61 6c 6c 79 20 7a 65 72 6f 2c 20  initially zero, 
31e10 6c 65 61 76 65 20 69 74 20 75 6e 63 68 61 6e 67  leave it unchang
31e20 65 64 0a 2a 2a 20 61 6e 64 20 66 61 6c 6c 20 74  ed.** and fall t
31e30 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20  hrough..*/.case 
31e40 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 3a 20 7b 20  OP_IfNotZero: { 
31e50 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
31e60 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in1 */.  pIn1 = 
31e70 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
31e80 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
31e90 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
31ea0 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
31eb0 65 6e 28 70 49 6e 31 2d 3e 75 2e 69 3c 30 2c 20  en(pIn1->u.i<0, 
31ec0 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  2);.  if( pIn1->
31ed0 75 2e 69 20 29 7b 0a 20 20 20 20 20 70 49 6e 31  u.i ){.     pIn1
31ee0 2d 3e 75 2e 69 20 2d 3d 20 70 4f 70 2d 3e 70 33  ->u.i -= pOp->p3
31ef0 3b 0a 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ;.     goto jump
31f00 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
31f10 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
31f20 65 3a 20 44 65 63 72 4a 75 6d 70 5a 65 72 6f 20  e: DecrJumpZero 
31f30 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
31f40 79 6e 6f 70 73 69 73 3a 20 69 66 20 28 2d 2d 72  ynopsis: if (--r
31f50 5b 50 31 5d 29 3d 3d 30 20 67 6f 74 6f 20 50 32  [P1])==0 goto P2
31f60 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
31f70 50 31 20 6d 75 73 74 20 68 6f 6c 64 20 61 6e 20  P1 must hold an 
31f80 69 6e 74 65 67 65 72 2e 20 20 44 65 63 72 65 6d  integer.  Decrem
31f90 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ent the value in
31fa0 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20   register P1.** 
31fb0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 20  then jump to P2 
31fc0 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  if the new value
31fd0 20 69 73 20 65 78 61 63 74 6c 79 20 7a 65 72 6f   is exactly zero
31fe0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 63  ..*/.case OP_Dec
31ff0 72 4a 75 6d 70 5a 65 72 6f 3a 20 7b 20 20 20 20  rJumpZero: {    
32000 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
32010 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
32020 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
32030 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
32040 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 49  &MEM_Int );.  pI
32050 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 56 64 62  n1->u.i--;.  Vdb
32060 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 49 6e  eBranchTaken(pIn
32070 31 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a 20  1->u.i==0, 2);. 
32080 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3d 3d   if( pIn1->u.i==
32090 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  0 ) goto jump_to
320a0 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
320b0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67  ../* Opcode: Agg
320c0 53 74 65 70 30 20 2a 20 50 32 20 50 33 20 50 34  Step0 * P2 P3 P4
320d0 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
320e0 20 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74 65   accum=r[P3] ste
320f0 70 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a  p(r[P2@P5]).**.*
32100 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73 74  * Execute the st
32110 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ep function for 
32120 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
32130 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  he.** function h
32140 61 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73 2e  as P5 arguments.
32150 20 20 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74     P4 is a point
32160 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65  er to the FuncDe
32170 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  f.** structure t
32180 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
32190 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 67  e function.  Reg
321a0 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 0a  ister P3 is the.
321b0 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  ** accumulator..
321c0 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67  **.** The P5 arg
321d0 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e  uments are taken
321e0 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
321f0 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63  2 and its.** suc
32200 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20 4f  cessors..*/./* O
32210 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70 20 2a  pcode: AggStep *
32220 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
32230 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d  Synopsis: accum=
32240 72 5b 50 33 5d 20 73 74 65 70 28 72 5b 50 32 40  r[P3] step(r[P2@
32250 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75  P5]).**.** Execu
32260 74 65 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  te the step func
32270 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67 72  tion for an aggr
32280 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a 20 66  egate.  The.** f
32290 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35 20 61  unction has P5 a
322a0 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34 20 69  rguments.   P4 i
322b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
322c0 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  n sqlite3_contex
322d0 74 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  t.** object that
322e0 20 69 73 20 75 73 65 64 20 74 6f 20 72 75 6e 20   is used to run 
322f0 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52  the function.  R
32300 65 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a 2a  egister P3 is.**
32310 20 61 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61   as the accumula
32320 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  tor..**.** The P
32330 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  5 arguments are 
32340 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73  taken from regis
32350 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a 2a  ter P2 and its.*
32360 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2a  * successors..**
32370 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
32380 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 64  is initially cod
32390 65 64 20 61 73 20 4f 50 5f 41 67 67 53 74 65 70  ed as OP_AggStep
323a0 30 2e 20 20 4f 6e 20 66 69 72 73 74 20 65 76 61  0.  On first eva
323b0 6c 75 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  luation,.** the 
323c0 46 75 6e 63 44 65 66 20 73 74 6f 72 65 64 20 69  FuncDef stored i
323d0 6e 20 50 34 20 69 73 20 63 6f 6e 76 65 72 74 65  n P4 is converte
323e0 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65  d into an sqlite
323f0 33 5f 63 6f 6e 74 65 78 74 20 61 6e 64 0a 2a 2a  3_context and.**
32400 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 63   the opcode is c
32410 68 61 6e 67 65 64 2e 20 20 49 6e 20 74 68 69 73  hanged.  In this
32420 20 77 61 79 2c 20 74 68 65 20 69 6e 69 74 69 61   way, the initia
32430 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
32440 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ** sqlite3_conte
32450 78 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  xt only happens 
32460 6f 6e 63 65 2c 20 69 6e 73 74 65 61 64 20 6f 66  once, instead of
32470 20 6f 6e 20 65 61 63 68 20 63 61 6c 6c 20 74 6f   on each call to
32480 20 74 68 65 0a 2a 2a 20 73 74 65 70 20 66 75 6e   the.** step fun
32490 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
324a0 50 5f 41 67 67 53 74 65 70 30 3a 20 7b 0a 20 20  P_AggStep0: {.  
324b0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
324c0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  _context *pCtx;.
324d0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
324e0 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44  p4type==P4_FUNCD
324f0 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f 70 2d  EF );.  n = pOp-
32500 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p5;.  assert( p
32510 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
32520 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
32530 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
32540 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30 20  .  assert( n==0 
32550 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26  || (pOp->p2>0 &&
32560 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d 3e   pOp->p2+n<=(p->
32570 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
32580 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61 73 73  sor)+1) );.  ass
32590 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70  ert( pOp->p3<pOp
325a0 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e  ->p2 || pOp->p3>
325b0 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20  =pOp->p2+n );.  
325c0 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44 62  pCtx = sqlite3Db
325d0 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
325e0 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 2b 20  sizeof(*pCtx) + 
325f0 28 6e 2d 31 29 2a 73 69 7a 65 6f 66 28 73 71 6c  (n-1)*sizeof(sql
32600 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 3b 0a 20  ite3_value*));. 
32610 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 20 67   if( pCtx==0 ) g
32620 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
32630 74 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b 0a 20 20  tx->pMem = 0;.  
32640 70 43 74 78 2d 3e 70 46 75 6e 63 20 3d 20 70 4f  pCtx->pFunc = pO
32650 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 70  p->p4.pFunc;.  p
32660 43 74 78 2d 3e 69 4f 70 20 3d 20 28 69 6e 74 29  Ctx->iOp = (int)
32670 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 70  (pOp - aOp);.  p
32680 43 74 78 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a  Ctx->pVdbe = p;.
32690 20 20 70 43 74 78 2d 3e 61 72 67 63 20 3d 20 6e    pCtx->argc = n
326a0 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
326b0 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b 0a 20 20  = P4_FUNCCTX;.  
326c0 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20 3d 20 70  pOp->p4.pCtx = p
326d0 43 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  Ctx;.  pOp->opco
326e0 64 65 20 3d 20 4f 50 5f 41 67 67 53 74 65 70 3b  de = OP_AggStep;
326f0 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
32700 67 68 20 69 6e 74 6f 20 4f 50 5f 41 67 67 53 74  gh into OP_AggSt
32710 65 70 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f 50 5f  ep */.}.case OP_
32720 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74  AggStep: {.  int
32730 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f   i;.  sqlite3_co
32740 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 4d  ntext *pCtx;.  M
32750 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d 65 6d 20  em *pMem;.  Mem 
32760 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  t;..  assert( pO
32770 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55  p->p4type==P4_FU
32780 4e 43 43 54 58 20 29 3b 0a 20 20 70 43 74 78 20  NCCTX );.  pCtx 
32790 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 3b 0a  = pOp->p4.pCtx;.
327a0 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70    pMem = &aMem[p
327b0 4f 70 2d 3e 70 33 5d 3b 0a 0a 20 20 2f 2a 20 49  Op->p3];..  /* I
327c0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
327d0 69 73 20 69 6e 73 69 64 65 20 6f 66 20 61 20 74  is inside of a t
327e0 72 69 67 67 65 72 2c 20 74 68 65 20 72 65 67 69  rigger, the regi
327f0 73 74 65 72 20 61 72 72 61 79 20 69 6e 20 61 4d  ster array in aM
32800 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67 68 74 20  em[].  ** might 
32810 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f 6e 65 20  change from one 
32820 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 74 68  evaluation to th
32830 65 20 6e 65 78 74 2e 20 20 54 68 65 20 6e 65 78  e next.  The nex
32840 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 0a  t block of code.
32850 20 20 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20 73    ** checks to s
32860 65 65 20 69 66 20 74 68 65 20 72 65 67 69 73 74  ee if the regist
32870 65 72 20 61 72 72 61 79 20 68 61 73 20 63 68 61  er array has cha
32880 6e 67 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nged, and if so 
32890 69 74 0a 20 20 2a 2a 20 72 65 69 6e 69 74 69 61  it.  ** reinitia
328a0 6c 69 7a 65 73 20 74 68 65 20 72 65 6c 61 76 61  lizes the relava
328b0 6e 74 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  nt parts of the 
328c0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
328d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 66 28 20  object */.  if( 
328e0 70 43 74 78 2d 3e 70 4d 65 6d 20 21 3d 20 70 4d  pCtx->pMem != pM
328f0 65 6d 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  em ){.    pCtx->
32900 70 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  pMem = pMem;.   
32910 20 66 6f 72 28 69 3d 70 43 74 78 2d 3e 61 72 67   for(i=pCtx->arg
32920 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  c-1; i>=0; i--) 
32930 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 20 3d 20  pCtx->argv[i] = 
32940 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69 5d  &aMem[pOp->p2+i]
32950 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
32960 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
32970 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d 3e 61 72  (i=0; i<pCtx->ar
32980 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  gc; i++){.    as
32990 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
329a0 28 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 20  (pCtx->argv[i]) 
329b0 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
329c0 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 69 2c  TRACE(pOp->p2+i,
329d0 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 3b   pCtx->argv[i]);
329e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
329f0 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 73 71 6c 69  Mem->n++;.  sqli
32a00 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
32a10 74 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  t, db, MEM_Null)
32a20 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75 74 20 3d  ;.  pCtx->pOut =
32a30 20 26 74 3b 0a 20 20 70 43 74 78 2d 3e 66 45 72   &t;.  pCtx->fEr
32a40 72 6f 72 4f 72 41 75 78 20 3d 20 30 3b 0a 20 20  rorOrAux = 0;.  
32a50 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20 3d  pCtx->skipFlag =
32a60 20 30 3b 0a 20 20 28 70 43 74 78 2d 3e 70 46 75   0;.  (pCtx->pFu
32a70 6e 63 2d 3e 78 53 46 75 6e 63 29 28 70 43 74 78  nc->xSFunc)(pCtx
32a80 2c 70 43 74 78 2d 3e 61 72 67 63 2c 70 43 74 78  ,pCtx->argc,pCtx
32a90 2d 3e 61 72 67 76 29 3b 20 2f 2a 20 49 4d 50 3a  ->argv); /* IMP:
32aa0 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30 20 2a   R-24505-23230 *
32ab0 2f 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 66 45  /.  if( pCtx->fE
32ac0 72 72 6f 72 4f 72 41 75 78 20 29 7b 0a 20 20 20  rrorOrAux ){.   
32ad0 20 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72 72   if( pCtx->isErr
32ae0 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  or ){.      sqli
32af0 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
32b00 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  "%s", sqlite3_va
32b10 6c 75 65 5f 74 65 78 74 28 26 74 29 29 3b 0a 20  lue_text(&t));. 
32b20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78 2d 3e       rc = pCtx->
32b30 69 73 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  isError;.    }. 
32b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
32b50 6d 52 65 6c 65 61 73 65 28 26 74 29 3b 0a 20 20  mRelease(&t);.  
32b60 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
32b70 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
32b80 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  or;.  }else{.   
32b90 20 61 73 73 65 72 74 28 20 74 2e 66 6c 61 67 73   assert( t.flags
32ba0 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  ==MEM_Null );.  
32bb0 7d 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 73 6b  }.  if( pCtx->sk
32bc0 69 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 73  ipFlag ){.    as
32bd0 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
32be0 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71  code==OP_CollSeq
32bf0 20 29 3b 0a 20 20 20 20 69 20 3d 20 70 4f 70 5b   );.    i = pOp[
32c00 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 69 66 28 20  -1].p1;.    if( 
32c10 69 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  i ) sqlite3VdbeM
32c20 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d  emSetInt64(&aMem
32c30 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 62  [i], 1);.  }.  b
32c40 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
32c50 64 65 3a 20 41 67 67 46 69 6e 61 6c 20 50 31 20  de: AggFinal P1 
32c60 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  P2 * P4 *.** Syn
32c70 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50  opsis: accum=r[P
32c80 31 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 45 78  1] N=P2.**.** Ex
32c90 65 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c 69  ecute the finali
32ca0 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  zer function for
32cb0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
32cc0 50 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65 6d  P1 is.** the mem
32cd0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61  ory location tha
32ce0 74 20 69 73 20 74 68 65 20 61 63 63 75 6d 75 6c  t is the accumul
32cf0 61 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67 67  ator for the agg
32d00 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32  regate..**.** P2
32d10 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
32d20 66 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  f arguments that
32d30 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
32d40 6f 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20  on takes and.** 
32d50 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
32d60 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 66  to the FuncDef f
32d70 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
32d80 2e 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 67  .  The P2.** arg
32d90 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 65  ument is not use
32da0 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65  d by this opcode
32db0 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 68  .  It is only th
32dc0 65 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67 75  ere to disambigu
32dd0 61 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ate.** functions
32de0 20 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20 76   that can take v
32df0 61 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f  arying numbers o
32e00 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  f arguments.  Th
32e10 65 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e 74  e.** P4 argument
32e20 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
32e30 66 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72 61  for the degenera
32e40 74 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  te case where.**
32e50 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
32e60 6f 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76 69  on was not previ
32e70 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ously called..*/
32e80 0a 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e 61  .case OP_AggFina
32e90 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  l: {.  Mem *pMem
32ea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
32eb0 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31  >p1>0 && pOp->p1
32ec0 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
32ed0 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
32ee0 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pMem = &aMem[pOp
32ef0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
32f00 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
32f10 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41  ~(MEM_Null|MEM_A
32f20 67 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20  gg))==0 );.  rc 
32f30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
32f40 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70  Finalize(pMem, p
32f50 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20  Op->p4.pFunc);. 
32f60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
32f70 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
32f80 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  p, "%s", sqlite3
32f90 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4d 65 6d  _value_text(pMem
32fa0 29 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f  ));.    goto abo
32fb0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
32fc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
32fd0 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
32fe0 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29  (pMem, encoding)
32ff0 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
33000 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20  LOBSIZE(pMem);. 
33010 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
33020 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20  MemTooBig(pMem) 
33030 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
33040 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  big;.  }.  break
33050 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
33060 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20  ITE_OMIT_WAL./* 
33070 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f 69  Opcode: Checkpoi
33080 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  nt P1 P2 P3 * *.
33090 2a 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  **.** Checkpoint
330a0 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 54 68   database P1. Th
330b0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
330c0 20 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72 65   P1 is not curre
330d0 6e 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d  ntly in.** WAL m
330e0 6f 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20 50  ode. Parameter P
330f0 32 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49  2 is one of SQLI
33100 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
33110 53 53 49 56 45 2c 20 46 55 4c 4c 2c 0a 2a 2a 20  SSIVE, FULL,.** 
33120 52 45 53 54 41 52 54 2c 20 6f 72 20 54 52 55 4e  RESTART, or TRUN
33130 43 41 54 45 2e 20 20 57 72 69 74 65 20 31 20 6f  CATE.  Write 1 o
33140 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d  r 0 into mem[P3]
33150 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   if the checkpoi
33160 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51  nt returns.** SQ
33170 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f 74  LITE_BUSY or not
33180 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
33190 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
331a0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
331b0 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20 74  e.** WAL after t
331c0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e  he checkpoint in
331d0 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64  to mem[P3+1] and
331e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
331f0 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 57  ages.** in the W
33200 41 4c 20 74 68 61 74 20 68 61 76 65 20 62 65 65  AL that have bee
33210 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61  n checkpointed a
33220 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f  fter the checkpo
33230 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  int.** completes
33240 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e   into mem[P3+2].
33250 20 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e 20    However on an 
33260 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d  error, mem[P3+1]
33270 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32   and.** mem[P3+2
33280 5d 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  ] are initialize
33290 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65  d to -1..*/.case
332a0 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 20   OP_Checkpoint: 
332b0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
332c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
332e0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52 65  ter */.  int aRe
332f0 73 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  s[3];           
33300 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
33310 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  lts */.  Mem *pM
33320 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
33330 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
33340 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
33350 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
33360 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
33370 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20 20   aRes[0] = 0;.  
33380 61 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b 32  aRes[1] = aRes[2
33390 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74  ] = -1;.  assert
333a0 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  ( pOp->p2==SQLIT
333b0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
333c0 53 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20 70  SIVE.       || p
333d0 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43  Op->p2==SQLITE_C
333e0 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a 20  HECKPOINT_FULL. 
333f0 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32        || pOp->p2
33400 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ==SQLITE_CHECKPO
33410 49 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 20 20  INT_RESTART.    
33420 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53     || pOp->p2==S
33430 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
33440 5f 54 52 55 4e 43 41 54 45 0a 20 20 29 3b 0a 20  _TRUNCATE.  );. 
33450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65   rc = sqlite3Che
33460 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f 70 2d  ckpoint(db, pOp-
33470 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 26 61  >p1, pOp->p2, &a
33480 52 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b 32 5d  Res[1], &aRes[2]
33490 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
334a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
334b0 45 5f 42 55 53 59 20 29 20 67 6f 74 6f 20 61 62  E_BUSY ) goto ab
334c0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
334d0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
334e0 45 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b 30  E_OK;.    aRes[0
334f0 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  ] = 1;.  }.  for
33500 28 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61 4d  (i=0, pMem = &aM
33510 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33  em[pOp->p3]; i<3
33520 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a  ; i++, pMem++){.
33530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
33540 65 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d 2c  emSetInt64(pMem,
33550 20 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b 0a   (i64)aRes[i]);.
33560 20 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b 3b    }    .  break;
33570 0a 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23 69  .};  .#endif..#i
33580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33590 54 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f  T_PRAGMA./* Opco
335a0 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20  de: JournalMode 
335b0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
335c0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f  ** Change the jo
335d0 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64 61  urnal mode of da
335e0 74 61 62 61 73 65 20 50 31 20 74 6f 20 50 33 2e  tabase P1 to P3.
335f0 20 50 33 20 6d 75 73 74 20 62 65 20 6f 6e 65 20   P3 must be one 
33600 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47 45 52 5f  of the.** PAGER_
33610 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20  JOURNALMODE_XXX 
33620 76 61 6c 75 65 73 2e 20 49 66 20 63 68 61 6e 67  values. If chang
33630 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20  ing between the 
33640 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63 6b  various rollback
33650 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65 74  .** modes (delet
33660 65 2c 20 74 72 75 6e 63 61 74 65 2c 20 70 65 72  e, truncate, per
33670 73 69 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d 65  sist, off and me
33680 6d 6f 72 79 29 2c 20 74 68 69 73 20 69 73 20 61  mory), this is a
33690 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72 61   simple.** opera
336a0 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20 72  tion. No IO is r
336b0 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
336c0 66 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20  f changing into 
336d0 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d 6f  or out of WAL mo
336e0 64 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  de the procedure
336f0 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63   is more complic
33700 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ated..**.** Writ
33710 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  e a string conta
33720 69 6e 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  ining the final 
33730 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20  journal-mode to 
33740 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
33750 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d  case OP_JournalM
33760 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75 74  ode: {    /* out
33770 32 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42  2 */.  Btree *pB
33780 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
33790 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
337a0 74 6f 20 63 68 61 6e 67 65 20 6a 6f 75 72 6e 61  to change journa
337b0 6c 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20 20 50  l mode of */.  P
337c0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
337d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
337e0 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74  * Pager associat
337f0 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20  ed with pBt */. 
33800 20 69 6e 74 20 65 4e 65 77 3b 20 20 20 20 20 20   int eNew;      
33810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33820 20 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e 61 6c 20   /* New journal 
33830 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  mode */.  int eO
33840 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
33850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
33860 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   old journal mod
33870 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
33880 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 63  ITE_OMIT_WAL.  c
33890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
338a0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  name;          /
338b0 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61  * Name of databa
338c0 73 65 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67  se file for pPag
338d0 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
338e0 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
338f0 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
33900 20 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70 33 3b   eNew = pOp->p3;
33910 0a 20 20 61 73 73 65 72 74 28 20 65 4e 65 77 3d  .  assert( eNew=
33920 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
33930 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
33940 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52    || eNew==PAGER
33950 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
33960 4e 43 41 54 45 20 0a 20 20 20 20 20 20 20 7c 7c  NCATE .       ||
33970 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
33980 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
33990 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77   .       || eNew
339a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
339b0 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 20 7c  ODE_OFF.       |
339c0 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
339d0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
339e0 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d  .       || eNew=
339f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
33a00 44 45 5f 57 41 4c 0a 20 20 20 20 20 20 20 7c 7c  DE_WAL.       ||
33a10 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
33a20 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
33a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
33a40 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
33a50 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
33a60 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
33a70 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 70 42  Only==0 );..  pB
33a80 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
33a90 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50 61 67  >p1].pBt;.  pPag
33aa0 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
33ab0 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 65  ePager(pBt);.  e
33ac0 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Old = sqlite3Pag
33ad0 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erGetJournalMode
33ae0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
33af0 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
33b00 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29 20  NALMODE_QUERY ) 
33b10 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 69  eNew = eOld;.  i
33b20 66 28 20 21 73 71 6c 69 74 65 33 50 61 67 65 72  f( !sqlite3Pager
33b30 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61  OkToChangeJourna
33b40 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 20 29 20  lMode(pPager) ) 
33b50 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23 69  eNew = eOld;..#i
33b60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33b70 54 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e 61 6d  T_WAL.  zFilenam
33b80 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
33b90 46 69 6c 65 6e 61 6d 65 28 70 50 61 67 65 72 2c  Filename(pPager,
33ba0 20 31 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f   1);..  /* Do no
33bb0 74 20 61 6c 6c 6f 77 20 61 20 74 72 61 6e 73 69  t allow a transi
33bc0 74 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f  tion to journal_
33bd0 6d 6f 64 65 3d 57 41 4c 20 66 6f 72 20 61 20 64  mode=WAL for a d
33be0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 6e 20  atabase.  ** in 
33bf0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
33c00 65 20 6f 72 20 69 66 20 74 68 65 20 56 46 53 20  e or if the VFS 
33c10 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
33c20 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 0a   shared memory .
33c30 20 20 2a 2f 0a 20 20 69 66 28 20 65 4e 65 77 3d    */.  if( eNew=
33c40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
33c50 44 45 5f 57 41 4c 0a 20 20 20 26 26 20 28 73 71  DE_WAL.   && (sq
33c60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
33c70 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 20 20 20 20  ilename)==0     
33c80 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66 69        /* Temp fi
33c90 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20  le */.       || 
33ca0 21 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c  !sqlite3PagerWal
33cb0 53 75 70 70 6f 72 74 65 64 28 70 50 61 67 65 72  Supported(pPager
33cc0 29 29 20 20 20 2f 2a 20 4e 6f 20 73 68 61 72 65  ))   /* No share
33cd0 64 2d 6d 65 6d 6f 72 79 20 73 75 70 70 6f 72 74  d-memory support
33ce0 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 65 4e 65   */.  ){.    eNe
33cf0 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20  w = eOld;.  }.. 
33d00 20 69 66 28 20 28 65 4e 65 77 21 3d 65 4f 6c 64   if( (eNew!=eOld
33d10 29 0a 20 20 20 26 26 20 28 65 4f 6c 64 3d 3d 50  ).   && (eOld==P
33d20 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
33d30 5f 57 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50 41  _WAL || eNew==PA
33d40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
33d50 57 41 4c 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  WAL).  ){.    if
33d60 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
33d70 74 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65 52 65  t || db->nVdbeRe
33d80 61 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 63  ad>1 ){.      rc
33d90 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
33da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
33db0 62 65 45 72 72 6f 72 28 70 2c 0a 20 20 20 20 20  beError(p,.     
33dc0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61       "cannot cha
33dd0 6e 67 65 20 25 73 20 77 61 6c 20 6d 6f 64 65 20  nge %s wal mode 
33de0 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
33df0 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20  ansaction",.    
33e00 20 20 20 20 20 20 28 65 4e 65 77 3d 3d 50 41 47        (eNew==PAG
33e10 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
33e20 41 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22 6f  AL ? "into" : "o
33e30 75 74 20 6f 66 22 29 0a 20 20 20 20 20 20 29 3b  ut of").      );
33e40 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
33e50 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
33e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0a 20 20 20      }else{. .   
33e70 20 20 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47     if( eOld==PAG
33e80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
33e90 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  AL ){.        /*
33ea0 20 49 66 20 6c 65 61 76 69 6e 67 20 57 41 4c 20   If leaving WAL 
33eb0 6d 6f 64 65 2c 20 63 6c 6f 73 65 20 74 68 65 20  mode, close the 
33ec0 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
33ed0 63 65 73 73 66 75 6c 2c 20 74 68 65 20 63 61 6c  cessful, the cal
33ee0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  l.        ** to 
33ef0 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 29 20  PagerCloseWal() 
33f00 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e 64 20  checkpoints and 
33f10 64 65 6c 65 74 65 73 20 74 68 65 20 77 72 69 74  deletes the writ
33f20 65 2d 61 68 65 61 64 2d 6c 6f 67 20 0a 20 20 20  e-ahead-log .   
33f30 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 41 6e       ** file. An
33f40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
33f50 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 68 65 6c  may still be hel
33f60 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
33f70 65 20 66 69 6c 65 20 0a 20 20 20 20 20 20 20 20  e file .        
33f80 2a 2a 20 61 66 74 65 72 20 61 20 73 75 63 63 65  ** after a succe
33f90 73 73 66 75 6c 20 72 65 74 75 72 6e 2e 20 0a 20  ssful return. . 
33fa0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33fc0 67 65 72 43 6c 6f 73 65 57 61 6c 28 70 50 61 67  gerCloseWal(pPag
33fd0 65 72 2c 20 64 62 29 3b 0a 20 20 20 20 20 20 20  er, db);.       
33fe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33ff0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
34000 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a  sqlite3PagerSetJ
34010 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
34020 72 2c 20 65 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, eNew);.      
34030 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
34040 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f  if( eOld==PAGER_
34050 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
34060 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  RY ){.        /*
34070 20 43 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74 69   Cannot transiti
34080 6f 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  on directly from
34090 20 4d 45 4d 4f 52 59 20 74 6f 20 57 41 4c 2e 20   MEMORY to WAL. 
340a0 20 55 73 65 20 6d 6f 64 65 20 4f 46 46 0a 20 20   Use mode OFF.  
340b0 20 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 69        ** as an i
340c0 6e 74 65 72 6d 65 64 69 61 74 65 20 2a 2f 0a 20  ntermediate */. 
340d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
340e0 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerSetJournalMod
340f0 65 28 70 50 61 67 65 72 2c 20 50 41 47 45 52 5f  e(pPager, PAGER_
34100 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29  JOURNALMODE_OFF)
34110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
34120 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61     /* Open a tra
34130 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
34140 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 52  database file. R
34150 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
34160 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
34170 2a 20 6d 6f 64 65 2c 20 74 68 69 73 20 74 72 61  * mode, this tra
34180 6e 73 61 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nsaction always 
34190 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
341a0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a  journal..      *
341b0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
341c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
341d0 54 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 3b  Trans(pBt)==0 );
341e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
341f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34200 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34210 42 74 72 65 65 53 65 74 56 65 72 73 69 6f 6e 28  BtreeSetVersion(
34220 70 42 74 2c 20 28 65 4e 65 77 3d 3d 50 41 47 45  pBt, (eNew==PAGE
34230 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
34240 4c 20 3f 20 32 20 3a 20 31 29 29 3b 0a 20 20 20  L ? 2 : 1));.   
34250 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
34260 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
34270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
34280 2a 2f 0a 0a 20 20 69 66 28 20 72 63 20 29 20 65  */..  if( rc ) e
34290 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 65 4e  New = eOld;.  eN
342a0 65 77 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ew = sqlite3Page
342b0 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rSetJournalMode(
342c0 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 0a  pPager, eNew);..
342d0 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
342e0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74  MEM_Str|MEM_Stat
342f0 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70  ic|MEM_Term;.  p
34300 4f 75 74 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Out->z = (char *
34310 29 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d  )sqlite3JournalM
34320 6f 64 65 6e 61 6d 65 28 65 4e 65 77 29 3b 0a 20  odename(eNew);. 
34330 20 70 4f 75 74 2d 3e 6e 20 3d 20 73 71 6c 69 74   pOut->n = sqlit
34340 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 75 74 2d  e3Strlen30(pOut-
34350 3e 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63  >z);.  pOut->enc
34360 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
34370 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
34380 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74  ngeEncoding(pOut
34390 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 69  , encoding);.  i
343a0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
343b0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
343c0 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 23 65 6e  .  break;.};.#en
343d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
343e0 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23 69  IT_PRAGMA */..#i
343f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
34400 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 26  E_OMIT_VACUUM) &
34410 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
34420 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a 2f  E_OMIT_ATTACH)./
34430 2a 20 4f 70 63 6f 64 65 3a 20 56 61 63 75 75 6d  * Opcode: Vacuum
34440 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
34450 2a 20 56 61 63 75 75 6d 20 74 68 65 20 65 6e 74  * Vacuum the ent
34460 69 72 65 20 64 61 74 61 62 61 73 65 20 50 31 2e  ire database P1.
34470 20 20 50 31 20 69 73 20 30 20 66 6f 72 20 22 6d    P1 is 0 for "m
34480 61 69 6e 22 2c 20 61 6e 64 20 32 20 6f 72 20 6d  ain", and 2 or m
34490 6f 72 65 0a 2a 2a 20 66 6f 72 20 61 6e 20 61 74  ore.** for an at
344a0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e  tached database.
344b0 20 20 54 68 65 20 22 74 65 6d 70 22 20 64 61 74    The "temp" dat
344c0 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65  abase may not be
344d0 20 76 61 63 75 75 6d 65 64 2e 0a 2a 2f 0a 63 61   vacuumed..*/.ca
344e0 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 20 7b 0a  se OP_Vacuum: {.
344f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
34500 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 72 63  dOnly==0 );.  rc
34510 20 3d 20 73 71 6c 69 74 65 33 52 75 6e 56 61 63   = sqlite3RunVac
34520 75 75 6d 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  uum(&p->zErrMsg,
34530 20 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20   db, pOp->p1);. 
34540 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
34550 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
34560 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  r;.  break;.}.#e
34570 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
34580 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
34590 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f 70  UTOVACUUM)./* Op
345a0 63 6f 64 65 3a 20 49 6e 63 72 56 61 63 75 75 6d  code: IncrVacuum
345b0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
345c0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
345d0 67 6c 65 20 73 74 65 70 20 6f 66 20 74 68 65 20  gle step of the 
345e0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
345f0 75 6d 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 0a  um procedure on.
34600 2a 2a 20 74 68 65 20 50 31 20 64 61 74 61 62 61  ** the P1 databa
34610 73 65 2e 20 49 66 20 74 68 65 20 76 61 63 75 75  se. If the vacuu
34620 6d 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20  m has finished, 
34630 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74  jump to instruct
34640 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65 72  ion.** P2. Other
34650 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75  wise, fall throu
34660 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
34670 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  nstruction..*/.c
34680 61 73 65 20 4f 50 5f 49 6e 63 72 56 61 63 75 75  ase OP_IncrVacuu
34690 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  m: {        /* j
346a0 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ump */.  Btree *
346b0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
346c0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
346d0 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
346e0 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
346f0 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61  kTest(p->btreeMa
34700 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a  sk, pOp->p1) );.
34710 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
34720 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 42  dOnly==0 );.  pB
34730 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
34740 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d  >p1].pBt;.  rc =
34750 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
34760 72 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20 20  rVacuum(pBt);.  
34770 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
34780 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 2c  rc==SQLITE_DONE,
34790 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  2);.  if( rc ){.
347a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
347b0 54 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f 20 61  TE_DONE ) goto a
347c0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
347d0 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  r;.    rc = SQLI
347e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
347f0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
34800 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
34810 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 78  f../* Opcode: Ex
34820 70 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  pire P1 * * * *.
34830 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65 63  **.** Cause prec
34840 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
34850 74 73 20 74 6f 20 65 78 70 69 72 65 2e 20 20 57  ts to expire.  W
34860 68 65 6e 20 61 6e 20 65 78 70 69 72 65 64 20 73  hen an expired s
34870 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65  tatement.** is e
34880 78 65 63 75 74 65 64 20 75 73 69 6e 67 20 73 71  xecuted using sq
34890 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69 74 20  lite3_step() it 
348a0 77 69 6c 6c 20 65 69 74 68 65 72 20 61 75 74 6f  will either auto
348b0 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 72 65 70  matically.** rep
348c0 72 65 70 61 72 65 20 69 74 73 65 6c 66 20 28 69  repare itself (i
348d0 66 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61  f it was origina
348e0 6c 6c 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  lly created usin
348f0 67 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  g sqlite3_prepar
34900 65 5f 76 32 28 29 29 0a 2a 2a 20 6f 72 20 69 74  e_v2()).** or it
34910 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
34920 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a 2a  SQLITE_SCHEMA..*
34930 2a 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 30  * .** If P1 is 0
34940 2c 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73  , then all SQL s
34950 74 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65  tatements become
34960 20 65 78 70 69 72 65 64 2e 20 49 66 20 50 31 20   expired. If P1 
34970 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20  is non-zero,.** 
34980 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75  then only the cu
34990 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e  rrently executin
349a0 67 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65  g statement is e
349b0 78 70 69 72 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  xpired..*/.case 
349c0 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20 69  OP_Expire: {.  i
349d0 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  f( !pOp->p1 ){. 
349e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
349f0 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
34a00 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  ts(db);.  }else{
34a10 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
34a20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 1;.  }.  break
34a30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
34a40 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
34a50 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  CACHE./* Opcode:
34a60 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50 32   TableLock P1 P2
34a70 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
34a80 70 73 69 73 3a 20 69 44 62 3d 50 31 20 72 6f 6f  psis: iDb=P1 roo
34a90 74 3d 50 32 20 77 72 69 74 65 3d 50 33 0a 2a 2a  t=P2 write=P3.**
34aa0 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63  .** Obtain a loc
34ab0 6b 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  k on a particula
34ac0 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69 6e  r table. This in
34ad0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 6e 6c  struction is onl
34ae0 79 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 74  y used when.** t
34af0 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
34b00 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
34b10 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  ed. .**.** P1 is
34b20 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
34b30 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 73 71  e database in sq
34b40 6c 69 74 65 33 2e 61 44 62 5b 5d 20 6f 66 20 74  lite3.aDb[] of t
34b50 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f  he database.** o
34b60 6e 20 77 68 69 63 68 20 74 68 65 20 6c 6f 63 6b  n which the lock
34b70 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 20 41   is acquired.  A
34b80 20 72 65 61 64 6c 6f 63 6b 20 69 73 20 6f 62 74   readlock is obt
34b90 61 69 6e 65 64 20 69 66 20 50 33 3d 3d 30 20 6f  ained if P3==0 o
34ba0 72 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63  r.** a write loc
34bb0 6b 20 69 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a  k if P3==1..**.*
34bc0 2a 20 50 32 20 63 6f 6e 74 61 69 6e 73 20 74 68  * P2 contains th
34bd0 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74  e root-page of t
34be0 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
34bf0 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74 61  ..**.** P4 conta
34c00 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
34c10 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
34c20 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6c 6f 63   table being loc
34c30 6b 65 64 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c  ked. This is onl
34c40 79 0a 2a 2a 20 75 73 65 64 20 74 6f 20 67 65 6e  y.** used to gen
34c50 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
34c60 65 73 73 61 67 65 20 69 66 20 74 68 65 20 6c 6f  essage if the lo
34c70 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
34c80 61 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ained..*/.case O
34c90 50 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20  P_TableLock: {. 
34ca0 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 20   u8 isWriteLock 
34cb0 3d 20 28 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20  = (u8)pOp->p3;. 
34cc0 20 69 66 28 20 69 73 57 72 69 74 65 4c 6f 63 6b   if( isWriteLock
34cd0 20 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67   || 0==(db->flag
34ce0 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
34cf0 6f 6d 6d 69 74 74 65 64 29 20 29 7b 0a 20 20 20  ommitted) ){.   
34d00 20 69 6e 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70   int p1 = pOp->p
34d10 31 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  1; .    assert( 
34d20 70 31 3e 3d 30 20 26 26 20 70 31 3c 64 62 2d 3e  p1>=0 && p1<db->
34d30 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
34d40 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
34d50 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 31 29 20  >btreeMask, p1) 
34d60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
34d70 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c  sWriteLock==0 ||
34d80 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20   isWriteLock==1 
34d90 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
34da0 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c  te3BtreeLockTabl
34db0 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e 70 42  e(db->aDb[p1].pB
34dc0 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73 57 72  t, pOp->p2, isWr
34dd0 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  iteLock);.    if
34de0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
34df0 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
34e00 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
34e10 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34e20 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b   *z = pOp->p4.z;
34e30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34e40 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 64 61  VdbeError(p, "da
34e50 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
34e60 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a 29 3b  locked: %s", z);
34e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
34e80 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
34e90 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
34ea0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
34eb0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
34ec0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
34ed0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
34ee0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
34ef0 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
34f00 56 42 65 67 69 6e 20 2a 20 2a 20 2a 20 50 34 20  VBegin * * * P4 
34f10 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62  *.**.** P4 may b
34f20 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
34f30 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
34f40 74 72 75 63 74 75 72 65 2e 20 49 66 20 73 6f 2c  tructure. If so,
34f50 20 63 61 6c 6c 20 74 68 65 20 0a 2a 2a 20 78 42   call the .** xB
34f60 65 67 69 6e 20 6d 65 74 68 6f 64 20 66 6f 72 20  egin method for 
34f70 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  that table..**.*
34f80 2a 20 41 6c 73 6f 2c 20 77 68 65 74 68 65 72 20  * Also, whether 
34f90 6f 72 20 6e 6f 74 20 50 34 20 69 73 20 73 65 74  or not P4 is set
34fa0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 69  , check that thi
34fb0 73 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 63  s is not being c
34fc0 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77 69  alled from.** wi
34fd0 74 68 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 20  thin a callback 
34fe0 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  to a virtual tab
34ff0 6c 65 20 78 53 79 6e 63 28 29 20 6d 65 74 68 6f  le xSync() metho
35000 64 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  d. If it is, the
35010 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 77   error.** code w
35020 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 53 51  ill be set to SQ
35030 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f 0a  LITE_LOCKED..*/.
35040 63 61 73 65 20 4f 50 5f 56 42 65 67 69 6e 3a 20  case OP_VBegin: 
35050 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61  {.  VTable *pVTa
35060 62 3b 0a 20 20 70 56 54 61 62 20 3d 20 70 4f 70  b;.  pVTab = pOp
35070 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 72 63  ->p4.pVtab;.  rc
35080 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 42 65   = sqlite3VtabBe
35090 67 69 6e 28 64 62 2c 20 70 56 54 61 62 29 3b 0a  gin(db, pVTab);.
350a0 20 20 69 66 28 20 70 56 54 61 62 20 29 20 73 71    if( pVTab ) sq
350b0 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
350c0 72 72 6d 73 67 28 70 2c 20 70 56 54 61 62 2d 3e  rrmsg(p, pVTab->
350d0 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 72 63  pVtab);.  if( rc
350e0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
350f0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
35100 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
35110 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
35120 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
35130 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35140 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
35150 2a 20 4f 70 63 6f 64 65 3a 20 56 43 72 65 61 74  * Opcode: VCreat
35160 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  e P1 P2 * * *.**
35170 0a 2a 2a 20 50 32 20 69 73 20 61 20 72 65 67 69  .** P2 is a regi
35180 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
35190 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 69  the name of a vi
351a0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 64  rtual table in d
351b0 61 74 61 62 61 73 65 20 0a 2a 2a 20 50 31 2e 20  atabase .** P1. 
351c0 43 61 6c 6c 20 74 68 65 20 78 43 72 65 61 74 65  Call the xCreate
351d0 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74   method for that
351e0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20   table..*/.case 
351f0 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b 0a 20 20  OP_VCreate: {.  
35200 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20 20  Mem sMem;       
35210 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e     /* For storin
35220 67 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69  g the record bei
35230 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
35240 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
35250 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
35260 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
35270 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 4d  */..  memset(&sM
35280 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d  em, 0, sizeof(sM
35290 65 6d 29 29 3b 0a 20 20 73 4d 65 6d 2e 64 62 20  em));.  sMem.db 
352a0 3d 20 64 62 3b 0a 20 20 2f 2a 20 42 65 63 61 75  = db;.  /* Becau
352b0 73 65 20 50 32 20 69 73 20 61 6c 77 61 79 73 20  se P2 is always 
352c0 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 2c  a static string,
352d0 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   it is impossibl
352e0 65 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73  e for the.  ** s
352f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
35300 79 28 29 20 74 6f 20 66 61 69 6c 20 2a 2f 0a 20  y() to fail */. 
35310 20 61 73 73 65 72 74 28 20 28 61 4d 65 6d 5b 70   assert( (aMem[p
35320 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73 20 26 20  Op->p2].flags & 
35330 4d 45 4d 5f 53 74 72 29 21 3d 30 20 29 3b 0a 20  MEM_Str)!=0 );. 
35340 20 61 73 73 65 72 74 28 20 28 61 4d 65 6d 5b 70   assert( (aMem[p
35350 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73 20 26 20  Op->p2].flags & 
35360 4d 45 4d 5f 53 74 61 74 69 63 29 21 3d 30 20 29  MEM_Static)!=0 )
35370 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
35380 56 64 62 65 4d 65 6d 43 6f 70 79 28 26 73 4d 65  VdbeMemCopy(&sMe
35390 6d 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  m, &aMem[pOp->p2
353a0 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ]);.  assert( rc
353b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
353c0 20 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63   zTab = (const c
353d0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
353e0 75 65 5f 74 65 78 74 28 26 73 4d 65 6d 29 3b 0a  ue_text(&sMem);.
353f0 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 20 7c    assert( zTab |
35400 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
35410 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 54 61 62  ed );.  if( zTab
35420 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
35430 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65 61  ite3VtabCallCrea
35440 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  te(db, pOp->p1, 
35450 7a 54 61 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73  zTab, &p->zErrMs
35460 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
35470 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
35480 26 73 4d 65 6d 29 3b 0a 20 20 69 66 28 20 72 63  &sMem);.  if( rc
35490 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
354a0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
354b0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
354c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
354d0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
354e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
354f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
35500 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65 73 74 72  * Opcode: VDestr
35510 6f 79 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  oy P1 * * P4 *.*
35520 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68 65 20 6e  *.** P4 is the n
35530 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75 61 6c  ame of a virtual
35540 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61 62 61   table in databa
35550 73 65 20 50 31 2e 20 20 43 61 6c 6c 20 74 68 65  se P1.  Call the
35560 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64   xDestroy method
35570 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c  .** of that tabl
35580 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 44  e..*/.case OP_VD
35590 65 73 74 72 6f 79 3a 20 7b 0a 20 20 64 62 2d 3e  estroy: {.  db->
355a0 6e 56 44 65 73 74 72 6f 79 2b 2b 3b 0a 20 20 72  nVDestroy++;.  r
355b0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43  c = sqlite3VtabC
355c0 61 6c 6c 44 65 73 74 72 6f 79 28 64 62 2c 20 70  allDestroy(db, p
355d0 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
355e0 7a 29 3b 0a 20 20 64 62 2d 3e 6e 56 44 65 73 74  z);.  db->nVDest
355f0 72 6f 79 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20  roy--;.  if( rc 
35600 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
35610 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
35620 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
35630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
35640 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
35650 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35660 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
35670 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65 6e 20 50   Opcode: VOpen P
35680 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
35690 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
356a0 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61   to a virtual ta
356b0 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73  ble object, an s
356c0 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
356d0 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20 69 73 20  cture..** P1 is 
356e0 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e  a cursor number.
356f0 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f 70    This opcode op
35700 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74 6f 20  ens a cursor to 
35710 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
35720 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 73 20  able and stores 
35730 74 68 61 74 20 63 75 72 73 6f 72 20 69 6e 20 50  that cursor in P
35740 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4f  1..*/.case OP_VO
35750 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  pen: {.  VdbeCur
35760 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 73 71 6c  sor *pCur;.  sql
35770 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
35780 20 2a 70 56 43 75 72 3b 0a 20 20 73 71 6c 69 74   *pVCur;.  sqlit
35790 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
357a0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
357b0 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b  module *pModule;
357c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ..  assert( p->b
357d0 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 70 43  IsReader );.  pC
357e0 75 72 20 3d 20 30 3b 0a 20 20 70 56 43 75 72 20  ur = 0;.  pVCur 
357f0 3d 20 30 3b 0a 20 20 70 56 74 61 62 20 3d 20 70  = 0;.  pVtab = p
35800 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
35810 74 61 62 3b 0a 20 20 69 66 28 20 70 56 74 61 62  tab;.  if( pVtab
35820 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 56 74  ==0 || NEVER(pVt
35830 61 62 2d 3e 70 4d 6f 64 75 6c 65 3d 3d 30 29 20  ab->pModule==0) 
35840 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
35850 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 67  TE_LOCKED;.    g
35860 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
35870 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d  _error;.  }.  pM
35880 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
35890 4d 6f 64 75 6c 65 3b 0a 20 20 72 63 20 3d 20 70  Module;.  rc = p
358a0 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 56  Module->xOpen(pV
358b0 74 61 62 2c 20 26 70 56 43 75 72 29 3b 0a 20 20  tab, &pVCur);.  
358c0 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
358d0 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
358e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
358f0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
35900 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 6e 69  error;..  /* Ini
35910 74 69 61 6c 69 7a 65 20 73 71 6c 69 74 65 33 5f  tialize sqlite3_
35920 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
35930 20 63 6c 61 73 73 20 2a 2f 0a 20 20 70 56 43 75   class */.  pVCu
35940 72 2d 3e 70 56 74 61 62 20 3d 20 70 56 74 61 62  r->pVtab = pVtab
35950 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
35960 7a 65 20 76 64 62 65 20 63 75 72 73 6f 72 20 6f  ze vdbe cursor o
35970 62 6a 65 63 74 20 2a 2f 0a 20 20 70 43 75 72 20  bject */.  pCur 
35980 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
35990 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20  (p, pOp->p1, 0, 
359a0 2d 31 2c 20 43 55 52 54 59 50 45 5f 56 54 41 42  -1, CURTYPE_VTAB
359b0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b  );.  if( pCur ){
359c0 0a 20 20 20 20 70 43 75 72 2d 3e 75 63 2e 70 56  .    pCur->uc.pV
359d0 43 75 72 20 3d 20 70 56 43 75 72 3b 0a 20 20 20  Cur = pVCur;.   
359e0 20 70 56 74 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a   pVtab->nRef++;.
359f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
35a00 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
35a10 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4d 6f  ailed );.    pMo
35a20 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43  dule->xClose(pVC
35a30 75 72 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  ur);.    goto no
35a40 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 62 72 65 61  _mem;.  }.  brea
35a50 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
35a60 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
35a70 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
35a80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35a90 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
35aa0 4f 70 63 6f 64 65 3a 20 56 46 69 6c 74 65 72 20  Opcode: VFilter 
35ab0 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
35ac0 20 53 79 6e 6f 70 73 69 73 3a 20 69 70 6c 61 6e   Synopsis: iplan
35ad0 3d 72 5b 50 33 5d 20 7a 70 6c 61 6e 3d 27 50 34  =r[P3] zplan='P4
35ae0 27 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  '.**.** P1 is a 
35af0 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 75 73  cursor opened us
35b00 69 6e 67 20 56 4f 70 65 6e 2e 20 20 50 32 20 69  ing VOpen.  P2 i
35b10 73 20 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20  s an address to 
35b20 6a 75 6d 70 20 74 6f 20 69 66 0a 2a 2a 20 74 68  jump to if.** th
35b30 65 20 66 69 6c 74 65 72 65 64 20 72 65 73 75 6c  e filtered resul
35b40 74 20 73 65 74 20 69 73 20 65 6d 70 74 79 2e 0a  t set is empty..
35b50 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 65 69 74 68  **.** P4 is eith
35b60 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 73 74 72  er NULL or a str
35b70 69 6e 67 20 74 68 61 74 20 77 61 73 20 67 65 6e  ing that was gen
35b80 65 72 61 74 65 64 20 62 79 20 74 68 65 20 78 42  erated by the xB
35b90 65 73 74 49 6e 64 65 78 0a 2a 2a 20 6d 65 74 68  estIndex.** meth
35ba0 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65  od of the module
35bb0 2e 20 20 54 68 65 20 69 6e 74 65 72 70 72 65 74  .  The interpret
35bc0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 34 20  ation of the P4 
35bd0 73 74 72 69 6e 67 20 69 73 20 6c 65 66 74 0a 2a  string is left.*
35be0 2a 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20  * to the module 
35bf0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
35c00 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
35c10 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 46  e invokes the xF
35c20 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 6f 6e 20  ilter method on 
35c30 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
35c40 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  e specified.** b
35c50 79 20 50 31 2e 20 20 54 68 65 20 69 6e 74 65 67  y P1.  The integ
35c60 65 72 20 71 75 65 72 79 20 70 6c 61 6e 20 70 61  er query plan pa
35c70 72 61 6d 65 74 65 72 20 74 6f 20 78 46 69 6c 74  rameter to xFilt
35c80 65 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  er is stored in 
35c90 72 65 67 69 73 74 65 72 0a 2a 2a 20 50 33 2e 20  register.** P3. 
35ca0 52 65 67 69 73 74 65 72 20 50 33 2b 31 20 73 74  Register P3+1 st
35cb0 6f 72 65 73 20 74 68 65 20 61 72 67 63 20 70 61  ores the argc pa
35cc0 72 61 6d 65 74 65 72 20 74 6f 20 62 65 20 70 61  rameter to be pa
35cd0 73 73 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 78  ssed to the.** x
35ce0 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 20 52  Filter method. R
35cf0 65 67 69 73 74 65 72 73 20 50 33 2b 32 2e 2e 50  egisters P3+2..P
35d00 33 2b 31 2b 61 72 67 63 20 61 72 65 20 74 68 65  3+1+argc are the
35d10 20 61 72 67 63 0a 2a 2a 20 61 64 64 69 74 69 6f   argc.** additio
35d20 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 73 20 77  nal parameters w
35d30 68 69 63 68 20 61 72 65 20 70 61 73 73 65 64 20  hich are passed 
35d40 74 6f 0a 2a 2a 20 78 46 69 6c 74 65 72 20 61 73  to.** xFilter as
35d50 20 61 72 67 76 2e 20 52 65 67 69 73 74 65 72 20   argv. Register 
35d60 50 33 2b 32 20 62 65 63 6f 6d 65 73 20 61 72 67  P3+2 becomes arg
35d70 76 5b 30 5d 20 77 68 65 6e 20 70 61 73 73 65 64  v[0] when passed
35d80 20 74 6f 20 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a   to xFilter..**.
35d90 2a 2a 20 41 20 6a 75 6d 70 20 69 73 20 6d 61 64  ** A jump is mad
35da0 65 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 72  e to P2 if the r
35db0 65 73 75 6c 74 20 73 65 74 20 61 66 74 65 72 20  esult set after 
35dc0 66 69 6c 74 65 72 69 6e 67 20 77 6f 75 6c 64 20  filtering would 
35dd0 62 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73  be empty..*/.cas
35de0 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 20  e OP_VFilter: { 
35df0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
35e00 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69  nt nArg;.  int i
35e10 51 75 65 72 79 3b 0a 20 20 63 6f 6e 73 74 20 73  Query;.  const s
35e20 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
35e30 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70  Module;.  Mem *p
35e40 51 75 65 72 79 3b 0a 20 20 4d 65 6d 20 2a 70 41  Query;.  Mem *pA
35e50 72 67 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc;.  sqlite3_v
35e60 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
35e70 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  r;.  sqlite3_vta
35e80 62 20 2a 70 56 74 61 62 3b 0a 20 20 56 64 62 65  b *pVtab;.  Vdbe
35e90 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
35ea0 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 69  int res;.  int i
35eb0 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b  ;.  Mem **apArg;
35ec0 0a 0a 20 20 70 51 75 65 72 79 20 3d 20 26 61 4d  ..  pQuery = &aM
35ed0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70  em[pOp->p3];.  p
35ee0 41 72 67 63 20 3d 20 26 70 51 75 65 72 79 5b 31  Argc = &pQuery[1
35ef0 5d 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61  ];.  pCur = p->a
35f00 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
35f10 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
35f20 6c 69 64 28 70 51 75 65 72 79 29 20 29 3b 0a 20  lid(pQuery) );. 
35f30 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
35f40 70 4f 70 2d 3e 70 33 2c 20 70 51 75 65 72 79 29  pOp->p3, pQuery)
35f50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
35f60 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
35f70 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 70 56  YPE_VTAB );.  pV
35f80 43 75 72 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70  Cur = pCur->uc.p
35f90 56 43 75 72 3b 0a 20 20 70 56 74 61 62 20 3d 20  VCur;.  pVtab = 
35fa0 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20  pVCur->pVtab;.  
35fb0 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
35fc0 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20  >pModule;..  /* 
35fd0 47 72 61 62 20 74 68 65 20 69 6e 64 65 78 20 6e  Grab the index n
35fe0 75 6d 62 65 72 20 61 6e 64 20 61 72 67 63 20 70  umber and argc p
35ff0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61  arameters */.  a
36000 73 73 65 72 74 28 20 28 70 51 75 65 72 79 2d 3e  ssert( (pQuery->
36010 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d  flags&MEM_Int)!=
36020 30 20 26 26 20 70 41 72 67 63 2d 3e 66 6c 61 67  0 && pArgc->flag
36030 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20  s==MEM_Int );.  
36040 6e 41 72 67 20 3d 20 28 69 6e 74 29 70 41 72 67  nArg = (int)pArg
36050 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72 79  c->u.i;.  iQuery
36060 20 3d 20 28 69 6e 74 29 70 51 75 65 72 79 2d 3e   = (int)pQuery->
36070 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  u.i;..  /* Invok
36080 65 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65  e the xFilter me
36090 74 68 6f 64 20 2a 2f 0a 20 20 72 65 73 20 3d 20  thod */.  res = 
360a0 30 3b 0a 20 20 61 70 41 72 67 20 3d 20 70 2d 3e  0;.  apArg = p->
360b0 61 70 41 72 67 3b 0a 20 20 66 6f 72 28 69 20 3d  apArg;.  for(i =
360c0 20 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29   0; i<nArg; i++)
360d0 7b 0a 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d  {.    apArg[i] =
360e0 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b 0a 20 20   &pArgc[i+1];.  
360f0 7d 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65  }.  rc = pModule
36100 2d 3e 78 46 69 6c 74 65 72 28 70 56 43 75 72 2c  ->xFilter(pVCur,
36110 20 69 51 75 65 72 79 2c 20 70 4f 70 2d 3e 70 34   iQuery, pOp->p4
36120 2e 7a 2c 20 6e 41 72 67 2c 20 61 70 41 72 67 29  .z, nArg, apArg)
36130 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 49  ;.  sqlite3VtabI
36140 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70  mportErrmsg(p, p
36150 56 74 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20  Vtab);.  if( rc 
36160 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
36170 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 65 73  _to_error;.  res
36180 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66   = pModule->xEof
36190 28 70 56 43 75 72 29 3b 0a 20 20 70 43 75 72 2d  (pVCur);.  pCur-
361a0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20  >nullRow = 0;.  
361b0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
361c0 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28  res!=0,2);.  if(
361d0 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70   res ) goto jump
361e0 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
361f0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
36200 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
36210 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
36220 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
36230 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
36240 63 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e 20 50 31  code: VColumn P1
36250 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
36260 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 76 63  nopsis: r[P3]=vc
36270 6f 6c 75 6d 6e 28 50 32 29 0a 2a 2a 0a 2a 2a 20  olumn(P2).**.** 
36280 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  Store the value 
36290 6f 66 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c  of the P2-th col
362a0 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f  umn of.** the ro
362b0 77 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  w of the virtual
362c0 2d 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20  -table that the 
362d0 0a 2a 2a 20 50 31 20 63 75 72 73 6f 72 20 69 73  .** P1 cursor is
362e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 6e 74   pointing to int
362f0 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
36300 2f 0a 63 61 73 65 20 4f 50 5f 56 43 6f 6c 75 6d  /.case OP_VColum
36310 6e 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  n: {.  sqlite3_v
36320 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f  tab *pVtab;.  co
36330 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
36340 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d  le *pModule;.  M
36350 65 6d 20 2a 70 44 65 73 74 3b 0a 20 20 73 71 6c  em *pDest;.  sql
36360 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 73 43 6f  ite3_context sCo
36370 6e 74 65 78 74 3b 0a 0a 20 20 56 64 62 65 43 75  ntext;..  VdbeCu
36380 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e  rsor *pCur = p->
36390 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
363a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
363b0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
363c0 45 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73 65  E_VTAB );.  asse
363d0 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
363e0 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
363f0 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
36400 72 29 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20  r) );.  pDest = 
36410 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
36420 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
36430 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  ge(p, pDest);.  
36440 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f  if( pCur->nullRo
36450 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  w ){.    sqlite3
36460 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
36470 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  Dest);.    break
36480 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20 3d 20  ;.  }.  pVtab = 
36490 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 2d 3e  pCur->uc.pVCur->
364a0 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65  pVtab;.  pModule
364b0 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
364c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 6f  e;.  assert( pMo
364d0 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 20 29 3b  dule->xColumn );
364e0 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 6f 6e 74  .  memset(&sCont
364f0 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ext, 0, sizeof(s
36500 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 73 43 6f  Context));.  sCo
36510 6e 74 65 78 74 2e 70 4f 75 74 20 3d 20 70 44 65  ntext.pOut = pDe
36520 73 74 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65  st;.  MemSetType
36530 46 6c 61 67 28 70 44 65 73 74 2c 20 4d 45 4d 5f  Flag(pDest, MEM_
36540 4e 75 6c 6c 29 3b 0a 20 20 72 63 20 3d 20 70 4d  Null);.  rc = pM
36550 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 28 70  odule->xColumn(p
36560 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 2c 20 26  Cur->uc.pVCur, &
36570 73 43 6f 6e 74 65 78 74 2c 20 70 4f 70 2d 3e 70  sContext, pOp->p
36580 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61  2);.  sqlite3Vta
36590 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c  bImportErrmsg(p,
365a0 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 73   pVtab);.  if( s
365b0 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 20  Context.isError 
365c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 43 6f 6e  ){.    rc = sCon
365d0 74 65 78 74 2e 69 73 45 72 72 6f 72 3b 0a 20 20  text.isError;.  
365e0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
365f0 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 44  hangeEncoding(pD
36600 65 73 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  est, encoding);.
36610 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
36620 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74 29  (pOp->p3, pDest)
36630 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
36640 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29 3b 0a  LOBSIZE(pDest);.
36650 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
36660 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 44 65 73  beMemTooBig(pDes
36670 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  t) ){.    goto t
36680 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 69 66  oo_big;.  }.  if
36690 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
366a0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
366b0 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
366c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
366d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
366e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
366f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
36700 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4e  LE./* Opcode: VN
36710 65 78 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ext P1 P2 * * *.
36720 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 76 69  **.** Advance vi
36730 72 74 75 61 6c 20 74 61 62 6c 65 20 50 31 20 74  rtual table P1 t
36740 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  o the next row i
36750 6e 20 69 74 73 20 72 65 73 75 6c 74 20 73 65 74  n its result set
36760 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20   and.** jump to 
36770 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20  instruction P2. 
36780 20 4f 72 2c 20 69 66 20 74 68 65 20 76 69 72 74   Or, if the virt
36790 75 61 6c 20 74 61 62 6c 65 20 68 61 73 20 72 65  ual table has re
367a0 61 63 68 65 64 0a 2a 2a 20 74 68 65 20 65 6e 64  ached.** the end
367b0 20 6f 66 20 69 74 73 20 72 65 73 75 6c 74 20 73   of its result s
367c0 65 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  et, then fall th
367d0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
367e0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  t instruction..*
367f0 2f 0a 63 61 73 65 20 4f 50 5f 56 4e 65 78 74 3a  /.case OP_VNext:
36800 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a   {   /* jump */.
36810 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
36820 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73  pVtab;.  const s
36830 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
36840 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 72 65  Module;.  int re
36850 73 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  s;.  VdbeCursor 
36860 2a 70 43 75 72 3b 0a 0a 20 20 72 65 73 20 3d 20  *pCur;..  res = 
36870 30 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61  0;.  pCur = p->a
36880 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
36890 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
368a0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
368b0 5f 56 54 41 42 20 29 3b 0a 20 20 69 66 28 20 70  _VTAB );.  if( p
368c0 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a  Cur->nullRow ){.
368d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
368e0 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d 3e 75   pVtab = pCur->u
368f0 63 2e 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a  c.pVCur->pVtab;.
36900 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61    pModule = pVta
36910 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73  b->pModule;.  as
36920 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78  sert( pModule->x
36930 4e 65 78 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  Next );..  /* In
36940 76 6f 6b 65 20 74 68 65 20 78 4e 65 78 74 28 29  voke the xNext()
36950 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d   method of the m
36960 6f 64 75 6c 65 2e 20 54 68 65 72 65 20 69 73 20  odule. There is 
36970 6e 6f 20 77 61 79 20 66 6f 72 20 74 68 65 0a 20  no way for the. 
36980 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 69   ** underlying i
36990 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f  mplementation to
369a0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
369b0 20 69 66 20 6f 6e 65 20 6f 63 63 75 72 73 20 64   if one occurs d
369c0 75 72 69 6e 67 0a 20 20 2a 2a 20 78 4e 65 78 74  uring.  ** xNext
369d0 28 29 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  (). Instead, if 
369e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
369f0 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e 65   true is returne
36a00 64 20 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68  d (indicating th
36a10 61 74 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 73  at .  ** data is
36a20 20 61 76 61 69 6c 61 62 6c 65 29 20 61 6e 64 20   available) and 
36a30 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72  the error code r
36a40 65 74 75 72 6e 65 64 20 77 68 65 6e 20 78 43 6f  eturned when xCo
36a50 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d  lumn or.  ** som
36a60 65 20 6f 74 68 65 72 20 6d 65 74 68 6f 64 20 69  e other method i
36a70 73 20 6e 65 78 74 20 69 6e 76 6f 6b 65 64 20 6f  s next invoked o
36a80 6e 20 74 68 65 20 73 61 76 65 20 76 69 72 74 75  n the save virtu
36a90 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  al table cursor.
36aa0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 4d 6f  .  */.  rc = pMo
36ab0 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70 43 75 72  dule->xNext(pCur
36ac0 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a 20 20 73  ->uc.pVCur);.  s
36ad0 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
36ae0 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29  Errmsg(p, pVtab)
36af0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
36b00 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
36b10 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d 20 70 4d  rror;.  res = pM
36b20 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 43 75 72  odule->xEof(pCur
36b30 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a 20 20 56  ->uc.pVCur);.  V
36b40 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 21  dbeBranchTaken(!
36b50 72 65 73 2c 32 29 3b 0a 20 20 69 66 28 20 21 72  res,2);.  if( !r
36b60 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
36b70 74 68 65 72 65 20 69 73 20 64 61 74 61 2c 20 6a  there is data, j
36b80 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20  ump to P2 */.   
36b90 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
36ba0 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69  _and_check_for_i
36bb0 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20  nterrupt;.  }.  
36bc0 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69  goto check_for_i
36bd0 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 23 65 6e 64  nterrupt;.}.#end
36be0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
36bf0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
36c00 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
36c10 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
36c20 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
36c30 52 65 6e 61 6d 65 20 50 31 20 2a 20 2a 20 50 34  Rename P1 * * P4
36c40 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61   *.**.** P4 is a
36c50 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69   pointer to a vi
36c60 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65  rtual table obje
36c70 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  ct, an sqlite3_v
36c80 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  tab structure..*
36c90 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e  * This opcode in
36ca0 76 6f 6b 65 73 20 74 68 65 20 63 6f 72 72 65 73  vokes the corres
36cb0 70 6f 6e 64 69 6e 67 20 78 52 65 6e 61 6d 65 20  ponding xRename 
36cc0 6d 65 74 68 6f 64 2e 20 54 68 65 20 76 61 6c 75  method. The valu
36cd0 65 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  e.** in register
36ce0 20 50 31 20 69 73 20 70 61 73 73 65 64 20 61 73   P1 is passed as
36cf0 20 74 68 65 20 7a 4e 61 6d 65 20 61 72 67 75 6d   the zName argum
36d00 65 6e 74 20 74 6f 20 74 68 65 20 78 52 65 6e 61  ent to the xRena
36d10 6d 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 63 61  me method..*/.ca
36d20 73 65 20 4f 50 5f 56 52 65 6e 61 6d 65 3a 20 7b  se OP_VRename: {
36d30 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
36d40 2a 70 56 74 61 62 3b 0a 20 20 4d 65 6d 20 2a 70  *pVtab;.  Mem *p
36d50 4e 61 6d 65 3b 0a 0a 20 20 70 56 74 61 62 20 3d  Name;..  pVtab =
36d60 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e   pOp->p4.pVtab->
36d70 70 56 74 61 62 3b 0a 20 20 70 4e 61 6d 65 20 3d  pVtab;.  pName =
36d80 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
36d90 0a 20 20 61 73 73 65 72 74 28 20 70 56 74 61 62  .  assert( pVtab
36da0 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61  ->pModule->xRena
36db0 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
36dc0 6d 65 6d 49 73 56 61 6c 69 64 28 70 4e 61 6d 65  memIsValid(pName
36dd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36de0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
36df0 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
36e00 45 28 70 4f 70 2d 3e 70 31 2c 20 70 4e 61 6d 65  E(pOp->p1, pName
36e10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
36e20 6d 65 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  me->flags & MEM_
36e30 53 74 72 20 29 3b 0a 20 20 74 65 73 74 63 61 73  Str );.  testcas
36e40 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53  e( pName->enc==S
36e50 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20  QLITE_UTF8 );.  
36e60 74 65 73 74 63 61 73 65 28 20 70 4e 61 6d 65 2d  testcase( pName-
36e70 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
36e80 31 36 42 45 20 29 3b 0a 20 20 74 65 73 74 63 61  16BE );.  testca
36e90 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d  se( pName->enc==
36ea0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29  SQLITE_UTF16LE )
36eb0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
36ec0 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
36ed0 6e 67 28 70 4e 61 6d 65 2c 20 53 51 4c 49 54 45  ng(pName, SQLITE
36ee0 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 72 63  _UTF8);.  if( rc
36ef0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
36f00 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 63  e_to_error;.  rc
36f10 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
36f20 65 2d 3e 78 52 65 6e 61 6d 65 28 70 56 74 61 62  e->xRename(pVtab
36f30 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 73  , pName->z);.  s
36f40 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
36f50 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29  Errmsg(p, pVtab)
36f60 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  ;.  p->expired =
36f70 20 30 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   0;.  if( rc ) g
36f80 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
36f90 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
36fa0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
36fb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
36fc0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
36fd0 70 63 6f 64 65 3a 20 56 55 70 64 61 74 65 20 50  pcode: VUpdate P
36fe0 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
36ff0 20 53 79 6e 6f 70 73 69 73 3a 20 64 61 74 61 3d   Synopsis: data=
37000 72 5b 50 33 40 50 32 5d 0a 2a 2a 0a 2a 2a 20 50  r[P3@P2].**.** P
37010 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
37020 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  o a virtual tabl
37030 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c  e object, an sql
37040 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
37050 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ure..** This opc
37060 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
37070 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78 55  corresponding xU
37080 70 64 61 74 65 20 6d 65 74 68 6f 64 2e 20 50 32  pdate method. P2
37090 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 63   values.** are c
370a0 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f 72 79  ontiguous memory
370b0 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 20   cells starting 
370c0 61 74 20 50 33 20 74 6f 20 70 61 73 73 20 74 6f  at P3 to pass to
370d0 20 74 68 65 20 78 55 70 64 61 74 65 20 0a 2a 2a   the xUpdate .**
370e0 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 54 68 65   invocation. The
370f0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
37100 65 72 20 28 50 33 2b 50 32 2d 31 29 20 63 6f 72  er (P3+P2-1) cor
37110 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
37120 0a 2a 2a 20 70 32 74 68 20 65 6c 65 6d 65 6e 74  .** p2th element
37130 20 6f 66 20 74 68 65 20 61 72 67 76 20 61 72 72   of the argv arr
37140 61 79 20 70 61 73 73 65 64 20 74 6f 20 78 55 70  ay passed to xUp
37150 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  date..**.** The 
37160 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20 77  xUpdate method w
37170 69 6c 6c 20 64 6f 20 61 20 44 45 4c 45 54 45 20  ill do a DELETE 
37180 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  or an INSERT or 
37190 62 6f 74 68 2e 0a 2a 2a 20 54 68 65 20 61 72 67  both..** The arg
371a0 76 5b 30 5d 20 65 6c 65 6d 65 6e 74 20 28 77 68  v[0] element (wh
371b0 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ich corresponds 
371c0 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50  to memory cell P
371d0 33 29 0a 2a 2a 20 69 73 20 74 68 65 20 72 6f 77  3).** is the row
371e0 69 64 20 6f 66 20 61 20 72 6f 77 20 74 6f 20 64  id of a row to d
371f0 65 6c 65 74 65 2e 20 20 49 66 20 61 72 67 76 5b  elete.  If argv[
37200 30 5d 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  0] is NULL then 
37210 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74 69 6f 6e 20  no .** deletion 
37220 6f 63 63 75 72 73 2e 20 20 54 68 65 20 61 72 67  occurs.  The arg
37230 76 5b 31 5d 20 65 6c 65 6d 65 6e 74 20 69 73 20  v[1] element is 
37240 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
37250 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 2e 20 20 54   new .** row.  T
37260 68 69 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  his can be NULL 
37270 74 6f 20 68 61 76 65 20 74 68 65 20 76 69 72 74  to have the virt
37280 75 61 6c 20 74 61 62 6c 65 20 73 65 6c 65 63 74  ual table select
37290 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77   the new .** row
372a0 69 64 20 66 6f 72 20 69 74 73 65 6c 66 2e 20 20  id for itself.  
372b0 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 65  The subsequent e
372c0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 61  lements in the a
372d0 72 72 61 79 20 61 72 65 20 0a 2a 2a 20 74 68 65  rray are .** the
372e0 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d   values of colum
372f0 6e 73 20 69 6e 20 74 68 65 20 6e 65 77 20 72 6f  ns in the new ro
37300 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d 3d  w..**.** If P2==
37310 31 20 74 68 65 6e 20 6e 6f 20 69 6e 73 65 72 74  1 then no insert
37320 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
37330 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65 20 72  argv[0] is the r
37340 6f 77 69 64 20 6f 66 0a 2a 2a 20 61 20 72 6f 77  owid of.** a row
37350 20 74 6f 20 64 65 6c 65 74 65 2e 0a 2a 2a 0a 2a   to delete..**.*
37360 2a 20 50 31 20 69 73 20 61 20 62 6f 6f 6c 65 61  * P1 is a boolea
37370 6e 20 66 6c 61 67 2e 20 49 66 20 69 74 20 69 73  n flag. If it is
37380 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 6e 64   set to true and
37390 20 74 68 65 20 78 55 70 64 61 74 65 20 63 61 6c   the xUpdate cal
373a0 6c 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  l.** is successf
373b0 75 6c 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ul, then the val
373c0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
373d0 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
373e0 72 74 5f 72 6f 77 69 64 28 29 20 0a 2a 2a 20 69  rt_rowid() .** i
373f0 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
37400 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ue of the rowid 
37410 66 6f 72 20 74 68 65 20 72 6f 77 20 6a 75 73 74  for the row just
37420 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
37430 20 50 35 20 69 73 20 74 68 65 20 65 72 72 6f 72   P5 is the error
37440 20 61 63 74 69 6f 6e 73 20 28 4f 45 5f 52 65 70   actions (OE_Rep
37450 6c 61 63 65 2c 20 4f 45 5f 46 61 69 6c 2c 20 4f  lace, OE_Fail, O
37460 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 20 74  E_Ignore, etc) t
37470 6f 0a 2a 2a 20 61 70 70 6c 79 20 69 6e 20 74 68  o.** apply in th
37480 65 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6e 73  e case of a cons
37490 74 72 61 69 6e 74 20 66 61 69 6c 75 72 65 20 6f  traint failure o
374a0 6e 20 61 6e 20 69 6e 73 65 72 74 20 6f 72 20 75  n an insert or u
374b0 70 64 61 74 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pdate..*/.case O
374c0 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 73  P_VUpdate: {.  s
374d0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
374e0 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ab;.  const sqli
374f0 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
37500 75 6c 65 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b  ule;.  int nArg;
37510 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
37520 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 3b 0a  te_int64 rowid;.
37530 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 20    Mem **apArg;. 
37540 20 4d 65 6d 20 2a 70 58 3b 0a 0a 20 20 61 73 73   Mem *pX;..  ass
37550 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  ert( pOp->p2==1 
37560 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
37570 35 3d 3d 4f 45 5f 46 61 69 6c 20 20 20 7c 7c 20  5==OE_Fail   || 
37580 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 6f 6c 6c  pOp->p5==OE_Roll
37590 62 61 63 6b 20 0a 20 20 20 20 20 20 20 7c 7c 20  back .       || 
375a0 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 41 62 6f 72  pOp->p5==OE_Abor
375b0 74 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45  t || pOp->p5==OE
375c0 5f 49 67 6e 6f 72 65 20 7c 7c 20 70 4f 70 2d 3e  _Ignore || pOp->
375d0 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 0a 20  p5==OE_Replace. 
375e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
375f0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
37600 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70    pVtab = pOp->p
37610 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
37620 20 20 69 66 28 20 70 56 74 61 62 3d 3d 30 20 7c    if( pVtab==0 |
37630 7c 20 4e 45 56 45 52 28 70 56 74 61 62 2d 3e 70  | NEVER(pVtab->p
37640 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b 0a 20 20  Module==0) ){.  
37650 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
37660 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74 6f 20 61  CKED;.    goto a
37670 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
37680 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64 75 6c 65  r;.  }.  pModule
37690 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
376a0 65 3b 0a 20 20 6e 41 72 67 20 3d 20 70 4f 70 2d  e;.  nArg = pOp-
376b0 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p2;.  assert( p
376c0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56  Op->p4type==P4_V
376d0 54 41 42 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  TAB );.  if( ALW
376e0 41 59 53 28 70 4d 6f 64 75 6c 65 2d 3e 78 55 70  AYS(pModule->xUp
376f0 64 61 74 65 29 20 29 7b 0a 20 20 20 20 75 38 20  date) ){.    u8 
37700 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d  vtabOnConflict =
37710 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c   db->vtabOnConfl
37720 69 63 74 3b 0a 20 20 20 20 61 70 41 72 67 20 3d  ict;.    apArg =
37730 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 70   p->apArg;.    p
37740 58 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  X = &aMem[pOp->p
37750 33 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  3];.    for(i=0;
37760 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
37770 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
37780 49 73 56 61 6c 69 64 28 70 58 29 20 29 3b 0a 20  IsValid(pX) );. 
37790 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43       memAboutToC
377a0 68 61 6e 67 65 28 70 2c 20 70 58 29 3b 0a 20 20  hange(p, pX);.  
377b0 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 70      apArg[i] = p
377c0 58 3b 0a 20 20 20 20 20 20 70 58 2b 2b 3b 0a 20  X;.      pX++;. 
377d0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 76 74 61     }.    db->vta
377e0 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 70 4f  bOnConflict = pO
377f0 70 2d 3e 70 35 3b 0a 20 20 20 20 72 63 20 3d 20  p->p5;.    rc = 
37800 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61 74 65  pModule->xUpdate
37810 28 70 56 74 61 62 2c 20 6e 41 72 67 2c 20 61 70  (pVtab, nArg, ap
37820 41 72 67 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20  Arg, &rowid);.  
37830 20 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66    db->vtabOnConf
37840 6c 69 63 74 20 3d 20 76 74 61 62 4f 6e 43 6f 6e  lict = vtabOnCon
37850 66 6c 69 63 74 3b 0a 20 20 20 20 73 71 6c 69 74  flict;.    sqlit
37860 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
37870 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
37880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37890 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 31 20 29  _OK && pOp->p1 )
378a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
378b0 6e 41 72 67 3e 31 20 26 26 20 61 70 41 72 67 5b  nArg>1 && apArg[
378c0 30 5d 20 26 26 20 28 61 70 41 72 67 5b 30 5d 2d  0] && (apArg[0]-
378d0 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29  >flags&MEM_Null)
378e0 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 61   );.      db->la
378f0 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f  stRowid = lastRo
37900 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20  wid = rowid;.   
37910 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 26 30   }.    if( (rc&0
37920 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
37930 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
37940 70 34 2e 70 56 74 61 62 2d 3e 62 43 6f 6e 73 74  p4.pVtab->bConst
37950 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 69  raint ){.      i
37960 66 28 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 49  f( pOp->p5==OE_I
37970 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
37980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37990 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
379a0 20 20 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63        p->errorAc
379b0 74 69 6f 6e 20 3d 20 28 28 70 4f 70 2d 3e 70 35  tion = ((pOp->p5
379c0 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 20 3f 20  ==OE_Replace) ? 
379d0 4f 45 5f 41 62 6f 72 74 20 3a 20 70 4f 70 2d 3e  OE_Abort : pOp->
379e0 70 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p5);.      }.   
379f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
37a00 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20  >nChange++;.    
37a10 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  }.    if( rc ) g
37a20 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
37a30 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72  _error;.  }.  br
37a40 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
37a50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
37a60 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
37a70 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d  fndef  SQLITE_OM
37a80 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
37a90 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 67 65  ./* Opcode: Page
37aa0 63 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20  count P1 P2 * * 
37ab0 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  *.**.** Write th
37ac0 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
37ad0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
37ae0 61 62 61 73 65 20 50 31 20 74 6f 20 6d 65 6d 6f  abase P1 to memo
37af0 72 79 20 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a 63  ry cell P2..*/.c
37b00 61 73 65 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74  ase OP_Pagecount
37b10 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
37b20 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74  * out2 */.  pOut
37b30 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
37b40 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
37b50 74 2d 3e 75 2e 69 20 3d 20 73 71 6c 69 74 65 33  t->u.i = sqlite3
37b60 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 64 62  BtreeLastPage(db
37b70 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
37b80 42 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  Bt);.  break;.}.
37b90 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
37ba0 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41    SQLITE_OMIT_PA
37bb0 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 20 4f  GER_PRAGMAS./* O
37bc0 70 63 6f 64 65 3a 20 4d 61 78 50 67 63 6e 74 20  pcode: MaxPgcnt 
37bd0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
37be0 2a 2a 20 54 72 79 20 74 6f 20 73 65 74 20 74 68  ** Try to set th
37bf0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
37c00 6f 75 6e 74 20 66 6f 72 20 64 61 74 61 62 61 73  ount for databas
37c10 65 20 50 31 20 74 6f 20 74 68 65 20 76 61 6c 75  e P1 to the valu
37c20 65 20 69 6e 20 50 33 2e 0a 2a 2a 20 44 6f 20 6e  e in P3..** Do n
37c30 6f 74 20 6c 65 74 20 74 68 65 20 6d 61 78 69 6d  ot let the maxim
37c40 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 61  um page count fa
37c50 6c 6c 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  ll below the cur
37c60 72 65 6e 74 20 70 61 67 65 20 63 6f 75 6e 74 20  rent page count 
37c70 61 6e 64 0a 2a 2a 20 64 6f 20 6e 6f 74 20 63 68  and.** do not ch
37c80 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
37c90 20 70 61 67 65 20 63 6f 75 6e 74 20 76 61 6c 75   page count valu
37ca0 65 20 69 66 20 50 33 3d 3d 30 2e 0a 2a 2a 0a 2a  e if P3==0..**.*
37cb0 2a 20 53 74 6f 72 65 20 74 68 65 20 6d 61 78 69  * Store the maxi
37cc0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 61  mum page count a
37cd0 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 20  fter the change 
37ce0 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
37cf0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61 78 50 67  */.case OP_MaxPg
37d00 63 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  cnt: {          
37d10 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 75    /* out2 */.  u
37d20 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 4d  nsigned int newM
37d30 61 78 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ax;.  Btree *pBt
37d40 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  ;..  pOut = out2
37d50 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
37d60 70 29 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e  p);.  pBt = db->
37d70 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74  aDb[pOp->p1].pBt
37d80 3b 0a 20 20 6e 65 77 4d 61 78 20 3d 20 30 3b 0a  ;.  newMax = 0;.
37d90 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b    if( pOp->p3 ){
37da0 0a 20 20 20 20 6e 65 77 4d 61 78 20 3d 20 73 71  .    newMax = sq
37db0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
37dc0 67 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  ge(pBt);.    if(
37dd0 20 6e 65 77 4d 61 78 20 3c 20 28 75 6e 73 69 67   newMax < (unsig
37de0 6e 65 64 29 70 4f 70 2d 3e 70 33 20 29 20 6e 65  ned)pOp->p3 ) ne
37df0 77 4d 61 78 20 3d 20 28 75 6e 73 69 67 6e 65 64  wMax = (unsigned
37e00 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20  )pOp->p3;.  }.  
37e10 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c 69  pOut->u.i = sqli
37e20 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
37e30 6f 75 6e 74 28 70 42 74 2c 20 6e 65 77 4d 61 78  ount(pBt, newMax
37e40 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  );.  break;.}.#e
37e50 6e 64 69 66 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ndif.../* Opcode
37e60 3a 20 49 6e 69 74 20 50 31 20 50 32 20 2a 20 50  : Init P1 P2 * P
37e70 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
37e80 20 53 74 61 72 74 20 61 74 20 50 32 0a 2a 2a 0a   Start at P2.**.
37e90 2a 2a 20 50 72 6f 67 72 61 6d 73 20 63 6f 6e 74  ** Programs cont
37ea0 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 69 6e 73  ain a single ins
37eb0 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 70  tance of this op
37ec0 63 6f 64 65 20 61 73 20 74 68 65 20 76 65 72 79  code as the very
37ed0 20 66 69 72 73 74 0a 2a 2a 20 6f 70 63 6f 64 65   first.** opcode
37ee0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 61 63 69  ..**.** If traci
37ef0 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 20 28 62  ng is enabled (b
37f00 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 72  y the sqlite3_tr
37f10 61 63 65 28 29 29 20 69 6e 74 65 72 66 61 63 65  ace()) interface
37f20 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 55 54  , then.** the UT
37f30 46 2d 38 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  F-8 string conta
37f40 69 6e 65 64 20 69 6e 20 50 34 20 69 73 20 65 6d  ined in P4 is em
37f50 69 74 74 65 64 20 6f 6e 20 74 68 65 20 74 72 61  itted on the tra
37f60 63 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  ce callback..** 
37f70 4f 72 20 69 66 20 50 34 20 69 73 20 62 6c 61 6e  Or if P4 is blan
37f80 6b 2c 20 75 73 65 20 74 68 65 20 73 74 72 69 6e  k, use the strin
37f90 67 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  g returned by sq
37fa0 6c 69 74 65 33 5f 73 71 6c 28 29 2e 0a 2a 2a 0a  lite3_sql()..**.
37fb0 2a 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 74 20  ** If P2 is not 
37fc0 7a 65 72 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e  zero, jump to in
37fd0 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2a  struction P2..**
37fe0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
37ff0 65 20 76 61 6c 75 65 20 6f 66 20 50 31 20 73 6f  e value of P1 so
38000 20 74 68 61 74 20 4f 50 5f 4f 6e 63 65 20 6f 70   that OP_Once op
38010 63 6f 64 65 73 20 77 69 6c 6c 20 6a 75 6d 70 20  codes will jump 
38020 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  the.** first tim
38030 65 20 74 68 65 79 20 61 72 65 20 65 76 61 6c 75  e they are evalu
38040 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 72 75  ated for this ru
38050 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  n..*/.case OP_In
38060 69 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f  it: {          /
38070 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 63 68 61 72  * jump */.  char
38080 20 2a 7a 54 72 61 63 65 3b 0a 20 20 69 6e 74 20   *zTrace;.  int 
38090 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  i;..  /* If the 
380a0 50 34 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  P4 argument is n
380b0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
380c0 20 6d 75 73 74 20 62 65 20 61 6e 20 53 51 4c 20   must be an SQL 
380d0 63 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67 2e 0a  comment string..
380e0 20 20 2a 2a 20 54 68 65 20 22 2d 2d 22 20 73 74    ** The "--" st
380f0 72 69 6e 67 20 69 73 20 62 72 6f 6b 65 6e 20 75  ring is broken u
38100 70 20 74 6f 20 70 72 65 76 65 6e 74 20 66 61 6c  p to prevent fal
38110 73 65 2d 70 6f 73 69 74 69 76 65 73 20 77 69 74  se-positives wit
38120 68 20 73 72 63 63 6b 31 2e 63 2e 0a 20 20 2a 2a  h srcck1.c..  **
38130 0a 20 20 2a 2a 20 54 68 69 73 20 61 73 73 65 72  .  ** This asser
38140 74 28 29 20 70 72 6f 76 69 64 65 73 20 65 76 69  t() provides evi
38150 64 65 6e 63 65 20 66 6f 72 3a 0a 20 20 2a 2a 20  dence for:.  ** 
38160 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
38170 30 36 37 36 2d 30 39 38 36 30 20 54 68 65 20 63  0676-09860 The c
38180 61 6c 6c 62 61 63 6b 20 63 61 6e 20 63 6f 6d 70  allback can comp
38190 75 74 65 20 74 68 65 20 73 61 6d 65 20 74 65 78  ute the same tex
381a0 74 20 74 68 61 74 0a 20 20 2a 2a 20 77 6f 75 6c  t that.  ** woul
381b0 64 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75  d have been retu
381c0 72 6e 65 64 20 62 79 20 74 68 65 20 6c 65 67 61  rned by the lega
381d0 63 79 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  cy sqlite3_trace
381e0 28 29 20 69 6e 74 65 72 66 61 63 65 20 62 79 0a  () interface by.
381f0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 58    ** using the X
38200 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 58   argument when X
38210 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2d 2d   begins with "--
38220 22 20 61 6e 64 20 69 6e 76 6f 6b 69 6e 67 0a 20  " and invoking. 
38230 20 2a 2a 20 73 71 6c 69 74 65 33 5f 65 78 70 61   ** sqlite3_expa
38240 6e 64 65 64 5f 73 71 6c 28 50 29 20 6f 74 68 65  nded_sql(P) othe
38250 72 77 69 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  rwise..  */.  as
38260 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d  sert( pOp->p4.z=
38270 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 70 4f  =0 || strncmp(pO
38280 70 2d 3e 70 34 2e 7a 2c 20 22 2d 22 20 22 2d 20  p->p4.z, "-" "- 
38290 22 2c 20 33 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ", 3)==0 );.  as
382a0 73 65 72 74 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f  sert( pOp==p->aO
382b0 70 20 29 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  p );  /* Always 
382c0 69 6e 73 74 72 75 63 74 69 6f 6e 20 30 20 2a 2f  instruction 0 */
382d0 0a 0a 23 69 66 6e 64 65