/ Hex Artifact Content
Login

Artifact 176c0897af0aedecd3abc9afaf7fa80eaa7cf5eaf62583de256a9961df474373:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 66  implements the f
01a0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 75 6e  unction that run
01b0: 73 20 74 68 65 0a 2a 2a 20 62 79 74 65 63 6f 64  s the.** bytecod
01c0: 65 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  e of a prepared 
01d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
01e0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
01f0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
0200: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0210: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0220: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0230: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0240: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0250: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0260: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0270: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0280: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0290: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
02a0: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
02b0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
02c0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
02d0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
02e0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
02f0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
0300: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0310: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0320: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0330: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0340: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0350: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0360: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0370: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0380: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0390: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
03a0: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
03b0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
03c0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
03d0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
03e0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
03f0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
0400: 69 73 75 73 65 64 2e 20 20 41 20 73 68 61 6c 6c  isused.  A shall
0410: 6f 77 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72  ow copy of a str
0420: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6a 75 73 74  ing or blob just
0430: 20 63 6f 70 69 65 73 20 61 0a 2a 2a 20 70 6f 69   copies a.** poi
0440: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
0450: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 6e 6f 74 20  ng or blob, not 
0460: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  the content.  If
0470: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
0480: 20 69 73 20 63 68 61 6e 67 65 64 20 77 68 69 6c   is changed whil
0490: 65 20 74 68 65 20 63 6f 70 79 20 69 73 20 73 74  e the copy is st
04a0: 69 6c 6c 20 69 6e 20 75 73 65 2c 20 74 68 65 20  ill in use, the 
04b0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d  string or blob m
04c0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67  ight.** be chang
04d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
04e0: 72 20 74 68 65 20 63 6f 70 79 2e 20 20 54 68 69  r the copy.  Thi
04f0: 73 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73  s macro verifies
0500: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 0a 2a 2a   that nothing.**
0510: 20 6c 69 6b 65 20 74 68 61 74 20 65 76 65 72 20   like that ever 
0520: 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 23 69 66 64  happens..*/.#ifd
0530: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0540: 23 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75  # define memAbou
0550: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73  tToChange(P,M) s
0560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f  qlite3VdbeMemAbo
0570: 75 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a  utToChange(P,M).
0580: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d  #else.# define m
0590: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
05a0: 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  P,M).#endif../*.
05b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
05c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
05d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
05e0: 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72  every time a cur
05f0: 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69  sor.** moves, ei
0600: 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53  ther by the OP_S
0610: 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20  eekXX, OP_Next, 
0620: 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64  or OP_Prev opcod
0630: 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a  es.  The test.**
0640: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20   procedures use 
0650: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
0660: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0670: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a  at indices are.*
0680: 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63  * working correc
0690: 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61  tly.  This varia
06a0: 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74  ble has no funct
06b0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
06c0: 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79  o.** help verify
06d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
06e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ration of the li
06f0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66  brary..*/.#ifdef
0700: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0710: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
0720: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0730: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
0740: 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  is global variab
0750: 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20  le is positive, 
0760: 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e  it gets decremen
0770: 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a  ted once before.
0780: 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  ** each instruct
0790: 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e  ion in the VDBE.
07a0: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
07b0: 73 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69  s zero, the u1.i
07c0: 73 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20  sInterrupted.** 
07d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
07e0: 69 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69  ite3 structure i
07f0: 73 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74  s set in order t
0800: 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e  o simulate an in
0810: 74 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54  terrupt..**.** T
0820: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0830: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
0840: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
0850: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e   It does not fun
0860: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f  ction.** in an o
0870: 72 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a  rdinary build..*
0880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0890: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
08a0: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
08b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
08c0: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f  .** The next glo
08d0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
08e0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68  incremented each
08f0: 20 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72   type the OP_Sor
0900: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  t opcode.** is e
0910: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
0920: 73 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73  st procedures us
0930: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
0940: 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  on to make sure 
0950: 74 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20  that.** sorting 
0960: 69 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20  is occurring or 
0970: 6e 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74  not occurring at
0980: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d   appropriate tim
0990: 65 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61  es.   This varia
09a0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75  ble.** has no fu
09b0: 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nction other tha
09c0: 6e 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79  n to help verify
09d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
09e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
09f0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
0a00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0a10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
0a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0a30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65  if../*.** The ne
0a40: 78 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  xt global variab
0a50: 6c 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73  le records the s
0a60: 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ize of the large
0a70: 73 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f  st MEM_Blob.** o
0a80: 72 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68  r MEM_Str that h
0a90: 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20  as been used by 
0aa0: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20  a VDBE opcode.  
0ab0: 54 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  The test procedu
0ac0: 72 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  res.** use this 
0ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d  information to m
0ae0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
0af0: 65 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63  e zero-blob func
0b00: 74 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20  tionality.** is 
0b10: 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c  working correctl
0b20: 79 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  y.   This variab
0b30: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0b50: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0b60: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0b70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0b80: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0b90: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ba0: 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
0bb0: 73 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  size = 0;.static
0bc0: 20 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42   void updateMaxB
0bd0: 6c 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b  lobsize(Mem *p){
0be0: 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
0bf0: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
0c00: 42 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e  Blob))!=0 && p->
0c10: 6e 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  n>sqlite3_max_bl
0c20: 6f 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71  obsize ){.    sq
0c30: 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
0c40: 7a 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d  ze = p->n;.  }.}
0c50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0c60: 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61  his macro evalua
0c70: 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 65  tes to true if e
0c80: 69 74 68 65 72 20 74 68 65 20 75 70 64 61 74 65  ither the update
0c90: 20 68 6f 6f 6b 20 6f 72 20 74 68 65 20 70 72 65   hook or the pre
0ca0: 75 70 64 61 74 65 0a 2a 2a 20 68 6f 6f 6b 20 61  update.** hook a
0cb0: 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 64  re enabled for d
0cc0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 20  atabase connect 
0cd0: 44 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  DB..*/.#ifdef SQ
0ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
0cf0: 50 44 41 54 45 5f 48 4f 4f 4b 0a 23 20 64 65 66  PDATE_HOOK.# def
0d00: 69 6e 65 20 48 41 53 5f 55 50 44 41 54 45 5f 48  ine HAS_UPDATE_H
0d10: 4f 4f 4b 28 44 42 29 20 28 28 44 42 29 2d 3e 78  OOK(DB) ((DB)->x
0d20: 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
0d30: 6b 7c 7c 28 44 42 29 2d 3e 78 55 70 64 61 74 65  k||(DB)->xUpdate
0d40: 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6c 73 65 0a  Callback).#else.
0d50: 23 20 64 65 66 69 6e 65 20 48 41 53 5f 55 50 44  # define HAS_UPD
0d60: 41 54 45 5f 48 4f 4f 4b 28 44 42 29 20 28 28 44  ATE_HOOK(DB) ((D
0d70: 42 29 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  B)->xUpdateCallb
0d80: 61 63 6b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ack).#endif../*.
0d90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0da0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0db0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0dc0: 74 69 6d 65 20 74 68 65 20 4f 50 5f 46 6f 75 6e  time the OP_Foun
0dd0: 64 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  d opcode.** is e
0de0: 78 65 63 75 74 65 64 2e 20 54 68 69 73 20 69 73  xecuted. This is
0df0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 77 68   used to test wh
0e00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
0e10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20   foreign key.** 
0e20: 6f 70 65 72 61 74 69 6f 6e 20 69 6d 70 6c 65 6d  operation implem
0e30: 65 6e 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 46  ented using OP_F
0e40: 6b 49 73 5a 65 72 6f 20 69 73 20 77 6f 72 6b 69  kIsZero is worki
0e50: 6e 67 2e 20 54 68 69 73 20 76 61 72 69 61 62 6c  ng. This variabl
0e60: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63  e.** has no func
0e70: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0e80: 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  to help verify t
0e90: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0ea0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  tion of the.** l
0eb0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ec0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ed0: 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  t sqlite3_found_
0ee0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0ef0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 61 20  f../*.** Test a 
0f00: 72 65 67 69 73 74 65 72 20 74 6f 20 73 65 65 20  register to see 
0f10: 69 66 20 69 74 20 65 78 63 65 65 64 73 20 74 68  if it exceeds th
0f20: 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
0f30: 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2a 20  m blob size..** 
0f40: 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 63 6f  If it does, reco
0f50: 72 64 20 74 68 65 20 6e 65 77 20 6d 61 78 69 6d  rd the new maxim
0f60: 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2f  um blob size..*/
0f70: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0f80: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0f90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54  fined(SQLITE_UNT
0fa0: 45 53 54 41 42 4c 45 29 0a 23 20 64 65 66 69 6e  ESTABLE).# defin
0fb0: 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f  e UPDATE_MAX_BLO
0fc0: 42 53 49 5a 45 28 50 29 20 20 75 70 64 61 74 65  BSIZE(P)  update
0fd0: 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29 0a 23  MaxBlobsize(P).#
0fe0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 50  else.# define UP
0ff0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
1000: 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(P).#endif../*.
1010: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 56 44  ** Invoke the VD
1020: 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1030: 62 61 63 6b 2c 20 69 66 20 74 68 61 74 20 63 61  back, if that ca
1040: 6c 6c 62 61 63 6b 20 69 73 20 64 65 66 69 6e 65  llback is define
1050: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 66 65 61 74  d.  This.** feat
1060: 75 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ure is used for 
1070: 74 65 73 74 20 73 75 69 74 65 20 76 61 6c 69 64  test suite valid
1080: 61 74 69 6f 6e 20 6f 6e 6c 79 20 61 6e 64 20 64  ation only and d
1090: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 61  oes not appear a
10a0: 6e 0a 2a 2a 20 70 72 6f 64 75 63 74 69 6f 6e 20  n.** production 
10b0: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 4d 20  builds..**.** M 
10c0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 32  is an integer, 2
10d0: 20 6f 72 20 33 2c 20 74 68 61 74 20 69 6e 64 69   or 3, that indi
10e0: 63 65 73 20 68 6f 77 20 6d 61 6e 79 20 64 69 66  ces how many dif
10f0: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 65 0a  ferent ways the.
1100: 2a 2a 20 62 72 61 6e 63 68 20 63 61 6e 20 67 6f  ** branch can go
1110: 2e 20 20 49 74 20 69 73 20 75 73 75 61 6c 6c 79  .  It is usually
1120: 20 32 2e 20 20 22 49 22 20 69 73 20 74 68 65 20   2.  "I" is the 
1130: 64 69 72 65 63 74 69 6f 6e 20 74 68 65 20 62 72  direction the br
1140: 61 6e 63 68 0a 2a 2a 20 67 6f 65 73 2e 20 20 30  anch.** goes.  0
1150: 20 6d 65 61 6e 73 20 66 61 6c 6c 73 20 74 68 72   means falls thr
1160: 6f 75 67 68 2e 20 20 31 20 6d 65 61 6e 73 20 62  ough.  1 means b
1170: 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2e 20  ranch is taken. 
1180: 20 32 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20   2 means the.** 
1190: 73 65 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69  second alternati
11a0: 76 65 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  ve branch is tak
11b0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 53 72 63 4c 69  en..**.** iSrcLi
11c0: 6e 65 20 69 73 20 74 68 65 20 73 6f 75 72 63 65  ne is the source
11d0: 20 63 6f 64 65 20 6c 69 6e 65 20 28 66 72 6f 6d   code line (from
11e0: 20 74 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20 6d 61   the __LINE__ ma
11f0: 63 72 6f 29 20 74 68 61 74 0a 2a 2a 20 67 65 6e  cro) that.** gen
1200: 65 72 61 74 65 64 20 74 68 65 20 56 44 42 45 20  erated the VDBE 
1210: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
1220: 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 61 74 69  is instrumentati
1230: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1240: 61 6c 6c 0a 2a 2a 20 73 6f 75 72 63 65 20 63 6f  all.** source co
1250: 64 65 20 69 73 20 69 6e 20 61 20 73 69 6e 67 6c  de is in a singl
1260: 65 20 66 69 6c 65 20 28 74 68 65 20 61 6d 61 6c  e file (the amal
1270: 67 61 6d 61 74 69 6f 6e 29 2e 20 20 53 70 65 63  gamation).  Spec
1280: 69 61 6c 20 76 61 6c 75 65 73 20 31 0a 2a 2a 20  ial values 1.** 
1290: 61 6e 64 20 32 20 66 6f 72 20 74 68 65 20 69 53  and 2 for the iS
12a0: 72 63 4c 69 6e 65 20 70 61 72 61 6d 65 74 65 72  rcLine parameter
12b0: 20 6d 65 61 6e 20 74 68 61 74 20 74 68 69 73 20   mean that this 
12c0: 70 61 72 74 69 63 75 6c 61 72 20 62 72 61 6e 63  particular branc
12d0: 68 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74  h is.** always t
12e0: 61 6b 65 6e 20 6f 72 20 6e 65 76 65 72 20 74 61  aken or never ta
12f0: 6b 65 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ken, respectivel
1300: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
1310: 65 64 28 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ed(SQLITE_VDBE_C
1320: 4f 56 45 52 41 47 45 29 0a 23 20 64 65 66 69 6e  OVERAGE).# defin
1330: 65 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65  e VdbeBranchTake
1340: 6e 28 49 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 64  n(I,M).#else.# d
1350: 65 66 69 6e 65 20 56 64 62 65 42 72 61 6e 63 68  efine VdbeBranch
1360: 54 61 6b 65 6e 28 49 2c 4d 29 20 76 64 62 65 54  Taken(I,M) vdbeT
1370: 61 6b 65 42 72 61 6e 63 68 28 70 4f 70 2d 3e 69  akeBranch(pOp->i
1380: 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 0a 20 20 73  SrcLine,I,M).  s
1390: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 54  tatic void vdbeT
13a0: 61 6b 65 42 72 61 6e 63 68 28 69 6e 74 20 69 53  akeBranch(int iS
13b0: 72 63 4c 69 6e 65 2c 20 75 38 20 49 2c 20 75 38  rcLine, u8 I, u8
13c0: 20 4d 29 7b 0a 20 20 20 20 69 66 28 20 69 53 72   M){.    if( iSr
13d0: 63 4c 69 6e 65 3c 3d 32 20 26 26 20 41 4c 57 41  cLine<=2 && ALWA
13e0: 59 53 28 69 53 72 63 4c 69 6e 65 3e 30 29 20 29  YS(iSrcLine>0) )
13f0: 7b 0a 20 20 20 20 20 20 4d 20 3d 20 69 53 72 63  {.      M = iSrc
1400: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 2f 2a 20 41  Line;.      /* A
1410: 73 73 65 72 74 20 74 68 65 20 74 72 75 74 68 20  ssert the truth 
1420: 6f 66 20 56 64 62 65 43 6f 76 65 72 61 67 65 41  of VdbeCoverageA
1430: 6c 77 61 79 73 54 61 6b 65 6e 28 29 20 61 6e 64  lwaysTaken() and
1440: 20 0a 20 20 20 20 20 20 2a 2a 20 56 64 62 65 43   .      ** VdbeC
1450: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
1460: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  n() */.      ass
1470: 65 72 74 28 20 28 4d 20 26 20 49 29 3d 3d 49 20  ert( (M & I)==I 
1480: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
14a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14b0: 65 42 72 61 6e 63 68 3d 3d 30 20 29 20 72 65 74  eBranch==0 ) ret
14c0: 75 72 6e 3b 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  urn;  /*NO_TEST*
14d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
14e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14f0: 65 42 72 61 6e 63 68 28 73 71 6c 69 74 65 33 47  eBranch(sqlite3G
1500: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1510: 65 42 72 61 6e 63 68 41 72 67 2c 0a 20 20 20 20  eBranchArg,.    
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 69 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 3b    iSrcLine,I,M);
1550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1560: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
1570: 20 74 68 65 20 67 69 76 65 6e 20 72 65 67 69 73   the given regis
1580: 74 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ter into a strin
1590: 67 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f 6e  g if it isn't on
15a0: 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 20 52 65  e.** already. Re
15b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
15c0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
15d0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74  s..*/.#define St
15e0: 72 69 6e 67 69 66 79 28 50 2c 20 65 6e 63 29 20  ringify(P, enc) 
15f0: 5c 0a 20 20 20 69 66 28 28 28 50 29 2d 3e 66 6c  \.   if(((P)->fl
1600: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
1610: 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 73 71  _Blob))==0 && sq
1620: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
1630: 6e 67 69 66 79 28 50 2c 65 6e 63 2c 30 29 29 20  ngify(P,enc,0)) 
1640: 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e 6f  \.     { goto no
1650: 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41  _mem; }../*.** A
1660: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1670: 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66  ng value (signif
1680: 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45  ied by the MEM_E
1690: 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61  phem flag) conta
16a0: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
16b0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
16c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
16d0: 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74  ng where some ot
16e0: 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73  her entity.** is
16f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1700: 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68   deallocating th
1710: 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61  at string.  Beca
1720: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
1730: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  .** does not con
1740: 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c  trol the string,
1750: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c   it might be del
1760: 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  eted without the
1770: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f   register.** kno
1780: 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  wing it..**.** T
1790: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
17a0: 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61  erts an ephemera
17b0: 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  l string into a 
17c0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
17d0: 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  cated.** string 
17e0: 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74 65  that the registe
17f0: 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c  r itself control
1800: 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
1810: 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72  ds, it.** conver
1820: 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20  ts an MEM_Ephem 
1830: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 73 74  string into a st
1840: 72 69 6e 67 20 77 69 74 68 20 50 2e 7a 3d 3d 50  ring with P.z==P
1850: 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 23 64 65  .zMalloc..*/.#de
1860: 66 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c  fine Deephemeral
1870: 69 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20  ize(P) \.   if( 
1880: 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  ((P)->flags&MEM_
1890: 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20  Ephem)!=0 \.    
18a0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62     && sqlite3Vdb
18b0: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
18c0: 65 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f  e(P) ){ goto no_
18d0: 6d 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  mem;}../* Return
18e0: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
18f0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75  sor was opened u
1900: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e  sing the OP_Open
1910: 53 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a  Sorter opcode. *
1920: 2f 0a 23 64 65 66 69 6e 65 20 69 73 53 6f 72 74  /.#define isSort
1930: 65 72 28 78 29 20 28 28 78 29 2d 3e 65 43 75 72  er(x) ((x)->eCur
1940: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f  Type==CURTYPE_SO
1950: 52 54 45 52 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  RTER)../*.** All
1960: 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f 72  ocate VdbeCursor
1970: 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20 52   number iCur.  R
1980: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1990: 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20 4e  to it.  Return N
19a0: 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75 6e  ULL.** if we run
19b0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a   out of memory..
19c0: 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43 75  */.static VdbeCu
19d0: 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43 75  rsor *allocateCu
19e0: 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70 2c  rsor(.  Vdbe *p,
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a00: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1a10: 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  hine */.  int iC
1a20: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
1a30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a40: 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20 2a  new VdbeCursor *
1a50: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  /.  int nField, 
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a70: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1a80: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1a90: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  dex */.  int iDb
1aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ab0: 2a 20 44 61 74 61 62 61 73 65 20 74 68 65 20 63  * Database the c
1ac0: 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1ad0: 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 75 38 20  , or -1 */.  u8 
1ae0: 65 43 75 72 54 79 70 65 20 20 20 20 20 20 20 20  eCurType        
1af0: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
1b00: 65 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  e new cursor */.
1b10: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b30: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b40: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b50: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b60: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b70: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b80: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b90: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1ba0: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1bb0: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1bc0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bd0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1be0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bf0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1c00: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1c10: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c20: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c30: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c40: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c50: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c60: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c70: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c80: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c90: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1ca0: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1cb0: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1cc0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cd0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1ce0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cf0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1d00: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1d10: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d20: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d30: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d40: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d50: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d60: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d70: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d80: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d90: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1da0: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1db0: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1dc0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1dd0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1de0: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  * The memory cel
1df0: 6c 20 66 6f 72 20 63 75 72 73 6f 72 20 30 20 69  l for cursor 0 i
1e00: 73 20 61 4d 65 6d 5b 30 5d 2e 20 54 68 65 20 72  s aMem[0]. The r
1e10: 65 73 74 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  est are allocate
1e20: 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1e30: 74 6f 70 20 6f 66 20 74 68 65 20 72 65 67 69 73  top of the regis
1e40: 74 65 72 20 73 70 61 63 65 2e 20 20 43 75 72 73  ter space.  Curs
1e50: 6f 72 20 31 20 69 73 20 61 74 20 4d 65 6d 5b 70  or 1 is at Mem[p
1e60: 2d 3e 6e 4d 65 6d 2d 31 5d 2e 0a 20 20 2a 2a 20  ->nMem-1]..  ** 
1e70: 43 75 72 73 6f 72 20 32 20 69 73 20 61 74 20 4d  Cursor 2 is at M
1e80: 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 32 5d 2e 20 41  em[p->nMem-2]. A
1e90: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a  nd so forth..  *
1ea0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
1eb0: 69 43 75 72 3e 30 20 3f 20 26 70 2d 3e 61 4d 65  iCur>0 ? &p->aMe
1ec0: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 20  m[p->nMem-iCur] 
1ed0: 3a 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 69 6e  : p->aMem;..  in
1ee0: 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43  t nByte;.  VdbeC
1ef0: 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a  ursor *pCx = 0;.
1f00: 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 20    nByte = .     
1f10: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
1f20: 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20 32 2a  dbeCursor)) + 2*
1f30: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65  sizeof(u32)*nFie
1f40: 6c 64 20 2b 20 0a 20 20 20 20 20 20 28 65 43 75  ld + .      (eCu
1f50: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
1f60: 54 52 45 45 3f 73 71 6c 69 74 65 33 42 74 72 65  TREE?sqlite3Btre
1f70: 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29  eCursorSize():0)
1f80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  ;..  assert( iCu
1f90: 72 3e 3d 30 20 26 26 20 69 43 75 72 3c 70 2d 3e  r>=0 && iCur<p->
1fa0: 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  nCursor );.  if(
1fb0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20   p->apCsr[iCur] 
1fc0: 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
1fd0: 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20  N-IF-FALSE*/.   
1fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1ff0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
2000: 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70  sr[iCur]);.    p
2010: 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20  ->apCsr[iCur] = 
2020: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
2030: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
2040: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
2050: 73 69 7a 65 28 70 4d 65 6d 2c 20 6e 42 79 74 65  size(pMem, nByte
2060: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 43 73  ) ){.    p->apCs
2070: 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 3d 20  r[iCur] = pCx = 
2080: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 4d 65  (VdbeCursor*)pMe
2090: 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m->z;.    memset
20a0: 28 70 43 78 2c 20 30 2c 20 6f 66 66 73 65 74 6f  (pCx, 0, offseto
20b0: 66 28 56 64 62 65 43 75 72 73 6f 72 2c 70 41 6c  f(VdbeCursor,pAl
20c0: 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 70  tCursor));.    p
20d0: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 3d 20 65  Cx->eCurType = e
20e0: 43 75 72 54 79 70 65 3b 0a 20 20 20 20 70 43 78  CurType;.    pCx
20f0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
2100: 20 70 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e   pCx->nField = n
2110: 46 69 65 6c 64 3b 0a 20 20 20 20 70 43 78 2d 3e  Field;.    pCx->
2120: 61 4f 66 66 73 65 74 20 3d 20 26 70 43 78 2d 3e  aOffset = &pCx->
2130: 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aType[nField];. 
2140: 20 20 20 69 66 28 20 65 43 75 72 54 79 70 65 3d     if( eCurType=
2150: 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2160: 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 75 63 2e  {.      pCx->uc.
2170: 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72  pCursor = (BtCur
2180: 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  sor*).          
2190: 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28  &pMem->z[ROUND8(
21a0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
21b0: 72 29 29 2b 32 2a 73 69 7a 65 6f 66 28 75 33 32  r))+2*sizeof(u32
21c0: 29 2a 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  )*nField];.     
21d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
21e0: 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 75 63 2e  sorZero(pCx->uc.
21f0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  pCursor);.    }.
2200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 78    }.  return pCx
2210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
2220: 6f 20 63 6f 6e 76 65 72 74 20 61 20 76 61 6c 75  o convert a valu
2230: 65 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63  e into a numeric
2240: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2250: 69 66 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20  if we can.** do 
2260: 73 6f 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20  so without loss 
2270: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  of information. 
2280: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2290: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   if the string.*
22a0: 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e  * looks like a n
22b0: 75 6d 62 65 72 2c 20 63 6f 6e 76 65 72 74 20 69  umber, convert i
22c0: 74 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e  t into a number.
22d0: 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
22e0: 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20  .** look like a 
22f0: 6e 75 6d 62 65 72 2c 20 6c 65 61 76 65 20 69 74  number, leave it
2300: 20 61 6c 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   alone..**.** If
2310: 20 74 68 65 20 62 54 72 79 46 6f 72 49 6e 74 20   the bTryForInt 
2320: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
2330: 65 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20  en extra effort 
2340: 69 73 20 6d 61 64 65 20 74 6f 20 67 69 76 65 0a  is made to give.
2350: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  ** an integer re
2360: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 53  presentation.  S
2370: 74 72 69 6e 67 73 20 74 68 61 74 20 6c 6f 6f 6b  trings that look
2380: 20 6c 69 6b 65 20 66 6c 6f 61 74 69 6e 67 20 70   like floating p
2390: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 73 20 62  oint.** values b
23a0: 75 74 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f  ut which have no
23b0: 20 66 72 61 63 74 69 6f 6e 61 6c 20 63 6f 6d 70   fractional comp
23c0: 6f 6e 65 6e 74 20 28 65 78 61 6d 70 6c 65 3a 20  onent (example: 
23d0: 27 34 38 2e 30 30 27 29 0a 2a 2a 20 77 69 6c 6c  '48.00').** will
23e0: 20 68 61 76 65 20 61 20 4d 45 4d 5f 49 6e 74 20   have a MEM_Int 
23f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
2400: 68 65 6e 20 62 54 72 79 46 6f 72 49 6e 74 20 69  hen bTryForInt i
2410: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2420: 20 62 54 72 79 46 6f 72 49 6e 74 20 69 73 20 66   bTryForInt is f
2430: 61 6c 73 65 2c 20 74 68 65 6e 20 69 66 20 74 68  alse, then if th
2440: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63  e input string c
2450: 6f 6e 74 61 69 6e 73 20 61 20 64 65 63 69 6d 61  ontains a decima
2460: 6c 0a 2a 2a 20 70 6f 69 6e 74 20 6f 72 20 65 78  l.** point or ex
2470: 70 6f 6e 65 6e 74 69 61 6c 20 6e 6f 74 61 74 69  ponential notati
2480: 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  on, the result i
2490: 73 20 6f 6e 6c 79 20 4d 45 4d 5f 52 65 61 6c 2c  s only MEM_Real,
24a0: 20 65 76 65 6e 0a 2a 2a 20 69 66 20 74 68 65 72   even.** if ther
24b0: 65 20 69 73 20 61 6e 20 65 78 61 63 74 20 69 6e  e is an exact in
24c0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
24d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 6e  tion of the quan
24e0: 74 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tity..*/.static 
24f0: 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69  void applyNumeri
2500: 63 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70  cAffinity(Mem *p
2510: 52 65 63 2c 20 69 6e 74 20 62 54 72 79 46 6f 72  Rec, int bTryFor
2520: 49 6e 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Int){.  double r
2530: 56 61 6c 75 65 3b 0a 20 20 69 36 34 20 69 56 61  Value;.  i64 iVa
2540: 6c 75 65 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  lue;.  u8 enc = 
2550: 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 61 73 73  pRec->enc;.  ass
2560: 65 72 74 28 20 28 70 52 65 63 2d 3e 66 6c 61 67  ert( (pRec->flag
2570: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
2580: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d  _Int|MEM_Real))=
2590: 3d 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 69 66  =MEM_Str );.  if
25a0: 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52  ( sqlite3AtoF(pR
25b0: 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20  ec->z, &rValue, 
25c0: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30  pRec->n, enc)==0
25d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25e0: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
25f0: 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c  4(pRec->z, &iVal
2600: 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63  ue, pRec->n, enc
2610: 29 20 29 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75  ) ){.    pRec->u
2620: 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  .i = iValue;.   
2630: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20   pRec->flags |= 
2640: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65  MEM_Int;.  }else
2650: 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 72 20  {.    pRec->u.r 
2660: 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 70 52  = rValue;.    pR
2670: 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ec->flags |= MEM
2680: 5f 52 65 61 6c 3b 0a 20 20 20 20 69 66 28 20 62  _Real;.    if( b
2690: 54 72 79 46 6f 72 49 6e 74 20 29 20 73 71 6c 69  TryForInt ) sqli
26a0: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
26b0: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
26c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  }.}../*.** Proce
26d0: 73 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69  ssing is determi
26e0: 6e 65 20 62 79 20 74 68 65 20 61 66 66 69 6e 69  ne by the affini
26f0: 74 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a  ty parameter:.**
2700: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
2710: 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54  NTEGER:.** SQLIT
2720: 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53  E_AFF_REAL:.** S
2730: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
2740: 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20  C:.**    Try to 
2750: 63 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20  convert pRec to 
2760: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
2770: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a  sentation or a .
2780: 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70  **    floating-p
2790: 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  oint representat
27a0: 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65  ion if an intege
27b0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
27c0: 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f  .**    is not po
27d0: 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68  ssible.  Note th
27e0: 61 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  at the integer r
27f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
2800: 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72  .**    always pr
2810: 65 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66  eferred, even if
2820: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 69 73   the affinity is
2830: 20 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a   REAL, because.*
2840: 2a 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20  *    an integer 
2850: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
2860: 73 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66  s more space eff
2870: 69 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a  icient on disk..
2880: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  **.** SQLITE_AFF
2890: 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e  _TEXT:.**    Con
28a0: 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 20 74  vert pRec to a t
28b0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
28c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  on..**.** SQLITE
28d0: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a 2a 20 20 20  _AFF_BLOB:.**   
28e0: 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73   No-op.  pRec is
28f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
2900: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79  tatic void apply
2910: 41 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20  Affinity(.  Mem 
2920: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  *pRec,          
2930: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20  /* The value to 
2940: 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74  apply affinity t
2950: 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  o */.  char affi
2960: 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  nity,      /* Th
2970: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65  e affinity to be
2980: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38   applied */.  u8
2990: 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20 20   enc            
29a0: 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65    /* Use this te
29b0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29  xt encoding */.)
29c0: 7b 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74 79  {.  if( affinity
29d0: 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  >=SQLITE_AFF_NUM
29e0: 45 52 49 43 20 29 7b 0a 20 20 20 20 61 73 73 65  ERIC ){.    asse
29f0: 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51  rt( affinity==SQ
2a00: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
2a10: 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51   || affinity==SQ
2a20: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
2a30: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66             || af
2a40: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2a50: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
2a60: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
2a70: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
2a80: 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49   ){ /*OPTIMIZATI
2a90: 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
2aa0: 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66      if( (pRec->f
2ab0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29  lags & MEM_Real)
2ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
2ad0: 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26  f( pRec->flags &
2ae0: 20 4d 45 4d 5f 53 74 72 20 29 20 61 70 70 6c 79   MEM_Str ) apply
2af0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
2b00: 70 52 65 63 2c 31 29 3b 0a 20 20 20 20 20 20 7d  pRec,1);.      }
2b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2b20: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
2b30: 41 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a  Affinity(pRec);.
2b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b50: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
2b60: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
2b70: 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  EXT ){.    /* On
2b80: 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65 20 63  ly attempt the c
2b90: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54 45 58  onversion to TEX
2ba0: 54 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  T if there is an
2bb0: 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c   integer or real
2bc0: 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
2bd0: 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64  tation (blob and
2be0: 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74   NULL do not get
2bf0: 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75 74 20   converted) but 
2c00: 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a  no string.    **
2c10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
2c20: 20 20 49 74 20 77 6f 75 6c 64 20 62 65 20 68 61    It would be ha
2c30: 72 6d 6c 65 73 73 20 74 6f 20 72 65 70 65 61 74  rmless to repeat
2c40: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
2c50: 69 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  if .    ** there
2c60: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 73 74   is already a st
2c70: 72 69 6e 67 20 72 65 70 2c 20 62 75 74 20 69 74  ring rep, but it
2c80: 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 74 6f   is pointless to
2c90: 20 77 61 73 74 65 20 74 68 6f 73 65 0a 20 20 20   waste those.   
2ca0: 20 2a 2a 20 43 50 55 20 63 79 63 6c 65 73 2e 20   ** CPU cycles. 
2cb0: 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  */.    if( 0==(p
2cc0: 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  Rec->flags&MEM_S
2cd0: 74 72 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  tr) ){ /*OPTIMIZ
2ce0: 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
2cf0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65 63  .      if( (pRec
2d00: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61  ->flags&(MEM_Rea
2d10: 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20  l|MEM_Int)) ){. 
2d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d30: 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70  beMemStringify(p
2d40: 52 65 63 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20  Rec, enc, 1);.  
2d50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d60: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pRec->flags &= ~
2d70: 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  (MEM_Real|MEM_In
2d80: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2d90: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
2da0: 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66 75  the type of a fu
2db0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  nction argument 
2dc0: 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c 75  or a result colu
2dd0: 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75 6d  mn.** into a num
2de0: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
2df0: 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65 72  ion.  Use either
2e00: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
2e10: 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69 73   whichever.** is
2e20: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20 42   appropriate.  B
2e30: 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20 63  ut only do the c
2e40: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74 20  onversion if it 
2e50: 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  is possible with
2e60: 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20 69  out.** loss of i
2e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 72  nformation and r
2e80: 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73 65  eturn the revise
2e90: 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  d type of the ar
2ea0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
2eb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
2ec0: 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69 74 65  eric_type(sqlite
2ed0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
2ee0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
2ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2f00: 28 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 65 54  (pVal);.  if( eT
2f10: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
2f20: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
2f30: 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a  m = (Mem*)pVal;.
2f40: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2f50: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 30  Affinity(pMem, 0
2f60: 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  );.    eType = s
2f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2f80: 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72  e(pVal);.  }.  r
2f90: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 0a  eturn eType;.}..
2fa0: 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76  /*.** Exported v
2fb0: 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41  ersion of applyA
2fc0: 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20  ffinity(). This 
2fd0: 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c  one works on sql
2fe0: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a  ite3_value*, .**
2ff0: 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61   not the interna
3000: 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a  l Mem* type..*/.
3010: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75  void sqlite3Valu
3020: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a  eApplyAffinity(.
3030: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3040: 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66  *pVal, .  u8 aff
3050: 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63  inity, .  u8 enc
3060: 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e  .){.  applyAffin
3070: 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c  ity((Mem *)pVal,
3080: 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b   affinity, enc);
3090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d 65 6d 20 63  .}../*.** pMem c
30a0: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 68 6f  urrently only ho
30b0: 6c 64 73 20 61 20 73 74 72 69 6e 67 20 74 79 70  lds a string typ
30c0: 65 20 28 6f 72 20 6d 61 79 62 65 20 61 20 42 4c  e (or maybe a BL
30d0: 4f 42 20 74 68 61 74 20 77 65 20 63 61 6e 0a 2a  OB that we can.*
30e0: 2a 20 69 6e 74 65 72 70 72 65 74 20 61 73 20 61  * interpret as a
30f0: 20 73 74 72 69 6e 67 20 69 66 20 77 65 20 77 61   string if we wa
3100: 6e 74 20 74 6f 29 2e 20 20 43 6f 6d 70 75 74 65  nt to).  Compute
3110: 20 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69   its correspondi
3120: 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 63 20 74 79  ng.** numeric ty
3130: 70 65 2c 20 69 66 20 68 61 73 20 6f 6e 65 2e 20  pe, if has one. 
3140: 20 53 65 74 20 74 68 65 20 70 4d 65 6d 2d 3e 75   Set the pMem->u
3150: 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e 69  .r and pMem->u.i
3160: 20 66 69 65 6c 64 73 0a 2a 2a 20 61 63 63 6f 72   fields.** accor
3170: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
3180: 63 20 75 31 36 20 53 51 4c 49 54 45 5f 4e 4f 49  c u16 SQLITE_NOI
3190: 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 65 4e 75 6d  NLINE computeNum
31a0: 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a 70 4d  ericType(Mem *pM
31b0: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28  em){.  assert( (
31c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
31d0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
31e0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
31f0: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
3200: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
3210: 6f 62 29 29 21 3d 30 20 29 3b 0a 20 20 69 66 28  ob))!=0 );.  if(
3220: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 4d 65   sqlite3AtoF(pMe
3230: 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  m->z, &pMem->u.r
3240: 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d  , pMem->n, pMem-
3250: 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >enc)==0 ){.    
3260: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3270: 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36  if( sqlite3Atoi6
3280: 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d  4(pMem->z, &pMem
3290: 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d 3e 6e 2c 20  ->u.i, pMem->n, 
32a0: 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 30 20 29 7b  pMem->enc)==0 ){
32b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 4d 45 4d 5f  .    return MEM_
32c0: 49 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Int;.  }.  retur
32d0: 6e 20 4d 45 4d 5f 52 65 61 6c 3b 0a 7d 0a 0a 2f  n MEM_Real;.}../
32e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
32f0: 6e 75 6d 65 72 69 63 20 74 79 70 65 20 66 6f 72  numeric type for
3300: 20 70 4d 65 6d 2c 20 65 69 74 68 65 72 20 4d 45   pMem, either ME
3310: 4d 5f 49 6e 74 20 6f 72 20 4d 45 4d 5f 52 65 61  M_Int or MEM_Rea
3320: 6c 20 6f 72 20 62 6f 74 68 20 6f 72 0a 2a 2a 20  l or both or.** 
3330: 6e 6f 6e 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 55 6e  none.  .**.** Un
3340: 6c 69 6b 65 20 61 70 70 6c 79 4e 75 6d 65 72 69  like applyNumeri
3350: 63 41 66 66 69 6e 69 74 79 28 29 2c 20 74 68 69  cAffinity(), thi
3360: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
3370: 6f 74 20 6d 6f 64 69 66 79 20 70 4d 65 6d 2d 3e  ot modify pMem->
3380: 66 6c 61 67 73 2e 0a 2a 2a 20 42 75 74 20 69 74  flags..** But it
3390: 20 64 6f 65 73 20 73 65 74 20 70 4d 65 6d 2d 3e   does set pMem->
33a0: 75 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e  u.r and pMem->u.
33b0: 69 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  i appropriately.
33c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6e  .*/.static u16 n
33d0: 75 6d 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a  umericType(Mem *
33e0: 70 4d 65 6d 29 7b 0a 20 20 69 66 28 20 70 4d 65  pMem){.  if( pMe
33f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  m->flags & (MEM_
3400: 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
3410: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d  .    return pMem
3420: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49  ->flags & (MEM_I
3430: 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20  nt|MEM_Real);.  
3440: 7d 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  }.  if( pMem->fl
3450: 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d  ags & (MEM_Str|M
3460: 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20  EM_Blob) ){.    
3470: 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 4e 75  return computeNu
3480: 6d 65 72 69 63 54 79 70 65 28 70 4d 65 6d 29 3b  mericType(pMem);
3490: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
34a0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
34b0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 57 72  E_DEBUG./*.** Wr
34c0: 69 74 65 20 61 20 6e 69 63 65 20 73 74 72 69 6e  ite a nice strin
34d0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
34e0: 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   of the contents
34f0: 20 6f 66 20 63 65 6c 6c 20 70 4d 65 6d 0a 2a 2a   of cell pMem.**
3500: 20 69 6e 74 6f 20 62 75 66 66 65 72 20 7a 42 75   into buffer zBu
3510: 66 2c 20 6c 65 6e 67 74 68 20 6e 42 75 66 2e 0a  f, length nBuf..
3520: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3530: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
3540: 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 63 68 61  t(Mem *pMem, cha
3550: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 68 61 72  r *zBuf){.  char
3560: 20 2a 7a 43 73 72 20 3d 20 7a 42 75 66 3b 0a 20   *zCsr = zBuf;. 
3570: 20 69 6e 74 20 66 20 3d 20 70 4d 65 6d 2d 3e 66   int f = pMem->f
3580: 6c 61 67 73 3b 0a 0a 20 20 73 74 61 74 69 63 20  lags;..  static 
3590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
35a0: 74 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b  t encnames[] = {
35b0: 22 28 58 29 22 2c 20 22 28 38 29 22 2c 20 22 28  "(X)", "(8)", "(
35c0: 31 36 4c 45 29 22 2c 20 22 28 31 36 42 45 29 22  16LE)", "(16BE)"
35d0: 7d 3b 0a 0a 20 20 69 66 28 20 66 26 4d 45 4d 5f  };..  if( f&MEM_
35e0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 69 6e 74 20  Blob ){.    int 
35f0: 69 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  i;.    char c;. 
3600: 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44     if( f & MEM_D
3610: 79 6e 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  yn ){.      c = 
3620: 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'z';.      asser
3630: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
3640: 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  tic|MEM_Ephem))=
3650: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
3660: 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74  if( f & MEM_Stat
3670: 69 63 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  ic ){.      c = 
3680: 27 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  't';.      asser
3690: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e  t( (f & (MEM_Dyn
36a0: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20  |MEM_Ephem))==0 
36b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
36c0: 20 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29   f & MEM_Ephem )
36d0: 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 65 27 3b  {.      c = 'e';
36e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
36f0: 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c  f & (MEM_Static|
3700: 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a  MEM_Dyn))==0 );.
3710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3720: 20 63 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a   c = 's';.    }.
3730: 20 20 20 20 2a 28 7a 43 73 72 2b 2b 29 20 3d 20      *(zCsr++) = 
3740: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  c;.    sqlite3_s
3750: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
3760: 72 2c 20 22 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e  r, "%d[", pMem->
3770: 6e 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20  n);.    zCsr += 
3780: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3790: 7a 43 73 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  zCsr);.    for(i
37a0: 3d 30 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d  =0; i<16 && i<pM
37b0: 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  em->n; i++){.   
37c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37d0: 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22  ntf(100, zCsr, "
37e0: 25 30 32 58 22 2c 20 28 28 69 6e 74 29 70 4d 65  %02X", ((int)pMe
37f0: 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78 46 46 29 29  m->z[i] & 0xFF))
3800: 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  ;.      zCsr += 
3810: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3820: 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCsr);.    }.   
3830: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26   for(i=0; i<16 &
3840: 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b  & i<pMem->n; i++
3850: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 20  ){.      char z 
3860: 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20  = pMem->z[i];.  
3870: 20 20 20 20 69 66 28 20 7a 3c 33 32 20 7c 7c 20      if( z<32 || 
3880: 7a 3e 31 32 36 20 29 20 2a 7a 43 73 72 2b 2b 20  z>126 ) *zCsr++ 
3890: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 65 6c 73  = '.';.      els
38a0: 65 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20  e *zCsr++ = z;. 
38b0: 20 20 20 7d 0a 20 20 20 20 2a 28 7a 43 73 72 2b     }.    *(zCsr+
38c0: 2b 29 20 3d 20 27 5d 27 3b 0a 20 20 20 20 69 66  +) = ']';.    if
38d0: 28 20 66 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ( f & MEM_Zero )
38e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
38f0: 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43  snprintf(100, zC
3900: 73 72 2c 22 2b 25 64 7a 22 2c 70 4d 65 6d 2d 3e  sr,"+%dz",pMem->
3910: 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20 20 20 20 20  u.nZero);.      
3920: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
3930: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
3940: 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 20 3d     }.    *zCsr =
3950: 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69   '\0';.  }else i
3960: 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 72 20 29  f( f & MEM_Str )
3970: 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a  {.    int j, k;.
3980: 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27 20      zBuf[0] = ' 
3990: 27 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d  ';.    if( f & M
39a0: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
39b0: 7a 42 75 66 5b 31 5d 20 3d 20 27 7a 27 3b 0a 20  zBuf[1] = 'z';. 
39c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
39d0: 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  & (MEM_Static|ME
39e0: 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a  M_Ephem))==0 );.
39f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20      }else if( f 
3a00: 26 20 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a  & MEM_Static ){.
3a10: 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
3a20: 27 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  't';.      asser
3a30: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e  t( (f & (MEM_Dyn
3a40: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20  |MEM_Ephem))==0 
3a50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3a60: 20 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29   f & MEM_Ephem )
3a70: 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20  {.      zBuf[1] 
3a80: 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73  = 'e';.      ass
3a90: 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53  ert( (f & (MEM_S
3aa0: 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d  tatic|MEM_Dyn))=
3ab0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  =0 );.    }else{
3ac0: 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d  .      zBuf[1] =
3ad0: 20 27 73 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   's';.    }.    
3ae0: 6b 20 3d 20 32 3b 0a 20 20 20 20 73 71 6c 69 74  k = 2;.    sqlit
3af0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
3b00: 20 26 7a 42 75 66 5b 6b 5d 2c 20 22 25 64 22 2c   &zBuf[k], "%d",
3b10: 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 6b   pMem->n);.    k
3b20: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3b30: 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20  n30(&zBuf[k]);. 
3b40: 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27     zBuf[k++] = '
3b50: 5b 27 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  [';.    for(j=0;
3b60: 20 6a 3c 31 35 20 26 26 20 6a 3c 70 4d 65 6d 2d   j<15 && j<pMem-
3b70: 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  >n; j++){.      
3b80: 75 38 20 63 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 6a  u8 c = pMem->z[j
3b90: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d  ];.      if( c>=
3ba0: 30 78 32 30 20 26 26 20 63 3c 30 78 37 66 20 29  0x20 && c<0x7f )
3bb0: 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b  {.        zBuf[k
3bc0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
3bd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 42  else{.        zB
3be0: 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20  uf[k++] = '.';. 
3bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3c00: 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5d 27   zBuf[k++] = ']'
3c10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
3c20: 70 72 69 6e 74 66 28 31 30 30 2c 26 7a 42 75 66  printf(100,&zBuf
3c30: 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65 73 5b 70 4d  [k], encnames[pM
3c40: 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20 20 6b  em->enc]);.    k
3c50: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3c60: 6e 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20  n30(&zBuf[k]);. 
3c70: 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 30     zBuf[k++] = 0
3c80: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
3c90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
3ca0: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
3cb0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 72  the value of a r
3cc0: 65 67 69 73 74 65 72 20 66 6f 72 20 74 72 61 63  egister for trac
3cd0: 69 6e 67 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2f  ing purposes:.*/
3ce0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
3cf0: 54 72 61 63 65 50 72 69 6e 74 28 4d 65 6d 20 2a  TracePrint(Mem *
3d00: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  p){.  if( p->fla
3d10: 67 73 20 26 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs & MEM_Undefin
3d20: 65 64 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ed ){.    printf
3d30: 28 22 20 75 6e 64 65 66 69 6e 65 64 22 29 3b 0a  (" undefined");.
3d40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66    }else if( p->f
3d50: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
3d60: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  ){.    printf(" 
3d70: 4e 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c 73 65 20  NULL");.  }else 
3d80: 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20  if( (p->flags & 
3d90: 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72  (MEM_Int|MEM_Str
3da0: 29 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  ))==(MEM_Int|MEM
3db0: 5f 53 74 72 29 20 29 7b 0a 20 20 20 20 70 72 69  _Str) ){.    pri
3dc0: 6e 74 66 28 22 20 73 69 3a 25 6c 6c 64 22 2c 20  ntf(" si:%lld", 
3dd0: 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73 65  p->u.i);.  }else
3de0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
3df0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 70  MEM_Int ){.    p
3e00: 72 69 6e 74 66 28 22 20 69 3a 25 6c 6c 64 22 2c  rintf(" i:%lld",
3e10: 20 70 2d 3e 75 2e 69 29 3b 0a 23 69 66 6e 64 65   p->u.i);.#ifnde
3e20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
3e30: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 7d  OATING_POINT.  }
3e40: 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67  else if( p->flag
3e50: 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
3e60: 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 3a 25      printf(" r:%
3e70: 67 22 2c 20 70 2d 3e 75 2e 72 29 3b 0a 23 65 6e  g", p->u.r);.#en
3e80: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
3e90: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  p->flags & MEM_R
3ea0: 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 70 72 69  owSet ){.    pri
3eb0: 6e 74 66 28 22 20 28 72 6f 77 73 65 74 29 22 29  ntf(" (rowset)")
3ec0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
3ed0: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
3ee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
3ef0: 6d 50 72 65 74 74 79 50 72 69 6e 74 28 70 2c 20  mPrettyPrint(p, 
3f00: 7a 42 75 66 29 3b 0a 20 20 20 20 70 72 69 6e 74  zBuf);.    print
3f10: 66 28 22 20 25 73 22 2c 20 7a 42 75 66 29 3b 0a  f(" %s", zBuf);.
3f20: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61    }.  if( p->fla
3f30: 67 73 20 26 20 4d 45 4d 5f 53 75 62 74 79 70 65  gs & MEM_Subtype
3f40: 20 29 20 70 72 69 6e 74 66 28 22 20 73 75 62 74   ) printf(" subt
3f50: 79 70 65 3d 30 78 25 30 32 78 22 2c 20 70 2d 3e  ype=0x%02x", p->
3f60: 65 53 75 62 74 79 70 65 29 3b 0a 7d 0a 73 74 61  eSubtype);.}.sta
3f70: 74 69 63 20 76 6f 69 64 20 72 65 67 69 73 74 65  tic void registe
3f80: 72 54 72 61 63 65 28 69 6e 74 20 69 52 65 67 2c  rTrace(int iReg,
3f90: 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 70 72 69 6e   Mem *p){.  prin
3fa0: 74 66 28 22 52 45 47 5b 25 64 5d 20 3d 20 22 2c  tf("REG[%d] = ",
3fb0: 20 69 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72 61   iReg);.  memTra
3fc0: 63 65 50 72 69 6e 74 28 70 29 3b 0a 20 20 70 72  cePrint(p);.  pr
3fd0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 73 71  intf("\n");.  sq
3fe0: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65  lite3VdbeCheckMe
3ff0: 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 3b 0a  mInvariants(p);.
4000: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
4010: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23 20   SQLITE_DEBUG.# 
4020: 20 64 65 66 69 6e 65 20 52 45 47 49 53 54 45 52   define REGISTER
4030: 5f 54 52 41 43 45 28 52 2c 4d 29 20 69 66 28 64  _TRACE(R,M) if(d
4040: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
4050: 56 64 62 65 54 72 61 63 65 29 72 65 67 69 73 74  VdbeTrace)regist
4060: 65 72 54 72 61 63 65 28 52 2c 4d 29 0a 23 65 6c  erTrace(R,M).#el
4070: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47  se.#  define REG
4080: 49 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29  ISTER_TRACE(R,M)
4090: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
40a0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 0a 2f   VDBE_PROFILE../
40b0: 2a 20 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63  * .** hwtime.h c
40c0: 6f 6e 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61  ontains inline a
40d0: 73 73 65 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f  ssembler code fo
40e0: 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a  r implementing .
40f0: 2a 2a 20 68 69 67 68 2d 70 65 72 66 6f 72 6d 61  ** high-performa
4100: 6e 63 65 20 74 69 6d 69 6e 67 20 72 6f 75 74 69  nce timing routi
4110: 6e 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  nes..*/.#include
4120: 20 22 68 77 74 69 6d 65 2e 68 22 0a 0a 23 65 6e   "hwtime.h"..#en
4130: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
4140: 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
4150: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
4160: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
4170: 69 6e 20 61 6e 20 61 73 73 65 72 74 28 29 20 65  in an assert() e
4180: 78 70 72 65 73 73 69 6f 6e 2e 20 49 74 0a 2a 2a  xpression. It.**
4190: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
41a0: 20 73 71 6c 69 74 65 33 2e 6e 54 72 61 6e 73 61   sqlite3.nTransa
41b0: 63 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69  ction variable i
41c0: 73 20 63 6f 72 72 65 63 74 6c 79 20 73 65 74 20  s correctly set 
41d0: 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  to.** the number
41e0: 20 6f 66 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74   of non-transact
41f0: 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 63  ion savepoints c
4200: 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
4210: 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
4220: 73 74 61 72 74 69 6e 67 20 61 74 20 73 71 6c 69  starting at sqli
4230: 74 65 33 2e 70 53 61 76 65 70 6f 69 6e 74 2e 0a  te3.pSavepoint..
4240: 2a 2a 20 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ** .** Usage:.**
4250: 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
4260: 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f  checkSavepointCo
4270: 75 6e 74 28 64 62 29 20 29 3b 0a 2a 2f 0a 73 74  unt(db) );.*/.st
4280: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 53 61  atic int checkSa
4290: 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 73 71 6c  vepointCount(sql
42a0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
42b0: 20 6e 20 3d 20 30 3b 0a 20 20 53 61 76 65 70 6f   n = 0;.  Savepo
42c0: 69 6e 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  int *p;.  for(p=
42d0: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20  db->pSavepoint; 
42e0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 20 6e  p; p=p->pNext) n
42f0: 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ++;.  assert( n=
4300: 3d 28 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  =(db->nSavepoint
4310: 20 2b 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63   + db->isTransac
4320: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  tionSavepoint) )
4330: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
4340: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4350: 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
4360: 72 20 6f 66 20 70 4f 70 2d 3e 70 32 20 61 66 74  r of pOp->p2 aft
4370: 65 72 20 66 69 72 73 74 20 70 72 65 70 61 72 69  er first prepari
4380: 6e 67 20 69 74 20 74 6f 20 62 65 0a 2a 2a 20 6f  ng it to be.** o
4390: 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
43a0: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
43b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
43c0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 4d 65 6d 20  TE_NOINLINE Mem 
43d0: 2a 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 57  *out2PrereleaseW
43e0: 69 74 68 43 6c 65 61 72 28 4d 65 6d 20 2a 70 4f  ithClear(Mem *pO
43f0: 75 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  ut){.  sqlite3Vd
4400: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
4410: 74 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67  t);.  pOut->flag
4420: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 72  s = MEM_Int;.  r
4430: 65 74 75 72 6e 20 70 4f 75 74 3b 0a 7d 0a 73 74  eturn pOut;.}.st
4440: 61 74 69 63 20 4d 65 6d 20 2a 6f 75 74 32 50 72  atic Mem *out2Pr
4450: 65 72 65 6c 65 61 73 65 28 56 64 62 65 20 2a 70  erelease(Vdbe *p
4460: 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a  , VdbeOp *pOp){.
4470: 20 20 4d 65 6d 20 2a 70 4f 75 74 3b 0a 20 20 61    Mem *pOut;.  a
4480: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
4490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
44a0: 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p2<=(p->nMem+
44b0: 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
44c0: 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e  );.  pOut = &p->
44d0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
44e0: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
44f0: 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 69 66  e(p, pOut);.  if
4500: 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63  ( VdbeMemDynamic
4510: 28 70 4f 75 74 29 20 29 7b 20 2f 2a 4f 50 54 49  (pOut) ){ /*OPTI
4520: 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53  MIZATION-IF-FALS
4530: 45 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  E*/.    return o
4540: 75 74 32 50 72 65 72 65 6c 65 61 73 65 57 69 74  ut2PrereleaseWit
4550: 68 43 6c 65 61 72 28 70 4f 75 74 29 3b 0a 20 20  hClear(pOut);.  
4560: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d  }else{.    pOut-
4570: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
4580: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4f 75  ;.    return pOu
4590: 74 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t;.  }.}.../*.**
45a0: 20 45 78 65 63 75 74 65 20 61 73 20 6d 75 63 68   Execute as much
45b0: 20 6f 66 20 61 20 56 44 42 45 20 70 72 6f 67 72   of a VDBE progr
45c0: 61 6d 20 61 73 20 77 65 20 63 61 6e 2e 0a 2a 2a  am as we can..**
45d0: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 72   This is the cor
45e0: 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 74 65  e of sqlite3_ste
45f0: 70 28 29 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  p().  .*/.int sq
4600: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 0a 20  lite3VdbeExec(. 
4610: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4630: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
4640: 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *aOp = p->aOp
4650: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
4660: 70 79 20 6f 66 20 70 2d 3e 61 4f 70 20 2a 2f 0a  py of p->aOp */.
4670: 20 20 4f 70 20 2a 70 4f 70 20 3d 20 61 4f 70 3b    Op *pOp = aOp;
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4690: 43 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f  Current operatio
46a0: 6e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  n */.#if defined
46b0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
46c0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
46d0: 52 4f 46 49 4c 45 29 0a 20 20 4f 70 20 2a 70 4f  ROFILE).  Op *pO
46e0: 72 69 67 4f 70 3b 20 20 20 20 20 20 20 20 20 20  rigOp;          
46f0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
4700: 20 70 4f 70 20 61 74 20 74 68 65 20 74 6f 70 20   pOp at the top 
4710: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 23  of the loop */.#
4720: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
4730: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20  ITE_DEBUG.  int 
4740: 6e 45 78 74 72 61 44 65 6c 65 74 65 20 3d 20 30  nExtraDelete = 0
4750: 3b 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 69  ;      /* Verifi
4760: 65 73 20 46 4f 52 44 45 4c 45 54 45 20 61 6e 64  es FORDELETE and
4770: 20 41 55 58 44 45 4c 45 54 45 20 66 6c 61 67 73   AUXDELETE flags
4780: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
4790: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
47a0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
47b0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
47c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
47d0: 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  >db;       /* Th
47e0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
47f0: 75 38 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e  u8 resetSchemaOn
4800: 46 61 75 6c 74 20 3d 20 30 3b 20 2f 2a 20 52 65  Fault = 0; /* Re
4810: 73 65 74 20 73 63 68 65 6d 61 20 61 66 74 65 72  set schema after
4820: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 70 6f 73   an error if pos
4830: 69 74 69 76 65 20 2a 2f 0a 20 20 75 38 20 65 6e  itive */.  u8 en
4840: 63 6f 64 69 6e 67 20 3d 20 45 4e 43 28 64 62 29  coding = ENC(db)
4850: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ;     /* The dat
4860: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a  abase encoding *
4870: 2f 0a 20 20 69 6e 74 20 69 43 6f 6d 70 61 72 65  /.  int iCompare
4880: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
4890: 2a 20 52 65 73 75 6c 74 20 6f 66 20 6c 61 73 74  * Result of last
48a0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20   comparison */. 
48b0: 20 75 6e 73 69 67 6e 65 64 20 6e 56 6d 53 74 65   unsigned nVmSte
48c0: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  p = 0;      /* N
48d0: 75 6d 62 65 72 20 6f 66 20 76 69 72 74 75 61 6c  umber of virtual
48e0: 20 6d 61 63 68 69 6e 65 20 73 74 65 70 73 20 2a   machine steps *
48f0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
4900: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
4910: 41 4c 4c 42 41 43 4b 0a 20 20 75 6e 73 69 67 6e  ALLBACK.  unsign
4920: 65 64 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69  ed nProgressLimi
4930: 74 3b 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 78  t;   /* Invoke x
4940: 50 72 6f 67 72 65 73 73 28 29 20 77 68 65 6e 20  Progress() when 
4950: 6e 56 6d 53 74 65 70 20 72 65 61 63 68 65 73 20  nVmStep reaches 
4960: 74 68 69 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  this */.#endif. 
4970: 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 70 2d 3e   Mem *aMem = p->
4980: 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 43  aMem;       /* C
4990: 6f 70 79 20 6f 66 20 70 2d 3e 61 4d 65 6d 20 2a  opy of p->aMem *
49a0: 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d 20  /.  Mem *pIn1 = 
49b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
49c0: 2a 20 31 73 74 20 69 6e 70 75 74 20 6f 70 65 72  * 1st input oper
49d0: 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  and */.  Mem *pI
49e0: 6e 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  n2 = 0;         
49f0: 20 20 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75 74      /* 2nd input
4a00: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65   operand */.  Me
4a10: 6d 20 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20 20  m *pIn3 = 0;    
4a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 72 64 20           /* 3rd 
4a30: 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f  input operand */
4a40: 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20 30  .  Mem *pOut = 0
4a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4a60: 20 4f 75 74 70 75 74 20 6f 70 65 72 61 6e 64 20   Output operand 
4a70: 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
4a80: 52 4f 46 49 4c 45 0a 20 20 75 36 34 20 73 74 61  ROFILE.  u64 sta
4a90: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rt;             
4aa0: 20 20 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63 6b      /* CPU clock
4ab0: 20 63 6f 75 6e 74 20 61 74 20 73 74 61 72 74 20   count at start 
4ac0: 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 23 65 6e  of opcode */.#en
4ad0: 64 69 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45 52  dif.  /*** INSER
4ae0: 54 20 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48 45  T STACK UNION HE
4af0: 52 45 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65 72  RE ***/..  asser
4b00: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
4b10: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 20 20  E_MAGIC_RUN );  
4b20: 2f 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  /* sqlite3_step(
4b30: 29 20 76 65 72 69 66 69 65 73 20 74 68 69 73 20  ) verifies this 
4b40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
4b50: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
4b60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
4b70: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
4b80: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
4b90: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
4ba0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
4bb0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
4bc0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
4bd0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
4be0: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
4bf0: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
4c00: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
4c10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
4c20: 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
4c30: 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
4c40: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
4c50: 61 64 65 72 20 7c 7c 20 70 2d 3e 72 65 61 64 4f  ader || p->readO
4c60: 6e 6c 79 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 69  nly!=0 );.  p->i
4c70: 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b  CurrentTime = 0;
4c80: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
4c90: 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 2d  plain==0 );.  p-
4ca0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
4cb0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
4cc0: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
4cd0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
4ce0: 65 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f 20  errupted ) goto 
4cf0: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74  abort_due_to_int
4d00: 65 72 72 75 70 74 3b 0a 20 20 73 71 6c 69 74 65  errupt;.  sqlite
4d10: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
4d20: 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
4d30: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
4d40: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 69 66 28 20  _CALLBACK.  if( 
4d50: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 29 7b  db->xProgress ){
4d60: 0a 20 20 20 20 75 33 32 20 69 50 72 69 6f 72 20  .    u32 iPrior 
4d70: 3d 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51  = p->aCounter[SQ
4d80: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
4d90: 56 4d 5f 53 54 45 50 5d 3b 0a 20 20 20 20 61 73  VM_STEP];.    as
4da0: 73 65 72 74 28 20 30 20 3c 20 64 62 2d 3e 6e 50  sert( 0 < db->nP
4db0: 72 6f 67 72 65 73 73 4f 70 73 20 29 3b 0a 20 20  rogressOps );.  
4dc0: 20 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74    nProgressLimit
4dd0: 20 3d 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73   = db->nProgress
4de0: 4f 70 73 20 2d 20 28 69 50 72 69 6f 72 20 25 20  Ops - (iPrior % 
4df0: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
4e00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4e10: 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d  nProgressLimit =
4e20: 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
4e30: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4e40: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 71  QLITE_DEBUG.  sq
4e50: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
4e60: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20  Malloc();.  if( 
4e70: 70 2d 3e 70 63 3d 3d 30 0a 20 20 20 26 26 20 28  p->pc==0.   && (
4e80: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 28  p->db->flags & (
4e90: 53 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69  SQLITE_VdbeListi
4ea0: 6e 67 7c 53 51 4c 49 54 45 5f 56 64 62 65 45 51  ng|SQLITE_VdbeEQ
4eb0: 50 7c 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  P|SQLITE_VdbeTra
4ec0: 63 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ce))!=0.  ){.   
4ed0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
4ee0: 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 73 71  once = 1;.    sq
4ef0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
4f00: 6c 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  l(p);.    if( p-
4f10: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
4f20: 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 20  ITE_VdbeListing 
4f30: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
4f40: 22 56 44 42 45 20 50 72 6f 67 72 61 6d 20 4c 69  "VDBE Program Li
4f50: 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20  sting:\n");.    
4f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4f70: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
4f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4f90: 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 69 2c  intOp(stdout, i,
4fa0: 20 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20   &aOp[i]);.     
4fb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4fc0: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
4fd0: 53 51 4c 49 54 45 5f 56 64 62 65 45 51 50 20 29  SQLITE_VdbeEQP )
4fe0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
4ff0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
5000: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4f 70  .        if( aOp
5010: 5b 69 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  [i].opcode==OP_E
5020: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
5030: 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 20 70      if( once ) p
5040: 72 69 6e 74 66 28 22 56 44 42 45 20 51 75 65 72  rintf("VDBE Quer
5050: 79 20 50 6c 61 6e 3a 5c 6e 22 29 3b 0a 20 20 20  y Plan:\n");.   
5060: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
5070: 73 5c 6e 22 2c 20 61 4f 70 5b 69 5d 2e 70 34 2e  s\n", aOp[i].p4.
5080: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e  z);.          on
5090: 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
50a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
50b0: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
50c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
50d0: 62 65 54 72 61 63 65 20 29 20 20 70 72 69 6e 74  beTrace )  print
50e0: 66 28 22 56 44 42 45 20 54 72 61 63 65 3a 5c 6e  f("VDBE Trace:\n
50f0: 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
5100: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
5110: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72  ();.#endif.  for
5120: 28 70 4f 70 3d 26 61 4f 70 5b 70 2d 3e 70 63 5d  (pOp=&aOp[p->pc]
5130: 3b 20 31 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  ; 1; pOp++){.   
5140: 20 2f 2a 20 45 72 72 6f 72 73 20 61 72 65 20 64   /* Errors are d
5150: 65 74 65 63 74 65 64 20 62 79 20 69 6e 64 69 76  etected by indiv
5160: 69 64 75 61 6c 20 6f 70 63 6f 64 65 73 2c 20 77  idual opcodes, w
5170: 69 74 68 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ith an immediate
5180: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 73 20 74 6f  .    ** jumps to
5190: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
51a0: 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ror. */.    asse
51b0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
51c0: 4b 20 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  K );..    assert
51d0: 28 20 70 4f 70 3e 3d 61 4f 70 20 26 26 20 70 4f  ( pOp>=aOp && pO
51e0: 70 3c 26 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 29 3b  p<&aOp[p->nOp]);
51f0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
5200: 46 49 4c 45 0a 20 20 20 20 73 74 61 72 74 20 3d  FILE.    start =
5210: 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29   sqlite3Hwtime()
5220: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 56 6d  ;.#endif.    nVm
5230: 53 74 65 70 2b 2b 3b 0a 23 69 66 64 65 66 20 53  Step++;.#ifdef S
5240: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
5250: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20  T_SCANSTATUS.   
5260: 20 69 66 28 20 70 2d 3e 61 6e 45 78 65 63 20 29   if( p->anExec )
5270: 20 70 2d 3e 61 6e 45 78 65 63 5b 28 69 6e 74 29   p->anExec[(int)
5280: 28 70 4f 70 2d 61 4f 70 29 5d 2b 2b 3b 0a 23 65  (pOp-aOp)]++;.#e
5290: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c  ndif..    /* Onl
52a0: 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e 67 20  y allow tracing 
52b0: 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  if SQLITE_DEBUG 
52c0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 20  is defined..    
52d0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
52e0: 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 64  _DEBUG.    if( d
52f0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5300: 45 5f 56 64 62 65 54 72 61 63 65 20 29 7b 0a 20  E_VdbeTrace ){. 
5310: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5320: 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20  PrintOp(stdout, 
5330: 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
5340: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 7d 0a 23 65  , pOp);.    }.#e
5350: 6e 64 69 66 0a 20 20 20 20 20 20 0a 0a 20 20 20  ndif.      ..   
5360: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
5370: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
5380: 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74 65 72  imulate an inter
5390: 72 75 70 74 2e 20 20 54 68 69 73 20 6f 6e 6c 79  rupt.  This only
53a0: 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20   happens.    ** 
53b0: 69 66 20 77 65 20 68 61 76 65 20 61 20 73 70 65  if we have a spe
53c0: 63 69 61 6c 20 74 65 73 74 20 62 75 69 6c 64 2e  cial test build.
53d0: 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
53e0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 69  QLITE_TEST.    i
53f0: 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  f( sqlite3_inter
5400: 72 75 70 74 5f 63 6f 75 6e 74 3e 30 20 29 7b 0a  rupt_count>0 ){.
5410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
5420: 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2d 2d 3b  terrupt_count--;
5430: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
5440: 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
5450: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nt==0 ){.       
5460: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
5470: 70 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  pt(db);.      }.
5480: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5490: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
54a0: 6b 69 6e 67 20 6f 6e 20 6f 74 68 65 72 20 6f 70  king on other op
54b0: 65 72 61 6e 64 73 20 2a 2f 0a 23 69 66 64 65 66  erands */.#ifdef
54c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
54d0: 20 20 7b 0a 20 20 20 20 20 20 75 38 20 6f 70 50    {.      u8 opP
54e0: 72 6f 70 65 72 74 79 20 3d 20 73 71 6c 69 74 65  roperty = sqlite
54f0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
5500: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 0a 20 20  pOp->opcode];.  
5510: 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65      if( (opPrope
5520: 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 31 29  rty & OPFLG_IN1)
5530: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
5540: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
5550: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5560: 72 74 28 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d  rt( pOp->p1<=(p-
5570: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
5580: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
5590: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
55a0: 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  lid(&aMem[pOp->p
55b0: 31 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  1]) );.        a
55c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
55d0: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
55e0: 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ants(&aMem[pOp->
55f0: 70 31 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20  p1]) );.        
5600: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
5610: 4f 70 2d 3e 70 31 2c 20 26 61 4d 65 6d 5b 70 4f  Op->p1, &aMem[pO
5620: 70 2d 3e 70 31 5d 29 3b 0a 20 20 20 20 20 20 7d  p->p1]);.      }
5630: 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72  .      if( (opPr
5640: 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49  operty & OPFLG_I
5650: 4e 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  N2)!=0 ){.      
5660: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5670: 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  2>0 );.        a
5680: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d  ssert( pOp->p2<=
5690: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
56a0: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
56b0: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
56c0: 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70  sValid(&aMem[pOp
56d0: 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20 20 20  ->p2]) );.      
56e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
56f0: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
5700: 61 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f  ariants(&aMem[pO
5710: 70 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20 20  p->p2]) );.     
5720: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
5730: 45 28 70 4f 70 2d 3e 70 32 2c 20 26 61 4d 65 6d  E(pOp->p2, &aMem
5740: 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20  [pOp->p2]);.    
5750: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f    }.      if( (o
5760: 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c  pProperty & OPFL
5770: 47 5f 49 4e 33 29 21 3d 30 20 29 7b 0a 20 20 20  G_IN3)!=0 ){.   
5780: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5790: 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20  ->p3>0 );.      
57a0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
57b0: 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
57c0: 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
57d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d         assert( m
57e0: 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b  emIsValid(&aMem[
57f0: 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20  pOp->p3]) );.   
5800: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
5810: 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d  ite3VdbeCheckMem
5820: 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d 65 6d  Invariants(&aMem
5830: 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20  [pOp->p3]) );.  
5840: 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54        REGISTER_T
5850: 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 26 61  RACE(pOp->p3, &a
5860: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20  Mem[pOp->p3]);. 
5870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5880: 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f   (opProperty & O
5890: 50 46 4c 47 5f 4f 55 54 32 29 21 3d 30 20 29 7b  PFLG_OUT2)!=0 ){
58a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
58b0: 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20   pOp->p2>0 );.  
58c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
58d0: 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p2<=(p->nMem+
58e0: 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
58f0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62  );.        memAb
5900: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26  outToChange(p, &
5910: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
5920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5930: 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20  ( (opProperty & 
5940: 4f 50 46 4c 47 5f 4f 55 54 33 29 21 3d 30 20 29  OPFLG_OUT3)!=0 )
5950: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5960: 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20  ( pOp->p3>0 );. 
5970: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5980: 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
5990: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
59a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 41   );.        memA
59b0: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
59c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b  &aMem[pOp->p3]);
59d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
59e0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
59f0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
5a00: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
5a10: 50 52 4f 46 49 4c 45 29 0a 20 20 20 20 70 4f 72  PROFILE).    pOr
5a20: 69 67 4f 70 20 3d 20 70 4f 70 3b 0a 23 65 6e 64  igOp = pOp;.#end
5a30: 69 66 0a 20 20 0a 20 20 20 20 73 77 69 74 63 68  if.  .    switch
5a40: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b  ( pOp->opcode ){
5a50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5aa0: 0a 2a 2a 20 57 68 61 74 20 66 6f 6c 6c 6f 77 73  .** What follows
5ab0: 20 69 73 20 61 20 6d 61 73 73 69 76 65 20 73 77   is a massive sw
5ac0: 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20 77  itch statement w
5ad0: 68 65 72 65 20 65 61 63 68 20 63 61 73 65 20 69  here each case i
5ae0: 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 73  mplements a.** s
5af0: 65 70 61 72 61 74 65 20 69 6e 73 74 72 75 63 74  eparate instruct
5b00: 69 6f 6e 20 69 6e 20 74 68 65 20 76 69 72 74 75  ion in the virtu
5b10: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49 66 20  al machine.  If 
5b20: 77 65 20 66 6f 6c 6c 6f 77 20 74 68 65 20 75 73  we follow the us
5b30: 75 61 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61 74 69  ual.** indentati
5b40: 6f 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2c 20  on conventions, 
5b50: 65 61 63 68 20 63 61 73 65 20 73 68 6f 75 6c 64  each case should
5b60: 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62 79 20   be indented by 
5b70: 36 20 73 70 61 63 65 73 2e 20 20 42 75 74 0a 2a  6 spaces.  But.*
5b80: 2a 20 74 68 61 74 20 69 73 20 61 20 6c 6f 74 20  * that is a lot 
5b90: 6f 66 20 77 61 73 74 65 64 20 73 70 61 63 65 20  of wasted space 
5ba0: 6f 6e 20 74 68 65 20 6c 65 66 74 20 6d 61 72 67  on the left marg
5bb0: 69 6e 2e 20 20 53 6f 20 74 68 65 20 63 6f 64 65  in.  So the code
5bc0: 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 73   within.** the s
5bd0: 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74 20  witch statement 
5be0: 77 69 6c 6c 20 62 72 65 61 6b 20 77 69 74 68 20  will break with 
5bf0: 63 6f 6e 76 65 6e 74 69 6f 6e 20 61 6e 64 20 62  convention and b
5c00: 65 20 66 6c 75 73 68 2d 6c 65 66 74 2e 20 41 6e  e flush-left. An
5c10: 6f 74 68 65 72 0a 2a 2a 20 62 69 67 20 63 6f 6d  other.** big com
5c20: 6d 65 6e 74 20 28 73 69 6d 69 6c 61 72 20 74 6f  ment (similar to
5c30: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 20   this one) will 
5c40: 6d 61 72 6b 20 74 68 65 20 70 6f 69 6e 74 20 69  mark the point i
5c50: 6e 20 74 68 65 20 63 6f 64 65 20 77 68 65 72 65  n the code where
5c60: 0a 2a 2a 20 77 65 20 74 72 61 6e 73 69 74 69 6f  .** we transitio
5c70: 6e 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d 61 6c  n back to normal
5c80: 20 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a   indentation..**
5c90: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 74 69  .** The formatti
5ca0: 6e 67 20 6f 66 20 65 61 63 68 20 63 61 73 65 20  ng of each case 
5cb0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54  is important.  T
5cc0: 68 65 20 6d 61 6b 65 66 69 6c 65 20 66 6f 72 20  he makefile for 
5cd0: 53 51 4c 69 74 65 0a 2a 2a 20 67 65 6e 65 72 61  SQLite.** genera
5ce0: 74 65 73 20 74 77 6f 20 43 20 66 69 6c 65 73 20  tes two C files 
5cf0: 22 6f 70 63 6f 64 65 73 2e 68 22 20 61 6e 64 20  "opcodes.h" and 
5d00: 22 6f 70 63 6f 64 65 73 2e 63 22 20 62 79 20 73  "opcodes.c" by s
5d10: 63 61 6e 6e 69 6e 67 20 74 68 69 73 0a 2a 2a 20  canning this.** 
5d20: 66 69 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  file looking for
5d30: 20 6c 69 6e 65 73 20 74 68 61 74 20 62 65 67 69   lines that begi
5d40: 6e 20 77 69 74 68 20 22 63 61 73 65 20 4f 50 5f  n with "case OP_
5d50: 22 2e 20 20 54 68 65 20 6f 70 63 6f 64 65 73 2e  ".  The opcodes.
5d60: 68 20 66 69 6c 65 73 0a 2a 2a 20 77 69 6c 6c 20  h files.** will 
5d70: 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 23  be filled with #
5d80: 64 65 66 69 6e 65 73 20 74 68 61 74 20 67 69 76  defines that giv
5d90: 65 20 75 6e 69 71 75 65 20 69 6e 74 65 67 65 72  e unique integer
5da0: 20 76 61 6c 75 65 73 20 74 6f 20 65 61 63 68 0a   values to each.
5db0: 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 74 68  ** opcode and th
5dc0: 65 20 6f 70 63 6f 64 65 73 2e 63 20 66 69 6c 65  e opcodes.c file
5dd0: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
5de0: 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74 72 69  an array of stri
5df0: 6e 67 73 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  ngs where.** eac
5e00: 68 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20  h string is the 
5e10: 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  symbolic name fo
5e20: 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
5e30: 69 6e 67 20 6f 70 63 6f 64 65 2e 20 20 49 66 20  ing opcode.  If 
5e40: 74 68 65 0a 2a 2a 20 63 61 73 65 20 73 74 61 74  the.** case stat
5e50: 65 6d 65 6e 74 20 69 73 20 66 6f 6c 6c 6f 77 65  ement is followe
5e60: 64 20 62 79 20 61 20 63 6f 6d 6d 65 6e 74 20 6f  d by a comment o
5e70: 66 20 74 68 65 20 66 6f 72 6d 20 22 2f 23 20 73  f the form "/# s
5e80: 61 6d 65 20 61 73 20 2e 2e 2e 20 23 2f 22 0a 2a  ame as ... #/".*
5e90: 2a 20 74 68 61 74 20 63 6f 6d 6d 65 6e 74 20 69  * that comment i
5ea0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
5eb0: 69 6e 65 20 74 68 65 20 70 61 72 74 69 63 75 6c  ine the particul
5ec0: 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ar value of the 
5ed0: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  opcode..**.** Ot
5ee0: 68 65 72 20 6b 65 79 77 6f 72 64 73 20 69 6e 20  her keywords in 
5ef0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 68 61 74  the comment that
5f00: 20 66 6f 6c 6c 6f 77 73 20 65 61 63 68 20 63 61   follows each ca
5f10: 73 65 20 61 72 65 20 75 73 65 64 20 74 6f 0a 2a  se are used to.*
5f20: 2a 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * construct the 
5f30: 4f 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49 5a 45  OPFLG_INITIALIZE
5f40: 52 20 76 61 6c 75 65 20 74 68 61 74 20 69 6e 69  R value that ini
5f50: 74 69 61 6c 69 7a 65 73 20 6f 70 63 6f 64 65 50  tializes opcodeP
5f60: 72 6f 70 65 72 74 79 5b 5d 2e 0a 2a 2a 20 4b 65  roperty[]..** Ke
5f70: 79 77 6f 72 64 73 20 69 6e 63 6c 75 64 65 3a 20  ywords include: 
5f80: 69 6e 31 2c 20 69 6e 32 2c 20 69 6e 33 2c 20 6f  in1, in2, in3, o
5f90: 75 74 32 2c 20 6f 75 74 33 2e 20 20 53 65 65 0a  ut2, out3.  See.
5fa0: 2a 2a 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  ** the mkopcodeh
5fb0: 2e 61 77 6b 20 73 63 72 69 70 74 20 66 6f 72 20  .awk script for 
5fc0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
5fd0: 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f  mation..**.** Do
5fe0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61 62 6f 75  cumentation abou
5ff0: 74 20 56 44 42 45 20 6f 70 63 6f 64 65 73 20 69  t VDBE opcodes i
6000: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73  s generated by s
6010: 63 61 6e 6e 69 6e 67 20 74 68 69 73 20 66 69 6c  canning this fil
6020: 65 0a 2a 2a 20 66 6f 72 20 6c 69 6e 65 73 20 6f  e.** for lines o
6030: 66 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 22  f that contain "
6040: 4f 70 63 6f 64 65 3a 22 2e 20 20 54 68 61 74 20  Opcode:".  That 
6050: 6c 69 6e 65 20 61 6e 64 20 61 6c 6c 20 73 75 62  line and all sub
6060: 73 65 71 75 65 6e 74 0a 2a 2a 20 63 6f 6d 6d 65  sequent.** comme
6070: 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 75 73 65  nt lines are use
6080: 64 20 69 6e 20 74 68 65 20 67 65 6e 65 72 61 74  d in the generat
6090: 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  ion of the opcod
60a0: 65 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 61  e.html documenta
60b0: 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a  tion.** file..**
60c0: 0a 2a 2a 20 53 55 4d 4d 41 52 59 3a 0a 2a 2a 0a  .** SUMMARY:.**.
60d0: 2a 2a 20 20 20 20 20 46 6f 72 6d 61 74 74 69 6e  **     Formattin
60e0: 67 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  g is important t
60f0: 6f 20 73 63 72 69 70 74 73 20 74 68 61 74 20 73  o scripts that s
6100: 63 61 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a  can this file..*
6110: 2a 20 20 20 20 20 44 6f 20 6e 6f 74 20 64 65 76  *     Do not dev
6120: 69 61 74 65 20 66 72 6f 6d 20 74 68 65 20 66 6f  iate from the fo
6130: 72 6d 61 74 74 69 6e 67 20 73 74 79 6c 65 20 63  rmatting style c
6140: 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e  urrently in use.
6150: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
6160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61a0: 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  */../* Opcode:  
61b0: 47 6f 74 6f 20 2a 20 50 32 20 2a 20 2a 20 2a 0a  Goto * P2 * * *.
61c0: 2a 2a 0a 2a 2a 20 41 6e 20 75 6e 63 6f 6e 64 69  **.** An uncondi
61d0: 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 61  tional jump to a
61e0: 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 20 54 68  ddress P2..** Th
61f0: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
6200: 6f 6e 20 65 78 65 63 75 74 65 64 20 77 69 6c 6c  on executed will
6210: 20 62 65 20 0a 2a 2a 20 74 68 65 20 6f 6e 65 20   be .** the one 
6220: 61 74 20 69 6e 64 65 78 20 50 32 20 66 72 6f 6d  at index P2 from
6230: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
6240: 66 0a 2a 2a 20 74 68 65 20 70 72 6f 67 72 61 6d  f.** the program
6250: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 70  ..**.** The P1 p
6260: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
6270: 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 62 79  actually used by
6280: 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 48   this opcode.  H
6290: 6f 77 65 76 65 72 2c 20 69 74 0a 2a 2a 20 69 73  owever, it.** is
62a0: 20 73 6f 6d 65 74 69 6d 65 73 20 73 65 74 20 74   sometimes set t
62b0: 6f 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 30  o 1 instead of 0
62c0: 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68   as a hint to th
62d0: 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 73  e command-line s
62e0: 68 65 6c 6c 0a 2a 2a 20 74 68 61 74 20 74 68 69  hell.** that thi
62f0: 73 20 47 6f 74 6f 20 69 73 20 74 68 65 20 62 6f  s Goto is the bo
6300: 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f 70 20 61  ttom of a loop a
6310: 6e 64 20 74 68 61 74 20 74 68 65 20 6c 69 6e 65  nd that the line
6320: 73 20 66 72 6f 6d 20 50 32 20 64 6f 77 6e 0a 2a  s from P2 down.*
6330: 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  * to the current
6340: 20 6c 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20   line should be 
6350: 69 6e 64 65 6e 74 65 64 20 66 6f 72 20 45 58 50  indented for EXP
6360: 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  LAIN output..*/.
6370: 63 61 73 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20  case OP_Goto: { 
6380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
6390: 75 6d 70 20 2a 2f 0a 6a 75 6d 70 5f 74 6f 5f 70  ump */.jump_to_p
63a0: 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f  2_and_check_for_
63b0: 69 6e 74 65 72 72 75 70 74 3a 0a 20 20 70 4f 70  interrupt:.  pOp
63c0: 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20   = &aOp[pOp->p2 
63d0: 2d 20 31 5d 3b 0a 0a 20 20 2f 2a 20 4f 70 63 6f  - 1];..  /* Opco
63e0: 64 65 73 20 74 68 61 74 20 61 72 65 20 75 73 65  des that are use
63f0: 64 20 61 73 20 74 68 65 20 62 6f 74 74 6f 6d 20  d as the bottom 
6400: 6f 66 20 61 20 6c 6f 6f 70 20 28 4f 50 5f 4e 65  of a loop (OP_Ne
6410: 78 74 2c 20 4f 50 5f 50 72 65 76 2c 0a 20 20 2a  xt, OP_Prev,.  *
6420: 2a 20 4f 50 5f 56 4e 65 78 74 2c 20 6f 72 20 4f  * OP_VNext, or O
6430: 50 5f 53 6f 72 74 65 72 4e 65 78 74 29 20 61 6c  P_SorterNext) al
6440: 6c 20 6a 75 6d 70 20 68 65 72 65 20 75 70 6f 6e  l jump here upon
6450: 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e  .  ** completion
6460: 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
6470: 69 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  if sqlite3_inter
6480: 72 75 70 74 28 29 20 68 61 73 20 62 65 65 6e 20  rupt() has been 
6490: 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 72 20 69  called.  ** or i
64a0: 66 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  f the progress c
64b0: 61 6c 6c 62 61 63 6b 20 6e 65 65 64 73 20 74 6f  allback needs to
64c0: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 20 0a 20 20   be invoked. .  
64d0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64  **.  ** This cod
64e0: 65 20 75 73 65 73 20 75 6e 73 74 72 75 63 74 75  e uses unstructu
64f0: 72 65 64 20 22 67 6f 74 6f 22 20 73 74 61 74 65  red "goto" state
6500: 6d 65 6e 74 73 20 61 6e 64 20 64 6f 65 73 20 6e  ments and does n
6510: 6f 74 20 6c 6f 6f 6b 20 63 6c 65 61 6e 2e 0a 20  ot look clean.. 
6520: 20 2a 2a 20 42 75 74 20 74 68 61 74 20 69 73 20   ** But that is 
6530: 6e 6f 74 20 64 75 65 20 74 6f 20 73 6c 6f 70 70  not due to slopp
6540: 79 20 63 6f 64 69 6e 67 20 68 61 62 69 74 73 2e  y coding habits.
6550: 20 54 68 65 20 63 6f 64 65 20 69 73 20 77 72 69   The code is wri
6560: 74 74 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 77  tten this.  ** w
6570: 61 79 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e  ay for performan
6580: 63 65 2c 20 74 6f 20 61 76 6f 69 64 20 68 61 76  ce, to avoid hav
6590: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 20 69  ing to run the i
65a0: 6e 74 65 72 72 75 70 74 20 61 6e 64 20 70 72 6f  nterrupt and pro
65b0: 67 72 65 73 73 0a 20 20 2a 2a 20 63 68 65 63 6b  gress.  ** check
65c0: 73 20 6f 6e 20 65 76 65 72 79 20 6f 70 63 6f 64  s on every opcod
65d0: 65 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 73  e.  This helps s
65e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f  qlite3_step() to
65f0: 20 72 75 6e 20 61 62 6f 75 74 20 31 2e 35 25 0a   run about 1.5%.
6600: 20 20 2a 2a 20 66 61 73 74 65 72 20 61 63 63 6f    ** faster acco
6610: 72 64 69 6e 67 20 74 6f 20 22 76 61 6c 67 72 69  rding to "valgri
6620: 6e 64 20 2d 2d 74 6f 6f 6c 3d 63 61 63 68 65 67  nd --tool=cacheg
6630: 72 69 6e 64 22 20 2a 2f 0a 63 68 65 63 6b 5f 66  rind" */.check_f
6640: 6f 72 5f 69 6e 74 65 72 72 75 70 74 3a 0a 20 20  or_interrupt:.  
6650: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
6660: 65 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f 20  errupted ) goto 
6670: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74  abort_due_to_int
6680: 65 72 72 75 70 74 3b 0a 23 69 66 6e 64 65 66 20  errupt;.#ifndef 
6690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
66a0: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20  RESS_CALLBACK.  
66b0: 2f 2a 20 43 61 6c 6c 20 74 68 65 20 70 72 6f 67  /* Call the prog
66c0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 69 66  ress callback if
66d0: 20 69 74 20 69 73 20 63 6f 6e 66 69 67 75 72 65   it is configure
66e0: 64 20 61 6e 64 20 74 68 65 20 72 65 71 75 69 72  d and the requir
66f0: 65 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ed number.  ** o
6700: 66 20 56 44 42 45 20 6f 70 73 20 68 61 76 65 20  f VDBE ops have 
6710: 62 65 65 6e 20 65 78 65 63 75 74 65 64 20 28 65  been executed (e
6720: 69 74 68 65 72 20 73 69 6e 63 65 20 74 68 69 73  ither since this
6730: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20   invocation of. 
6740: 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45   ** sqlite3VdbeE
6750: 78 65 63 28 29 20 6f 72 20 73 69 6e 63 65 20 6c  xec() or since l
6760: 61 73 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f  ast time the pro
6770: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77  gress callback w
6780: 61 73 20 63 61 6c 6c 65 64 29 2e 0a 20 20 2a 2a  as called)..  **
6790: 20 49 66 20 74 68 65 20 70 72 6f 67 72 65 73 73   If the progress
67a0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
67b0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 65 78 69 74  s non-zero, exit
67c0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
67d0: 68 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  hine with.  ** a
67e0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53 51 4c   return code SQL
67f0: 49 54 45 5f 41 42 4f 52 54 2e 0a 20 20 2a 2f 0a  ITE_ABORT..  */.
6800: 20 20 69 66 28 20 6e 56 6d 53 74 65 70 3e 3d 6e    if( nVmStep>=n
6810: 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 26 26  ProgressLimit &&
6820: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 21 3d   db->xProgress!=
6830: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6840: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
6850: 73 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50 72 6f  s!=0 );.    nPro
6860: 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 6e 56 6d  gressLimit = nVm
6870: 53 74 65 70 20 2b 20 64 62 2d 3e 6e 50 72 6f 67  Step + db->nProg
6880: 72 65 73 73 4f 70 73 20 2d 20 28 6e 56 6d 53 74  ressOps - (nVmSt
6890: 65 70 25 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73  ep%db->nProgress
68a0: 4f 70 73 29 3b 0a 20 20 20 20 69 66 28 20 64 62  Ops);.    if( db
68b0: 2d 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e  ->xProgress(db->
68c0: 70 50 72 6f 67 72 65 73 73 41 72 67 29 20 29 7b  pProgressArg) ){
68d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
68e0: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
68f0: 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
6900: 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
6910: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
6920: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
6930: 4f 70 63 6f 64 65 3a 20 20 47 6f 73 75 62 20 50  Opcode:  Gosub P
6940: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
6950: 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
6960: 6e 74 20 61 64 64 72 65 73 73 20 6f 6e 74 6f 20  nt address onto 
6970: 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 61  register P1.** a
6980: 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  nd then jump to 
6990: 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2f 0a 63  address P2..*/.c
69a0: 61 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b 20  ase OP_Gosub: { 
69b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
69c0: 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  mp */.  assert( 
69d0: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70  pOp->p1>0 && pOp
69e0: 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p1<=(p->nMem+1
69f0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
6a00: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
6a10: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
6a20: 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61  ert( VdbeMemDyna
6a30: 6d 69 63 28 70 49 6e 31 29 3d 3d 30 20 29 3b 0a  mic(pIn1)==0 );.
6a40: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
6a50: 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 70  ge(p, pIn1);.  p
6a60: 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  In1->flags = MEM
6a70: 5f 49 6e 74 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e  _Int;.  pIn1->u.
6a80: 69 20 3d 20 28 69 6e 74 29 28 70 4f 70 2d 61 4f  i = (int)(pOp-aO
6a90: 70 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54  p);.  REGISTER_T
6aa0: 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49  RACE(pOp->p1, pI
6ab0: 6e 31 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 73 74 20  n1);..  /* Most 
6ac0: 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 73 20  jump operations 
6ad0: 64 6f 20 61 20 67 6f 74 6f 20 74 6f 20 74 68 69  do a goto to thi
6ae0: 73 20 73 70 6f 74 20 69 6e 20 6f 72 64 65 72 20  s spot in order 
6af0: 74 6f 20 75 70 64 61 74 65 0a 20 20 2a 2a 20 74  to update.  ** t
6b00: 68 65 20 70 4f 70 20 70 6f 69 6e 74 65 72 2e 20  he pOp pointer. 
6b10: 2a 2f 0a 6a 75 6d 70 5f 74 6f 5f 70 32 3a 0a 20  */.jump_to_p2:. 
6b20: 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d   pOp = &aOp[pOp-
6b30: 3e 70 32 20 2d 20 31 5d 3b 0a 20 20 62 72 65 61  >p2 - 1];.  brea
6b40: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
6b50: 20 20 52 65 74 75 72 6e 20 50 31 20 2a 20 2a 20    Return P1 * * 
6b60: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74  * *.**.** Jump t
6b70: 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
6b80: 75 63 74 69 6f 6e 20 61 66 74 65 72 20 74 68 65  uction after the
6b90: 20 61 64 64 72 65 73 73 20 69 6e 20 72 65 67 69   address in regi
6ba0: 73 74 65 72 20 50 31 2e 20 20 41 66 74 65 72 0a  ster P1.  After.
6bb0: 2a 2a 20 74 68 65 20 6a 75 6d 70 2c 20 72 65 67  ** the jump, reg
6bc0: 69 73 74 65 72 20 50 31 20 62 65 63 6f 6d 65 73  ister P1 becomes
6bd0: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 63   undefined..*/.c
6be0: 61 73 65 20 4f 50 5f 52 65 74 75 72 6e 3a 20 7b  ase OP_Return: {
6bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
6c00: 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  1 */.  pIn1 = &a
6c10: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
6c20: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
6c30: 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a  ags==MEM_Int );.
6c40: 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 49 6e    pOp = &aOp[pIn
6c50: 31 2d 3e 75 2e 69 5d 3b 0a 20 20 70 49 6e 31 2d  1->u.i];.  pIn1-
6c60: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
6c70: 65 66 69 6e 65 64 3b 0a 20 20 62 72 65 61 6b 3b  efined;.  break;
6c80: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
6c90: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 50 31 20  nitCoroutine P1 
6ca0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
6cb0: 53 65 74 20 75 70 20 72 65 67 69 73 74 65 72 20  Set up register 
6cc0: 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  P1 so that it wi
6cd0: 6c 6c 20 59 69 65 6c 64 20 74 6f 20 74 68 65 20  ll Yield to the 
6ce0: 63 6f 72 6f 75 74 69 6e 65 0a 2a 2a 20 6c 6f 63  coroutine.** loc
6cf0: 61 74 65 64 20 61 74 20 61 64 64 72 65 73 73 20  ated at address 
6d00: 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 21  P3..**.** If P2!
6d10: 3d 30 20 74 68 65 6e 20 74 68 65 20 63 6f 72 6f  =0 then the coro
6d20: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
6d30: 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
6d40: 20 66 6f 6c 6c 6f 77 73 0a 2a 2a 20 74 68 69 73   follows.** this
6d50: 20 6f 70 63 6f 64 65 2e 20 20 53 6f 20 6a 75 6d   opcode.  So jum
6d60: 70 20 6f 76 65 72 20 74 68 65 20 63 6f 72 6f 75  p over the corou
6d70: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
6d80: 69 6f 6e 20 74 6f 0a 2a 2a 20 61 64 64 72 65 73  ion to.** addres
6d90: 73 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  s P2..**.** See 
6da0: 61 6c 73 6f 3a 20 45 6e 64 43 6f 72 6f 75 74 69  also: EndCorouti
6db0: 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  ne.*/.case OP_In
6dc0: 69 74 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 20 20  itCoroutine: {  
6dd0: 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
6de0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
6df0: 30 20 26 26 20 20 70 4f 70 2d 3e 70 31 3c 3d 28  0 &&  pOp->p1<=(
6e00: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
6e10: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 61 73 73  Cursor) );.  ass
6e20: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20  ert( pOp->p2>=0 
6e30: 26 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f  && pOp->p2<p->nO
6e40: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p );.  assert( p
6e50: 4f 70 2d 3e 70 33 3e 3d 30 20 26 26 20 70 4f 70  Op->p3>=0 && pOp
6e60: 2d 3e 70 33 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  ->p3<p->nOp );. 
6e70: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
6e80: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
6e90: 28 20 21 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  ( !VdbeMemDynami
6ea0: 63 28 70 4f 75 74 29 20 29 3b 0a 20 20 70 4f 75  c(pOut) );.  pOu
6eb0: 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  t->u.i = pOp->p3
6ec0: 20 2d 20 31 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c   - 1;.  pOut->fl
6ed0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
6ee0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 20 67   if( pOp->p2 ) g
6ef0: 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
6f00: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6f10: 70 63 6f 64 65 3a 20 20 45 6e 64 43 6f 72 6f 75  pcode:  EndCorou
6f20: 74 69 6e 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  tine P1 * * * *.
6f30: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 73 74 72 75  **.** The instru
6f40: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 61 64 64  ction at the add
6f50: 72 65 73 73 20 69 6e 20 72 65 67 69 73 74 65 72  ress in register
6f60: 20 50 31 20 69 73 20 61 20 59 69 65 6c 64 2e 0a   P1 is a Yield..
6f70: 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 50  ** Jump to the P
6f80: 32 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74  2 parameter of t
6f90: 68 61 74 20 59 69 65 6c 64 2e 0a 2a 2a 20 41 66  hat Yield..** Af
6fa0: 74 65 72 20 74 68 65 20 6a 75 6d 70 2c 20 72 65  ter the jump, re
6fb0: 67 69 73 74 65 72 20 50 31 20 62 65 63 6f 6d 65  gister P1 become
6fc0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  s undefined..**.
6fd0: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 49 6e 69  ** See also: Ini
6fe0: 74 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61  tCoroutine.*/.ca
6ff0: 73 65 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  se OP_EndCorouti
7000: 6e 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ne: {           
7010: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 56 64 62 65  /* in1 */.  Vdbe
7020: 4f 70 20 2a 70 43 61 6c 6c 65 72 3b 0a 20 20 70  Op *pCaller;.  p
7030: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
7040: 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
7050: 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d  pIn1->flags==MEM
7060: 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  _Int );.  assert
7070: 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 3d 30 20 26  ( pIn1->u.i>=0 &
7080: 26 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 2d 3e 6e  & pIn1->u.i<p->n
7090: 4f 70 20 29 3b 0a 20 20 70 43 61 6c 6c 65 72 20  Op );.  pCaller 
70a0: 3d 20 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69  = &aOp[pIn1->u.i
70b0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 61  ];.  assert( pCa
70c0: 6c 6c 65 72 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  ller->opcode==OP
70d0: 5f 59 69 65 6c 64 20 29 3b 0a 20 20 61 73 73 65  _Yield );.  asse
70e0: 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e 70 32 3e  rt( pCaller->p2>
70f0: 3d 30 20 26 26 20 70 43 61 6c 6c 65 72 2d 3e 70  =0 && pCaller->p
7100: 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f  2<p->nOp );.  pO
7110: 70 20 3d 20 26 61 4f 70 5b 70 43 61 6c 6c 65 72  p = &aOp[pCaller
7120: 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20 70 49 6e  ->p2 - 1];.  pIn
7130: 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  1->flags = MEM_U
7140: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 62 72 65 61  ndefined;.  brea
7150: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
7160: 20 20 59 69 65 6c 64 20 50 31 20 50 32 20 2a 20    Yield P1 P2 * 
7170: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70 20 74  * *.**.** Swap t
7180: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
7190: 65 72 20 77 69 74 68 20 74 68 65 20 76 61 6c 75  er with the valu
71a0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
71b0: 2e 20 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 74  .  This.** has t
71c0: 68 65 20 65 66 66 65 63 74 20 6f 66 20 79 69 65  he effect of yie
71d0: 6c 64 69 6e 67 20 74 6f 20 61 20 63 6f 72 6f 75  lding to a corou
71e0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tine..**.** If t
71f0: 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 74 68 61  he coroutine tha
7200: 74 20 69 73 20 6c 61 75 6e 63 68 65 64 20 62 79  t is launched by
7210: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
7220: 6e 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a 20 59  n ends with.** Y
7230: 69 65 6c 64 20 6f 72 20 52 65 74 75 72 6e 20 74  ield or Return t
7240: 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  hen continue to 
7250: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
7260: 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
7270: 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 6c   the coroutine l
7280: 61 75 6e 63 68 65 64 20 62 79 20 74 68 69 73 20  aunched by this 
7290: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 73  instruction ends
72a0: 20 77 69 74 68 0a 2a 2a 20 45 6e 64 43 6f 72 6f   with.** EndCoro
72b0: 75 74 69 6e 65 2c 20 74 68 65 6e 20 6a 75 6d 70  utine, then jump
72c0: 20 74 6f 20 50 32 20 72 61 74 68 65 72 20 74 68   to P2 rather th
72d0: 61 6e 20 63 6f 6e 74 69 6e 75 69 6e 67 20 77 69  an continuing wi
72e0: 74 68 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 69  th the.** next i
72f0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
7300: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 49 6e 69 74  * See also: Init
7310: 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61 73  Coroutine.*/.cas
7320: 65 20 4f 50 5f 59 69 65 6c 64 3a 20 7b 20 20 20  e OP_Yield: {   
7330: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c           /* in1,
7340: 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 70   jump */.  int p
7350: 63 44 65 73 74 3b 0a 20 20 70 49 6e 31 20 3d 20  cDest;.  pIn1 = 
7360: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
7370: 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d 65    assert( VdbeMe
7380: 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31 29 3d 3d  mDynamic(pIn1)==
7390: 30 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61  0 );.  pIn1->fla
73a0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
73b0: 70 63 44 65 73 74 20 3d 20 28 69 6e 74 29 70 49  pcDest = (int)pI
73c0: 6e 31 2d 3e 75 2e 69 3b 0a 20 20 70 49 6e 31 2d  n1->u.i;.  pIn1-
73d0: 3e 75 2e 69 20 3d 20 28 69 6e 74 29 28 70 4f 70  >u.i = (int)(pOp
73e0: 20 2d 20 61 4f 70 29 3b 0a 20 20 52 45 47 49 53   - aOp);.  REGIS
73f0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
7400: 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 4f 70 20  1, pIn1);.  pOp 
7410: 3d 20 26 61 4f 70 5b 70 63 44 65 73 74 5d 3b 0a  = &aOp[pcDest];.
7420: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
7430: 70 63 6f 64 65 3a 20 20 48 61 6c 74 49 66 4e 75  pcode:  HaltIfNu
7440: 6c 6c 20 20 50 31 20 50 32 20 50 33 20 50 34 20  ll  P1 P2 P3 P4 
7450: 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
7460: 69 66 20 72 5b 50 33 5d 3d 6e 75 6c 6c 20 68 61  if r[P3]=null ha
7470: 6c 74 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  lt.**.** Check t
7480: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
7490: 73 74 65 72 20 50 33 2e 20 20 49 66 20 69 74 20  ster P3.  If it 
74a0: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 48 61 6c  is NULL then Hal
74b0: 74 20 75 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d  t using.** param
74c0: 65 74 65 72 20 50 31 2c 20 50 32 2c 20 61 6e 64  eter P1, P2, and
74d0: 20 50 34 20 61 73 20 69 66 20 74 68 69 73 20 77   P4 as if this w
74e0: 65 72 65 20 61 20 48 61 6c 74 20 69 6e 73 74 72  ere a Halt instr
74f0: 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 0a  uction.  If the.
7500: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  ** value in regi
7510: 73 74 65 72 20 50 33 20 69 73 20 6e 6f 74 20 4e  ster P3 is not N
7520: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ULL, then this r
7530: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
7540: 70 2e 0a 2a 2a 20 54 68 65 20 50 35 20 70 61 72  p..** The P5 par
7550: 61 6d 65 74 65 72 20 73 68 6f 75 6c 64 20 62 65  ameter should be
7560: 20 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48   1..*/.case OP_H
7570: 61 6c 74 49 66 4e 75 6c 6c 3a 20 7b 20 20 20 20  altIfNull: {    
7580: 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20 70 49    /* in3 */.  pI
7590: 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
75a0: 70 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 33  p3];.  if( (pIn3
75b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
75c0: 6c 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ll)==0 ) break;.
75d0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
75e0: 68 20 69 6e 74 6f 20 4f 50 5f 48 61 6c 74 20 2a  h into OP_Halt *
75f0: 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  /.}../* Opcode: 
7600: 20 48 61 6c 74 20 50 31 20 50 32 20 2a 20 50 34   Halt P1 P2 * P4
7610: 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 69 74 20 69   P5.**.** Exit i
7620: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 41 6c 6c  mmediately.  All
7630: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c 20 65   open cursors, e
7640: 74 63 20 61 72 65 20 63 6c 6f 73 65 64 0a 2a 2a  tc are closed.**
7650: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
7660: 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20  **.** P1 is the 
7670: 72 65 73 75 6c 74 20 63 6f 64 65 20 72 65 74 75  result code retu
7680: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
7690: 65 78 65 63 28 29 2c 20 73 71 6c 69 74 65 33 5f  exec(), sqlite3_
76a0: 72 65 73 65 74 28 29 2c 0a 2a 2a 20 6f 72 20 73  reset(),.** or s
76b0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
76c0: 29 2e 20 20 46 6f 72 20 61 20 6e 6f 72 6d 61 6c  ).  For a normal
76d0: 20 68 61 6c 74 2c 20 74 68 69 73 20 73 68 6f 75   halt, this shou
76e0: 6c 64 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20  ld be SQLITE_OK 
76f0: 28 30 29 2e 0a 2a 2a 20 46 6f 72 20 65 72 72 6f  (0)..** For erro
7700: 72 73 2c 20 69 74 20 63 61 6e 20 62 65 20 73 6f  rs, it can be so
7710: 6d 65 20 6f 74 68 65 72 20 76 61 6c 75 65 2e 20  me other value. 
7720: 20 49 66 20 50 31 21 3d 30 20 74 68 65 6e 20 50   If P1!=0 then P
7730: 32 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  2 will determine
7740: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
7750: 6f 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ot to rollback t
7760: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
7770: 61 63 74 69 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20  action.  Do not 
7780: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 50  rollback.** if P
7790: 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44 6f 20 74  2==OE_Fail. Do t
77a0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 50  he rollback if P
77b0: 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20  2==OE_Rollback. 
77c0: 20 49 66 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74   If P2==OE_Abort
77d0: 2c 0a 2a 2a 20 74 68 65 6e 20 62 61 63 6b 20 6f  ,.** then back o
77e0: 75 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  ut all changes t
77f0: 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65  hat have occurre
7800: 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 65 78  d during this ex
7810: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ecution of the.*
7820: 2a 20 56 44 42 45 2c 20 62 75 74 20 64 6f 20 6e  * VDBE, but do n
7830: 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ot rollback the 
7840: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
7850: 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74  .** If P4 is not
7860: 20 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20 69 73   null then it is
7870: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
7880: 65 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  e string..**.** 
7890: 50 35 20 69 73 20 61 20 76 61 6c 75 65 20 62 65  P5 is a value be
78a0: 74 77 65 65 6e 20 30 20 61 6e 64 20 34 2c 20 69  tween 0 and 4, i
78b0: 6e 63 6c 75 73 69 76 65 2c 20 74 68 61 74 20 6d  nclusive, that m
78c0: 6f 64 69 66 69 65 73 20 74 68 65 20 50 34 20 73  odifies the P4 s
78d0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tring..**.**    
78e0: 30 3a 20 20 28 6e 6f 20 63 68 61 6e 67 65 29 0a  0:  (no change).
78f0: 2a 2a 20 20 20 20 31 3a 20 20 4e 4f 54 20 4e 55  **    1:  NOT NU
7900: 4c 4c 20 63 6f 6e 74 72 61 69 6e 74 20 66 61 69  LL contraint fai
7910: 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 32 3a  led: P4.**    2:
7920: 20 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61    UNIQUE constra
7930: 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a  int failed: P4.*
7940: 2a 20 20 20 20 33 3a 20 20 43 48 45 43 4b 20 63  *    3:  CHECK c
7950: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
7960: 3a 20 50 34 0a 2a 2a 20 20 20 20 34 3a 20 20 46  : P4.**    4:  F
7970: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
7980: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34  raint failed: P4
7990: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
79a0: 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20 50 34 20  not zero and P4 
79b0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 65 76  is NULL, then ev
79c0: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
79d0: 68 65 20 22 3a 22 20 69 73 0a 2a 2a 20 6f 6d 69  he ":" is.** omi
79e0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  tted..**.** Ther
79f0: 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  e is an implied 
7a00: 22 48 61 6c 74 20 30 20 30 20 30 22 20 69 6e 73  "Halt 0 0 0" ins
7a10: 74 72 75 63 74 69 6f 6e 20 69 6e 73 65 72 74 65  truction inserte
7a20: 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e  d at the very en
7a30: 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79 20 70 72  d of.** every pr
7a40: 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20 6a 75 6d  ogram.  So a jum
7a50: 70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  p past the last 
7a60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  instruction of t
7a70: 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69 73  he program.** is
7a80: 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78 65   the same as exe
7a90: 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a 2a 2f 0a  cuting Halt..*/.
7aa0: 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a 20 7b 0a  case OP_Halt: {.
7ab0: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
7ac0: 61 6d 65 3b 0a 20 20 69 6e 74 20 70 63 78 3b 0a  ame;.  int pcx;.
7ad0: 0a 20 20 70 63 78 20 3d 20 28 69 6e 74 29 28 70  .  pcx = (int)(p
7ae0: 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 69 66 28  Op - aOp);.  if(
7af0: 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45   pOp->p1==SQLITE
7b00: 5f 4f 4b 20 26 26 20 70 2d 3e 70 46 72 61 6d 65  _OK && p->pFrame
7b10: 20 29 7b 0a 20 20 20 20 2f 2a 20 48 61 6c 74 20   ){.    /* Halt 
7b20: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e  the sub-program.
7b30: 20 52 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20   Return control 
7b40: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 66 72  to the parent fr
7b50: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 46 72 61  ame. */.    pFra
7b60: 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a  me = p->pFrame;.
7b70: 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20      p->pFrame = 
7b80: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
7b90: 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 2d 2d  .    p->nFrame--
7ba0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7bb0: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
7bc0: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
7bd0: 20 70 63 78 20 3d 20 73 71 6c 69 74 65 33 56 64   pcx = sqlite3Vd
7be0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
7bf0: 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  Frame);.    if( 
7c00: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e 6f  pOp->p2==OE_Igno
7c10: 72 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  re ){.      /* I
7c20: 6e 73 74 72 75 63 74 69 6f 6e 20 70 63 78 20 69  nstruction pcx i
7c30: 73 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  s the OP_Program
7c40: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
7c50: 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a 20  e sub-program . 
7c60: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
7c70: 79 20 62 65 69 6e 67 20 68 61 6c 74 65 64 2e 20  y being halted. 
7c80: 49 66 20 74 68 65 20 70 32 20 69 6e 73 74 72 75  If the p2 instru
7c90: 63 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 4f 50  ction of this OP
7ca0: 5f 48 61 6c 74 0a 20 20 20 20 20 20 2a 2a 20 69  _Halt.      ** i
7cb0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 73 65  nstruction is se
7cc0: 74 20 74 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  t to OE_Ignore, 
7cd0: 74 68 65 6e 20 74 68 65 20 73 75 62 2d 70 72 6f  then the sub-pro
7ce0: 67 72 61 6d 20 69 73 20 74 68 72 6f 77 69 6e 67  gram is throwing
7cf0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 49 47 4e  .      ** an IGN
7d00: 4f 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 20 49  ORE exception. I
7d10: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 6d 70  n this case jump
7d20: 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
7d30: 73 70 65 63 69 66 69 65 64 0a 20 20 20 20 20 20  specified.      
7d40: 2a 2a 20 61 73 20 74 68 65 20 70 32 20 6f 66 20  ** as the p2 of 
7d50: 74 68 65 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50  the calling OP_P
7d60: 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20  rogram.  */.    
7d70: 20 20 70 63 78 20 3d 20 70 2d 3e 61 4f 70 5b 70    pcx = p->aOp[p
7d80: 63 78 5d 2e 70 32 2d 31 3b 0a 20 20 20 20 7d 0a  cx].p2-1;.    }.
7d90: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 4f 70      aOp = p->aOp
7da0: 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20 70 2d 3e  ;.    aMem = p->
7db0: 61 4d 65 6d 3b 0a 20 20 20 20 70 4f 70 20 3d 20  aMem;.    pOp = 
7dc0: 26 61 4f 70 5b 70 63 78 5d 3b 0a 20 20 20 20 62  &aOp[pcx];.    b
7dd0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72  reak;.  }.  p->r
7de0: 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70  c = pOp->p1;.  p
7df0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
7e00: 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a 20 20 70  (u8)pOp->p2;.  p
7e10: 2d 3e 70 63 20 3d 20 70 63 78 3b 0a 20 20 61 73  ->pc = pcx;.  as
7e20: 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 3d 34  sert( pOp->p5<=4
7e30: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20   );.  if( p->rc 
7e40: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
7e50: 70 35 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74  p5 ){.      stat
7e60: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
7e70: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
7e80: 20 7b 20 22 4e 4f 54 20 4e 55 4c 4c 22 2c 20 22   { "NOT NULL", "
7e90: 55 4e 49 51 55 45 22 2c 20 22 43 48 45 43 4b 22  UNIQUE", "CHECK"
7ea0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
7ed0: 46 4f 52 45 49 47 4e 20 4b 45 59 22 20 7d 3b 0a  FOREIGN KEY" };.
7ee0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7ef0: 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20  pOp->p5==1 );.  
7f00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
7f10: 70 2d 3e 70 35 3d 3d 32 20 29 3b 0a 20 20 20 20  p->p5==2 );.    
7f20: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d    testcase( pOp-
7f30: 3e 70 35 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  >p5==3 );.      
7f40: 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70  testcase( pOp->p
7f50: 35 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 71  5==4 );.      sq
7f60: 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
7f70: 2c 20 22 25 73 20 63 6f 6e 73 74 72 61 69 6e 74  , "%s constraint
7f80: 20 66 61 69 6c 65 64 22 2c 20 61 7a 54 79 70 65   failed", azType
7f90: 5b 70 4f 70 2d 3e 70 35 2d 31 5d 29 3b 0a 20 20  [pOp->p5-1]);.  
7fa0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e      if( pOp->p4.
7fb0: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  z ){.        p->
7fc0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
7fd0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a  3MPrintf(db, "%z
7fe0: 3a 20 25 73 22 2c 20 70 2d 3e 7a 45 72 72 4d 73  : %s", p->zErrMs
7ff0: 67 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  g, pOp->p4.z);. 
8000: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8010: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8020: 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73 22  dbeError(p, "%s"
8030: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
8040: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
8050: 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20 22 61 62  log(pOp->p1, "ab
8060: 6f 72 74 20 61 74 20 25 64 20 69 6e 20 5b 25 73  ort at %d in [%s
8070: 5d 3a 20 25 73 22 2c 20 70 63 78 2c 20 70 2d 3e  ]: %s", pcx, p->
8080: 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  zSql, p->zErrMsg
8090: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
80a0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
80b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
80c0: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72  SQLITE_BUSY || r
80d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
80e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
80f0: 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
8100: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
8110: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
8120: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
8130: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
8140: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
8150: 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
8160: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20  _CONSTRAINT );. 
8170: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
8180: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d 3e  QLITE_OK || db->
8190: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 20  nDeferredCons>0 
81a0: 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  || db->nDeferred
81b0: 49 6d 6d 43 6f 6e 73 3e 30 20 29 3b 0a 20 20 20  ImmCons>0 );.   
81c0: 20 72 63 20 3d 20 70 2d 3e 72 63 20 3f 20 53 51   rc = p->rc ? SQ
81d0: 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c  LITE_ERROR : SQL
81e0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
81f0: 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
8200: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
8210: 49 6e 74 65 67 65 72 20 50 31 20 50 32 20 2a 20  Integer P1 P2 * 
8220: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
8230: 20 72 5b 50 32 5d 3d 50 31 0a 2a 2a 0a 2a 2a 20   r[P2]=P1.**.** 
8240: 54 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  The 32-bit integ
8250: 65 72 20 76 61 6c 75 65 20 50 31 20 69 73 20 77  er value P1 is w
8260: 72 69 74 74 65 6e 20 69 6e 74 6f 20 72 65 67 69  ritten into regi
8270: 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
8280: 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b 20 20   OP_Integer: {  
8290: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
82a0: 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  /.  pOut = out2P
82b0: 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
82c0: 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
82d0: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65 61   pOp->p1;.  brea
82e0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
82f0: 20 49 6e 74 36 34 20 2a 20 50 32 20 2a 20 50 34   Int64 * P2 * P4
8300: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
8310: 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50  r[P2]=P4.**.** P
8320: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
8330: 6f 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  o a 64-bit integ
8340: 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 72 69  er value..** Wri
8350: 74 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  te that value in
8360: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
8370: 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 36 34  */.case OP_Int64
8380: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
8390: 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20   out2 */.  pOut 
83a0: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
83b0: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73 65  (p, pOp);.  asse
83c0: 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70 49 36 34  rt( pOp->p4.pI64
83d0: 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75  !=0 );.  pOut->u
83e0: 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  .i = *pOp->p4.pI
83f0: 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  64;.  break;.}..
8400: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8410: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
8420: 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  NT./* Opcode: Re
8430: 61 6c 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a  al * P2 * P4 *.*
8440: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
8450: 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  ]=P4.**.** P4 is
8460: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
8470: 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
8480: 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 20  point value..** 
8490: 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65  Write that value
84a0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
84b0: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  2..*/.case OP_Re
84c0: 61 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  al: {           
84d0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 46   /* same as TK_F
84e0: 4c 4f 41 54 2c 20 6f 75 74 32 20 2a 2f 0a 20 20  LOAT, out2 */.  
84f0: 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
8500: 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
8510: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
8520: 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73 73 65 72  EM_Real;.  asser
8530: 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
8540: 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29  (*pOp->p4.pReal)
8550: 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 72 20   );.  pOut->u.r 
8560: 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  = *pOp->p4.pReal
8570: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
8580: 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
8590: 53 74 72 69 6e 67 38 20 2a 20 50 32 20 2a 20 50  String8 * P2 * P
85a0: 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
85b0: 20 72 5b 50 32 5d 3d 27 50 34 27 0a 2a 2a 0a 2a   r[P2]='P4'.**.*
85c0: 2a 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61  * P4 points to a
85d0: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
85e0: 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 54 68  UTF-8 string. Th
85f0: 69 73 20 6f 70 63 6f 64 65 20 69 73 20 74 72 61  is opcode is tra
8600: 6e 73 66 6f 72 6d 65 64 20 0a 2a 2a 20 69 6e 74  nsformed .** int
8610: 6f 20 61 20 53 74 72 69 6e 67 20 6f 70 63 6f 64  o a String opcod
8620: 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 65  e before it is e
8630: 78 65 63 75 74 65 64 20 66 6f 72 20 74 68 65 20  xecuted for the 
8640: 66 69 72 73 74 20 74 69 6d 65 2e 20 20 44 75 72  first time.  Dur
8650: 69 6e 67 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e  ing.** this tran
8660: 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 20  sformation, the 
8670: 6c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  length of string
8680: 20 50 34 20 69 73 20 63 6f 6d 70 75 74 65 64 20   P4 is computed 
8690: 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 61 73  and stored.** as
86a0: 20 74 68 65 20 50 31 20 70 61 72 61 6d 65 74 65   the P1 paramete
86b0: 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74  r..*/.case OP_St
86c0: 72 69 6e 67 38 3a 20 7b 20 20 20 20 20 20 20 20  ring8: {        
86d0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53   /* same as TK_S
86e0: 54 52 49 4e 47 2c 20 6f 75 74 32 20 2a 2f 0a 20  TRING, out2 */. 
86f0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
8700: 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20  .z!=0 );.  pOut 
8710: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
8720: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 70 2d  (p, pOp);.  pOp-
8730: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 74 72  >opcode = OP_Str
8740: 69 6e 67 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d  ing;.  pOp->p1 =
8750: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8760: 28 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 0a 23 69  (pOp->p4.z);..#i
8770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8780: 54 5f 55 54 46 31 36 0a 20 20 69 66 28 20 65 6e  T_UTF16.  if( en
8790: 63 6f 64 69 6e 67 21 3d 53 51 4c 49 54 45 5f 55  coding!=SQLITE_U
87a0: 54 46 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  TF8 ){.    rc = 
87b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
87c0: 74 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e  tStr(pOut, pOp->
87d0: 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  p4.z, -1, SQLITE
87e0: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
87f0: 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65 72  ATIC);.    asser
8800: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
8810: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 54   || rc==SQLITE_T
8820: 4f 4f 42 49 47 20 29 3b 0a 20 20 20 20 69 66 28  OOBIG );.    if(
8830: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
8840: 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
8850: 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f  oding(pOut, enco
8860: 64 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  ding) ) goto no_
8870: 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  mem;.    assert(
8880: 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e   pOut->szMalloc>
8890: 30 20 26 26 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c  0 && pOut->zMall
88a0: 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29 3b 0a 20  oc==pOut->z );. 
88b0: 20 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d     assert( VdbeM
88c0: 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29 3d  emDynamic(pOut)=
88d0: 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  =0 );.    pOut->
88e0: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
88f0: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d    pOut->flags |=
8900: 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20 20   MEM_Static;.   
8910: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
8920: 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  ==P4_DYNAMIC ){.
8930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8940: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 70 34 2e  ree(db, pOp->p4.
8950: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  z);.    }.    pO
8960: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
8970: 59 4e 41 4d 49 43 3b 0a 20 20 20 20 70 4f 70 2d  YNAMIC;.    pOp-
8980: 3e 70 34 2e 7a 20 3d 20 70 4f 75 74 2d 3e 7a 3b  >p4.z = pOut->z;
8990: 0a 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70  .    pOp->p1 = p
89a0: 4f 75 74 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 74 65  Out->n;.  }.  te
89b0: 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
89c0: 54 45 5f 54 4f 4f 42 49 47 20 29 3b 0a 23 65 6e  TE_TOOBIG );.#en
89d0: 64 69 66 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  dif.  if( pOp->p
89e0: 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  1>db->aLimit[SQL
89f0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
8a00: 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ] ){.    goto to
8a10: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 61 73 73  o_big;.  }.  ass
8a20: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
8a30: 4f 4b 20 29 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20  OK );.  /* Fall 
8a40: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
8a50: 65 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74 72  ext case, OP_Str
8a60: 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f  ing */.}.  ./* O
8a70: 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50 31  pcode: String P1
8a80: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
8a90: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
8aa0: 27 50 34 27 20 28 6c 65 6e 3d 50 31 29 0a 2a 2a  'P4' (len=P1).**
8ab0: 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 76  .** The string v
8ac0: 61 6c 75 65 20 50 34 20 6f 66 20 6c 65 6e 67 74  alue P4 of lengt
8ad0: 68 20 50 31 20 28 62 79 74 65 73 29 20 69 73 20  h P1 (bytes) is 
8ae0: 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
8af0: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P2..**.** If 
8b00: 50 33 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 61  P3 is not zero a
8b10: 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nd the content o
8b20: 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  f register P3 is
8b30: 20 65 71 75 61 6c 20 74 6f 20 50 35 2c 20 74 68   equal to P5, th
8b40: 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 74 79  en.** the dataty
8b50: 70 65 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  pe of the regist
8b60: 65 72 20 50 32 20 69 73 20 63 6f 6e 76 65 72 74  er P2 is convert
8b70: 65 64 20 74 6f 20 42 4c 4f 42 2e 20 20 54 68 65  ed to BLOB.  The
8b80: 20 63 6f 6e 74 65 6e 74 20 69 73 0a 2a 2a 20 74   content is.** t
8b90: 68 65 20 73 61 6d 65 20 73 65 71 75 65 6e 63 65  he same sequence
8ba0: 20 6f 66 20 62 79 74 65 73 2c 20 69 74 20 69 73   of bytes, it is
8bb0: 20 6d 65 72 65 6c 79 20 69 6e 74 65 72 70 72 65   merely interpre
8bc0: 74 65 64 20 61 73 20 61 20 42 4c 4f 42 20 69 6e  ted as a BLOB in
8bd0: 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61 20 73 74  stead.** of a st
8be0: 72 69 6e 67 2c 20 61 73 20 69 66 20 69 74 20 68  ring, as if it h
8bf0: 61 64 20 62 65 65 6e 20 43 41 53 54 2e 20 20 49  ad been CAST.  I
8c00: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
8c10: 2a 0a 2a 2a 20 69 66 28 20 50 33 21 3d 30 20 61  *.** if( P3!=0 a
8c20: 6e 64 20 72 65 67 5b 50 33 5d 3d 3d 50 35 20 29  nd reg[P3]==P5 )
8c30: 20 72 65 67 5b 50 32 5d 20 3a 3d 20 43 41 53 54   reg[P2] := CAST
8c40: 28 72 65 67 5b 50 32 5d 20 61 73 20 42 4c 4f 42  (reg[P2] as BLOB
8c50: 29 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72  ).*/.case OP_Str
8c60: 69 6e 67 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ing: {          
8c70: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73  /* out2 */.  ass
8c80: 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  ert( pOp->p4.z!=
8c90: 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75  0 );.  pOut = ou
8ca0: 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
8cb0: 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  pOp);.  pOut->fl
8cc0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
8cd0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72  M_Static|MEM_Ter
8ce0: 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 70  m;.  pOut->z = p
8cf0: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 70 4f 75 74  Op->p4.z;.  pOut
8d00: 2d 3e 6e 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  ->n = pOp->p1;. 
8d10: 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63   pOut->enc = enc
8d20: 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f  oding;.  UPDATE_
8d30: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
8d40: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
8d50: 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d  TE_LIKE_DOESNT_M
8d60: 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 69 66 28  ATCH_BLOBS.  if(
8d70: 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20 20   pOp->p3>0 ){.  
8d80: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
8d90: 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
8da0: 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
8db0: 20 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b     pIn3 = &aMem[
8dc0: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 61 73  pOp->p3];.    as
8dd0: 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67  sert( pIn3->flag
8de0: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
8df0: 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 69     if( pIn3->u.i
8e00: 3d 3d 70 4f 70 2d 3e 70 35 20 29 20 70 4f 75 74  ==pOp->p5 ) pOut
8e10: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
8e20: 6f 62 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  ob|MEM_Static|ME
8e30: 4d 5f 54 65 72 6d 3b 0a 20 20 7d 0a 23 65 6e 64  M_Term;.  }.#end
8e40: 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  if.  break;.}../
8e50: 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 20 50  * Opcode: Null P
8e60: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
8e70: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 2e 2e 50  ynopsis: r[P2..P
8e80: 33 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 57 72  3]=NULL.**.** Wr
8e90: 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20  ite a NULL into 
8ea0: 72 65 67 69 73 74 65 72 73 20 50 32 2e 20 20 49  registers P2.  I
8eb0: 66 20 50 33 20 67 72 65 61 74 65 72 20 74 68 61  f P3 greater tha
8ec0: 6e 20 50 32 2c 20 74 68 65 6e 20 61 6c 73 6f 20  n P2, then also 
8ed0: 77 72 69 74 65 0a 2a 2a 20 4e 55 4c 4c 20 69 6e  write.** NULL in
8ee0: 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 20 61  to register P3 a
8ef0: 6e 64 20 65 76 65 72 79 20 72 65 67 69 73 74 65  nd every registe
8f00: 72 20 69 6e 20 62 65 74 77 65 65 6e 20 50 32 20  r in between P2 
8f10: 61 6e 64 20 50 33 2e 20 20 49 66 20 50 33 0a 2a  and P3.  If P3.*
8f20: 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 50  * is less than P
8f30: 32 20 28 74 79 70 69 63 61 6c 6c 79 20 50 33 20  2 (typically P3 
8f40: 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 20 6f 6e  is zero) then on
8f50: 6c 79 20 72 65 67 69 73 74 65 72 20 50 32 20 69  ly register P2 i
8f60: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 4e 55 4c 4c  s.** set to NULL
8f70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
8f80: 31 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a  1 value is non-z
8f90: 65 72 6f 2c 20 74 68 65 6e 20 61 6c 73 6f 20 73  ero, then also s
8fa0: 65 74 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  et the MEM_Clear
8fb0: 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74 0a  ed flag so that.
8fc0: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 77  ** NULL values w
8fd0: 69 6c 6c 20 6e 6f 74 20 63 6f 6d 70 61 72 65 20  ill not compare 
8fe0: 65 71 75 61 6c 20 65 76 65 6e 20 69 66 20 53 51  equal even if SQ
8ff0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73  LITE_NULLEQ is s
9000: 65 74 20 6f 6e 0a 2a 2a 20 4f 50 5f 4e 65 20 6f  et on.** OP_Ne o
9010: 72 20 4f 50 5f 45 71 2e 0a 2a 2f 0a 63 61 73 65  r OP_Eq..*/.case
9020: 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20 20   OP_Null: {     
9030: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
9040: 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 75 31  .  int cnt;.  u1
9050: 36 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20 20 70 4f  6 nullFlag;.  pO
9060: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
9070: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 63  ase(p, pOp);.  c
9080: 6e 74 20 3d 20 70 4f 70 2d 3e 70 33 2d 70 4f 70  nt = pOp->p3-pOp
9090: 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
90a0: 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p3<=(p->nMe
90b0: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
90c0: 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  ) );.  pOut->fla
90d0: 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 20 3d 20  gs = nullFlag = 
90e0: 70 4f 70 2d 3e 70 31 20 3f 20 28 4d 45 4d 5f 4e  pOp->p1 ? (MEM_N
90f0: 75 6c 6c 7c 4d 45 4d 5f 43 6c 65 61 72 65 64 29  ull|MEM_Cleared)
9100: 20 3a 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 70   : MEM_Null;.  p
9110: 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 77 68  Out->n = 0;.  wh
9120: 69 6c 65 28 20 63 6e 74 3e 30 20 29 7b 0a 20 20  ile( cnt>0 ){.  
9130: 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20 6d 65    pOut++;.    me
9140: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
9150: 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , pOut);.    sql
9160: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
9170: 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 70 4f  ll(pOut);.    pO
9180: 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e 75 6c 6c  ut->flags = null
9190: 46 6c 61 67 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  Flag;.    pOut->
91a0: 6e 20 3d 20 30 3b 0a 20 20 20 20 63 6e 74 2d 2d  n = 0;.    cnt--
91b0: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
91c0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 66  ../* Opcode: Sof
91d0: 74 4e 75 6c 6c 20 50 31 20 2a 20 2a 20 2a 20 2a  tNull P1 * * * *
91e0: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
91f0: 50 31 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 53  P1]=NULL.**.** S
9200: 65 74 20 72 65 67 69 73 74 65 72 20 50 31 20 74  et register P1 t
9210: 6f 20 68 61 76 65 20 74 68 65 20 76 61 6c 75 65  o have the value
9220: 20 4e 55 4c 4c 20 61 73 20 73 65 65 6e 20 62 79   NULL as seen by
9230: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
9240: 72 64 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  rd.** instructio
9250: 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 66 72  n, but do not fr
9260: 65 65 20 61 6e 79 20 73 74 72 69 6e 67 20 6f 72  ee any string or
9270: 20 62 6c 6f 62 20 6d 65 6d 6f 72 79 20 61 73 73   blob memory ass
9280: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
9290: 74 68 65 20 72 65 67 69 73 74 65 72 2c 20 73 6f  the register, so
92a0: 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61 6c   that if the val
92b0: 75 65 20 77 61 73 20 61 20 73 74 72 69 6e 67 20  ue was a string 
92c0: 6f 72 20 62 6c 6f 62 20 74 68 61 74 20 77 61 73  or blob that was
92d0: 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 63  .** previously c
92e0: 6f 70 69 65 64 20 75 73 69 6e 67 20 4f 50 5f 53  opied using OP_S
92f0: 43 6f 70 79 2c 20 74 68 65 20 63 6f 70 69 65 73  Copy, the copies
9300: 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
9310: 6f 20 62 65 20 76 61 6c 69 64 2e 0a 2a 2f 0a 63  o be valid..*/.c
9320: 61 73 65 20 4f 50 5f 53 6f 66 74 4e 75 6c 6c 3a  ase OP_SoftNull:
9330: 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
9340: 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p1>0 && pOp->p
9350: 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  1<=(p->nMem+1 - 
9360: 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
9370: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
9380: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 2d 3e  p->p1];.  pOut->
9390: 66 6c 61 67 73 20 3d 20 28 70 4f 75 74 2d 3e 66  flags = (pOut->f
93a0: 6c 61 67 73 26 7e 28 4d 45 4d 5f 55 6e 64 65 66  lags&~(MEM_Undef
93b0: 69 6e 65 64 7c 4d 45 4d 5f 41 66 66 4d 61 73 6b  ined|MEM_AffMask
93c0: 29 29 7c 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 62  ))|MEM_Null;.  b
93d0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
93e0: 64 65 3a 20 42 6c 6f 62 20 50 31 20 50 32 20 2a  de: Blob P1 P2 *
93f0: 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
9400: 73 3a 20 72 5b 50 32 5d 3d 50 34 20 28 6c 65 6e  s: r[P2]=P4 (len
9410: 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f  =P1).**.** P4 po
9420: 69 6e 74 73 20 74 6f 20 61 20 62 6c 6f 62 20 6f  ints to a blob o
9430: 66 20 64 61 74 61 20 50 31 20 62 79 74 65 73 20  f data P1 bytes 
9440: 6c 6f 6e 67 2e 20 20 53 74 6f 72 65 20 74 68 69  long.  Store thi
9450: 73 0a 2a 2a 20 62 6c 6f 62 20 69 6e 20 72 65 67  s.** blob in reg
9460: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
9470: 65 20 4f 50 5f 42 6c 6f 62 3a 20 7b 20 20 20 20  e OP_Blob: {    
9480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
9490: 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ut2 */.  assert(
94a0: 20 70 4f 70 2d 3e 70 31 20 3c 3d 20 53 51 4c 49   pOp->p1 <= SQLI
94b0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b  TE_MAX_LENGTH );
94c0: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
94d0: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
94e0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
94f0: 65 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 70  emSetStr(pOut, p
9500: 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70 2d 3e 70  Op->p4.z, pOp->p
9510: 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 75 74  1, 0, 0);.  pOut
9520: 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
9530: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
9540: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
9550: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
9560: 63 6f 64 65 3a 20 56 61 72 69 61 62 6c 65 20 50  code: Variable P
9570: 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53  1 P2 * P4 *.** S
9580: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 70  ynopsis: r[P2]=p
9590: 61 72 61 6d 65 74 65 72 28 50 31 2c 50 34 29 0a  arameter(P1,P4).
95a0: 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 74  **.** Transfer t
95b0: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75  he values of bou
95c0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 50 31 20  nd parameter P1 
95d0: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
95e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
95f0: 72 61 6d 65 74 65 72 20 69 73 20 6e 61 6d 65 64  rameter is named
9600: 2c 20 74 68 65 6e 20 69 74 73 20 6e 61 6d 65 20  , then its name 
9610: 61 70 70 65 61 72 73 20 69 6e 20 50 34 2e 0a 2a  appears in P4..*
9620: 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 69  * The P4 value i
9630: 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  s used by sqlite
9640: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
9650: 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63 61 73 65  _name()..*/.case
9660: 20 4f 50 5f 56 61 72 69 61 62 6c 65 3a 20 7b 20   OP_Variable: { 
9670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
9680: 74 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56 61  t2 */.  Mem *pVa
9690: 72 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  r;       /* Valu
96a0: 65 20 62 65 69 6e 67 20 74 72 61 6e 73 66 65 72  e being transfer
96b0: 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  red */..  assert
96c0: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70  ( pOp->p1>0 && p
96d0: 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 56 61 72 20  Op->p1<=p->nVar 
96e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
96f0: 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20 70 4f 70  ->p4.z==0 || pOp
9700: 2d 3e 70 34 2e 7a 3d 3d 73 71 6c 69 74 65 33 56  ->p4.z==sqlite3V
9710: 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 2d  ListNumToName(p-
9720: 3e 70 56 4c 69 73 74 2c 70 4f 70 2d 3e 70 31 29  >pVList,pOp->p1)
9730: 20 29 3b 0a 20 20 70 56 61 72 20 3d 20 26 70 2d   );.  pVar = &p-
9740: 3e 61 56 61 72 5b 70 4f 70 2d 3e 70 31 20 2d 20  >aVar[pOp->p1 - 
9750: 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  1];.  if( sqlite
9760: 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
9770: 56 61 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Var) ){.    goto
9780: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
9790: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
97a0: 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ->p2];.  sqlite3
97b0: 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
97c0: 70 79 28 70 4f 75 74 2c 20 70 56 61 72 2c 20 4d  py(pOut, pVar, M
97d0: 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 55 50  EM_Static);.  UP
97e0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
97f0: 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
9800: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
9810: 4d 6f 76 65 20 50 31 20 50 32 20 50 33 20 2a 20  Move P1 P2 P3 * 
9820: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
9830: 5b 50 32 40 50 33 5d 3d 72 5b 50 31 40 50 33 5d  [P2@P3]=r[P1@P3]
9840: 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  .**.** Move the 
9850: 50 33 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  P3 values in reg
9860: 69 73 74 65 72 20 50 31 2e 2e 50 31 2b 50 33 2d  ister P1..P1+P3-
9870: 31 20 6f 76 65 72 20 69 6e 74 6f 0a 2a 2a 20 72  1 over into.** r
9880: 65 67 69 73 74 65 72 73 20 50 32 2e 2e 50 32 2b  egisters P2..P2+
9890: 50 33 2d 31 2e 20 20 52 65 67 69 73 74 65 72 73  P3-1.  Registers
98a0: 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61 72 65   P1..P1+P3-1 are
98b0: 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67  .** left holding
98c0: 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 20   a NULL.  It is 
98d0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 72 65 67  an error for reg
98e0: 69 73 74 65 72 20 72 61 6e 67 65 73 0a 2a 2a 20  ister ranges.** 
98f0: 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61 6e 64 20  P1..P1+P3-1 and 
9900: 50 32 2e 2e 50 32 2b 50 33 2d 31 20 74 6f 20 6f  P2..P2+P3-1 to o
9910: 76 65 72 6c 61 70 2e 20 20 49 74 20 69 73 20 61  verlap.  It is a
9920: 6e 20 65 72 72 6f 72 0a 2a 2a 20 66 6f 72 20 50  n error.** for P
9930: 33 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  3 to be less tha
9940: 6e 20 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  n 1..*/.case OP_
9950: 4d 6f 76 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b  Move: {.  int n;
9960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9970: 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
9980: 73 20 6c 65 66 74 20 74 6f 20 63 6f 70 79 20 2a  s left to copy *
9990: 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20  /.  int p1;     
99a0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
99b0: 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20 2a 2f   to copy from */
99c0: 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20  .  int p2;      
99d0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
99e0: 74 6f 20 63 6f 70 79 20 74 6f 20 2a 2f 0a 0a 20  to copy to */.. 
99f0: 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20   n = pOp->p3;.  
9a00: 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = pOp->p1;.  
9a10: 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  p2 = pOp->p2;.  
9a20: 61 73 73 65 72 74 28 20 6e 3e 30 20 26 26 20 70  assert( n>0 && p
9a30: 31 3e 30 20 26 26 20 70 32 3e 30 20 29 3b 0a 20  1>0 && p2>0 );. 
9a40: 20 61 73 73 65 72 74 28 20 70 31 2b 6e 3c 3d 70   assert( p1+n<=p
9a50: 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31 20 29 3b  2 || p2+n<=p1 );
9a60: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
9a70: 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26  [p1];.  pOut = &
9a80: 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 64 6f 7b 0a  aMem[p2];.  do{.
9a90: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 74      assert( pOut
9aa0: 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d  <=&aMem[(p->nMem
9ab0: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
9ac0: 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
9ad0: 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b 28 70 2d   pIn1<=&aMem[(p-
9ae0: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
9af0: 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61 73  rsor)] );.    as
9b00: 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
9b10: 28 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 6d 65  (pIn1) );.    me
9b20: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
9b30: 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , pOut);.    sql
9b40: 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28  ite3VdbeMemMove(
9b50: 70 4f 75 74 2c 20 70 49 6e 31 29 3b 0a 23 69 66  pOut, pIn1);.#if
9b60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9b70: 0a 20 20 20 20 69 66 28 20 70 4f 75 74 2d 3e 70  .    if( pOut->p
9b80: 53 63 6f 70 79 46 72 6f 6d 3e 3d 26 61 4d 65 6d  ScopyFrom>=&aMem
9b90: 5b 70 31 5d 20 26 26 20 70 4f 75 74 2d 3e 70 53  [p1] && pOut->pS
9ba0: 63 6f 70 79 46 72 6f 6d 3c 70 4f 75 74 20 29 7b  copyFrom<pOut ){
9bb0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 53 63  .      pOut->pSc
9bc0: 6f 70 79 46 72 6f 6d 20 2b 3d 20 70 4f 70 2d 3e  opyFrom += pOp->
9bd0: 70 32 20 2d 20 70 31 3b 0a 20 20 20 20 7d 0a 23  p2 - p1;.    }.#
9be0: 65 6e 64 69 66 0a 20 20 20 20 44 65 65 70 68 65  endif.    Deephe
9bf0: 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a  meralize(pOut);.
9c00: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
9c10: 43 45 28 70 32 2b 2b 2c 20 70 4f 75 74 29 3b 0a  CE(p2++, pOut);.
9c20: 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 20 20      pIn1++;.    
9c30: 70 4f 75 74 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  pOut++;.  }while
9c40: 28 20 2d 2d 6e 20 29 3b 0a 20 20 62 72 65 61 6b  ( --n );.  break
9c50: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
9c60: 43 6f 70 79 20 50 31 20 50 32 20 50 33 20 2a 20  Copy P1 P2 P3 * 
9c70: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
9c80: 5b 50 32 40 50 33 2b 31 5d 3d 72 5b 50 31 40 50  [P2@P3+1]=r[P1@P
9c90: 33 2b 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20  3+1].**.** Make 
9ca0: 61 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74  a copy of regist
9cb0: 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 20 69 6e  ers P1..P1+P3 in
9cc0: 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 32 2e  to registers P2.
9cd0: 2e 50 32 2b 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68  .P2+P3..**.** Th
9ce0: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d  is instruction m
9cf0: 61 6b 65 73 20 61 20 64 65 65 70 20 63 6f 70 79  akes a deep copy
9d00: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20 20   of the value.  
9d10: 41 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 69  A duplicate.** i
9d20: 73 20 6d 61 64 65 20 6f 66 20 61 6e 79 20 73 74  s made of any st
9d30: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 63 6f 6e  ring or blob con
9d40: 73 74 61 6e 74 2e 20 20 53 65 65 20 61 6c 73 6f  stant.  See also
9d50: 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 63 61   OP_SCopy..*/.ca
9d60: 73 65 20 4f 50 5f 43 6f 70 79 3a 20 7b 0a 20 20  se OP_Copy: {.  
9d70: 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f  int n;..  n = pO
9d80: 70 2d 3e 70 33 3b 0a 20 20 70 49 6e 31 20 3d 20  p->p3;.  pIn1 = 
9d90: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
9da0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
9db0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72  Op->p2];.  asser
9dc0: 74 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b  t( pOut!=pIn1 );
9dd0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
9de0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
9df0: 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75  mShallowCopy(pOu
9e00: 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68  t, pIn1, MEM_Eph
9e10: 65 6d 29 3b 0a 20 20 20 20 44 65 65 70 68 65 6d  em);.    Deephem
9e20: 65 72 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 23  eralize(pOut);.#
9e30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9e40: 55 47 0a 20 20 20 20 70 4f 75 74 2d 3e 70 53 63  UG.    pOut->pSc
9e50: 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e  opyFrom = 0;.#en
9e60: 64 69 66 0a 20 20 20 20 52 45 47 49 53 54 45 52  dif.    REGISTER
9e70: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 70  _TRACE(pOp->p2+p
9e80: 4f 70 2d 3e 70 33 2d 6e 2c 20 70 4f 75 74 29 3b  Op->p3-n, pOut);
9e90: 0a 20 20 20 20 69 66 28 20 28 6e 2d 2d 29 3d 3d  .    if( (n--)==
9ea0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
9eb0: 4f 75 74 2b 2b 3b 0a 20 20 20 20 70 49 6e 31 2b  Out++;.    pIn1+
9ec0: 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  +;.  }.  break;.
9ed0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 43  }../* Opcode: SC
9ee0: 6f 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  opy P1 P2 * * *.
9ef0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
9f00: 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 4d  2]=r[P1].**.** M
9f10: 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  ake a shallow co
9f20: 70 79 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  py of register P
9f30: 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  1 into register 
9f40: 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
9f50: 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73  nstruction makes
9f60: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
9f70: 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20 20 49  of the value.  I
9f80: 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
9f90: 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c  s a string or bl
9fa0: 6f 62 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 70  ob, then the cop
9fb0: 79 20 69 73 20 6f 6e 6c 79 20 61 20 70 6f 69 6e  y is only a poin
9fc0: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6f 72  ter to the.** or
9fd0: 69 67 69 6e 61 6c 20 61 6e 64 20 68 65 6e 63 65  iginal and hence
9fe0: 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   if the original
9ff0: 20 63 68 61 6e 67 65 73 20 73 6f 20 77 69 6c 6c   changes so will
a000: 20 74 68 65 20 63 6f 70 79 2e 0a 2a 2a 20 57 6f   the copy..** Wo
a010: 72 73 65 2c 20 69 66 20 74 68 65 20 6f 72 69 67  rse, if the orig
a020: 69 6e 61 6c 20 69 73 20 64 65 61 6c 6c 6f 63 61  inal is dealloca
a030: 74 65 64 2c 20 74 68 65 20 63 6f 70 79 20 62 65  ted, the copy be
a040: 63 6f 6d 65 73 20 69 6e 76 61 6c 69 64 2e 0a 2a  comes invalid..*
a050: 2a 20 54 68 75 73 20 74 68 65 20 70 72 6f 67 72  * Thus the progr
a060: 61 6d 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  am must guarante
a070: 65 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  e that the origi
a080: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 68 61  nal will not cha
a090: 6e 67 65 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  nge.** during th
a0a0: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68  e lifetime of th
a0b0: 65 20 63 6f 70 79 2e 20 20 55 73 65 20 4f 50 5f  e copy.  Use OP_
a0c0: 43 6f 70 79 20 74 6f 20 6d 61 6b 65 20 61 20 63  Copy to make a c
a0d0: 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f 70 79 2e  omplete.** copy.
a0e0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 43 6f 70  .*/.case OP_SCop
a0f0: 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  y: {            
a100: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e  /* out2 */.  pIn
a110: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
a120: 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  1];.  pOut = &aM
a130: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  em[pOp->p2];.  a
a140: 73 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49 6e  ssert( pOut!=pIn
a150: 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  1 );.  sqlite3Vd
a160: 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
a170: 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d  (pOut, pIn1, MEM
a180: 5f 45 70 68 65 6d 29 3b 0a 23 69 66 64 65 66 20  _Ephem);.#ifdef 
a190: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
a1a0: 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46  f( pOut->pScopyF
a1b0: 72 6f 6d 3d 3d 30 20 29 20 70 4f 75 74 2d 3e 70  rom==0 ) pOut->p
a1c0: 53 63 6f 70 79 46 72 6f 6d 20 3d 20 70 49 6e 31  ScopyFrom = pIn1
a1d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72 65 61 6b  ;.#endif.  break
a1e0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
a1f0: 49 6e 74 43 6f 70 79 20 50 31 20 50 32 20 2a 20  IntCopy P1 P2 * 
a200: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
a210: 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a   r[P2]=r[P1].**.
a220: 2a 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  ** Transfer the 
a230: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 68 65  integer value he
a240: 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ld in register P
a250: 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  1 into register 
a260: 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
a270: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
a280: 65 72 73 69 6f 6e 20 6f 66 20 53 43 6f 70 79 20  ersion of SCopy 
a290: 74 68 61 74 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  that works only 
a2a0: 66 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 76  for integer.** v
a2b0: 61 6c 75 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  alues..*/.case O
a2c0: 50 5f 49 6e 74 43 6f 70 79 3a 20 7b 20 20 20 20  P_IntCopy: {    
a2d0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
a2e0: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
a2f0: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
a300: 73 65 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61  sert( (pIn1->fla
a310: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  gs & MEM_Int)!=0
a320: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d   );.  pOut = &aM
a330: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73  em[pOp->p2];.  s
a340: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
a350: 49 6e 74 36 34 28 70 4f 75 74 2c 20 70 49 6e 31  Int64(pOut, pIn1
a360: 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b  ->u.i);.  break;
a370: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
a380: 65 73 75 6c 74 52 6f 77 20 50 31 20 50 32 20 2a  esultRow P1 P2 *
a390: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
a3a0: 3a 20 6f 75 74 70 75 74 3d 72 5b 50 31 40 50 32  : output=r[P1@P2
a3b0: 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69  ].**.** The regi
a3c0: 73 74 65 72 73 20 50 31 20 74 68 72 6f 75 67 68  sters P1 through
a3d0: 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e   P1+P2-1 contain
a3e0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
a3f0: 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69  .** results. Thi
a400: 73 20 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20  s opcode causes 
a410: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  the sqlite3_step
a420: 28 29 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69  () call to termi
a430: 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20  nate.** with an 
a440: 53 51 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72  SQLITE_ROW retur
a450: 6e 20 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65  n code and it se
a460: 74 73 20 75 70 20 74 68 65 20 73 71 6c 69 74 65  ts up the sqlite
a470: 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74  3_stmt.** struct
a480: 75 72 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ure to provide a
a490: 63 63 65 73 73 20 74 6f 20 74 68 65 20 72 28 50  ccess to the r(P
a4a0: 31 29 2e 2e 72 28 50 31 2b 50 32 2d 31 29 20 76  1)..r(P1+P2-1) v
a4b0: 61 6c 75 65 73 20 61 73 0a 2a 2a 20 74 68 65 20  alues as.** the 
a4c0: 72 65 73 75 6c 74 20 72 6f 77 2e 0a 2a 2f 0a 63  result row..*/.c
a4d0: 61 73 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  ase OP_ResultRow
a4e0: 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  : {.  Mem *pMem;
a4f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
a500: 72 74 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  rt( p->nResColum
a510: 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20  n==pOp->p2 );.  
a520: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
a530: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
a540: 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 3c 3d  Op->p1+pOp->p2<=
a550: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
a560: 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 0a 23  nCursor)+1 );..#
a570: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a580: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
a590: 42 41 43 4b 0a 20 20 2f 2a 20 52 75 6e 20 74 68  BACK.  /* Run th
a5a0: 65 20 70 72 6f 67 72 65 73 73 20 63 6f 75 6e 74  e progress count
a5b0: 65 72 20 6a 75 73 74 20 62 65 66 6f 72 65 20 72  er just before r
a5c0: 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20  eturning..  */. 
a5d0: 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65   if( db->xProgre
a5e0: 73 73 21 3d 30 0a 20 20 20 26 26 20 6e 56 6d 53  ss!=0.   && nVmS
a5f0: 74 65 70 3e 3d 6e 50 72 6f 67 72 65 73 73 4c 69  tep>=nProgressLi
a600: 6d 69 74 20 0a 20 20 20 26 26 20 64 62 2d 3e 78  mit .   && db->x
a610: 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70 50 72  Progress(db->pPr
a620: 6f 67 72 65 73 73 41 72 67 29 21 3d 30 0a 20 20  ogressArg)!=0.  
a630: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
a640: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
a650: 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
a660: 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 23  _to_error;.  }.#
a670: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
a680: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
a690: 73 20 76 69 6f 6c 61 74 65 64 20 69 6d 6d 65 64  s violated immed
a6a0: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
a6b0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 64 6f   constraints, do
a6c0: 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 74 75 72 6e  .  ** not return
a6d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
a6e0: 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e 20 41 6e  ows modified. An
a6f0: 64 20 64 6f 20 6e 6f 74 20 52 45 4c 45 41 53 45  d do not RELEASE
a700: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
a710: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e   ** transaction.
a720: 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
a730: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 2a 2f  rolled back.  */
a740: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
a750: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56  !=(rc = sqlite3V
a760: 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
a770: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
a780: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
a790: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20  E_CountRows );. 
a7a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 73     assert( p->us
a7b0: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 3b  esStmtJournal );
a7c0: 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
a7d0: 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
a7e0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  }..  /* If the S
a7f0: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
a800: 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 73  flag is set in s
a810: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 6d 61 73  qlite3.flags mas
a820: 6b 2c 20 74 68 65 6e 20 0a 20 20 2a 2a 20 44 4d  k, then .  ** DM
a830: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76  L statements inv
a840: 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20  oke this opcode 
a850: 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  to return the nu
a860: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20  mber of rows .  
a870: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 74  ** modified to t
a880: 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69 73  he user. This is
a890: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68   the only way th
a8a0: 61 74 20 61 20 56 4d 20 74 68 61 74 0a 20 20 2a  at a VM that.  *
a8b0: 2a 20 6f 70 65 6e 73 20 61 20 73 74 61 74 65 6d  * opens a statem
a8c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
a8d0: 6d 61 79 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  may invoke this 
a8e0: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a  opcode..  **.  *
a8f0: 2a 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 69  * In case this i
a900: 73 20 73 75 63 68 20 61 20 73 74 61 74 65 6d 65  s such a stateme
a910: 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 79 20 73 74  nt, close any st
a920: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
a930: 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 20  ion.  ** opened 
a940: 62 79 20 74 68 69 73 20 56 4d 20 62 65 66 6f 72  by this VM befor
a950: 65 20 72 65 74 75 72 6e 69 6e 67 20 63 6f 6e 74  e returning cont
a960: 72 6f 6c 20 74 6f 20 74 68 65 20 75 73 65 72 2e  rol to the user.
a970: 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a   This is to.  **
a980: 20 65 6e 73 75 72 65 20 74 68 61 74 20 73 74 61   ensure that sta
a990: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
a9a0: 6f 6e 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ons are always n
a9b0: 65 73 74 65 64 2c 20 6e 6f 74 20 6f 76 65 72 6c  ested, not overl
a9c0: 61 70 70 69 6e 67 2e 0a 20 20 2a 2a 20 49 66 20  apping..  ** If 
a9d0: 74 68 65 20 6f 70 65 6e 20 73 74 61 74 65 6d 65  the open stateme
a9e0: 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt-transaction i
a9f0: 73 20 6e 6f 74 20 63 6c 6f 73 65 64 20 68 65 72  s not closed her
aa00: 65 2c 20 74 68 65 6e 20 74 68 65 20 75 73 65 72  e, then the user
aa10: 0a 20 20 2a 2a 20 6d 61 79 20 73 74 65 70 20 61  .  ** may step a
aa20: 6e 6f 74 68 65 72 20 56 4d 20 74 68 61 74 20 6f  nother VM that o
aa30: 70 65 6e 73 20 69 74 73 20 6f 77 6e 20 73 74 61  pens its own sta
aa40: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
aa50: 6f 6e 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61  on. This.  ** ma
aa60: 79 20 6c 65 61 64 20 74 6f 20 6f 76 65 72 6c 61  y lead to overla
aa70: 70 70 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  pping statement 
aa80: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
aa90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74  **.  ** The stat
aaa0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
aab0: 6e 20 69 73 20 6e 65 76 65 72 20 61 20 74 6f 70  n is never a top
aac0: 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69  -level transacti
aad0: 6f 6e 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  on.  Hence.  ** 
aae0: 74 68 65 20 52 45 4c 45 41 53 45 20 63 61 6c 6c  the RELEASE call
aaf0: 20 62 65 6c 6f 77 20 63 61 6e 20 6e 65 76 65 72   below can never
ab00: 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73   fail..  */.  as
ab10: 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
ab20: 65 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 66 6c  ent==0 || db->fl
ab30: 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74  ags&SQLITE_Count
ab40: 52 6f 77 73 20 29 3b 0a 20 20 72 63 20 3d 20 73  Rows );.  rc = s
ab50: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
ab60: 74 61 74 65 6d 65 6e 74 28 70 2c 20 53 41 56 45  tatement(p, SAVE
ab70: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
ab80: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
ab90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a  LITE_OK );..  /*
aba0: 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   Invalidate all 
abb0: 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72  ephemeral cursor
abc0: 20 72 6f 77 20 63 61 63 68 65 73 20 2a 2f 0a 20   row caches */. 
abd0: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 28   p->cacheCtr = (
abe0: 70 2d 3e 63 61 63 68 65 43 74 72 20 2b 20 32 29  p->cacheCtr + 2)
abf0: 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  |1;..  /* Make s
ac00: 75 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ure the results 
ac10: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
ac20: 6f 77 20 61 72 65 20 5c 30 30 30 20 74 65 72 6d  ow are \000 term
ac30: 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61 6e 64 20  inated.  ** and 
ac40: 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64  have an assigned
ac50: 20 74 79 70 65 2e 20 20 54 68 65 20 72 65 73 75   type.  The resu
ac60: 6c 74 73 20 61 72 65 20 64 65 2d 65 70 68 65 6d  lts are de-ephem
ac70: 65 72 61 6c 69 7a 65 64 20 61 73 0a 20 20 2a 2a  eralized as.  **
ac80: 20 61 20 73 69 64 65 20 65 66 66 65 63 74 2e 0a   a side effect..
ac90: 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d 20 70 2d    */.  pMem = p-
aca0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 61  >pResultSet = &a
acb0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
acc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 2d 3e  for(i=0; i<pOp->
acd0: 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  p2; i++){.    as
ace0: 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
acf0: 28 26 70 4d 65 6d 5b 69 5d 29 20 29 3b 0a 20 20  (&pMem[i]) );.  
ad00: 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65    Deephemeralize
ad10: 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20  (&pMem[i]);.    
ad20: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 5b 69 5d  assert( (pMem[i]
ad30: 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 45 70 68  .flags & MEM_Eph
ad40: 65 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  em)==0.         
ad50: 20 20 20 7c 7c 20 28 70 4d 65 6d 5b 69 5d 2e 66     || (pMem[i].f
ad60: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c  lags & (MEM_Str|
ad70: 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29 3b  MEM_Blob))==0 );
ad80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ad90: 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28  MemNulTerminate(
ada0: 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 52  &pMem[i]);.    R
adb0: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
adc0: 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65 6d 5b 69  p->p1+i, &pMem[i
add0: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  ]);.  }.  if( db
ade0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
adf0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20   goto no_mem;.. 
ae00: 20 69 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20   if( db->mTrace 
ae10: 26 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52  & SQLITE_TRACE_R
ae20: 4f 57 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54  OW ){.    db->xT
ae30: 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43  race(SQLITE_TRAC
ae40: 45 5f 52 4f 57 2c 20 64 62 2d 3e 70 54 72 61 63  E_ROW, db->pTrac
ae50: 65 41 72 67 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  eArg, p, 0);.  }
ae60: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 53 51  ..  /* Return SQ
ae70: 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a 20 20  LITE_ROW.  */.  
ae80: 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f  p->pc = (int)(pO
ae90: 70 20 2d 20 61 4f 70 29 20 2b 20 31 3b 0a 20 20  p - aOp) + 1;.  
aea0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
aeb0: 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74  .  goto vdbe_ret
aec0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  urn;.}../* Opcod
aed0: 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50 32 20  e: Concat P1 P2 
aee0: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
aef0: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2b  is: r[P3]=r[P2]+
af00: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 41 64 64 20  r[P1].**.** Add 
af10: 74 68 65 20 74 65 78 74 20 69 6e 20 72 65 67 69  the text in regi
af20: 73 74 65 72 20 50 31 20 6f 6e 74 6f 20 74 68 65  ster P1 onto the
af30: 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 78 74   end of the text
af40: 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72 20   in.** register 
af50: 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  P2 and store the
af60: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
af70: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
af80: 74 68 65 72 20 74 68 65 20 50 31 20 6f 72 20 50  ther the P1 or P
af90: 32 20 74 65 78 74 20 61 72 65 20 4e 55 4c 4c 20  2 text are NULL 
afa0: 74 68 65 6e 20 73 74 6f 72 65 20 4e 55 4c 4c 20  then store NULL 
afb0: 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  in P3..**.**   P
afc0: 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a 2a 2a 0a  3 = P2 || P1.**.
afd0: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
afe0: 20 66 6f 72 20 50 31 20 61 6e 64 20 50 33 20 74   for P1 and P3 t
aff0: 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 72 65  o be the same re
b000: 67 69 73 74 65 72 2e 20 53 6f 6d 65 74 69 6d 65  gister. Sometime
b010: 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69 73 20 74  s,.** if P3 is t
b020: 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72  he same register
b030: 20 61 73 20 50 32 2c 20 74 68 65 20 69 6d 70 6c   as P2, the impl
b040: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 62  ementation is ab
b050: 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61  le.** to avoid a
b060: 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f 0a 63 61   memcpy()..*/.ca
b070: 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a 20 7b 20  se OP_Concat: { 
b080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
b090: 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41 54 2c 20  e as TK_CONCAT, 
b0a0: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
b0b0: 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b 0a 0a  /.  i64 nByte;..
b0c0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
b0d0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20  Op->p1];.  pIn2 
b0e0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
b0f0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
b100: 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73  [pOp->p3];.  ass
b110: 65 72 74 28 20 70 49 6e 31 21 3d 70 4f 75 74 20  ert( pIn1!=pOut 
b120: 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
b130: 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c  flags | pIn2->fl
b140: 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  ags) & MEM_Null 
b150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b160: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
b170: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
b180: 20 7d 0a 20 20 69 66 28 20 45 78 70 61 6e 64 42   }.  if( ExpandB
b190: 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20 45 78 70  lob(pIn1) || Exp
b1a0: 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 20 29 20  andBlob(pIn2) ) 
b1b0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 53  goto no_mem;.  S
b1c0: 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c 20 65  tringify(pIn1, e
b1d0: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53 74 72 69  ncoding);.  Stri
b1e0: 6e 67 69 66 79 28 70 49 6e 32 2c 20 65 6e 63 6f  ngify(pIn2, enco
b1f0: 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74 65 20 3d  ding);.  nByte =
b200: 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49 6e 32 2d   pIn1->n + pIn2-
b210: 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  >n;.  if( nByte>
b220: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
b230: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
b240: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
b250: 62 69 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  big;.  }.  if( s
b260: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
b270: 77 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79  w(pOut, (int)nBy
b280: 74 65 2b 32 2c 20 70 4f 75 74 3d 3d 70 49 6e 32  te+2, pOut==pIn2
b290: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  ) ){.    goto no
b2a0: 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 4d 65 6d 53  _mem;.  }.  MemS
b2b0: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
b2c0: 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69 66 28   MEM_Str);.  if(
b2d0: 20 70 4f 75 74 21 3d 70 49 6e 32 20 29 7b 0a 20   pOut!=pIn2 ){. 
b2e0: 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e     memcpy(pOut->
b2f0: 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70 49 6e 32  z, pIn2->z, pIn2
b300: 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  ->n);.  }.  memc
b310: 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70 49 6e 32  py(&pOut->z[pIn2
b320: 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a 2c 20 70  ->n], pIn1->z, p
b330: 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f 75 74 2d  In1->n);.  pOut-
b340: 3e 7a 5b 6e 42 79 74 65 5d 3d 30 3b 0a 20 20 70  >z[nByte]=0;.  p
b350: 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b 31 5d 20  Out->z[nByte+1] 
b360: 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  = 0;.  pOut->fla
b370: 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a  gs |= MEM_Term;.
b380: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74    pOut->n = (int
b390: 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e  )nByte;.  pOut->
b3a0: 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a  enc = encoding;.
b3b0: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
b3c0: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
b3d0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
b3e0: 64 65 3a 20 41 64 64 20 50 31 20 50 32 20 50 33  de: Add P1 P2 P3
b3f0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
b400: 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2b 72 5b  : r[P3]=r[P1]+r[
b410: 50 32 5d 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 68  P2].**.** Add th
b420: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
b430: 74 65 72 20 50 31 20 74 6f 20 74 68 65 20 76 61  ter P1 to the va
b440: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
b450: 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  P2.** and store 
b460: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
b470: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
b480: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
b490: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
b4a0: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
b4b0: 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74 69 70 6c   Opcode: Multipl
b4c0: 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  y P1 P2 P3 * *.*
b4d0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
b4e0: 5d 3d 72 5b 50 31 5d 2a 72 5b 50 32 5d 0a 2a 2a  ]=r[P1]*r[P2].**
b4f0: 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 69 70 6c 79 20  .**.** Multiply 
b500: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
b510: 69 73 74 65 72 20 50 31 20 62 79 20 74 68 65 20  ister P1 by the 
b520: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
b530: 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  r P2.** and stor
b540: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
b550: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
b560: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
b570: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
b580: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
b590: 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 75 62 74 72  /* Opcode: Subtr
b5a0: 61 63 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  act P1 P2 P3 * *
b5b0: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
b5c0: 50 33 5d 3d 72 5b 50 32 5d 2d 72 5b 50 31 5d 0a  P3]=r[P2]-r[P1].
b5d0: 2a 2a 0a 2a 2a 20 53 75 62 74 72 61 63 74 20 74  **.** Subtract t
b5e0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
b5f0: 73 74 65 72 20 50 31 20 66 72 6f 6d 20 74 68 65  ster P1 from the
b600: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
b610: 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f  er P2.** and sto
b620: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
b630: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
b640: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
b650: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
b660: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
b670: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 69 76 69  ./* Opcode: Divi
b680: 64 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  de P1 P2 P3 * *.
b690: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
b6a0: 33 5d 3d 72 5b 50 32 5d 2f 72 5b 50 31 5d 0a 2a  3]=r[P2]/r[P1].*
b6b0: 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74 68 65 20  *.** Divide the 
b6c0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
b6d0: 72 20 50 31 20 62 79 20 74 68 65 20 76 61 6c 75  r P1 by the valu
b6e0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
b6f0: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
b700: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
b710: 73 74 65 72 20 50 33 20 28 50 33 3d 50 32 2f 50  ster P3 (P3=P2/P
b720: 31 29 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65  1). If the value
b730: 20 69 6e 20 0a 2a 2a 20 72 65 67 69 73 74 65 72   in .** register
b740: 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65   P1 is zero, the
b750: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
b760: 4e 55 4c 4c 2e 20 49 66 20 65 69 74 68 65 72 20  NULL. If either 
b770: 69 6e 70 75 74 20 69 73 20 0a 2a 2a 20 4e 55 4c  input is .** NUL
b780: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
b790: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
b7a0: 6f 64 65 3a 20 52 65 6d 61 69 6e 64 65 72 20 50  ode: Remainder P
b7b0: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
b7c0: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72  ynopsis: r[P3]=r
b7d0: 5b 50 32 5d 25 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  [P2]%r[P1].**.**
b7e0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 6d   Compute the rem
b7f0: 61 69 6e 64 65 72 20 61 66 74 65 72 20 69 6e 74  ainder after int
b800: 65 67 65 72 20 72 65 67 69 73 74 65 72 20 50 32  eger register P2
b810: 20 69 73 20 64 69 76 69 64 65 64 20 62 79 20 0a   is divided by .
b820: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20 61  ** register P1 a
b830: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
b840: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
b850: 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 76  P3. .** If the v
b860: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
b870: 20 50 31 20 69 73 20 7a 65 72 6f 20 74 68 65 20   P1 is zero the 
b880: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b890: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70 65  ** If either ope
b8a0: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74 68  rand is NULL, th
b8b0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b8c0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64  ..*/.case OP_Add
b8d0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
b8e0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
b8f0: 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20 69 6e 32  K_PLUS, in1, in2
b900: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
b910: 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20 20  P_Subtract:     
b920: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
b930: 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c 20 69 6e   as TK_MINUS, in
b940: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
b950: 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  case OP_Multiply
b960: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
b970: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 41  * same as TK_STA
b980: 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  R, in1, in2, out
b990: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 69 76  3 */.case OP_Div
b9a0: 69 64 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ide:            
b9b0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
b9c0: 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c 20 69 6e  K_SLASH, in1, in
b9d0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
b9e0: 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a 20 7b 20  OP_Remainder: { 
b9f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
ba00: 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20 69 6e 31  e as TK_REM, in1
ba10: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
ba20: 20 63 68 61 72 20 62 49 6e 74 69 6e 74 3b 20 20   char bIntint;  
ba30: 20 2f 2a 20 53 74 61 72 74 65 64 20 6f 75 74 20   /* Started out 
ba40: 61 73 20 74 77 6f 20 69 6e 74 65 67 65 72 20 6f  as two integer o
ba50: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 75 31 36  perands */.  u16
ba60: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 2f 2a 20   flags;      /* 
ba70: 43 6f 6d 62 69 6e 65 64 20 4d 45 4d 5f 2a 20 66  Combined MEM_* f
ba80: 6c 61 67 73 20 66 72 6f 6d 20 62 6f 74 68 20 69  lags from both i
ba90: 6e 70 75 74 73 20 2a 2f 0a 20 20 75 31 36 20 74  nputs */.  u16 t
baa0: 79 70 65 31 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ype1;      /* Nu
bab0: 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20 6c 65  meric type of le
bac0: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
bad0: 75 31 36 20 74 79 70 65 32 3b 20 20 20 20 20 20  u16 type2;      
bae0: 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79 70 65 20  /* Numeric type 
baf0: 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  of right operand
bb00: 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 20 20 20   */.  i64 iA;   
bb10: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
bb20: 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f   value of left o
bb30: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36 34 20  perand */.  i64 
bb40: 69 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  iB;         /* I
bb50: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f 66 20  nteger value of 
bb60: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
bb70: 0a 20 20 64 6f 75 62 6c 65 20 72 41 3b 20 20 20  .  double rA;   
bb80: 20 20 20 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65     /* Real value
bb90: 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64   of left operand
bba0: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 42 3b   */.  double rB;
bbb0: 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76 61        /* Real va
bbc0: 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f 70 65  lue of right ope
bbd0: 72 61 6e 64 20 2a 2f 0a 0a 20 20 70 49 6e 31 20  rand */..  pIn1 
bbe0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
bbf0: 3b 0a 20 20 74 79 70 65 31 20 3d 20 6e 75 6d 65  ;.  type1 = nume
bc00: 72 69 63 54 79 70 65 28 70 49 6e 31 29 3b 0a 20  ricType(pIn1);. 
bc10: 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
bc20: 70 2d 3e 70 32 5d 3b 0a 20 20 74 79 70 65 32 20  p->p2];.  type2 
bc30: 3d 20 6e 75 6d 65 72 69 63 54 79 70 65 28 70 49  = numericType(pI
bc40: 6e 32 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  n2);.  pOut = &a
bc50: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
bc60: 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d 3e 66 6c  flags = pIn1->fl
bc70: 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67  ags | pIn2->flag
bc80: 73 3b 0a 20 20 69 66 28 20 28 74 79 70 65 31 20  s;.  if( (type1 
bc90: 26 20 74 79 70 65 32 20 26 20 4d 45 4d 5f 49 6e  & type2 & MEM_In
bca0: 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 41 20  t)!=0 ){.    iA 
bcb0: 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 20  = pIn1->u.i;.   
bcc0: 20 69 42 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b   iB = pIn2->u.i;
bcd0: 0a 20 20 20 20 62 49 6e 74 69 6e 74 20 3d 20 31  .    bIntint = 1
bce0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f  ;.    switch( pO
bcf0: 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  p->opcode ){.   
bd00: 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20     case OP_Add: 
bd10: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
bd20: 33 41 64 64 49 6e 74 36 34 28 26 69 42 2c 69 41  3AddInt64(&iB,iA
bd30: 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68  ) ) goto fp_math
bd40: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
bd50: 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74  case OP_Subtract
bd60: 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 75  :  if( sqlite3Su
bd70: 62 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29  bInt64(&iB,iA) )
bd80: 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20   goto fp_math;  
bd90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bda0: 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20  e OP_Multiply:  
bdb0: 69 66 28 20 73 71 6c 69 74 65 33 4d 75 6c 49 6e  if( sqlite3MulIn
bdc0: 74 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f  t64(&iB,iA) ) go
bdd0: 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65  to fp_math;  bre
bde0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
bdf0: 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20  P_Divide: {.    
be00: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
be10: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
be20: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
be30: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
be40: 2d 31 20 26 26 20 69 42 3d 3d 53 4d 41 4c 4c 45  -1 && iB==SMALLE
be50: 53 54 5f 49 4e 54 36 34 20 29 20 67 6f 74 6f 20  ST_INT64 ) goto 
be60: 66 70 5f 6d 61 74 68 3b 0a 20 20 20 20 20 20 20  fp_math;.       
be70: 20 69 42 20 2f 3d 20 69 41 3b 0a 20 20 20 20 20   iB /= iA;.     
be80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
be90: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
bea0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   {.        if( i
beb0: 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  A==0 ) goto arit
bec0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
bed0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  _null;.        i
bee0: 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d  f( iA==-1 ) iA =
bef0: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 42 20 25   1;.        iB %
bf00: 3d 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72  = iA;.        br
bf10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
bf20: 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69   }.    pOut->u.i
bf30: 20 3d 20 69 42 3b 0a 20 20 20 20 4d 65 6d 53 65   = iB;.    MemSe
bf40: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
bf50: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c 73  MEM_Int);.  }els
bf60: 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d  e if( (flags & M
bf70: 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a 20  EM_Null)!=0 ){. 
bf80: 20 20 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74     goto arithmet
bf90: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
bfa0: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
bfb0: 62 49 6e 74 69 6e 74 20 3d 20 30 3b 0a 66 70 5f  bIntint = 0;.fp_
bfc0: 6d 61 74 68 3a 0a 20 20 20 20 72 41 20 3d 20 73  math:.    rA = s
bfd0: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
bfe0: 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 20 20 72  lue(pIn1);.    r
bff0: 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  B = sqlite3VdbeR
c000: 65 61 6c 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  ealValue(pIn2);.
c010: 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d      switch( pOp-
c020: 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  >opcode ){.     
c030: 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20   case OP_Add:   
c040: 20 20 20 20 20 20 72 42 20 2b 3d 20 72 41 3b 20        rB += rA; 
c050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c060: 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72     case OP_Subtr
c070: 61 63 74 3a 20 20 20 20 72 42 20 2d 3d 20 72 41  act:    rB -= rA
c080: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
c090: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c       case OP_Mul
c0a0: 74 69 70 6c 79 3a 20 20 20 20 72 42 20 2a 3d 20  tiply:    rB *= 
c0b0: 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  rA;       break;
c0c0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44  .      case OP_D
c0d0: 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20  ivide: {.       
c0e0: 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
c0f0: 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
c100: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
c110: 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  INT... */.      
c120: 20 20 69 66 28 20 72 41 3d 3d 28 64 6f 75 62 6c    if( rA==(doubl
c130: 65 29 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68  e)0 ) goto arith
c140: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
c150: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 72 42  null;.        rB
c160: 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20 20 20 20   /= rA;.        
c170: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c180: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
c190: 20 20 20 20 20 20 20 20 69 41 20 3d 20 28 69 36          iA = (i6
c1a0: 34 29 72 41 3b 0a 20 20 20 20 20 20 20 20 69 42  4)rA;.        iB
c1b0: 20 3d 20 28 69 36 34 29 72 42 3b 0a 20 20 20 20   = (i64)rB;.    
c1c0: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
c1d0: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
c1e0: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
c1f0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
c200: 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20  -1 ) iA = 1;.   
c210: 20 20 20 20 20 72 42 20 3d 20 28 64 6f 75 62 6c       rB = (doubl
c220: 65 29 28 69 42 20 25 20 69 41 29 3b 0a 20 20 20  e)(iB % iA);.   
c230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c240: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
c250: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
c260: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
c270: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a  pOut->u.i = rB;.
c280: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
c290: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
c2a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
c2b0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 72 42   sqlite3IsNaN(rB
c2c0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
c2d0: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
c2e0: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d  t_is_null;.    }
c2f0: 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 72 20 3d  .    pOut->u.r =
c300: 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54   rB;.    MemSetT
c310: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
c320: 4d 5f 52 65 61 6c 29 3b 0a 20 20 20 20 69 66 28  M_Real);.    if(
c330: 20 28 28 74 79 70 65 31 7c 74 79 70 65 32 29 26   ((type1|type2)&
c340: 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 26 26 20  MEM_Real)==0 && 
c350: 21 62 49 6e 74 69 6e 74 20 29 7b 0a 20 20 20 20  !bIntint ){.    
c360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74    sqlite3VdbeInt
c370: 65 67 65 72 41 66 66 69 6e 69 74 79 28 70 4f 75  egerAffinity(pOu
c380: 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  t);.    }.#endif
c390: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 61  .  }.  break;..a
c3a0: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
c3b0: 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69  _is_null:.  sqli
c3c0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
c3d0: 6c 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  l(pOut);.  break
c3e0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
c3f0: 43 6f 6c 6c 53 65 71 20 50 31 20 2a 20 2a 20 50  CollSeq P1 * * P
c400: 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  4.**.** P4 is a 
c410: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 43 6f 6c  pointer to a Col
c420: 6c 53 65 71 20 6f 62 6a 65 63 74 2e 20 49 66 20  lSeq object. If 
c430: 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
c440: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
c450: 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67 61 74 65  .** or aggregate
c460: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 47 65   calls sqlite3Ge
c470: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 29 2c 20  tFuncCollSeq(), 
c480: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
c490: 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20  equence will.** 
c4a0: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
c4b0: 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  s is used by the
c4c0: 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c   built-in min(),
c4d0: 20 6d 61 78 28 29 20 61 6e 64 20 6e 75 6c 6c 69   max() and nulli
c4e0: 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  f().** functions
c4f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73  ..**.** If P1 is
c500: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
c510: 69 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72  it is a register
c520: 20 74 68 61 74 20 61 20 73 75 62 73 65 71 75 65   that a subseque
c530: 6e 74 20 6d 69 6e 28 29 20 6f 72 0a 2a 2a 20 6d  nt min() or.** m
c540: 61 78 28 29 20 61 67 67 72 65 67 61 74 65 20 77  ax() aggregate w
c550: 69 6c 6c 20 73 65 74 20 74 6f 20 31 20 69 66 20  ill set to 1 if 
c560: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
c570: 69 73 20 6e 6f 74 20 74 68 65 20 6d 69 6e 69 6d  is not the minim
c580: 75 6d 20 6f 72 0a 2a 2a 20 6d 61 78 69 6d 75 6d  um or.** maximum
c590: 2e 20 20 54 68 65 20 50 31 20 72 65 67 69 73 74  .  The P1 regist
c5a0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
c5b0: 64 20 74 6f 20 30 20 62 79 20 74 68 69 73 20 69  d to 0 by this i
c5c0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
c5d0: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
c5e0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
c5f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
c600: 65 20 61 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64  e aforementioned
c610: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f   functions.** to
c620: 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f   retrieve the co
c630: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
c640: 20 73 65 74 20 62 79 20 74 68 69 73 20 6f 70 63   set by this opc
c650: 6f 64 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ode is not avail
c660: 61 62 6c 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79  able.** publicly
c670: 2e 20 20 4f 6e 6c 79 20 62 75 69 6c 74 2d 69 6e  .  Only built-in
c680: 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20   functions have 
c690: 61 63 63 65 73 73 20 74 6f 20 74 68 69 73 20 66  access to this f
c6a0: 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20  eature..*/.case 
c6b0: 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20  OP_CollSeq: {.  
c6c0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
c6d0: 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20  ype==P4_COLLSEQ 
c6e0: 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  );.  if( pOp->p1
c6f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c700: 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26  dbeMemSetInt64(&
c710: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 30  aMem[pOp->p1], 0
c720: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
c730: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
c740: 74 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20  tAnd P1 P2 P3 * 
c750: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
c760: 5b 50 33 5d 3d 72 5b 50 31 5d 26 72 5b 50 32 5d  [P3]=r[P1]&r[P2]
c770: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
c780: 62 69 74 2d 77 69 73 65 20 41 4e 44 20 6f 66 20  bit-wise AND of 
c790: 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65  the values in re
c7a0: 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32  gister P1 and P2
c7b0: 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68   and.** store th
c7c0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
c7d0: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
c7e0: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
c7f0: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
c800: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
c810: 70 63 6f 64 65 3a 20 42 69 74 4f 72 20 50 31 20  pcode: BitOr P1 
c820: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
c830: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
c840: 31 5d 7c 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54  1]|r[P2].**.** T
c850: 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65  ake the bit-wise
c860: 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65   OR of the value
c870: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
c880: 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
c890: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
c8a0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
c8b0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
c8c0: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
c8d0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
c8e0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68  */./* Opcode: Sh
c8f0: 69 66 74 4c 65 66 74 20 50 31 20 50 32 20 50 33  iftLeft P1 P2 P3
c900: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
c910: 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 3c 3c 72  : r[P3]=r[P2]<<r
c920: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74  [P1].**.** Shift
c930: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
c940: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
c950: 32 20 74 6f 20 74 68 65 20 6c 65 66 74 20 62 79  2 to the left by
c960: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
c970: 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64  f bits specified
c980: 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20   by the integer 
c990: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
c9a0: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  ** Store the res
c9b0: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
c9c0: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
c9d0: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
c9e0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
c9f0: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
ca00: 3a 20 53 68 69 66 74 52 69 67 68 74 20 50 31 20  : ShiftRight P1 
ca10: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
ca20: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
ca30: 32 5d 3e 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  2]>>r[P1].**.** 
ca40: 53 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65  Shift the intege
ca50: 72 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  r value in regis
ca60: 74 65 72 20 50 32 20 74 6f 20 74 68 65 20 72 69  ter P2 to the ri
ca70: 67 68 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75  ght by the.** nu
ca80: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65  mber of bits spe
ca90: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e  cified by the in
caa0: 74 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65  teger in registe
cab0: 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74  r P1..** Store t
cac0: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
cad0: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
cae0: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
caf0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
cb00: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73   is NULL..*/.cas
cb10: 65 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20  e OP_BitAnd:    
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb30: 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 41 4e  same as TK_BITAN
cb40: 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  D, in1, in2, out
cb50: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74  3 */.case OP_Bit
cb60: 4f 72 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Or:             
cb70: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
cb80: 54 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20 69  TK_BITOR, in1, i
cb90: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
cba0: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20   OP_ShiftLeft:  
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
cbc0: 61 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49 46 54  ame as TK_LSHIFT
cbd0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
cbe0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66   */.case OP_Shif
cbf0: 74 52 69 67 68 74 3a 20 7b 20 20 20 20 20 20 20  tRight: {       
cc00: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
cc10: 4b 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c 20 69  K_RSHIFT, in1, i
cc20: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36  n2, out3 */.  i6
cc30: 34 20 69 41 3b 0a 20 20 75 36 34 20 75 41 3b 0a  4 iA;.  u64 uA;.
cc40: 20 20 69 36 34 20 69 42 3b 0a 20 20 75 38 20 6f    i64 iB;.  u8 o
cc50: 70 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  p;..  pIn1 = &aM
cc60: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
cc70: 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
cc80: 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26  >p2];.  pOut = &
cc90: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
cca0: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
ccb0: 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29  s | pIn2->flags)
ccc0: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
ccd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
cce0: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
ccf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
cd00: 20 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62   iA = sqlite3Vdb
cd10: 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b  eIntValue(pIn2);
cd20: 0a 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 56  .  iB = sqlite3V
cd30: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
cd40: 29 3b 0a 20 20 6f 70 20 3d 20 70 4f 70 2d 3e 6f  );.  op = pOp->o
cd50: 70 63 6f 64 65 3b 0a 20 20 69 66 28 20 6f 70 3d  pcode;.  if( op=
cd60: 3d 4f 50 5f 42 69 74 41 6e 64 20 29 7b 0a 20 20  =OP_BitAnd ){.  
cd70: 20 20 69 41 20 26 3d 20 69 42 3b 0a 20 20 7d 65    iA &= iB;.  }e
cd80: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42  lse if( op==OP_B
cd90: 69 74 4f 72 20 29 7b 0a 20 20 20 20 69 41 20 7c  itOr ){.    iA |
cda0: 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = iB;.  }else if
cdb0: 28 20 69 42 21 3d 30 20 29 7b 0a 20 20 20 20 61  ( iB!=0 ){.    a
cdc0: 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 53 68  ssert( op==OP_Sh
cdd0: 69 66 74 52 69 67 68 74 20 7c 7c 20 6f 70 3d 3d  iftRight || op==
cde0: 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a  OP_ShiftLeft );.
cdf0: 0a 20 20 20 20 2f 2a 20 49 66 20 73 68 69 66 74  .    /* If shift
ce00: 69 6e 67 20 62 79 20 61 20 6e 65 67 61 74 69 76  ing by a negativ
ce10: 65 20 61 6d 6f 75 6e 74 2c 20 73 68 69 66 74 20  e amount, shift 
ce20: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 69 72  in the other dir
ce30: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  ection */.    if
ce40: 28 20 69 42 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( iB<0 ){.      
ce50: 61 73 73 65 72 74 28 20 4f 50 5f 53 68 69 66 74  assert( OP_Shift
ce60: 52 69 67 68 74 3d 3d 4f 50 5f 53 68 69 66 74 4c  Right==OP_ShiftL
ce70: 65 66 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 6f  eft+1 );.      o
ce80: 70 20 3d 20 32 2a 4f 50 5f 53 68 69 66 74 4c 65  p = 2*OP_ShiftLe
ce90: 66 74 20 2b 20 31 20 2d 20 6f 70 3b 0a 20 20 20  ft + 1 - op;.   
cea0: 20 20 20 69 42 20 3d 20 69 42 3e 28 2d 36 34 29     iB = iB>(-64)
ceb0: 20 3f 20 2d 69 42 20 3a 20 36 34 3b 0a 20 20 20   ? -iB : 64;.   
cec0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 42 3e 3d   }..    if( iB>=
ced0: 36 34 20 29 7b 0a 20 20 20 20 20 20 69 41 20 3d  64 ){.      iA =
cee0: 20 28 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 4f   (iA>=0 || op==O
cef0: 50 5f 53 68 69 66 74 4c 65 66 74 29 20 3f 20 30  P_ShiftLeft) ? 0
cf00: 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   : -1;.    }else
cf10: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
cf20: 75 41 2c 20 26 69 41 2c 20 73 69 7a 65 6f 66 28  uA, &iA, sizeof(
cf30: 75 41 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  uA));.      if( 
cf40: 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  op==OP_ShiftLeft
cf50: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3c   ){.        uA <
cf60: 3c 3d 20 69 42 3b 0a 20 20 20 20 20 20 7d 65 6c  <= iB;.      }el
cf70: 73 65 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3e  se{.        uA >
cf80: 3e 3d 20 69 42 3b 0a 20 20 20 20 20 20 20 20 2f  >= iB;.        /
cf90: 2a 20 53 69 67 6e 2d 65 78 74 65 6e 64 20 6f 6e  * Sign-extend on
cfa0: 20 61 20 72 69 67 68 74 20 73 68 69 66 74 20 6f   a right shift o
cfb0: 66 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  f a negative num
cfc0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ber */.        i
cfd0: 66 28 20 69 41 3c 30 20 29 20 75 41 20 7c 3d 20  f( iA<0 ) uA |= 
cfe0: 28 28 28 28 75 36 34 29 30 78 66 66 66 66 66 66  ((((u64)0xffffff
cff0: 66 66 29 3c 3c 33 32 29 7c 30 78 66 66 66 66 66  ff)<<32)|0xfffff
d000: 66 66 66 29 20 3c 3c 20 28 36 34 2d 69 42 29 3b  fff) << (64-iB);
d010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
d020: 65 6d 63 70 79 28 26 69 41 2c 20 26 75 41 2c 20  emcpy(&iA, &uA, 
d030: 73 69 7a 65 6f 66 28 69 41 29 29 3b 0a 20 20 20  sizeof(iA));.   
d040: 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75   }.  }.  pOut->u
d050: 2e 69 20 3d 20 69 41 3b 0a 20 20 4d 65 6d 53 65  .i = iA;.  MemSe
d060: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
d070: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61  MEM_Int);.  brea
d080: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
d090: 20 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20 2a   AddImm  P1 P2 *
d0a0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
d0b0: 3a 20 72 5b 50 31 5d 3d 72 5b 50 31 5d 2b 50 32  : r[P1]=r[P1]+P2
d0c0: 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74 68 65 20  .** .** Add the 
d0d0: 63 6f 6e 73 74 61 6e 74 20 50 32 20 74 6f 20 74  constant P2 to t
d0e0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
d0f0: 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54 68 65 20  ster P1..** The 
d100: 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
d110: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a   an integer..**.
d120: 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61 6e 79 20  ** To force any 
d130: 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 61  register to be a
d140: 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75 73 74 20  n integer, just 
d150: 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f  add 0..*/.case O
d160: 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20 20 20 20  P_AddImm: {     
d170: 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f         /* in1 */
d180: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
d190: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41  pOp->p1];.  memA
d1a0: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
d1b0: 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
d1c0: 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
d1d0: 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d  y(pIn1);.  pIn1-
d1e0: 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b  >u.i += pOp->p2;
d1f0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
d200: 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e  Opcode: MustBeIn
d210: 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
d220: 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76   .** Force the v
d230: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
d240: 20 50 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74   P1 to be an int
d250: 65 67 65 72 2e 20 20 49 66 20 74 68 65 20 76 61  eger.  If the va
d260: 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20  lue.** in P1 is 
d270: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 61  not an integer a
d280: 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  nd cannot be con
d290: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69  verted into an i
d2a0: 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74 68 6f 75  nteger.** withou
d2b0: 74 20 64 61 74 61 20 6c 6f 73 73 2c 20 74 68 65  t data loss, the
d2c0: 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  n jump immediate
d2d0: 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20 69 66 20  ly to P2, or if 
d2e0: 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73 65 20 61  P2==0.** raise a
d2f0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  n SQLITE_MISMATC
d300: 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a  H exception..*/.
d310: 63 61 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e  case OP_MustBeIn
d320: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
d330: 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
d340: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
d350: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
d360: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
d370: 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Int)==0 ){.   
d380: 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
d390: 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  In1, SQLITE_AFF_
d3a0: 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e  NUMERIC, encodin
d3b0: 67 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  g);.    VdbeBran
d3c0: 63 68 54 61 6b 65 6e 28 28 70 49 6e 31 2d 3e 66  chTaken((pIn1->f
d3d0: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 3d 3d 30  lags&MEM_Int)==0
d3e0: 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 28 70  , 2);.    if( (p
d3f0: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
d400: 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Int)==0 ){.    
d410: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30    if( pOp->p2==0
d420: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d430: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
d440: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  ;.        goto a
d450: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
d460: 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
d470: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d          goto jum
d480: 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 7d  p_to_p2;.      }
d490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4d 65 6d  .    }.  }.  Mem
d4a0: 53 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31  SetTypeFlag(pIn1
d4b0: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72  , MEM_Int);.  br
d4c0: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
d4d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
d4e0: 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70  TING_POINT./* Op
d4f0: 63 6f 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69  code: RealAffini
d500: 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  ty P1 * * * *.**
d510: 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20  .** If register 
d520: 50 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65  P1 holds an inte
d530: 67 65 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74  ger convert it t
d540: 6f 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  o a real value..
d550: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
d560: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 65  e is used when e
d570: 78 74 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d  xtracting inform
d580: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c  ation from a col
d590: 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  umn that.** has 
d5a0: 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20  REAL affinity.  
d5b0: 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  Such column valu
d5c0: 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  es may still be 
d5d0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74  stored as.** int
d5e0: 65 67 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65  egers, for space
d5f0: 20 65 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74   efficiency, but
d600: 20 61 66 74 65 72 20 65 78 74 72 61 63 74 69 6f   after extractio
d610: 6e 20 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a  n we want them.*
d620: 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61  * to have only a
d630: 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a   real value..*/.
d640: 63 61 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69  case OP_RealAffi
d650: 6e 69 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20  nity: {         
d660: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20           /* in1 
d670: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
d680: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
d690: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
d6a0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73  MEM_Int ){.    s
d6b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61  qlite3VdbeMemRea
d6c0: 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a  lify(pIn1);.  }.
d6d0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
d6e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
d6f0: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f  E_OMIT_CAST./* O
d700: 70 63 6f 64 65 3a 20 43 61 73 74 20 50 31 20 50  pcode: Cast P1 P
d710: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
d720: 73 69 73 3a 20 61 66 66 69 6e 69 74 79 28 72 5b  sis: affinity(r[
d730: 50 31 5d 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65  P1]).**.** Force
d740: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
d750: 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20  gister P1 to be 
d760: 74 68 65 20 74 79 70 65 20 64 65 66 69 6e 65 64  the type defined
d770: 20 62 79 20 50 32 2e 0a 2a 2a 20 0a 2a 2a 20 3c   by P2..** .** <
d780: 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d  ul>.** <li> P2==
d790: 27 41 27 20 26 72 61 72 72 3b 20 42 4c 4f 42 0a  'A' &rarr; BLOB.
d7a0: 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 42 27 20  ** <li> P2=='B' 
d7b0: 26 72 61 72 72 3b 20 54 45 58 54 0a 2a 2a 20 3c  &rarr; TEXT.** <
d7c0: 6c 69 3e 20 50 32 3d 3d 27 43 27 20 26 72 61 72  li> P2=='C' &rar
d7d0: 72 3b 20 4e 55 4d 45 52 49 43 0a 2a 2a 20 3c 6c  r; NUMERIC.** <l
d7e0: 69 3e 20 50 32 3d 3d 27 44 27 20 26 72 61 72 72  i> P2=='D' &rarr
d7f0: 3b 20 49 4e 54 45 47 45 52 0a 2a 2a 20 3c 6c 69  ; INTEGER.** <li
d800: 3e 20 50 32 3d 3d 27 45 27 20 26 72 61 72 72 3b  > P2=='E' &rarr;
d810: 20 52 45 41 4c 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a   REAL.** </ul>.*
d820: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75  *.** A NULL valu
d830: 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
d840: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
d850: 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55  .  It remains NU
d860: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  LL..*/.case OP_C
d870: 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ast: {          
d880: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
d890: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
d8a0: 3e 70 32 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f  >p2>=SQLITE_AFF_
d8b0: 42 4c 4f 42 20 26 26 20 70 4f 70 2d 3e 70 32 3c  BLOB && pOp->p2<
d8c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
d8d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
d8e0: 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
d8f0: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 74 65  AFF_TEXT );.  te
d900: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d  stcase( pOp->p2=
d910: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
d920: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
d930: 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
d940: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
d950: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
d960: 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  p2==SQLITE_AFF_I
d970: 4e 54 45 47 45 52 20 29 3b 0a 20 20 74 65 73 74  NTEGER );.  test
d980: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
d990: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
d9a0: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
d9b0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d  [pOp->p1];.  mem
d9c0: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
d9d0: 20 70 49 6e 31 29 3b 0a 20 20 72 63 20 3d 20 45   pIn1);.  rc = E
d9e0: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b  xpandBlob(pIn1);
d9f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
da00: 6d 43 61 73 74 28 70 49 6e 31 2c 20 70 4f 70 2d  mCast(pIn1, pOp-
da10: 3e 70 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  >p2, encoding);.
da20: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
da30: 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 69  BSIZE(pIn1);.  i
da40: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
da50: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
da60: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
da70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
da80: 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70  T_CAST */../* Op
da90: 63 6f 64 65 3a 20 45 71 20 50 31 20 50 32 20 50  code: Eq P1 P2 P
daa0: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
dab0: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3d 3d 72  sis: IF r[P3]==r
dac0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  [P1].**.** Compa
dad0: 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  re the values in
dae0: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
daf0: 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29   P3.  If reg(P3)
db00: 3d 3d 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a  ==reg(P1) then.*
db10: 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  * jump to addres
db20: 73 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65  s P2.  Or if the
db30: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
db40: 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 50  flag is set in P
db50: 35 2c 20 74 68 65 6e 0a 2a 2a 20 73 74 6f 72 65  5, then.** store
db60: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
db70: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 72 65 67  omparison in reg
db80: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
db90: 54 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  The SQLITE_AFF_M
dba0: 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50  ASK portion of P
dbb0: 35 20 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66  5 must be an aff
dbc0: 69 6e 69 74 79 20 63 68 61 72 61 63 74 65 72 20  inity character 
dbd0: 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  -.** SQLITE_AFF_
dbe0: 54 45 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46  TEXT, SQLITE_AFF
dbf0: 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f  _INTEGER, and so
dc00: 20 66 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d   forth. An attem
dc10: 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74  pt is made .** t
dc20: 6f 20 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e  o coerce both in
dc30: 70 75 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74  puts according t
dc40: 6f 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 20  o this affinity 
dc50: 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f  before the.** co
dc60: 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
dc70: 2e 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  . If the SQLITE_
dc80: 41 46 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30  AFF_MASK is 0x00
dc90: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a  , then numeric.*
dca0: 2a 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  * affinity is us
dcb0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
dcc0: 65 20 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65  e affinity conve
dcd0: 72 73 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65  rsions are store
dce0: 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74  d.** back into t
dcf0: 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65  he input registe
dd00: 72 73 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53  rs P1 and P3.  S
dd10: 6f 20 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61  o this opcode ca
dd20: 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69  n cause.** persi
dd30: 73 74 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f  stent changes to
dd40: 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
dd50: 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  d P3..**.** Once
dd60: 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73   any conversions
dd70: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
dd80: 65 2c 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76  e, and neither v
dd90: 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a  alue is NULL, .*
dda0: 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  * the values are
ddb0: 20 63 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f   compared. If bo
ddc0: 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c  th values are bl
ddd0: 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28  obs then memcmp(
dde0: 29 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  ) is.** used to 
ddf0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65  determine the re
de00: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d  sults of the com
de10: 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74  parison.  If bot
de20: 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20  h values.** are 
de30: 74 65 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61  text, then the a
de40: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
de50: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70  ting function sp
de60: 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34  ecified in.** P4
de70: 20 69 73 20 75 73 65 64 20 74 6f 20 64 6f 20 74   is used to do t
de80: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
de90: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65  If P4 is not spe
dea0: 63 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d  cified then.** m
deb0: 65 6d 63 6d 70 28 29 20 69 73 20 75 73 65 64 20  emcmp() is used 
dec0: 74 6f 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20  to compare text 
ded0: 73 74 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68  string.  If both
dee0: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e   values are.** n
def0: 75 6d 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e  umeric, then a n
df00: 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f  umeric compariso
df10: 6e 20 69 73 20 75 73 65 64 2e 20 49 66 20 74 68  n is used. If th
df20: 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
df30: 61 72 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  are of different
df40: 20 74 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d   types, then num
df50: 62 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65  bers are conside
df60: 72 65 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a  red less than.**
df70: 20 73 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72   strings and str
df80: 69 6e 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ings are conside
df90: 72 65 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c  red less than bl
dfa0: 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  obs..**.** If SQ
dfb0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73  LITE_NULLEQ is s
dfc0: 65 74 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68  et in P5 then th
dfd0: 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
dfe0: 61 72 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73  arison is always
dff0: 20 65 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20   either.** true 
e000: 6f 72 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20  or false and is 
e010: 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20  never NULL.  If 
e020: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
e030: 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  e NULL then the 
e040: 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d  result.** of com
e050: 70 61 72 69 73 6f 6e 20 69 73 20 74 72 75 65 2e  parison is true.
e060: 20 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72    If either oper
e070: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  and is NULL then
e080: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 66   the result is f
e090: 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74  alse..** If neit
e0a0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
e0b0: 55 4c 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69  ULL the result i
e0c0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 74  s the same as it
e0d0: 20 77 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20   would be if.** 
e0e0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  the SQLITE_NULLE
e0f0: 51 20 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74  Q flag were omit
e100: 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2a 0a  ted from P5..**.
e110: 2a 2a 20 49 66 20 62 6f 74 68 20 53 51 4c 49 54  ** If both SQLIT
e120: 45 5f 53 54 4f 52 45 50 32 20 61 6e 64 20 53 51  E_STOREP2 and SQ
e130: 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c  LITE_KEEPNULL fl
e140: 61 67 73 20 61 72 65 20 73 65 74 20 74 68 65 6e  ags are set then
e150: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
e160: 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79  of r[P2] is only
e170: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20   changed if the 
e180: 6e 65 77 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  new value is NUL
e190: 4c 20 6f 72 20 30 20 28 66 61 6c 73 65 29 2e 0a  L or 0 (false)..
e1a0: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
e1b0: 73 2c 20 61 20 70 72 69 6f 72 20 72 5b 50 32 5d  s, a prior r[P2]
e1c0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
e1d0: 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
e1e0: 79 20 31 20 28 74 72 75 65 29 2e 0a 2a 2f 0a 2f  y 1 (true)..*/./
e1f0: 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31 20  * Opcode: Ne P1 
e200: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
e210: 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33  ynopsis: IF r[P3
e220: 5d 21 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  ]!=r[P1].**.** T
e230: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
e240: 69 6b 65 20 74 68 65 20 45 71 20 6f 70 63 6f 64  ike the Eq opcod
e250: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
e260: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
e270: 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e  if.** the operan
e280: 64 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ds in registers 
e290: 50 31 20 61 6e 64 20 50 33 20 61 72 65 20 6e 6f  P1 and P3 are no
e2a0: 74 20 65 71 75 61 6c 2e 20 20 53 65 65 20 74 68  t equal.  See th
e2b0: 65 20 45 71 20 6f 70 63 6f 64 65 20 66 6f 72 0a  e Eq opcode for.
e2c0: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  ** additional in
e2d0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
e2e0: 20 49 66 20 62 6f 74 68 20 53 51 4c 49 54 45 5f   If both SQLITE_
e2f0: 53 54 4f 52 45 50 32 20 61 6e 64 20 53 51 4c 49  STOREP2 and SQLI
e300: 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67  TE_KEEPNULL flag
e310: 73 20 61 72 65 20 73 65 74 20 74 68 65 6e 20 74  s are set then t
e320: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
e330: 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79 20 63   r[P2] is only c
e340: 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 6e 65  hanged if the ne
e350: 77 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20  w value is NULL 
e360: 6f 72 20 31 20 28 74 72 75 65 29 2e 0a 2a 2a 20  or 1 (true)..** 
e370: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
e380: 61 20 70 72 69 6f 72 20 72 5b 50 32 5d 20 76 61  a prior r[P2] va
e390: 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lue will not be 
e3a0: 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 30  overwritten by 0
e3b0: 20 28 66 61 6c 73 65 29 2e 0a 2a 2f 0a 2f 2a 20   (false)..*/./* 
e3c0: 4f 70 63 6f 64 65 3a 20 4c 74 20 50 31 20 50 32  Opcode: Lt P1 P2
e3d0: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
e3e0: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3c  opsis: IF r[P3]<
e3f0: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  r[P1].**.** Comp
e400: 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69  are the values i
e410: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e  n register P1 an
e420: 64 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33  d P3.  If reg(P3
e430: 29 3c 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a  )<reg(P1) then.*
e440: 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  * jump to addres
e450: 73 20 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65  s P2.  Or if the
e460: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
e470: 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 50  flag is set in P
e480: 35 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72  5 store.** the r
e490: 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
e4a0: 73 6f 6e 20 28 30 20 6f 72 20 31 20 6f 72 20 4e  son (0 or 1 or N
e4b0: 55 4c 4c 29 20 69 6e 74 6f 20 72 65 67 69 73 74  ULL) into regist
e4c0: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er P2..**.** If 
e4d0: 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  the SQLITE_JUMPI
e4e0: 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20  FNULL bit of P5 
e4f0: 69 73 20 73 65 74 20 61 6e 64 20 65 69 74 68 65  is set and eithe
e500: 72 20 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20  r reg(P1) or.** 
e510: 72 65 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20  reg(P3) is NULL 
e520: 74 68 65 6e 20 74 68 65 20 74 61 6b 65 20 74 68  then the take th
e530: 65 20 6a 75 6d 70 2e 20 20 49 66 20 74 68 65 20  e jump.  If the 
e540: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
e550: 4c 20 0a 2a 2a 20 62 69 74 20 69 73 20 63 6c 65  L .** bit is cle
e560: 61 72 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  ar then fall thr
e570: 6f 75 67 68 20 69 66 20 65 69 74 68 65 72 20 6f  ough if either o
e580: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a  perand is NULL..
e590: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
e5a0: 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f  _AFF_MASK portio
e5b0: 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20  n of P5 must be 
e5c0: 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 72  an affinity char
e5d0: 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54  acter -.** SQLIT
e5e0: 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49  E_AFF_TEXT, SQLI
e5f0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20  TE_AFF_INTEGER, 
e600: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e  and so forth. An
e610: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
e620: 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62   .** to coerce b
e630: 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72  oth inputs accor
e640: 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66  ding to this aff
e650: 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68 65  inity before the
e660: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  .** comparison i
e670: 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53  s made. If the S
e680: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69  QLITE_AFF_MASK i
e690: 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d  s 0x00, then num
e6a0: 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79  eric.** affinity
e6b0: 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74   is used. Note t
e6c0: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
e6d0: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
e6e0: 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20   stored.** back 
e6f0: 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72  into the input r
e700: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
e710: 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63  P3.  So this opc
e720: 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a  ode can cause.**
e730: 20 70 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e   persistent chan
e740: 67 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73  ges to registers
e750: 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a   P1 and P3..**.*
e760: 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65  * Once any conve
e770: 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65  rsions have take
e780: 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69  n place, and nei
e790: 74 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55  ther value is NU
e7a0: 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75  LL, .** the valu
e7b0: 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e  es are compared.
e7c0: 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20   If both values 
e7d0: 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d  are blobs then m
e7e0: 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73  emcmp() is.** us
e7f0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
e800: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
e810: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
e820: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a  If both values.*
e830: 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e  * are text, then
e840: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
e850: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
e860: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
e870: 0a 2a 2a 20 50 34 20 69 73 20 20 75 73 65 64 20  .** P4 is  used 
e880: 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72  to do the compar
e890: 69 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20  ison.  If P4 is 
e8a0: 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 68  not specified th
e8b0: 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69  en.** memcmp() i
e8c0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
e8d0: 65 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20  e text string.  
e8e0: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61  If both values a
e8f0: 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74  re.** numeric, t
e900: 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f  hen a numeric co
e910: 6d 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64  mparison is used
e920: 2e 20 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c  . If the two val
e930: 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69  ues.** are of di
e940: 66 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74  fferent types, t
e950: 68 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20  hen numbers are 
e960: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
e970: 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20  than.** strings 
e980: 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
e990: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
e9a0: 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 2f  than blobs..*/./
e9b0: 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20 50 31 20  * Opcode: Le P1 
e9c0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
e9d0: 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33  ynopsis: IF r[P3
e9e0: 5d 3c 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  ]<=r[P1].**.** T
e9f0: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
ea00: 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  ike the Lt opcod
ea10: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
ea20: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
ea30: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  if.** the conten
ea40: 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33  t of register P3
ea50: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
ea60: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f   equal to the co
ea70: 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69  ntent of.** regi
ea80: 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68  ster P1.  See th
ea90: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
eaa0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
eab0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  mation..*/./* Op
eac0: 63 6f 64 65 3a 20 47 74 20 50 31 20 50 32 20 50  code: Gt P1 P2 P
ead0: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
eae0: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e 72 5b  sis: IF r[P3]>r[
eaf0: 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  P1].**.** This w
eb00: 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74  orks just like t
eb10: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63  he Lt opcode exc
eb20: 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d  ept that the jum
eb30: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a  p is taken if.**
eb40: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
eb50: 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 67  register P3 is g
eb60: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
eb70: 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65  content of.** re
eb80: 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20  gister P1.  See 
eb90: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f  the Lt opcode fo
eba0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
ebb0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  ormation..*/./* 
ebc0: 4f 70 63 6f 64 65 3a 20 47 65 20 50 31 20 50 32  Opcode: Ge P1 P2
ebd0: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
ebe0: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e  opsis: IF r[P3]>
ebf0: 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  =r[P1].**.** Thi
ec00: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
ec10: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
ec20: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
ec30: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
ec40: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
ec50: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
ec60: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
ec70: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63  r equal to the c
ec80: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67  ontent of.** reg
ec90: 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74  ister P1.  See t
eca0: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72  he Lt opcode for
ecb0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
ecc0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  rmation..*/.case
ecd0: 20 4f 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20   OP_Eq:         
ece0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
ecf0: 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e   TK_EQ, jump, in
ed00: 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  1, in3 */.case O
ed10: 50 5f 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20  P_Ne:           
ed20: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
ed30: 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_NE, jump, in1,
ed40: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
ed50: 4c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Lt:             
ed60: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
ed70: 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  LT, jump, in1, i
ed80: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65  n3 */.case OP_Le
ed90: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
eda0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45  /* same as TK_LE
edb0: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
edc0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20   */.case OP_Gt: 
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ede0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20   same as TK_GT, 
edf0: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
ee00: 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20  /.case OP_Ge: { 
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
ee20: 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75  ame as TK_GE, ju
ee30: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
ee40: 20 20 69 6e 74 20 72 65 73 2c 20 72 65 73 32 3b    int res, res2;
ee50: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
ee60: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
ee70: 6e 20 6f 66 20 70 49 6e 31 20 61 67 61 69 6e 73  n of pIn1 agains
ee80: 74 20 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61 72  t pIn3 */.  char
ee90: 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
eea0: 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75  /* Affinity to u
eeb0: 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  se for compariso
eec0: 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73  n */.  u16 flags
eed0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
eee0: 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61  py of initial va
eef0: 6c 75 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c 61  lue of pIn1->fla
ef00: 67 73 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67  gs */.  u16 flag
ef10: 73 33 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  s3;         /* C
ef20: 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76  opy of initial v
ef30: 61 6c 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66 6c  alue of pIn3->fl
ef40: 61 67 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d  ags */..  pIn1 =
ef50: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
ef60: 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
ef70: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67  pOp->p3];.  flag
ef80: 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73  s1 = pIn1->flags
ef90: 3b 0a 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e  ;.  flags3 = pIn
efa0: 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  3->flags;.  if( 
efb0: 28 66 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33  (flags1 | flags3
efc0: 29 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  )&MEM_Null ){.  
efd0: 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68    /* One or both
efe0: 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55   operands are NU
eff0: 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f  LL */.    if( pO
f000: 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e  p->p5 & SQLITE_N
f010: 55 4c 4c 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  ULLEQ ){.      /
f020: 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  * If SQLITE_NULL
f030: 45 51 20 69 73 20 73 65 74 20 28 77 68 69 63 68  EQ is set (which
f040: 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65   will only happe
f050: 6e 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f  n if the operato
f060: 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 4f 50  r is.      ** OP
f070: 5f 45 71 20 6f 72 20 4f 50 5f 4e 65 29 20 74 68  _Eq or OP_Ne) th
f080: 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
f090: 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e   or not dependin
f0a0: 67 20 6f 6e 20 77 68 65 74 68 65 72 0a 20 20 20  g on whether.   
f0b0: 20 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 62 6f 74     ** or not bot
f0c0: 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 6e  h operands are n
f0d0: 75 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ull..      */.  
f0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
f0f0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 7c  >opcode==OP_Eq |
f100: 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
f110: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ne );.      as
f120: 73 65 72 74 28 20 28 66 6c 61 67 73 31 20 26 20  sert( (flags1 & 
f130: 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 20  MEM_Cleared)==0 
f140: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f150: 20 28 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49   (pOp->p5 & SQLI
f160: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3d 3d  TE_JUMPIFNULL)==
f170: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
f180: 66 6c 61 67 73 31 26 66 6c 61 67 73 33 26 4d 45  flags1&flags3&ME
f190: 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20 20 20 20  M_Null)!=0.     
f1a0: 20 20 26 26 20 28 66 6c 61 67 73 33 26 4d 45 4d    && (flags3&MEM
f1b0: 5f 43 6c 65 61 72 65 64 29 3d 3d 30 0a 20 20 20  _Cleared)==0.   
f1c0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
f1d0: 73 20 3d 20 30 3b 20 20 2f 2a 20 4f 70 65 72 61  s = 0;  /* Opera
f1e0: 6e 64 73 20 61 72 65 20 65 71 75 61 6c 20 2a 2f  nds are equal */
f1f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f200: 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 20 20        res = 1;  
f210: 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20  /* Operands are 
f220: 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20  not equal */.   
f230: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f240: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
f250: 4e 55 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20  NULLEQ is clear 
f260: 61 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  and at least one
f270: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
f280: 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
f290: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  the result is al
f2a0: 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  ways NULL..     
f2b0: 20 2a 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20   ** The jump is 
f2c0: 74 61 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c  taken if the SQL
f2d0: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62  ITE_JUMPIFNULL b
f2e0: 69 74 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20  it is set..     
f2f0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
f300: 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53  p->p5 & SQLITE_S
f310: 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20  TOREP2 ){.      
f320: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
f330: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20  Op->p2];.       
f340: 20 69 43 6f 6d 70 61 72 65 20 3d 20 31 3b 20 20   iCompare = 1;  
f350: 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61 72    /* Operands ar
f360: 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a 20  e not equal */. 
f370: 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54         memAboutT
f380: 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
f390: 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 53 65 74  ;.        MemSet
f3a0: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
f3b0: 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  EM_Null);.      
f3c0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
f3d0: 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b  (pOp->p2, pOut);
f3e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f3f0: 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63 68        VdbeBranch
f400: 54 61 6b 65 6e 28 32 2c 33 29 3b 0a 20 20 20 20  Taken(2,3);.    
f410: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20      if( pOp->p5 
f420: 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  & SQLITE_JUMPIFN
f430: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
f440: 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
f450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f460: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f470: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
f480: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 6f      /* Neither o
f490: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 20  perand is NULL. 
f4a0: 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   Do a comparison
f4b0: 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69 6e 69 74  . */.    affinit
f4c0: 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  y = pOp->p5 & SQ
f4d0: 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a 20  LITE_AFF_MASK;. 
f4e0: 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 3e     if( affinity>
f4f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
f500: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
f510: 20 28 66 6c 61 67 73 31 20 7c 20 66 6c 61 67 73   (flags1 | flags
f520: 33 29 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  3)&MEM_Str ){.  
f530: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
f540: 31 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  1 & (MEM_Int|MEM
f550: 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d  _Real|MEM_Str))=
f560: 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  =MEM_Str ){.    
f570: 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72        applyNumer
f580: 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c  icAffinity(pIn1,
f590: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  0);.          te
f5a0: 73 74 63 61 73 65 28 20 66 6c 61 67 73 33 21 3d  stcase( flags3!=
f5b0: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 29 3b 20 2f  pIn3->flags ); /
f5c0: 2a 20 50 6f 73 73 69 62 6c 65 20 69 66 20 70 49  * Possible if pI
f5d0: 6e 31 3d 3d 70 49 6e 33 20 2a 2f 0a 20 20 20 20  n1==pIn3 */.    
f5e0: 20 20 20 20 20 20 66 6c 61 67 73 33 20 3d 20 70        flags3 = p
f5f0: 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  In3->flags;.    
f600: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
f610: 28 20 28 66 6c 61 67 73 33 20 26 20 28 4d 45 4d  ( (flags3 & (MEM
f620: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45  _Int|MEM_Real|ME
f630: 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72  M_Str))==MEM_Str
f640: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
f650: 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
f660: 74 79 28 70 49 6e 33 2c 30 29 3b 0a 20 20 20 20  ty(pIn3,0);.    
f670: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f680: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68      /* Handle th
f690: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
f6a0: 20 69 6e 74 65 67 65 72 20 63 6f 6d 70 61 72 69   integer compari
f6b0: 73 6f 6e 20 68 65 72 65 2c 20 61 73 20 61 6e 0a  son here, as an.
f6c0: 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a        ** optimiz
f6d0: 61 74 69 6f 6e 2c 20 74 6f 20 61 76 6f 69 64 20  ation, to avoid 
f6e0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
f6f0: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 2a 2f  3MemCompare() */
f700: 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 31  .      if( (pIn1
f710: 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e 33 2d 3e  ->flags & pIn3->
f720: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
f730: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
f740: 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20 3e 20 70  f( pIn3->u.i > p
f750: 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72 65 73 20  In1->u.i ){ res 
f760: 3d 20 2b 31 3b 20 67 6f 74 6f 20 63 6f 6d 70 61  = +1; goto compa
f770: 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20 20 20 20  re_op; }.       
f780: 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20 3c   if( pIn3->u.i <
f790: 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72 65   pIn1->u.i ){ re
f7a0: 73 20 3d 20 2d 31 3b 20 67 6f 74 6f 20 63 6f 6d  s = -1; goto com
f7b0: 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20 20  pare_op; }.     
f7c0: 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20     res = 0;.    
f7d0: 20 20 20 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65      goto compare
f7e0: 5f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _op;.      }.   
f7f0: 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e   }else if( affin
f800: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
f810: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 69 66  TEXT ){.      if
f820: 28 20 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f  ( (flags1 & MEM_
f830: 53 74 72 29 3d 3d 30 20 26 26 20 28 66 6c 61 67  Str)==0 && (flag
f840: 73 31 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  s1 & (MEM_Int|ME
f850: 4d 5f 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20  M_Real))!=0 ){. 
f860: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f870: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
f880: 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  EM_Int );.      
f890: 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 31    testcase( pIn1
f8a0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
f8b0: 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  al );.        sq
f8c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
f8d0: 6e 67 69 66 79 28 70 49 6e 31 2c 20 65 6e 63 6f  ngify(pIn1, enco
f8e0: 64 69 6e 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  ding, 1);.      
f8f0: 20 20 74 65 73 74 63 61 73 65 28 20 28 66 6c 61    testcase( (fla
f900: 67 73 31 26 4d 45 4d 5f 44 79 6e 29 20 21 3d 20  gs1&MEM_Dyn) != 
f910: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d  (pIn1->flags&MEM
f920: 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20 20 20 20  _Dyn) );.       
f930: 20 66 6c 61 67 73 31 20 3d 20 28 70 49 6e 31 2d   flags1 = (pIn1-
f940: 3e 66 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54 79  >flags & ~MEM_Ty
f950: 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67 73  peMask) | (flags
f960: 31 20 26 20 4d 45 4d 5f 54 79 70 65 4d 61 73 6b  1 & MEM_TypeMask
f970: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
f980: 74 28 20 70 49 6e 31 21 3d 70 49 6e 33 20 29 3b  t( pIn1!=pIn3 );
f990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f9a0: 66 28 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d  f( (flags3 & MEM
f9b0: 5f 53 74 72 29 3d 3d 30 20 26 26 20 28 66 6c 61  _Str)==0 && (fla
f9c0: 67 73 33 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d  gs3 & (MEM_Int|M
f9d0: 45 4d 5f 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a  EM_Real))!=0 ){.
f9e0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
f9f0: 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20  ( pIn3->flags & 
fa00: 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20  MEM_Int );.     
fa10: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e     testcase( pIn
fa20: 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  3->flags & MEM_R
fa30: 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  eal );.        s
fa40: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72  qlite3VdbeMemStr
fa50: 69 6e 67 69 66 79 28 70 49 6e 33 2c 20 65 6e 63  ingify(pIn3, enc
fa60: 6f 64 69 6e 67 2c 20 31 29 3b 0a 20 20 20 20 20  oding, 1);.     
fa70: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 66 6c     testcase( (fl
fa80: 61 67 73 33 26 4d 45 4d 5f 44 79 6e 29 20 21 3d  ags3&MEM_Dyn) !=
fa90: 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45   (pIn3->flags&ME
faa0: 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20 20 20  M_Dyn) );.      
fab0: 20 20 66 6c 61 67 73 33 20 3d 20 28 70 49 6e 33    flags3 = (pIn3
fac0: 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54  ->flags & ~MEM_T
fad0: 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67  ypeMask) | (flag
fae0: 73 33 20 26 20 4d 45 4d 5f 54 79 70 65 4d 61 73  s3 & MEM_TypeMas
faf0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
fb00: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  }.    assert( pO
fb10: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f  p->p4type==P4_CO
fb20: 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d 3e 70 34  LLSEQ || pOp->p4
fb30: 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  .pColl==0 );.   
fb40: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
fb50: 6d 43 6f 6d 70 61 72 65 28 70 49 6e 33 2c 20 70  mCompare(pIn3, p
fb60: 49 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  In1, pOp->p4.pCo
fb70: 6c 6c 29 3b 0a 20 20 7d 0a 63 6f 6d 70 61 72 65  ll);.  }.compare
fb80: 5f 6f 70 3a 0a 20 20 2f 2a 20 41 74 20 74 68 69  _op:.  /* At thi
fb90: 73 20 70 6f 69 6e 74 2c 20 72 65 73 20 69 73 20  s point, res is 
fba0: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
fbb0: 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 72  or positive if r
fbc0: 65 67 5b 50 31 5d 20 69 73 0a 20 20 2a 2a 20 6c  eg[P1] is.  ** l
fbd0: 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
fbe0: 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
fbf0: 68 61 6e 20 72 65 67 5b 50 33 5d 2c 20 72 65 73  han reg[P3], res
fc00: 70 65 63 74 69 76 65 6c 79 2e 20 20 43 6f 6d 70  pectively.  Comp
fc10: 75 74 65 0a 20 20 2a 2a 20 74 68 65 20 61 6e 73  ute.  ** the ans
fc20: 77 65 72 20 74 6f 20 74 68 69 73 20 6f 70 65 72  wer to this oper
fc30: 61 74 6f 72 20 69 6e 20 72 65 73 32 2c 20 64 65  ator in res2, de
fc40: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 61 74 20  pending on what 
fc50: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
fc60: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 61 63 74   ** operator act
fc70: 75 61 6c 6c 79 20 69 73 2e 20 20 54 68 65 20 6e  ually is.  The n
fc80: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
fc90: 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
fca0: 20 66 61 63 74 0a 20 20 2a 2a 20 74 68 61 74 20   fact.  ** that 
fcb0: 74 68 65 20 36 20 63 6f 6d 70 61 72 69 73 6f 6e  the 6 comparison
fcc0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 63   operators are c
fcd0: 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67  onsecutive integ
fce0: 65 72 73 20 69 6e 20 74 68 69 73 0a 20 20 2a 2a  ers in this.  **
fcf0: 20 6f 72 64 65 72 3a 20 20 4e 45 2c 20 45 51 2c   order:  NE, EQ,
fd00: 20 47 54 2c 20 4c 45 2c 20 4c 54 2c 20 47 45 20   GT, LE, LT, GE 
fd10: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f  */.  assert( OP_
fd20: 45 71 3d 3d 4f 50 5f 4e 65 2b 31 20 29 3b 20 61  Eq==OP_Ne+1 ); a
fd30: 73 73 65 72 74 28 20 4f 50 5f 47 74 3d 3d 4f 50  ssert( OP_Gt==OP
fd40: 5f 4e 65 2b 32 20 29 3b 20 61 73 73 65 72 74 28  _Ne+2 ); assert(
fd50: 20 4f 50 5f 4c 65 3d 3d 4f 50 5f 4e 65 2b 33 20   OP_Le==OP_Ne+3 
fd60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f  );.  assert( OP_
fd70: 4c 74 3d 3d 4f 50 5f 4e 65 2b 34 20 29 3b 20 61  Lt==OP_Ne+4 ); a
fd80: 73 73 65 72 74 28 20 4f 50 5f 47 65 3d 3d 4f 50  ssert( OP_Ge==OP
fd90: 5f 4e 65 2b 35 20 29 3b 0a 20 20 69 66 28 20 72  _Ne+5 );.  if( r
fda0: 65 73 3c 30 20 29 7b 20 20 20 20 20 20 20 20 20  es<0 ){         
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fdc0: 2a 20 6e 65 2c 20 65 71 2c 20 67 74 2c 20 6c 65  * ne, eq, gt, le
fdd0: 2c 20 6c 74 2c 20 67 65 20 2a 2f 0a 20 20 20 20  , lt, ge */.    
fde0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
fdf0: 69 67 6e 65 64 20 63 68 61 72 20 61 4c 54 62 5b  igned char aLTb[
fe00: 5d 20 3d 20 7b 20 31 2c 20 20 30 2c 20 20 30 2c  ] = { 1,  0,  0,
fe10: 20 20 31 2c 20 20 31 2c 20 20 30 20 7d 3b 0a 20    1,  1,  0 };. 
fe20: 20 20 20 72 65 73 32 20 3d 20 61 4c 54 62 5b 70     res2 = aLTb[p
fe30: 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d 20 4f 50 5f  Op->opcode - OP_
fe40: 4e 65 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Ne];.  }else if(
fe50: 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73   res==0 ){.    s
fe60: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
fe70: 67 6e 65 64 20 63 68 61 72 20 61 45 51 62 5b 5d  gned char aEQb[]
fe80: 20 3d 20 7b 20 30 2c 20 20 31 2c 20 20 30 2c 20   = { 0,  1,  0, 
fe90: 20 31 2c 20 20 30 2c 20 20 31 20 7d 3b 0a 20 20   1,  0,  1 };.  
fea0: 20 20 72 65 73 32 20 3d 20 61 45 51 62 5b 70 4f    res2 = aEQb[pO
feb0: 70 2d 3e 6f 70 63 6f 64 65 20 2d 20 4f 50 5f 4e  p->opcode - OP_N
fec0: 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e];.  }else{.   
fed0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
fee0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 47 54 62  signed char aGTb
fef0: 5b 5d 20 3d 20 7b 20 31 2c 20 20 30 2c 20 20 31  [] = { 1,  0,  1
ff00: 2c 20 20 30 2c 20 20 30 2c 20 20 31 20 7d 3b 0a  ,  0,  0,  1 };.
ff10: 20 20 20 20 72 65 73 32 20 3d 20 61 47 54 62 5b      res2 = aGTb[
ff20: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d 20 4f 50  pOp->opcode - OP
ff30: 5f 4e 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _Ne];.  }..  /* 
ff40: 55 6e 64 6f 20 61 6e 79 20 63 68 61 6e 67 65 73  Undo any changes
ff50: 20 6d 61 64 65 20 62 79 20 61 70 70 6c 79 41 66   made by applyAf
ff60: 66 69 6e 69 74 79 28 29 20 74 6f 20 74 68 65 20  finity() to the 
ff70: 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 2e  input registers.
ff80: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
ff90: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
ffa0: 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73 31  _Dyn) == (flags1
ffb0: 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20   & MEM_Dyn) );. 
ffc0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 66   pIn1->flags = f
ffd0: 6c 61 67 73 31 3b 0a 20 20 61 73 73 65 72 74 28  lags1;.  assert(
ffe0: 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
fff0: 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61  MEM_Dyn) == (fla
10000 67 73 33 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29  gs3 & MEM_Dyn) )
10010 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20  ;.  pIn3->flags 
10020 3d 20 66 6c 61 67 73 33 3b 0a 0a 20 20 69 66 28  = flags3;..  if(
10030 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
10040 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20  E_STOREP2 ){.   
10050 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
10060 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 69 43 6f 6d  p->p2];.    iCom
10070 70 61 72 65 20 3d 20 72 65 73 3b 0a 20 20 20 20  pare = res;.    
10080 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 53  if( (pOp->p5 & S
10090 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 29 21  QLITE_KEEPNULL)!
100a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
100b0 68 65 20 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67  he KEEPNULL flag
100c0 20 70 72 65 76 65 6e 74 73 20 4f 50 5f 45 71 20   prevents OP_Eq 
100d0 66 72 6f 6d 20 6f 76 65 72 77 72 69 74 69 6e 67  from overwriting
100e0 20 61 20 4e 55 4c 4c 20 77 69 74 68 20 31 0a 20   a NULL with 1. 
100f0 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 72 65 76       ** and prev
10100 65 6e 74 73 20 4f 50 5f 4e 65 20 66 72 6f 6d 20  ents OP_Ne from 
10110 6f 76 65 72 77 72 69 74 69 6e 67 20 4e 55 4c 4c  overwriting NULL
10120 20 77 69 74 68 20 30 2e 20 20 54 68 69 73 20 66   with 0.  This f
10130 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
10140 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 63 6f 6e  only used in con
10150 74 65 78 74 73 20 77 68 65 72 65 20 65 69 74 68  texts where eith
10160 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  er:.      **   (
10170 31 29 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  1) op==OP_Eq && 
10180 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20  (r[P2]==NULL || 
10190 72 5b 50 32 5d 3d 3d 30 29 0a 20 20 20 20 20 20  r[P2]==0).      
101a0 2a 2a 20 20 20 28 32 29 20 6f 70 3d 3d 4f 50 5f  **   (2) op==OP_
101b0 4e 65 20 26 26 20 28 72 5b 50 32 5d 3d 3d 4e 55  Ne && (r[P2]==NU
101c0 4c 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d 31 29 0a  LL || r[P2]==1).
101d0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 66 6f        ** Therefo
101e0 72 65 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  re it is not nec
101f0 65 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20  essary to check 
10200 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
10210 5b 50 32 5d 20 66 6f 72 0a 20 20 20 20 20 20 2a  [P2] for.      *
10220 2a 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20  * NULL. */.     
10230 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
10240 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 7c 7c 20 70  code==OP_Ne || p
10250 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
10260 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
10270 74 28 20 72 65 73 32 3d 3d 30 20 7c 7c 20 72 65  t( res2==0 || re
10280 73 32 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74  s2==1 );.      t
10290 65 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d 30  estcase( res2==0
102a0 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   && pOp->opcode=
102b0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
102c0 74 65 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d  testcase( res2==
102d0 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  1 && pOp->opcode
102e0 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
102f0 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32 3d   testcase( res2=
10300 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  =0 && pOp->opcod
10310 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  e==OP_Ne );.    
10320 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32    testcase( res2
10330 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f  ==1 && pOp->opco
10340 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  de==OP_Ne );.   
10350 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 63     if( (pOp->opc
10360 6f 64 65 3d 3d 4f 50 5f 45 71 29 3d 3d 72 65 73  ode==OP_Eq)==res
10370 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  2 ) break;.    }
10380 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  .    memAboutToC
10390 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a  hange(p, pOut);.
103a0 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
103b0 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
103c0 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  );.    pOut->u.i
103d0 20 3d 20 72 65 73 32 3b 0a 20 20 20 20 52 45 47   = res2;.    REG
103e0 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
103f0 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 7d 65  >p2, pOut);.  }e
10400 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61  lse{.    VdbeBra
10410 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c  nchTaken(res!=0,
10420 20 28 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49   (pOp->p5 & SQLI
10430 54 45 5f 4e 55 4c 4c 45 51 29 3f 32 3a 33 29 3b  TE_NULLEQ)?2:3);
10440 0a 20 20 20 20 69 66 28 20 72 65 73 32 20 29 7b  .    if( res2 ){
10450 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  .      goto jump
10460 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20  _to_p2;.    }.  
10470 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
10480 20 4f 70 63 6f 64 65 3a 20 45 6c 73 65 4e 6f 74   Opcode: ElseNot
10490 45 71 20 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  Eq * P2 * * *.**
104a0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
104b0 6d 75 73 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  must immediately
104c0 20 66 6f 6c 6c 6f 77 20 61 6e 20 4f 50 5f 4c 74   follow an OP_Lt
104d0 20 6f 72 20 4f 50 5f 47 74 20 63 6f 6d 70 61 72   or OP_Gt compar
104e0 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
104f0 2a 20 49 66 20 72 65 73 75 6c 74 20 6f 66 20 61  * If result of a
10500 6e 20 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69 73  n OP_Eq comparis
10510 6f 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  on on the same t
10520 77 6f 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 77  wo operands.** w
10530 6f 75 6c 64 20 68 61 76 65 20 62 65 20 4e 55 4c  ould have be NUL
10540 4c 20 6f 72 20 66 61 6c 73 65 20 28 30 29 2c 20  L or false (0), 
10550 74 68 65 6e 20 74 68 65 6e 20 6a 75 6d 70 20 74  then then jump t
10560 6f 20 50 32 2e 20 0a 2a 2a 20 49 66 20 74 68 65  o P2. .** If the
10570 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f 50   result of an OP
10580 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  _Eq comparison o
10590 6e 20 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f  n the two previo
105a0 75 73 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 77  us operands.** w
105b0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 74  ould have been t
105c0 72 75 65 20 28 31 29 2c 20 74 68 65 6e 20 66 61  rue (1), then fa
105d0 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63  ll through..*/.c
105e0 61 73 65 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71  ase OP_ElseNotEq
105f0 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 73 61 6d  : {       /* sam
10600 65 20 61 73 20 54 4b 5f 45 53 43 41 50 45 2c 20  e as TK_ESCAPE, 
10610 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74  jump */.  assert
10620 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 61  ( pOp>aOp );.  a
10630 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f  ssert( pOp[-1].o
10640 70 63 6f 64 65 3d 3d 4f 50 5f 4c 74 20 7c 7c 20  pcode==OP_Lt || 
10650 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
10660 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
10670 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 35 20 26 20  t( pOp[-1].p5 & 
10680 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29  SQLITE_STOREP2 )
10690 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
106a0 6b 65 6e 28 69 43 6f 6d 70 61 72 65 21 3d 30 2c  ken(iCompare!=0,
106b0 20 32 29 3b 0a 20 20 69 66 28 20 69 43 6f 6d 70   2);.  if( iComp
106c0 61 72 65 21 3d 30 20 29 20 67 6f 74 6f 20 6a 75  are!=0 ) goto ju
106d0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
106e0 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
106f0 3a 20 50 65 72 6d 75 74 61 74 69 6f 6e 20 2a 20  : Permutation * 
10700 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53  * * P4 *.**.** S
10710 65 74 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  et the permutati
10720 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 4f  on used by the O
10730 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72 61 74  P_Compare operat
10740 6f 72 20 69 6e 20 74 68 65 20 6e 65 78 74 0a 2a  or in the next.*
10750 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  * instruction.  
10760 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  The permutation 
10770 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
10780 20 50 34 20 6f 70 65 72 61 6e 64 2e 0a 2a 2a 0a   P4 operand..**.
10790 2a 2a 20 54 68 65 20 70 65 72 6d 75 74 61 74 69  ** The permutati
107a0 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64  on is only valid
107b0 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 20   until the next 
107c0 4f 50 5f 43 6f 6d 70 61 72 65 20 74 68 61 74 20  OP_Compare that 
107d0 68 61 73 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41  has.** the OPFLA
107e0 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20 73 65  G_PERMUTE bit se
107f0 74 20 69 6e 20 50 35 2e 20 54 79 70 69 63 61 6c  t in P5. Typical
10800 6c 79 20 74 68 65 20 4f 50 5f 50 65 72 6d 75 74  ly the OP_Permut
10810 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 0a 2a 2a  ation should .**
10820 20 6f 63 63 75 72 20 69 6d 6d 65 64 69 61 74 65   occur immediate
10830 6c 79 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ly prior to the 
10840 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a 2a 0a 2a  OP_Compare..**.*
10850 2a 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  * The first inte
10860 67 65 72 20 69 6e 20 74 68 65 20 50 34 20 69 6e  ger in the P4 in
10870 74 65 67 65 72 20 61 72 72 61 79 20 69 73 20 74  teger array is t
10880 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
10890 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64 20 64 6f   array.** and do
108a0 65 73 20 6e 6f 74 20 62 65 63 6f 6d 65 20 70 61  es not become pa
108b0 72 74 20 6f 66 20 74 68 65 20 70 65 72 6d 75 74  rt of the permut
108c0 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
108d0 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 3a 20 7b  P_Permutation: {
108e0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
108f0 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52  p4type==P4_INTAR
10900 52 41 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RAY );.  assert(
10910 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29 3b 0a 20   pOp->p4.ai );. 
10920 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e   assert( pOp[1].
10930 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6d 70 61  opcode==OP_Compa
10940 72 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  re );.  assert( 
10950 70 4f 70 5b 31 5d 2e 70 35 20 26 20 4f 50 46 4c  pOp[1].p5 & OPFL
10960 41 47 5f 50 45 52 4d 55 54 45 20 29 3b 0a 20 20  AG_PERMUTE );.  
10970 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
10980 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20 50 31 20  ode: Compare P1 
10990 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
109a0 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 40 50 33  ynopsis: r[P1@P3
109b0 5d 20 3c 2d 3e 20 72 5b 50 32 40 50 33 5d 0a 2a  ] <-> r[P2@P3].*
109c0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
109d0 20 76 65 63 74 6f 72 73 20 6f 66 20 72 65 67 69   vectors of regi
109e0 73 74 65 72 73 20 69 6e 20 72 65 67 28 50 31 29  sters in reg(P1)
109f0 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31 29 20 28  ..reg(P1+P3-1) (
10a00 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65 63  call this.** vec
10a10 74 6f 72 20 22 41 22 29 20 61 6e 64 20 69 6e 20  tor "A") and in 
10a20 72 65 67 28 50 32 29 2e 2e 72 65 67 28 50 32 2b  reg(P2)..reg(P2+
10a30 50 33 2d 31 29 20 28 22 42 22 29 2e 20 20 53 61  P3-1) ("B").  Sa
10a40 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ve the result of
10a50 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73  .** the comparis
10a60 6f 6e 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  on for use by th
10a70 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20 69  e next OP_Jump i
10a80 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 49  nstruct..**.** I
10a90 66 20 50 35 20 68 61 73 20 74 68 65 20 4f 50 46  f P5 has the OPF
10aa0 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20  LAG_PERMUTE bit 
10ab0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  set, then the or
10ac0 64 65 72 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  der of compariso
10ad0 6e 20 69 73 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  n is.** determin
10ae0 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ed by the most r
10af0 65 63 65 6e 74 20 4f 50 5f 50 65 72 6d 75 74 61  ecent OP_Permuta
10b00 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  tion operator.  
10b10 49 66 20 74 68 65 0a 2a 2a 20 4f 50 46 4c 41 47  If the.** OPFLAG
10b20 5f 50 45 52 4d 55 54 45 20 62 69 74 20 69 73 20  _PERMUTE bit is 
10b30 63 6c 65 61 72 2c 20 74 68 65 6e 20 72 65 67 69  clear, then regi
10b40 73 74 65 72 20 61 72 65 20 63 6f 6d 70 61 72 65  ster are compare
10b50 64 20 69 6e 20 73 65 71 75 65 6e 74 69 61 6c 0a  d in sequential.
10b60 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  ** order..**.** 
10b70 50 34 20 69 73 20 61 20 4b 65 79 49 6e 66 6f 20  P4 is a KeyInfo 
10b80 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
10b90 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67  efines collating
10ba0 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64 20 73   sequences and s
10bb0 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f  ort.** orders fo
10bc0 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
10bd0 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61 74 69  .  The permutati
10be0 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f 20 72 65  on applies to re
10bf0 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e  gisters.** only.
10c00 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c    The KeyInfo el
10c10 65 6d 65 6e 74 73 20 61 72 65 20 75 73 65 64 20  ements are used 
10c20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a  sequentially..**
10c30 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73  .** The comparis
10c40 6f 6e 20 69 73 20 61 20 73 6f 72 74 20 63 6f 6d  on is a sort com
10c50 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c  parison, so NULL
10c60 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c  s compare equal,
10c70 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65  .** NULLs are le
10c80 73 73 20 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c  ss than numbers,
10c90 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6c 65 73   numbers are les
10ca0 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a  s than strings,.
10cb0 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61  ** and strings a
10cc0 72 65 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f  re less than blo
10cd0 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  bs..*/.case OP_C
10ce0 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20  ompare: {.  int 
10cf0 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
10d00 74 20 70 31 3b 0a 20 20 69 6e 74 20 70 32 3b 0a  t p1;.  int p2;.
10d10 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20    const KeyInfo 
10d20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74  *pKeyInfo;.  int
10d30 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20   idx;.  CollSeq 
10d40 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f  *pColl;    /* Co
10d50 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10d60 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69 73 20   to use on this 
10d70 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 52  term */.  int bR
10d80 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
10d90 54 72 75 65 20 66 6f 72 20 44 45 53 43 45 4e 44  True for DESCEND
10da0 49 4e 47 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ING sort order *
10db0 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
10dc0 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 65  e;     /* The pe
10dd0 72 6d 75 74 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  rmutation */..  
10de0 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f  if( (pOp->p5 & O
10df0 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3d 3d  PFLAG_PERMUTE)==
10e00 30 20 29 7b 0a 20 20 20 20 61 50 65 72 6d 75 74  0 ){.    aPermut
10e10 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
10e20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e      assert( pOp>
10e30 61 4f 70 20 29 3b 0a 20 20 20 20 61 73 73 65 72  aOp );.    asser
10e40 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
10e50 65 3d 3d 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  e==OP_Permutatio
10e60 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n );.    assert(
10e70 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d   pOp[-1].p4type=
10e80 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a  =P4_INTARRAY );.
10e90 20 20 20 20 61 50 65 72 6d 75 74 65 20 3d 20 70      aPermute = p
10ea0 4f 70 5b 2d 31 5d 2e 70 34 2e 61 69 20 2b 20 31  Op[-1].p4.ai + 1
10eb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 50  ;.    assert( aP
10ec0 65 72 6d 75 74 65 21 3d 30 20 29 3b 0a 20 20 7d  ermute!=0 );.  }
10ed0 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  .  n = pOp->p3;.
10ee0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70    pKeyInfo = pOp
10ef0 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
10f00 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
10f10 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
10f20 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d 20  fo!=0 );.  p1 = 
10f30 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20  pOp->p1;.  p2 = 
10f40 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 64 65 66 20  pOp->p2;.#ifdef 
10f50 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
10f60 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
10f70 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20 30     int k, mx = 0
10f80 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ;.    for(k=0; k
10f90 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50 65  <n; k++) if( aPe
10fa0 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78  rmute[k]>mx ) mx
10fb0 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a   = aPermute[k];.
10fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 30      assert( p1>0
10fd0 20 26 26 20 70 31 2b 6d 78 3c 3d 28 70 2d 3e 6e   && p1+mx<=(p->n
10fe0 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
10ff0 6f 72 29 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  or)+1 );.    ass
11000 65 72 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b  ert( p2>0 && p2+
11010 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  mx<=(p->nMem+1 -
11020 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29   p->nCursor)+1 )
11030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11040 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20 70  ssert( p1>0 && p
11050 31 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  1+n<=(p->nMem+1 
11060 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20  - p->nCursor)+1 
11070 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
11080 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d 28 70 2d  2>0 && p2+n<=(p-
11090 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
110a0 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 7d 0a 23  rsor)+1 );.  }.#
110b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
110c0 44 45 42 55 47 20 2a 2f 0a 20 20 66 6f 72 28 69  DEBUG */.  for(i
110d0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
110e0 20 20 20 69 64 78 20 3d 20 61 50 65 72 6d 75 74     idx = aPermut
110f0 65 20 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d 20  e ? aPermute[i] 
11100 3a 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  : i;.    assert(
11110 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65   memIsValid(&aMe
11120 6d 5b 70 31 2b 69 64 78 5d 29 20 29 3b 0a 20 20  m[p1+idx]) );.  
11130 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
11140 61 6c 69 64 28 26 61 4d 65 6d 5b 70 32 2b 69 64  alid(&aMem[p2+id
11150 78 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53  x]) );.    REGIS
11160 54 45 52 5f 54 52 41 43 45 28 70 31 2b 69 64 78  TER_TRACE(p1+idx
11170 2c 20 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29  , &aMem[p1+idx])
11180 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
11190 52 41 43 45 28 70 32 2b 69 64 78 2c 20 26 61 4d  RACE(p2+idx, &aM
111a0 65 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a 20 20 20  em[p2+idx]);.   
111b0 20 61 73 73 65 72 74 28 20 69 3c 70 4b 65 79 49   assert( i<pKeyI
111c0 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 29  nfo->nKeyField )
111d0 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4b  ;.    pColl = pK
111e0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
111f0 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 70 4b 65  ;.    bRev = pKe
11200 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
11210 72 5b 69 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61  r[i];.    iCompa
11220 72 65 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  re = sqlite3MemC
11230 6f 6d 70 61 72 65 28 26 61 4d 65 6d 5b 70 31 2b  ompare(&aMem[p1+
11240 69 64 78 5d 2c 20 26 61 4d 65 6d 5b 70 32 2b 69  idx], &aMem[p2+i
11250 64 78 5d 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  dx], pColl);.   
11260 20 69 66 28 20 69 43 6f 6d 70 61 72 65 20 29 7b   if( iCompare ){
11270 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20  .      if( bRev 
11280 29 20 69 43 6f 6d 70 61 72 65 20 3d 20 2d 69 43  ) iCompare = -iC
11290 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 62 72  ompare;.      br
112a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
112b0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
112c0 63 6f 64 65 3a 20 4a 75 6d 70 20 50 31 20 50 32  code: Jump P1 P2
112d0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75   P3 * *.**.** Ju
112e0 6d 70 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  mp to the instru
112f0 63 74 69 6f 6e 20 61 74 20 61 64 64 72 65 73 73  ction at address
11300 20 50 31 2c 20 50 32 2c 20 6f 72 20 50 33 20 64   P1, P2, or P3 d
11310 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
11320 68 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 6f  her.** in the mo
11330 73 74 20 72 65 63 65 6e 74 20 4f 50 5f 43 6f 6d  st recent OP_Com
11340 70 61 72 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  pare instruction
11350 20 74 68 65 20 50 31 20 76 65 63 74 6f 72 20 77   the P1 vector w
11360 61 73 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  as less than.** 
11370 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
11380 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 50 32  ater than the P2
11390 20 76 65 63 74 6f 72 2c 20 72 65 73 70 65 63 74   vector, respect
113a0 69 76 65 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ively..*/.case O
113b0 50 5f 4a 75 6d 70 3a 20 7b 20 20 20 20 20 20 20  P_Jump: {       
113c0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
113d0 0a 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3c  .  if( iCompare<
113e0 30 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61  0 ){.    VdbeBra
113f0 6e 63 68 54 61 6b 65 6e 28 30 2c 33 29 3b 20 70  nchTaken(0,3); p
11400 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70  Op = &aOp[pOp->p
11410 31 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65 20  1 - 1];.  }else 
11420 69 66 28 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20  if( iCompare==0 
11430 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  ){.    VdbeBranc
11440 68 54 61 6b 65 6e 28 31 2c 33 29 3b 20 70 4f 70  hTaken(1,3); pOp
11450 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20   = &aOp[pOp->p2 
11460 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  - 1];.  }else{. 
11470 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
11480 65 6e 28 32 2c 33 29 3b 20 70 4f 70 20 3d 20 26  en(2,3); pOp = &
11490 61 4f 70 5b 70 4f 70 2d 3e 70 33 20 2d 20 31 5d  aOp[pOp->p3 - 1]
114a0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
114b0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64  ../* Opcode: And
114c0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
114d0 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
114e0 3d 28 72 5b 50 31 5d 20 26 26 20 72 5b 50 32 5d  =(r[P1] && r[P2]
114f0 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65  ).**.** Take the
11500 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20 6f 66 20   logical AND of 
11510 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65  the values in re
11520 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
11530 32 20 61 6e 64 0a 2a 2a 20 77 72 69 74 65 20 74  2 and.** write t
11540 68 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72  he result into r
11550 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a  egister P3..**.*
11560 2a 20 49 66 20 65 69 74 68 65 72 20 50 31 20 6f  * If either P1 o
11570 72 20 50 32 20 69 73 20 30 20 28 66 61 6c 73 65  r P2 is 0 (false
11580 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  ) then the resul
11590 74 20 69 73 20 30 20 65 76 65 6e 20 69 66 0a 2a  t is 0 even if.*
115a0 2a 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75  * the other inpu
115b0 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55  t is NULL.  A NU
115c0 4c 4c 20 61 6e 64 20 74 72 75 65 20 6f 72 20 74  LL and true or t
115d0 77 6f 20 4e 55 4c 4c 73 20 67 69 76 65 0a 2a 2a  wo NULLs give.**
115e0 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a   a NULL output..
115f0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 72  */./* Opcode: Or
11600 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
11610 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
11620 3d 28 72 5b 50 31 5d 20 7c 7c 20 72 5b 50 32 5d  =(r[P1] || r[P2]
11630 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65  ).**.** Take the
11640 20 6c 6f 67 69 63 61 6c 20 4f 52 20 6f 66 20 74   logical OR of t
11650 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
11660 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20  ister P1 and P2 
11670 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  and.** store the
11680 20 61 6e 73 77 65 72 20 69 6e 20 72 65 67 69 73   answer in regis
11690 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P3..**.** If
116a0 20 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32   either P1 or P2
116b0 20 69 73 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75   is nonzero (tru
116c0 65 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e) then the resu
116d0 6c 74 20 69 73 20 31 20 28 74 72 75 65 29 0a 2a  lt is 1 (true).*
116e0 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6f 74  * even if the ot
116f0 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
11700 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66  L.  A NULL and f
11710 61 6c 73 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c  alse or two NULL
11720 73 0a 2a 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c  s.** give a NULL
11730 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65   output..*/.case
11740 20 4f 50 5f 41 6e 64 3a 20 20 20 20 20 20 20 20   OP_And:        
11750 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
11760 20 54 4b 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e   TK_AND, in1, in
11770 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
11780 4f 50 5f 4f 72 3a 20 7b 20 20 20 20 20 20 20 20  OP_Or: {        
11790 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
117a0 54 4b 5f 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c  TK_OR, in1, in2,
117b0 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76   out3 */.  int v
117c0 31 3b 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70  1;    /* Left op
117d0 65 72 61 6e 64 3a 20 20 30 3d 3d 46 41 4c 53 45  erand:  0==FALSE
117e0 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e  , 1==TRUE, 2==UN
117f0 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f  KNOWN or NULL */
11800 0a 20 20 69 6e 74 20 76 32 3b 20 20 20 20 2f 2a  .  int v2;    /*
11810 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 3a 20   Right operand: 
11820 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55  0==FALSE, 1==TRU
11830 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72  E, 2==UNKNOWN or
11840 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 70 49 6e 31   NULL */..  pIn1
11850 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
11860 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66  ];.  if( pIn1->f
11870 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
11880 29 7b 0a 20 20 20 20 76 31 20 3d 20 32 3b 0a 20  ){.    v1 = 2;. 
11890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 31 20 3d   }else{.    v1 =
118a0 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
118b0 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 20  alue(pIn1)!=0;. 
118c0 20 7d 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65   }.  pIn2 = &aMe
118d0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66  m[pOp->p2];.  if
118e0 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20  ( pIn2->flags & 
118f0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
11900 76 32 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b  v2 = 2;.  }else{
11910 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65  .    v2 = sqlite
11920 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49  3VdbeIntValue(pI
11930 6e 32 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 69 66  n2)!=0;.  }.  if
11940 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
11950 50 5f 41 6e 64 20 29 7b 0a 20 20 20 20 73 74 61  P_And ){.    sta
11960 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
11970 65 64 20 63 68 61 72 20 61 6e 64 5f 6c 6f 67 69  ed char and_logi
11980 63 5b 5d 20 3d 20 7b 20 30 2c 20 30 2c 20 30 2c  c[] = { 0, 0, 0,
11990 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 32 2c 20   0, 1, 2, 0, 2, 
119a0 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 61 6e  2 };.    v1 = an
119b0 64 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d  d_logic[v1*3+v2]
119c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
119d0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
119e0 67 6e 65 64 20 63 68 61 72 20 6f 72 5f 6c 6f 67  gned char or_log
119f0 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ic[] = { 0, 1, 2
11a00 2c 20 31 2c 20 31 2c 20 31 2c 20 32 2c 20 31 2c  , 1, 1, 1, 2, 1,
11a10 20 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 6f   2 };.    v1 = o
11a20 72 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d  r_logic[v1*3+v2]
11a30 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26  ;.  }.  pOut = &
11a40 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
11a50 20 69 66 28 20 76 31 3d 3d 32 20 29 7b 0a 20 20   if( v1==2 ){.  
11a60 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
11a70 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  (pOut, MEM_Null)
11a80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11a90 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 31 3b 0a 20  Out->u.i = v1;. 
11aa0 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61     MemSetTypeFla
11ab0 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29  g(pOut, MEM_Int)
11ac0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
11ad0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74  ../* Opcode: Not
11ae0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
11af0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
11b00 20 21 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e   !r[P1].**.** In
11b10 74 65 72 70 72 65 74 20 74 68 65 20 76 61 6c 75  terpret the valu
11b20 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
11b30 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
11b40 6c 75 65 2e 20 20 53 74 6f 72 65 20 74 68 65 0a  lue.  Store the.
11b50 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c  ** boolean compl
11b60 65 6d 65 6e 74 20 69 6e 20 72 65 67 69 73 74 65  ement in registe
11b70 72 20 50 32 2e 20 20 49 66 20 74 68 65 20 76 61  r P2.  If the va
11b80 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
11b90 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20  P1 is .** NULL, 
11ba0 74 68 65 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73  then a NULL is s
11bb0 74 6f 72 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a  tored in P2..*/.
11bc0 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20  case OP_Not: {  
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11be0 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c   same as TK_NOT,
11bf0 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20   in1, out2 */.  
11c00 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
11c10 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
11c20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
11c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
11c40 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
11c50 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
11c60 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
11c70 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c   ){.    pOut->fl
11c80 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
11c90 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 21     pOut->u.i = !
11ca0 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
11cb0 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20  lue(pIn1);.  }. 
11cc0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
11cd0 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20 50 31 20  code: BitNot P1 
11ce0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
11cf0 70 73 69 73 3a 20 72 5b 50 31 5d 3d 20 7e 72 5b  psis: r[P1]= ~r[
11d00 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  P1].**.** Interp
11d10 72 65 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ret the content 
11d20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 61  of register P1 a
11d30 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 53  s an integer.  S
11d40 74 6f 72 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73  tore the.** ones
11d50 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74  -complement of t
11d60 68 65 20 50 31 20 76 61 6c 75 65 20 69 6e 74 6f  he P1 value into
11d70 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49   register P2.  I
11d80 66 20 50 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20  f P1 holds.** a 
11d90 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20  NULL then store 
11da0 61 20 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f  a NULL in P2..*/
11db0 0a 63 61 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a  .case OP_BitNot:
11dc0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   {             /
11dd0 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54  * same as TK_BIT
11de0 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a  NOT, in1, out2 *
11df0 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
11e00 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75  [pOp->p1];.  pOu
11e10 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
11e20 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2];.  sqlite3Vdb
11e30 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
11e40 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
11e50 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
11e60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 75 74  )==0 ){.    pOut
11e70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
11e80 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  t;.    pOut->u.i
11e90 20 3d 20 7e 73 71 6c 69 74 65 33 56 64 62 65 49   = ~sqlite3VdbeI
11ea0 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20  ntValue(pIn1);. 
11eb0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
11ec0 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e 63 65 20 50  * Opcode: Once P
11ed0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
11ee0 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   Fall through to
11ef0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
11f00 63 74 69 6f 6e 20 74 68 65 20 66 69 72 73 74 20  ction the first 
11f10 74 69 6d 65 20 74 68 69 73 20 6f 70 63 6f 64 65  time this opcode
11f20 20 69 73 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72   is.** encounter
11f30 65 64 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63  ed on each invoc
11f40 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 79 74  ation of the byt
11f50 65 2d 63 6f 64 65 20 70 72 6f 67 72 61 6d 2e 20  e-code program. 
11f60 20 4a 75 6d 70 20 74 6f 20 50 32 0a 2a 2a 20 6f   Jump to P2.** o
11f70 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  n the second and
11f80 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
11f90 65 6e 63 6f 75 6e 74 65 72 73 20 64 75 72 69 6e  encounters durin
11fa0 67 20 74 68 65 20 73 61 6d 65 20 69 6e 76 6f 63  g the same invoc
11fb0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 70  ation..**.** Top
11fc0 2d 6c 65 76 65 6c 20 70 72 6f 67 72 61 6d 73 20  -level programs 
11fd0 64 65 74 65 72 6d 69 6e 65 20 66 69 72 73 74 20  determine first 
11fe0 69 6e 76 6f 63 61 74 69 6f 6e 20 62 79 20 63 6f  invocation by co
11ff0 6d 70 61 72 69 6e 67 20 74 68 65 20 50 31 0a 2a  mparing the P1.*
12000 2a 20 6f 70 65 72 61 6e 64 20 61 67 61 69 6e 73  * operand agains
12010 74 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64  t the P1 operand
12020 20 6f 6e 20 74 68 65 20 4f 50 5f 49 6e 69 74 20   on the OP_Init 
12030 6f 70 63 6f 64 65 20 61 74 20 74 68 65 20 62 65  opcode at the be
12040 67 69 6e 6e 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  ginning.** of th
12050 65 20 70 72 6f 67 72 61 6d 2e 20 20 49 66 20 74  e program.  If t
12060 68 65 20 50 31 20 76 61 6c 75 65 73 20 64 69 66  he P1 values dif
12070 66 65 72 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74  fer, then fall t
12080 68 72 6f 75 67 68 20 61 6e 64 20 6d 61 6b 65 0a  hrough and make.
12090 2a 2a 20 74 68 65 20 50 31 20 6f 66 20 74 68 69  ** the P1 of thi
120a0 73 20 6f 70 63 6f 64 65 20 65 71 75 61 6c 20 74  s opcode equal t
120b0 6f 20 74 68 65 20 50 31 20 6f 66 20 4f 50 5f 49  o the P1 of OP_I
120c0 6e 69 74 2e 20 20 49 66 20 50 31 20 76 61 6c 75  nit.  If P1 valu
120d0 65 73 20 61 72 65 0a 2a 2a 20 74 68 65 20 73 61  es are.** the sa
120e0 6d 65 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65  me then take the
120f0 20 6a 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   jump..**.** For
12100 20 73 75 62 70 72 6f 67 72 61 6d 73 2c 20 74 68   subprograms, th
12110 65 72 65 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ere is a bitmask
12120 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
12130 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  e that determine
12140 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  s.** whether or 
12150 6e 6f 74 20 74 68 65 20 6a 75 6d 70 20 73 68 6f  not the jump sho
12160 75 6c 64 20 62 65 20 74 61 6b 65 6e 2e 20 20 54  uld be taken.  T
12170 68 65 20 62 69 74 6d 61 73 6b 20 69 73 20 6e 65  he bitmask is ne
12180 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75  cessary.** becau
12190 73 65 20 74 68 65 20 73 65 6c 66 2d 61 6c 74 65  se the self-alte
121a0 72 69 6e 67 20 63 6f 64 65 20 74 72 69 63 6b 20  ring code trick 
121b0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 66 6f  does not work fo
121c0 72 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 74  r recursive.** t
121d0 72 69 67 67 65 72 73 2e 0a 2a 2f 0a 63 61 73 65  riggers..*/.case
121e0 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20 20 20   OP_Once: {     
121f0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
12200 2a 2f 0a 20 20 75 33 32 20 69 41 64 64 72 3b 20  */.  u32 iAddr; 
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12220 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 69  * Address of thi
12230 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  s instruction */
12240 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
12250 70 5b 30 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  p[0].opcode==OP_
12260 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  Init );.  if( p-
12270 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 69  >pFrame ){.    i
12280 41 64 64 72 20 3d 20 28 69 6e 74 29 28 70 4f 70  Addr = (int)(pOp
12290 20 2d 20 70 2d 3e 61 4f 70 29 3b 0a 20 20 20 20   - p->aOp);.    
122a0 69 66 28 20 28 70 2d 3e 70 46 72 61 6d 65 2d 3e  if( (p->pFrame->
122b0 61 4f 6e 63 65 5b 69 41 64 64 72 2f 38 5d 20 26  aOnce[iAddr/8] &
122c0 20 28 31 3c 3c 28 69 41 64 64 72 20 26 20 37 29   (1<<(iAddr & 7)
122d0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 56  ))!=0 ){.      V
122e0 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 31  dbeBranchTaken(1
122f0 2c 20 32 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  , 2);.      goto
12300 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
12310 20 7d 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65   }.    p->pFrame
12320 2d 3e 61 4f 6e 63 65 5b 69 41 64 64 72 2f 38 5d  ->aOnce[iAddr/8]
12330 20 7c 3d 20 31 3c 3c 28 69 41 64 64 72 20 26 20   |= 1<<(iAddr & 
12340 37 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  7);.  }else{.   
12350 20 69 66 28 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70   if( p->aOp[0].p
12360 31 3d 3d 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  1==pOp->p1 ){.  
12370 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
12380 6b 65 6e 28 31 2c 20 32 29 3b 0a 20 20 20 20 20  ken(1, 2);.     
12390 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
123a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 56 64  ;.    }.  }.  Vd
123b0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c  beBranchTaken(0,
123c0 20 32 29 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d   2);.  pOp->p1 =
123d0 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3b 0a 20   p->aOp[0].p1;. 
123e0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
123f0 63 6f 64 65 3a 20 49 66 20 50 31 20 50 32 20 50  code: If P1 P2 P
12400 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
12410 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61   to P2 if the va
12420 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
12430 50 31 20 69 73 20 74 72 75 65 2e 20 20 54 68 65  P1 is true.  The
12440 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e   value.** is con
12450 73 69 64 65 72 65 64 20 74 72 75 65 20 69 66 20  sidered true if 
12460 69 74 20 69 73 20 6e 75 6d 65 72 69 63 20 61 6e  it is numeric an
12470 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20  d non-zero.  If 
12480 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20  the value.** in 
12490 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  P1 is NULL then 
124a0 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
124b0 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33 20   and only if P3 
124c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  is non-zero..*/.
124d0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74  /* Opcode: IfNot
124e0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
124f0 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
12500 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
12510 65 67 69 73 74 65 72 20 50 31 20 69 73 20 46 61  egister P1 is Fa
12520 6c 73 65 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  lse.  The value.
12530 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
12540 20 66 61 6c 73 65 20 69 66 20 69 74 20 68 61 73   false if it has
12550 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65   a numeric value
12560 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20 74 68   of zero.  If th
12570 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31  e value.** in P1
12580 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
12590 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61  ke the jump if a
125a0 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33 20 69 73  nd only if P3 is
125b0 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 63 61   non-zero..*/.ca
125c0 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20 20 20  se OP_If:       
125d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
125e0 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65 20 4f  p, in1 */.case O
125f0 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20 20  P_IfNot: {      
12600 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
12610 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a 20  n1 */.  int c;. 
12620 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
12630 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49  p->p1];.  if( pI
12640 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
12650 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63 20 3d 20  Null ){.    c = 
12660 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c 73 65  pOp->p3;.  }else
12670 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12680 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
12690 49 4e 54 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  INT.    c = sqli
126a0 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
126b0 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c 73 65 0a  pIn1)!=0;.#else.
126c0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
126d0 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e  dbeRealValue(pIn
126e0 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64 69 66 0a  1)!=0.0;.#endif.
126f0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
12700 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20 29 20  ode==OP_IfNot ) 
12710 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20 56 64  c = !c;.  }.  Vd
12720 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 63 21  beBranchTaken(c!
12730 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 63 20  =0, 2);.  if( c 
12740 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
12750 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
12760 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
12770 65 3a 20 49 73 4e 75 6c 6c 20 50 31 20 50 32 20  e: IsNull P1 P2 
12780 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
12790 73 3a 20 69 66 20 72 5b 50 31 5d 3d 3d 4e 55 4c  s: if r[P1]==NUL
127a0 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20  L goto P2.**.** 
127b0 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68  Jump to P2 if th
127c0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
127d0 74 65 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e 0a  ter P1 is NULL..
127e0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c  */.case OP_IsNul
127f0 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l: {            
12800 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49 53  /* same as TK_IS
12810 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20  NULL, jump, in1 
12820 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
12830 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64  m[pOp->p1];.  Vd
12840 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 28  beBranchTaken( (
12850 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
12860 4d 5f 4e 75 6c 6c 29 21 3d 30 2c 20 32 29 3b 0a  M_Null)!=0, 2);.
12870 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
12880 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d  gs & MEM_Null)!=
12890 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
128a0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
128b0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
128c0 6f 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20  ode: NotNull P1 
128d0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
128e0 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d  psis: if r[P1]!=
128f0 4e 55 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  NULL goto P2.**.
12900 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  ** Jump to P2 if
12910 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
12920 67 69 73 74 65 72 20 50 31 20 69 73 20 6e 6f 74  gister P1 is not
12930 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65   NULL.  .*/.case
12940 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20   OP_NotNull: {  
12950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
12960 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c  e as TK_NOTNULL,
12970 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
12980 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
12990 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61  ->p1];.  VdbeBra
129a0 6e 63 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d  nchTaken( (pIn1-
129b0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
129c0 6c 29 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28  l)==0, 2);.  if(
129d0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
129e0 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  MEM_Null)==0 ){.
129f0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
12a00 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
12a10 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
12a20 49 66 4e 75 6c 6c 52 6f 77 20 50 31 20 50 32 20  IfNullRow P1 P2 
12a30 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
12a40 69 73 3a 20 69 66 20 50 31 2e 6e 75 6c 6c 52 6f  is: if P1.nullRo
12a50 77 20 74 68 65 6e 20 72 5b 50 33 5d 3d 4e 55 4c  w then r[P3]=NUL
12a60 4c 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a  L, goto P2.**.**
12a70 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 73 6f   Check the curso
12a80 72 20 50 31 20 74 6f 20 73 65 65 20 69 66 20 69  r P1 to see if i
12a90 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
12aa0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 4e 55 4c  ointing at a NUL
12ab0 4c 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 69 74 20  L row..** If it 
12ac0 69 73 2c 20 74 68 65 6e 20 73 65 74 20 72 65 67  is, then set reg
12ad0 69 73 74 65 72 20 50 33 20 74 6f 20 4e 55 4c 4c  ister P3 to NULL
12ae0 20 61 6e 64 20 6a 75 6d 70 20 69 6d 6d 65 64 69   and jump immedi
12af0 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20  ately to P2..** 
12b00 49 66 20 50 31 20 69 73 20 6e 6f 74 20 6f 6e 20  If P1 is not on 
12b10 61 20 4e 55 4c 4c 20 72 6f 77 2c 20 74 68 65 6e  a NULL row, then
12b20 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 77 69   fall through wi
12b30 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 6e 79  thout making any
12b40 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a  .** changes..*/.
12b50 63 61 73 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f  case OP_IfNullRo
12b60 77 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20  w: {         /* 
12b70 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74  jump */.  assert
12b80 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
12b90 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
12ba0 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
12bb0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
12bc0 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]!=0 );.  if( p-
12bd0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d  >apCsr[pOp->p1]-
12be0 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  >nullRow ){.    
12bf0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
12c00 74 4e 75 6c 6c 28 61 4d 65 6d 20 2b 20 70 4f 70  tNull(aMem + pOp
12c10 2d 3e 70 33 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ->p3);.    goto 
12c20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
12c30 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
12c40 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31  pcode: Column P1
12c50 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
12c60 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
12c70 50 58 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  PX.**.** Interpr
12c80 65 74 20 74 68 65 20 64 61 74 61 20 74 68 61 74  et the data that
12c90 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74   cursor P1 point
12ca0 73 20 74 6f 20 61 73 20 61 20 73 74 72 75 63 74  s to as a struct
12cb0 75 72 65 20 62 75 69 6c 74 20 75 73 69 6e 67 0a  ure built using.
12cc0 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ** the MakeRecor
12cd0 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
12ce0 28 53 65 65 20 74 68 65 20 4d 61 6b 65 52 65 63  (See the MakeRec
12cf0 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  ord opcode for a
12d00 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66  dditional.** inf
12d10 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
12d20 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65  he format of the
12d30 20 64 61 74 61 2e 29 20 20 45 78 74 72 61 63 74   data.)  Extract
12d40 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d   the P2-th colum
12d50 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 72  n.** from this r
12d60 65 63 6f 72 64 2e 20 20 49 66 20 74 68 65 72 65  ecord.  If there
12d70 20 61 72 65 20 6c 65 73 73 20 74 68 61 74 20 28   are less that (
12d80 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65 73  P2+1) .** values
12d90 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20   in the record, 
12da0 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 0a  extract a NULL..
12db0 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
12dc0 65 78 74 72 61 63 74 65 64 20 69 73 20 73 74 6f  extracted is sto
12dd0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
12de0 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P3..**.** If the
12df0 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73   record contains
12e00 20 66 65 77 65 72 20 74 68 61 6e 20 50 32 20 66   fewer than P2 f
12e10 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 78 74 72  ields, then extr
12e20 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c  act a NULL.  Or,
12e30 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 20 61 72  .** if the P4 ar
12e40 67 75 6d 65 6e 74 20 69 73 20 61 20 50 34 5f 4d  gument is a P4_M
12e50 45 4d 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  EM use the value
12e60 20 6f 66 20 74 68 65 20 50 34 20 61 72 67 75 6d   of the P4 argum
12e70 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 20 72 65  ent as.** the re
12e80 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sult..**.** If t
12e90 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  he OPFLAG_CLEARC
12ea0 41 43 48 45 20 62 69 74 20 69 73 20 73 65 74 20  ACHE bit is set 
12eb0 6f 6e 20 50 35 20 61 6e 64 20 50 31 20 69 73 20  on P5 and P1 is 
12ec0 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63  a pseudo-table c
12ed0 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20 74  ursor,.** then t
12ee0 68 65 20 63 61 63 68 65 20 6f 66 20 74 68 65 20  he cache of the 
12ef0 63 75 72 73 6f 72 20 69 73 20 72 65 73 65 74 20  cursor is reset 
12f00 70 72 69 6f 72 20 74 6f 20 65 78 74 72 61 63 74  prior to extract
12f10 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a  ing the column..
12f20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 4f 50 5f  ** The first OP_
12f30 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20 61  Column against a
12f40 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 61 66   pseudo-table af
12f50 74 65 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ter the value of
12f60 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
12f70 72 65 67 69 73 74 65 72 20 68 61 73 20 63 68 61  register has cha
12f80 6e 67 65 64 20 73 68 6f 75 6c 64 20 68 61 76 65  nged should have
12f90 20 74 68 69 73 20 62 69 74 20 73 65 74 2e 0a 2a   this bit set..*
12fa0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
12fb0 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e 64  AG_LENGTHARG and
12fc0 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
12fd0 47 20 62 69 74 73 20 61 72 65 20 73 65 74 20 6f  G bits are set o
12fe0 6e 20 50 35 20 74 68 65 6e 0a 2a 2a 20 74 68 65  n P5 then.** the
12ff0 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61   result is guara
13000 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62 65  nteed to only be
13010 20 75 73 65 64 20 61 73 20 74 68 65 20 61 72 67   used as the arg
13020 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67 74  ument of a lengt
13030 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f 66  h().** or typeof
13040 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65 73  () function, res
13050 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
13060 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61 72 67 65  loading of large
13070 20 62 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a 2a   blobs can be.**
13080 20 73 6b 69 70 70 65 64 20 66 6f 72 20 6c 65 6e   skipped for len
13090 67 74 68 28 29 20 61 6e 64 20 61 6c 6c 20 63 6f  gth() and all co
130a0 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63 61  ntent loading ca
130b0 6e 20 62 65 20 73 6b 69 70 70 65 64 20 66 6f 72  n be skipped for
130c0 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63 61   typeof()..*/.ca
130d0 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a  se OP_Column: {.
130e0 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20    int p2;       
130f0 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e       /* column n
13100 75 6d 62 65 72 20 74 6f 20 72 65 74 72 69 65 76  umber to retriev
13110 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  e */.  VdbeCurso
13120 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65  r *pC;    /* The
13130 20 56 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a   VDBE cursor */.
13140 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
13150 72 3b 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65  r;   /* The BTre
13160 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33  e cursor */.  u3
13170 32 20 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20  2 *aOffset;     
13180 20 2f 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20 69   /* aOffset[i] i
13190 73 20 6f 66 66 73 65 74 20 74 6f 20 73 74 61 72  s offset to star
131a0 74 20 6f 66 20 64 61 74 61 20 66 6f 72 20 69 2d  t of data for i-
131b0 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  th column */.  i
131c0 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
131d0 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20    /* The length 
131e0 6f 66 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  of the serialize
131f0 64 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63  d data for the c
13200 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
13210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13220 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
13230 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20 20  .  Mem *pDest;  
13240 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
13250 6f 20 77 72 69 74 65 20 74 68 65 20 65 78 74 72  o write the extr
13260 61 63 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20  acted value */. 
13270 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20   Mem sMem;      
13280 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69      /* For stori
13290 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 62 65  ng the record be
132a0 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20  ing decoded */. 
132b0 20 63 6f 6e 73 74 20 75 38 20 2a 7a 44 61 74 61   const u8 *zData
132c0 3b 20 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74  ;   /* Part of t
132d0 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20  he record being 
132e0 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e  decoded */.  con
132f0 73 74 20 75 38 20 2a 7a 48 64 72 3b 20 20 20 20  st u8 *zHdr;    
13300 2f 2a 20 4e 65 78 74 20 75 6e 70 61 72 73 65 64  /* Next unparsed
13310 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
13320 64 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  der */.  const u
13330 38 20 2a 7a 45 6e 64 48 64 72 3b 20 2f 2a 20 50  8 *zEndHdr; /* P
13340 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
13350 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20 68  byte after the h
13360 65 61 64 65 72 20 2a 2f 0a 20 20 75 36 34 20 6f  eader */.  u64 o
13370 66 66 73 65 74 36 34 3b 20 20 20 20 20 20 2f 2a  ffset64;      /*
13380 20 36 34 2d 62 69 74 20 6f 66 66 73 65 74 20 2a   64-bit offset *
13390 2f 0a 20 20 75 33 32 20 74 3b 20 20 20 20 20 20  /.  u32 t;      
133a0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 79 70 65         /* A type
133b0 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 72   code from the r
133c0 65 63 6f 72 64 20 68 65 61 64 65 72 20 2a 2f 0a  ecord header */.
133d0 20 20 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20 20    Mem *pReg;    
133e0 20 20 20 20 20 2f 2a 20 50 73 65 75 64 6f 54 61       /* PseudoTa
133f0 62 6c 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  ble input regist
13400 65 72 20 2a 2f 0a 0a 20 20 70 43 20 3d 20 70 2d  er */..  pC = p-
13410 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
13420 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
13430 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
13440 72 73 6f 72 20 63 61 63 68 65 20 69 73 20 73 74  rsor cache is st
13450 61 6c 65 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  ale (meaning it 
13460 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
13470 20 70 6f 69 6e 74 20 61 74 0a 20 20 2a 2a 20 74   point at.  ** t
13480 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 29 20  he correct row) 
13490 74 68 65 6e 20 62 72 69 6e 67 20 69 74 20 75 70  then bring it up
134a0 2d 74 6f 2d 64 61 74 65 20 62 79 20 64 6f 69 6e  -to-date by doin
134b0 67 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  g the necessary 
134c0 0a 20 20 2a 2a 20 42 2d 54 72 65 65 20 73 65 65  .  ** B-Tree see
134d0 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  k. */.  rc = sql
134e0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
134f0 76 65 74 6f 28 26 70 43 2c 20 26 70 32 29 3b 0a  veto(&pC, &p2);.
13500 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
13510 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
13520 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  or;..  assert( p
13530 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
13540 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
13550 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
13560 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65 6d  .  pDest = &aMem
13570 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d  [pOp->p3];.  mem
13580 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
13590 20 70 44 65 73 74 29 3b 0a 20 20 61 73 73 65 72   pDest);.  asser
135a0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
135b0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
135c0 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
135d0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
135e0 72 74 28 20 70 32 3c 70 43 2d 3e 6e 46 69 65 6c  rt( p2<pC->nFiel
135f0 64 20 29 3b 0a 20 20 61 4f 66 66 73 65 74 20 3d  d );.  aOffset =
13600 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20 20   pC->aOffset;.  
13610 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
13620 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 56 54  Type!=CURTYPE_VT
13630 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AB );.  assert( 
13640 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55  pC->eCurType!=CU
13650 52 54 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c 20  RTYPE_PSEUDO || 
13660 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20  pC->nullRow );. 
13670 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
13680 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53  rType!=CURTYPE_S
13690 4f 52 54 45 52 20 29 3b 0a 0a 20 20 69 66 28 20  ORTER );..  if( 
136a0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 21  pC->cacheStatus!
136b0 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 20  =p->cacheCtr ){ 
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
136d0 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
136e0 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 69 66 28  -FALSE*/.    if(
136f0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a   pC->nullRow ){.
13700 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 65 43        if( pC->eC
13710 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
13720 50 53 45 55 44 4f 20 29 7b 0a 20 20 20 20 20 20  PSEUDO ){.      
13730 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 73 70 65    /* For the spe
13740 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 73 20  cial case of as 
13750 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 2c 20 74  pseudo-cursor, t
13760 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 66 69  he seekResult fi
13770 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
13780 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 72 65  dentifies the re
13790 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
137a0 73 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  s the record */.
137b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
137c0 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 3e 30  pC->seekResult>0
137d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 67   );.        pReg
137e0 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 73 65 65   = &aMem[pC->see
137f0 6b 52 65 73 75 6c 74 5d 3b 0a 20 20 20 20 20 20  kResult];.      
13800 20 20 61 73 73 65 72 74 28 20 70 52 65 67 2d 3e    assert( pReg->
13810 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
13820 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
13830 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
13840 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Reg) );.        
13850 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20  pC->payloadSize 
13860 3d 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 70 52  = pC->szRow = pR
13870 65 67 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 70  eg->n;.        p
13880 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29 70  C->aRow = (u8*)p
13890 52 65 67 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Reg->z;.      }e
138a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
138b0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
138c0 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  ll(pDest);.     
138d0 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d     goto op_colum
138e0 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  n_out;.      }. 
138f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13900 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70  pCrsr = pC->uc.p
13910 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 61 73  Cursor;.      as
13920 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
13930 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
13940 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
13950 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 20 20  t( pCrsr );.    
13960 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13970 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
13980 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20 20  lid(pCrsr) );.  
13990 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53      pC->payloadS
139a0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ize = sqlite3Btr
139b0 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
139c0 72 73 72 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e  rsr);.      pC->
139d0 61 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 42 74  aRow = sqlite3Bt
139e0 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28  reePayloadFetch(
139f0 70 43 72 73 72 2c 20 26 70 43 2d 3e 73 7a 52 6f  pCrsr, &pC->szRo
13a00 77 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  w);.      assert
13a10 28 20 70 43 2d 3e 73 7a 52 6f 77 3c 3d 70 43 2d  ( pC->szRow<=pC-
13a20 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 29 3b 0a  >payloadSize );.
13a30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
13a40 2d 3e 73 7a 52 6f 77 3c 3d 36 35 35 33 36 20 29  ->szRow<=65536 )
13a50 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 61  ;  /* Maximum pa
13a60 67 65 20 73 69 7a 65 20 69 73 20 36 34 4b 69 42  ge size is 64KiB
13a70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
13a80 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20  ->payloadSize > 
13a90 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b  (u32)db->aLimit[
13aa0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
13ab0 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  GTH] ){.        
13ac0 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
13ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13ae0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
13af0 3d 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 20  = p->cacheCtr;. 
13b00 20 20 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65     pC->iHdrOffse
13b10 74 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  t = getVarint32(
13b20 70 43 2d 3e 61 52 6f 77 2c 20 61 4f 66 66 73 65  pC->aRow, aOffse
13b30 74 5b 30 5d 29 3b 0a 20 20 20 20 70 43 2d 3e 6e  t[0]);.    pC->n
13b40 48 64 72 50 61 72 73 65 64 20 3d 20 30 3b 0a 0a  HdrParsed = 0;..
13b50 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 73 7a 52  .    if( pC->szR
13b60 6f 77 3c 61 4f 66 66 73 65 74 5b 30 5d 20 29 7b  ow<aOffset[0] ){
13b70 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a 41        /*OPTIMIZA
13b80 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a  TION-IF-FALSE*/.
13b90 20 20 20 20 20 20 2f 2a 20 70 43 2d 3e 61 52 6f        /* pC->aRo
13ba0 77 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  w does not have 
13bb0 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
13bc0 72 65 20 72 6f 77 2c 20 62 75 74 20 69 74 20 64  re row, but it d
13bd0 6f 65 73 20 61 74 20 6c 65 61 73 74 0a 20 20 20  oes at least.   
13be0 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 63 6f     ** need to co
13bf0 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20 6f  ver the header o
13c00 66 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 49  f the record.  I
13c10 66 20 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73 20  f pC->aRow does 
13c20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  not contain.    
13c30 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74    ** the complet
13c40 65 20 68 65 61 64 65 72 2c 20 74 68 65 6e 20 73  e header, then s
13c50 65 74 20 69 74 20 74 6f 20 7a 65 72 6f 2c 20 66  et it to zero, f
13c60 6f 72 63 69 6e 67 20 74 68 65 20 68 65 61 64 65  orcing the heade
13c70 72 20 74 6f 20 62 65 0a 20 20 20 20 20 20 2a 2a  r to be.      **
13c80 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
13c90 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 20  ocated. */.     
13ca0 20 70 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a 20   pC->aRow = 0;. 
13cb0 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20 3d       pC->szRow =
13cc0 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61   0;..      /* Ma
13cd0 6b 65 20 73 75 72 65 20 61 20 63 6f 72 72 75 70  ke sure a corrup
13ce0 74 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  t database has n
13cf0 6f 74 20 67 69 76 65 6e 20 75 73 20 61 6e 20 6f  ot given us an o
13d00 76 65 72 73 69 7a 65 20 68 65 61 64 65 72 2e 0a  versize header..
13d10 20 20 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73        ** Do this
13d20 20 6e 6f 77 20 74 6f 20 61 76 6f 69 64 20 61 6e   now to avoid an
13d30 20 6f 76 65 72 73 69 7a 65 20 6d 65 6d 6f 72 79   oversize memory
13d40 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   allocation..   
13d50 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
13d60 79 70 65 20 65 6e 74 72 69 65 73 20 63 61 6e 20  ype entries can 
13d70 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
13d80 20 35 20 62 79 74 65 73 20 65 61 63 68 2e 20 20   5 bytes each.  
13d90 42 75 74 20 34 20 61 6e 64 20 35 20 62 79 74 65  But 4 and 5 byte
13da0 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 73 20  .      ** types 
13db0 75 73 65 20 73 6f 20 6d 75 63 68 20 64 61 74 61  use so much data
13dc0 20 73 70 61 63 65 20 74 68 61 74 20 74 68 65 72   space that ther
13dd0 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34 30  e can only be 40
13de0 39 36 20 61 6e 64 20 33 32 20 6f 66 0a 20 20 20  96 and 32 of.   
13df0 20 20 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73 70     ** them, resp
13e00 65 63 74 69 76 65 6c 79 2e 20 20 53 6f 20 74 68  ectively.  So th
13e10 65 20 6d 61 78 69 6d 75 6d 20 68 65 61 64 65 72  e maximum header
13e20 20 6c 65 6e 67 74 68 20 72 65 73 75 6c 74 73 20   length results 
13e30 66 72 6f 6d 20 61 0a 20 20 20 20 20 20 2a 2a 20  from a.      ** 
13e40 33 2d 62 79 74 65 20 74 79 70 65 20 66 6f 72 20  3-byte type for 
13e50 65 61 63 68 20 6f 66 20 74 68 65 20 6d 61 78 69  each of the maxi
13e60 6d 75 6d 20 6f 66 20 33 32 37 36 38 20 63 6f 6c  mum of 32768 col
13e70 75 6d 6e 73 20 70 6c 75 73 20 74 68 72 65 65 0a  umns plus three.
13e80 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 20 62        ** extra b
13e90 79 74 65 73 20 66 6f 72 20 74 68 65 20 68 65 61  ytes for the hea
13ea0 64 65 72 20 6c 65 6e 67 74 68 20 69 74 73 65 6c  der length itsel
13eb0 66 2e 20 20 33 32 37 36 38 2a 33 20 2b 20 33 20  f.  32768*3 + 3 
13ec0 3d 20 39 38 33 30 37 2e 0a 20 20 20 20 20 20 2a  = 98307..      *
13ed0 2f 0a 20 20 20 20 20 20 69 66 28 20 61 4f 66 66  /.      if( aOff
13ee0 73 65 74 5b 30 5d 20 3e 20 39 38 33 30 37 20 7c  set[0] > 98307 |
13ef0 7c 20 61 4f 66 66 73 65 74 5b 30 5d 20 3e 20 70  | aOffset[0] > p
13f00 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 29  C->payloadSize )
13f10 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f  {.        goto o
13f20 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75 70 74  p_column_corrupt
13f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13f40 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
13f50 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
13f60 61 74 69 6f 6e 2e 20 20 42 79 20 73 6b 69 70 70  ation.  By skipp
13f70 69 6e 67 20 6f 76 65 72 20 74 68 65 20 66 69 72  ing over the fir
13f80 73 74 20 66 65 77 20 74 65 73 74 73 0a 20 20 20  st few tests.   
13f90 20 20 20 2a 2a 20 28 65 78 3a 20 70 43 2d 3e 6e     ** (ex: pC->n
13fa0 48 64 72 50 61 72 73 65 64 3c 3d 70 32 29 20 69  HdrParsed<=p2) i
13fb0 6e 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 69  n the next secti
13fc0 6f 6e 2c 20 77 65 20 61 63 68 69 65 76 65 20 61  on, we achieve a
13fd0 0a 20 20 20 20 20 20 2a 2a 20 6d 65 61 73 75 72  .      ** measur
13fe0 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  able performance
13ff0 20 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a   gain..      **.
14000 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72        ** This br
14010 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 65 76  anch is taken ev
14020 65 6e 20 69 66 20 61 4f 66 66 73 65 74 5b 30 5d  en if aOffset[0]
14030 3d 3d 30 2e 20 20 53 75 63 68 20 61 20 72 65 63  ==0.  Such a rec
14040 6f 72 64 20 69 73 20 6e 65 76 65 72 0a 20 20 20  ord is never.   
14050 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20     ** generated 
14060 62 79 20 53 51 4c 69 74 65 2c 20 61 6e 64 20 63  by SQLite, and c
14070 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65 72  ould be consider
14080 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2c 20 62  ed corruption, b
14090 75 74 20 77 65 0a 20 20 20 20 20 20 2a 2a 20 61  ut we.      ** a
140a0 63 63 65 70 74 20 69 74 20 66 6f 72 20 68 69 73  ccept it for his
140b0 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
140c0 20 20 57 68 65 6e 20 61 4f 66 66 73 65 74 5b 30    When aOffset[0
140d0 5d 3d 3d 30 2c 20 74 68 65 20 63 6f 64 65 20 74  ]==0, the code t
140e0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 72 61  his.      ** bra
140f0 6e 63 68 20 6a 75 6d 70 73 20 74 6f 20 72 65 61  nch jumps to rea
14100 64 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ds past the end 
14110 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 62  of the record, b
14120 75 74 20 6e 65 76 65 72 20 6d 6f 72 65 0a 20 20  ut never more.  
14130 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 20 66 65      ** than a fe
14140 77 20 62 79 74 65 73 2e 20 20 45 76 65 6e 20 69  w bytes.  Even i
14150 66 20 74 68 65 20 72 65 63 6f 72 64 20 6f 63 63  f the record occ
14160 75 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  urs at the end o
14170 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  f the page.     
14180 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61   ** content area
14190 2c 20 74 68 65 20 22 70 61 67 65 20 68 65 61 64  , the "page head
141a0 65 72 22 20 63 6f 6d 65 73 20 61 66 74 65 72 20  er" comes after 
141b0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
141c0 20 61 6e 64 20 73 6f 0a 20 20 20 20 20 20 2a 2a   and so.      **
141d0 20 74 68 69 73 20 6f 76 65 72 72 65 61 64 20 69   this overread i
141e0 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 53 69 6d  s harmless.  Sim
141f0 69 6c 61 72 20 6f 76 65 72 72 65 61 64 73 20 63  ilar overreads c
14200 61 6e 20 6f 63 63 75 72 20 66 6f 72 20 61 20 63  an occur for a c
14210 6f 72 72 75 70 74 0a 20 20 20 20 20 20 2a 2a 20  orrupt.      ** 
14220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
14230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 7a 44       */.      zD
14240 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a  ata = pC->aRow;.
14250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
14260 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32  ->nHdrParsed<=p2
14270 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43   );         /* C
14280 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 6b 69 70 70  onditional skipp
14290 65 64 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ed */.      test
142a0 63 61 73 65 28 20 61 4f 66 66 73 65 74 5b 30 5d  case( aOffset[0]
142b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ==0 );.      got
142c0 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64  o op_column_read
142d0 5f 68 65 61 64 65 72 3b 0a 20 20 20 20 7d 0a 20  _header;.    }. 
142e0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
142f0 72 65 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  re at least the 
14300 66 69 72 73 74 20 70 32 2b 31 20 65 6e 74 72 69  first p2+1 entri
14310 65 73 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  es of the header
14320 20 68 61 76 65 20 62 65 65 6e 0a 20 20 2a 2a 20   have been.  ** 
14330 70 61 72 73 65 64 20 61 6e 64 20 76 61 6c 69 64  parsed and valid
14340 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
14350 69 6e 20 61 4f 66 66 73 65 74 5b 5d 20 61 6e 64  in aOffset[] and
14360 20 70 43 2d 3e 61 54 79 70 65 5b 5d 2e 0a 20 20   pC->aType[]..  
14370 2a 2f 0a 20 20 69 66 28 20 70 43 2d 3e 6e 48 64  */.  if( pC->nHd
14380 72 50 61 72 73 65 64 3c 3d 70 32 20 29 7b 0a 20  rParsed<=p2 ){. 
14390 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
143a0 73 20 6d 6f 72 65 20 68 65 61 64 65 72 20 61 76  s more header av
143b0 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 61 72 73  ailable for pars
143c0 69 6e 67 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ing in the recor
143d0 64 2c 20 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f  d, try.    ** to
143e0 20 65 78 74 72 61 63 74 20 61 64 64 69 74 69 6f   extract additio
143f0 6e 61 6c 20 66 69 65 6c 64 73 20 75 70 20 74 68  nal fields up th
14400 72 6f 75 67 68 20 74 68 65 20 70 32 2b 31 2d 74  rough the p2+1-t
14410 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2f 0a  h field .    */.
14420 20 20 20 20 69 66 28 20 70 43 2d 3e 69 48 64 72      if( pC->iHdr
14430 4f 66 66 73 65 74 3c 61 4f 66 66 73 65 74 5b 30  Offset<aOffset[0
14440 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61  ] ){.      /* Ma
14450 6b 65 20 73 75 72 65 20 7a 44 61 74 61 20 70 6f  ke sure zData po
14460 69 6e 74 73 20 74 6f 20 65 6e 6f 75 67 68 20 6f  ints to enough o
14470 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  f the record to 
14480 63 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72  cover the header
14490 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
144a0 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 7b 0a 20 20  C->aRow==0 ){.  
144b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4d        memset(&sM
144c0 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d  em, 0, sizeof(sM
144d0 65 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em));.        rc
144e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
144f0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 75  mFromBtree(pC->u
14500 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 61 4f  c.pCursor, 0, aO
14510 66 66 73 65 74 5b 30 5d 2c 20 26 73 4d 65 6d 29  ffset[0], &sMem)
14520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
14540 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
14550 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7a  error;.        z
14560 44 61 74 61 20 3d 20 28 75 38 2a 29 73 4d 65 6d  Data = (u8*)sMem
14570 2e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  .z;.      }else{
14580 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d  .        zData =
14590 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20   pC->aRow;.     
145a0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46   }.  .      /* F
145b0 69 6c 6c 20 69 6e 20 70 43 2d 3e 61 54 79 70 65  ill in pC->aType
145c0 5b 69 5d 20 61 6e 64 20 61 4f 66 66 73 65 74 5b  [i] and aOffset[
145d0 69 5d 20 76 61 6c 75 65 73 20 74 68 72 6f 75 67  i] values throug
145e0 68 20 74 68 65 20 70 32 2d 74 68 20 66 69 65 6c  h the p2-th fiel
145f0 64 2e 20 2a 2f 0a 20 20 20 20 6f 70 5f 63 6f 6c  d. */.    op_col
14600 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65 72 3a  umn_read_header:
14610 0a 20 20 20 20 20 20 69 20 3d 20 70 43 2d 3e 6e  .      i = pC->n
14620 48 64 72 50 61 72 73 65 64 3b 0a 20 20 20 20 20  HdrParsed;.     
14630 20 6f 66 66 73 65 74 36 34 20 3d 20 61 4f 66 66   offset64 = aOff
14640 73 65 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 48  set[i];.      zH
14650 64 72 20 3d 20 7a 44 61 74 61 20 2b 20 70 43 2d  dr = zData + pC-
14660 3e 69 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  >iHdrOffset;.   
14670 20 20 20 7a 45 6e 64 48 64 72 20 3d 20 7a 44 61     zEndHdr = zDa
14680 74 61 20 2b 20 61 4f 66 66 73 65 74 5b 30 5d 3b  ta + aOffset[0];
14690 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
146a0 20 7a 48 64 72 3e 3d 7a 45 6e 64 48 64 72 20 29   zHdr>=zEndHdr )
146b0 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
146c0 20 20 20 20 69 66 28 20 28 74 20 3d 20 7a 48 64      if( (t = zHd
146d0 72 5b 30 5d 29 3c 30 78 38 30 20 29 7b 0a 20 20  r[0])<0x80 ){.  
146e0 20 20 20 20 20 20 20 20 7a 48 64 72 2b 2b 3b 0a          zHdr++;.
146f0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
14700 36 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  64 += sqlite3Vdb
14710 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79  eOneByteSerialTy
14720 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20  peLen(t);.      
14730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14740 20 20 20 7a 48 64 72 20 2b 3d 20 73 71 6c 69 74     zHdr += sqlit
14750 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 7a 48  e3GetVarint32(zH
14760 64 72 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 20  dr, &t);.       
14770 20 20 20 6f 66 66 73 65 74 36 34 20 2b 3d 20 73     offset64 += s
14780 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14790 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20  TypeLen(t);.    
147a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43      }.        pC
147b0 2d 3e 61 54 79 70 65 5b 69 2b 2b 5d 20 3d 20 74  ->aType[i++] = t
147c0 3b 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73 65  ;.        aOffse
147d0 74 5b 69 5d 20 3d 20 28 75 33 32 29 28 6f 66 66  t[i] = (u32)(off
147e0 73 65 74 36 34 20 26 20 30 78 66 66 66 66 66 66  set64 & 0xffffff
147f0 66 66 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ff);.      }whil
14800 65 28 20 69 3c 3d 70 32 20 26 26 20 7a 48 64 72  e( i<=p2 && zHdr
14810 3c 7a 45 6e 64 48 64 72 20 29 3b 0a 0a 20 20 20  <zEndHdr );..   
14820 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
14830 20 69 73 20 63 6f 72 72 75 70 74 20 69 66 20 61   is corrupt if a
14840 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
14850 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
14860 20 20 20 20 2a 2a 20 28 31 29 20 74 68 65 20 62      ** (1) the b
14870 79 74 65 73 20 6f 66 20 74 68 65 20 68 65 61 64  ytes of the head
14880 65 72 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  er extend past t
14890 68 65 20 64 65 63 6c 61 72 65 64 20 68 65 61 64  he declared head
148a0 65 72 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  er size.      **
148b0 20 28 32 29 20 74 68 65 20 65 6e 74 69 72 65 20   (2) the entire 
148c0 68 65 61 64 65 72 20 77 61 73 20 75 73 65 64 20  header was used 
148d0 62 75 74 20 6e 6f 74 20 61 6c 6c 20 64 61 74 61  but not all data
148e0 20 77 61 73 20 75 73 65 64 0a 20 20 20 20 20 20   was used.      
148f0 2a 2a 20 28 33 29 20 74 68 65 20 65 6e 64 20 6f  ** (3) the end o
14900 66 20 74 68 65 20 64 61 74 61 20 65 78 74 65 6e  f the data exten
14910 64 73 20 62 65 79 6f 6e 64 20 74 68 65 20 65 6e  ds beyond the en
14920 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e  d of the record.
14930 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14940 69 66 28 20 28 7a 48 64 72 3e 3d 7a 45 6e 64 48  if( (zHdr>=zEndH
14950 64 72 20 26 26 20 28 7a 48 64 72 3e 7a 45 6e 64  dr && (zHdr>zEnd
14960 48 64 72 20 7c 7c 20 6f 66 66 73 65 74 36 34 21  Hdr || offset64!
14970 3d 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65  =pC->payloadSize
14980 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 66  )).       || (of
14990 66 73 65 74 36 34 20 3e 20 70 43 2d 3e 70 61 79  fset64 > pC->pay
149a0 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20 20 20 20  loadSize).      
149b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
149c0 4f 66 66 73 65 74 5b 30 5d 3d 3d 30 20 29 7b 0a  Offset[0]==0 ){.
149d0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b            i = 0;
149e0 0a 20 20 20 20 20 20 20 20 20 20 7a 48 64 72 20  .          zHdr 
149f0 3d 20 7a 45 6e 64 48 64 72 3b 0a 20 20 20 20 20  = zEndHdr;.     
14a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14a10 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77      if( pC->aRow
14a20 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
14a30 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65  eMemRelease(&sMe
14a40 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  m);.          go
14a50 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72  to op_column_cor
14a60 72 75 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rupt;.        }.
14a70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
14a80 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20  C->nHdrParsed = 
14a90 69 3b 0a 20 20 20 20 20 20 70 43 2d 3e 69 48 64  i;.      pC->iHd
14aa0 72 4f 66 66 73 65 74 20 3d 20 28 75 33 32 29 28  rOffset = (u32)(
14ab0 7a 48 64 72 20 2d 20 7a 44 61 74 61 29 3b 0a 20  zHdr - zData);. 
14ac0 20 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f       if( pC->aRo
14ad0 77 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  w==0 ) sqlite3Vd
14ae0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d  beMemRelease(&sM
14af0 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  em);.    }else{.
14b00 20 20 20 20 20 20 74 20 3d 20 30 3b 0a 20 20 20        t = 0;.   
14b10 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 66   }..    /* If af
14b20 74 65 72 20 74 72 79 69 6e 67 20 74 6f 20 65 78  ter trying to ex
14b30 74 72 61 63 74 20 6e 65 77 20 65 6e 74 72 69 65  tract new entrie
14b40 73 20 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65  s from the heade
14b50 72 2c 20 6e 48 64 72 50 61 72 73 65 64 20 69 73  r, nHdrParsed is
14b60 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 6e 6f  .    ** still no
14b70 74 20 75 70 20 74 6f 20 70 32 2c 20 74 68 61 74  t up to p2, that
14b80 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14b90 72 65 63 6f 72 64 20 68 61 73 20 66 65 77 65 72  record has fewer
14ba0 20 74 68 61 6e 20 70 32 0a 20 20 20 20 2a 2a 20   than p2.    ** 
14bb0 63 6f 6c 75 6d 6e 73 2e 20 20 53 6f 20 74 68 65  columns.  So the
14bc0 20 72 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20   result will be 
14bd0 65 69 74 68 65 72 20 74 68 65 20 64 65 66 61 75  either the defau
14be0 6c 74 20 76 61 6c 75 65 20 6f 72 20 61 20 4e 55  lt value or a NU
14bf0 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  LL..    */.    i
14c00 66 28 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65  f( pC->nHdrParse
14c10 64 3c 3d 70 32 20 29 7b 0a 20 20 20 20 20 20 69  d<=p2 ){.      i
14c20 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
14c30 50 34 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  P4_MEM ){.      
14c40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
14c50 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73  ShallowCopy(pDes
14c60 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c  t, pOp->p4.pMem,
14c70 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20   MEM_Static);.  
14c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14c90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
14ca0 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b  mSetNull(pDest);
14cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
14cc0 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75  oto op_column_ou
14cd0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
14ce0 7b 0a 20 20 20 20 74 20 3d 20 70 43 2d 3e 61 54  {.    t = pC->aT
14cf0 79 70 65 5b 70 32 5d 3b 0a 20 20 7d 0a 0a 20 20  ype[p2];.  }..  
14d00 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 63  /* Extract the c
14d10 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 70  ontent for the p
14d20 32 2b 31 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20  2+1-th column.  
14d30 43 6f 6e 74 72 6f 6c 20 63 61 6e 20 6f 6e 6c 79  Control can only
14d40 0a 20 20 2a 2a 20 72 65 61 63 68 20 74 68 69 73  .  ** reach this
14d50 20 70 6f 69 6e 74 20 69 66 20 61 4f 66 66 73 65   point if aOffse
14d60 74 5b 70 32 5d 2c 20 61 4f 66 66 73 65 74 5b 70  t[p2], aOffset[p
14d70 32 2b 31 5d 2c 20 61 6e 64 20 70 43 2d 3e 61 54  2+1], and pC->aT
14d80 79 70 65 5b 70 32 5d 20 61 72 65 0a 20 20 2a 2a  ype[p2] are.  **
14d90 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 20 20 2a 2f   all valid..  */
14da0 0a 20 20 61 73 73 65 72 74 28 20 70 32 3c 70 43  .  assert( p2<pC
14db0 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 29 3b 0a  ->nHdrParsed );.
14dc0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
14dd0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
14de0 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
14df0 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
14e00 74 73 28 70 44 65 73 74 29 20 29 3b 0a 20 20 69  ts(pDest) );.  i
14e10 66 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  f( VdbeMemDynami
14e20 63 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  c(pDest) ){.    
14e30 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
14e40 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20  tNull(pDest);.  
14e50 7d 0a 20 20 61 73 73 65 72 74 28 20 74 3d 3d 70  }.  assert( t==p
14e60 43 2d 3e 61 54 79 70 65 5b 70 32 5d 20 29 3b 0a  C->aType[p2] );.
14e70 20 20 69 66 28 20 70 43 2d 3e 73 7a 52 6f 77 3e    if( pC->szRow>
14e80 3d 61 4f 66 66 73 65 74 5b 70 32 2b 31 5d 20 29  =aOffset[p2+1] )
14e90 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
14ea0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
14eb0 20 77 68 65 72 65 20 74 68 65 20 64 65 73 69 72   where the desir
14ec0 65 64 20 63 6f 6e 74 65 6e 74 20 66 69 74 73 20  ed content fits 
14ed0 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  on the original.
14ee0 20 20 20 20 2a 2a 20 70 61 67 65 20 2d 20 77 68      ** page - wh
14ef0 65 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ere the content 
14f00 69 73 20 6e 6f 74 20 6f 6e 20 61 6e 20 6f 76 65  is not on an ove
14f10 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20  rflow page */.  
14f20 20 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52    zData = pC->aR
14f30 6f 77 20 2b 20 61 4f 66 66 73 65 74 5b 70 32 5d  ow + aOffset[p2]
14f40 3b 0a 20 20 20 20 69 66 28 20 74 3c 31 32 20 29  ;.    if( t<12 )
14f50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14f60 64 62 65 53 65 72 69 61 6c 47 65 74 28 7a 44 61  dbeSerialGet(zDa
14f70 74 61 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20  ta, t, pDest);. 
14f80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14f90 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
14fa0 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
14fb0 6e 67 2c 20 77 65 20 6e 65 65 64 20 61 20 70 65  ng, we need a pe
14fc0 72 73 69 73 74 65 6e 74 20 76 61 6c 75 65 2c 20  rsistent value, 
14fd0 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 20 4d  not.      ** a M
14fe0 45 4d 5f 45 70 68 65 6d 20 76 61 6c 75 65 2e 20  EM_Ephem value. 
14ff0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
15000 61 20 66 61 73 74 20 73 68 6f 72 74 2d 63 75 74  a fast short-cut
15010 20 74 68 61 74 20 69 73 20 65 71 75 69 76 61 6c   that is equival
15020 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ent.      ** to 
15030 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 56  calling sqlite3V
15040 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61  dbeSerialGet() a
15050 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
15060 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 29 2e 0a  ephemeralize()..
15070 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
15080 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
15090 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
150a0 42 6c 6f 62 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  Blob, MEM_Str|ME
150b0 4d 5f 54 65 72 6d 20 7d 3b 0a 20 20 20 20 20 20  M_Term };.      
150c0 70 44 65 73 74 2d 3e 6e 20 3d 20 6c 65 6e 20 3d  pDest->n = len =
150d0 20 28 74 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20   (t-12)/2;.     
150e0 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e   pDest->enc = en
150f0 63 6f 64 69 6e 67 3b 0a 20 20 20 20 20 20 69 66  coding;.      if
15100 28 20 70 44 65 73 74 2d 3e 73 7a 4d 61 6c 6c 6f  ( pDest->szMallo
15110 63 20 3c 20 6c 65 6e 2b 32 20 29 7b 0a 20 20 20  c < len+2 ){.   
15120 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67       pDest->flag
15130 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
15140 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
15150 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 44 65  3VdbeMemGrow(pDe
15160 73 74 2c 20 6c 65 6e 2b 32 2c 20 30 29 20 29 20  st, len+2, 0) ) 
15170 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
15180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15190 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20 70 44 65    pDest->z = pDe
151a0 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20  st->zMalloc;.   
151b0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
151c0 79 28 70 44 65 73 74 2d 3e 7a 2c 20 7a 44 61 74  y(pDest->z, zDat
151d0 61 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 70  a, len);.      p
151e0 44 65 73 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 30  Dest->z[len] = 0
151f0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a  ;.      pDest->z
15200 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20  [len+1] = 0;.   
15210 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20     pDest->flags 
15220 3d 20 61 46 6c 61 67 5b 74 26 31 5d 3b 0a 20 20  = aFlag[t&1];.  
15230 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
15240 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e   pDest->enc = en
15250 63 6f 64 69 6e 67 3b 0a 20 20 20 20 2f 2a 20 54  coding;.    /* T
15260 68 69 73 20 62 72 61 6e 63 68 20 68 61 70 70 65  his branch happe
15270 6e 73 20 6f 6e 6c 79 20 77 68 65 6e 20 63 6f 6e  ns only when con
15280 74 65 6e 74 20 69 73 20 6f 6e 20 6f 76 65 72 66  tent is on overf
15290 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  low pages */.   
152a0 20 69 66 28 20 28 28 70 4f 70 2d 3e 70 35 20 26   if( ((pOp->p5 &
152b0 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
152c0 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
152d0 41 52 47 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ARG))!=0.       
152e0 20 20 20 26 26 20 28 28 74 3e 3d 31 32 20 26 26     && ((t>=12 &&
152f0 20 28 74 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70   (t&1)==0) || (p
15300 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
15310 54 59 50 45 4f 46 41 52 47 29 21 3d 30 29 29 0a  TYPEOFARG)!=0)).
15320 20 20 20 20 20 7c 7c 20 28 6c 65 6e 20 3d 20 73       || (len = s
15330 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15340 54 79 70 65 4c 65 6e 28 74 29 29 3d 3d 30 0a 20  TypeLen(t))==0. 
15350 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43     ){.      /* C
15360 6f 6e 74 65 6e 74 20 69 73 20 69 72 72 65 6c 65  ontent is irrele
15370 76 61 6e 74 20 66 6f 72 0a 20 20 20 20 20 20 2a  vant for.      *
15380 2a 20 20 20 20 31 2e 20 74 68 65 20 74 79 70 65  *    1. the type
15390 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 0a 20  of() function,. 
153a0 20 20 20 20 20 2a 2a 20 20 20 20 32 2e 20 74 68       **    2. th
153b0 65 20 6c 65 6e 67 74 68 28 58 29 20 66 75 6e 63  e length(X) func
153c0 74 69 6f 6e 20 69 66 20 58 20 69 73 20 61 20 62  tion if X is a b
153d0 6c 6f 62 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  lob, and.      *
153e0 2a 20 20 20 20 33 2e 20 69 66 20 74 68 65 20 63  *    3. if the c
153f0 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20 69 73  ontent length is
15400 20 7a 65 72 6f 2e 0a 20 20 20 20 20 20 2a 2a 20   zero..      ** 
15410 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20 77  So we might as w
15420 65 6c 6c 20 75 73 65 20 62 6f 67 75 73 20 63 6f  ell use bogus co
15430 6e 74 65 6e 74 20 72 61 74 68 65 72 20 74 68 61  ntent rather tha
15440 6e 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20  n reading.      
15450 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ** content from 
15460 64 69 73 6b 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  disk. .      **.
15470 20 20 20 20 20 20 2a 2a 20 41 6c 74 68 6f 75 67        ** Althoug
15480 68 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  h sqlite3VdbeSer
15490 69 61 6c 47 65 74 28 29 20 6d 61 79 20 72 65 61  ialGet() may rea
154a0 64 20 61 74 20 6d 6f 73 74 20 38 20 62 79 74 65  d at most 8 byte
154b0 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  s from the.     
154c0 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
154d0 64 20 74 6f 20 69 74 2c 20 64 65 62 75 67 67 69  d to it, debuggi
154e0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 56 64 62 65  ng function Vdbe
154f0 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 29  MemPrettyPrint()
15500 20 6d 61 79 0a 20 20 20 20 20 20 2a 2a 20 72 65   may.      ** re
15510 61 64 20 75 70 20 74 6f 20 31 36 2e 20 53 6f 20  ad up to 16. So 
15520 31 36 20 62 79 74 65 73 20 6f 66 20 62 6f 67 75  16 bytes of bogu
15530 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 73 75 70  s content is sup
15540 70 6c 69 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  plied..      */.
15550 20 20 20 20 20 20 73 74 61 74 69 63 20 75 38 20        static u8 
15560 61 5a 65 72 6f 5b 31 36 5d 3b 20 20 2f 2a 20 54  aZero[16];  /* T
15570 68 69 73 20 69 73 20 74 68 65 20 62 6f 67 75 73  his is the bogus
15580 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
15590 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
155a0 69 61 6c 47 65 74 28 61 5a 65 72 6f 2c 20 74 2c  ialGet(aZero, t,
155b0 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c   pDest);.    }el
155c0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
155d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
155e0 6d 42 74 72 65 65 28 70 43 2d 3e 75 63 2e 70 43  mBtree(pC->uc.pC
155f0 75 72 73 6f 72 2c 20 61 4f 66 66 73 65 74 5b 70  ursor, aOffset[p
15600 32 5d 2c 20 6c 65 6e 2c 20 70 44 65 73 74 29 3b  2], len, pDest);
15610 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15620 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
15630 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
15640 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
15650 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
15660 63 6f 6e 73 74 20 75 38 2a 29 70 44 65 73 74 2d  const u8*)pDest-
15670 3e 7a 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20  >z, t, pDest);. 
15680 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67       pDest->flag
15690 73 20 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b  s &= ~MEM_Ephem;
156a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6f 70 5f 63  .    }.  }..op_c
156b0 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44  olumn_out:.  UPD
156c0 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
156d0 28 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53  (pDest);.  REGIS
156e0 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
156f0 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65  3, pDest);.  bre
15700 61 6b 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 63  ak;..op_column_c
15710 6f 72 72 75 70 74 3a 0a 20 20 69 66 28 20 61 4f  orrupt:.  if( aO
15720 70 5b 30 5d 2e 70 33 3e 30 20 29 7b 0a 20 20 20  p[0].p3>0 ){.   
15730 20 70 4f 70 20 3d 20 26 61 4f 70 5b 61 4f 70 5b   pOp = &aOp[aOp[
15740 30 5d 2e 70 33 2d 31 5d 3b 0a 20 20 20 20 62 72  0].p3-1];.    br
15750 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eak;.  }else{.  
15760 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
15770 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
15780 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
15790 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 7d 0a 0a  o_error;.  }.}..
157a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66 66 69 6e  /* Opcode: Affin
157b0 69 74 79 20 50 31 20 50 32 20 2a 20 50 34 20 2a  ity P1 P2 * P4 *
157c0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66  .** Synopsis: af
157d0 66 69 6e 69 74 79 28 72 5b 50 31 40 50 32 5d 29  finity(r[P1@P2])
157e0 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66 66  .**.** Apply aff
157f0 69 6e 69 74 69 65 73 20 74 6f 20 61 20 72 61 6e  inities to a ran
15800 67 65 20 6f 66 20 50 32 20 72 65 67 69 73 74 65  ge of P2 registe
15810 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
15820 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73   P1..**.** P4 is
15830 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
15840 73 20 50 32 20 63 68 61 72 61 63 74 65 72 73 20  s P2 characters 
15850 6c 6f 6e 67 2e 20 54 68 65 20 4e 2d 74 68 20 63  long. The N-th c
15860 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a  haracter of the.
15870 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61  ** string indica
15880 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  tes the column a
15890 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
158a0 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
158b0 74 68 65 20 4e 2d 74 68 0a 2a 2a 20 6d 65 6d 6f  the N-th.** memo
158c0 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72  ry cell in the r
158d0 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ange..*/.case OP
158e0 5f 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63  _Affinity: {.  c
158f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69  onst char *zAffi
15900 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61  nity;   /* The a
15910 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70  ffinity to be ap
15920 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 7a 41 66 66  plied */..  zAff
15930 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e  inity = pOp->p4.
15940 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  z;.  assert( zAf
15950 66 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61  finity!=0 );.  a
15960 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
15970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41   );.  assert( zA
15980 66 66 69 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d  ffinity[pOp->p2]
15990 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20  ==0 );.  pIn1 = 
159a0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
159b0 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
159c0 28 20 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d  ( pIn1 <= &p->aM
159d0 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  em[(p->nMem+1 - 
159e0 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a  p->nCursor)] );.
159f0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
15a00 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a  sValid(pIn1) );.
15a10 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74      applyAffinit
15a20 79 28 70 49 6e 31 2c 20 2a 28 7a 41 66 66 69 6e  y(pIn1, *(zAffin
15a30 69 74 79 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67  ity++), encoding
15a40 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  );.    pIn1++;. 
15a50 20 7d 77 68 69 6c 65 28 20 7a 41 66 66 69 6e 69   }while( zAffini
15a60 74 79 5b 30 5d 20 29 3b 0a 20 20 62 72 65 61 6b  ty[0] );.  break
15a70 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
15a80 4d 61 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32  MakeRecord P1 P2
15a90 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
15aa0 70 73 69 73 3a 20 72 5b 50 33 5d 3d 6d 6b 72 65  psis: r[P3]=mkre
15ab0 63 28 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a  c(r[P1@P2]).**.*
15ac0 2a 20 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67  * Convert P2 reg
15ad0 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
15ae0 20 77 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68   with P1 into th
15af0 65 20 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  e [record format
15b00 5d 0a 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61  ].** use as a da
15b10 74 61 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64  ta record in a d
15b20 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
15b30 20 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20   as a key.** in 
15b40 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f  an index.  The O
15b50 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
15b60 63 61 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72  can decode the r
15b70 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a  ecord later..**.
15b80 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 73  ** P4 may be a s
15b90 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 32  tring that is P2
15ba0 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67   characters long
15bb0 2e 20 20 54 68 65 20 4e 2d 74 68 20 63 68 61 72  .  The N-th char
15bc0 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20  acter of the.** 
15bd0 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73  string indicates
15be0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
15bf0 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
15c00 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
15c10 20 4e 2d 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f   N-th.** field o
15c20 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e  f the index key.
15c30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69  .**.** The mappi
15c40 6e 67 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65  ng from characte
15c50 72 20 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73  r to affinity is
15c60 20 67 69 76 65 6e 20 62 79 20 74 68 65 20 53 51   given by the SQ
15c70 4c 49 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63  LITE_AFF_.** mac
15c80 72 6f 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ros defined in s
15c90 71 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a  qliteInt.h..**.*
15ca0 2a 20 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20  * If P4 is NULL 
15cb0 74 68 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66  then all index f
15cc0 69 65 6c 64 73 20 68 61 76 65 20 74 68 65 20 61  ields have the a
15cd0 66 66 69 6e 69 74 79 20 42 4c 4f 42 2e 0a 2a 2f  ffinity BLOB..*/
15ce0 0a 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63  .case OP_MakeRec
15cf0 6f 72 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65  ord: {.  u8 *zNe
15d00 77 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  wRecord;        
15d10 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
15d20 6f 6c 64 20 74 68 65 20 64 61 74 61 20 66 6f 72  old the data for
15d30 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
15d40 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20  */.  Mem *pRec; 
15d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15d60 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
15d70 0a 20 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20  .  u64 nData;   
15d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15d90 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
15da0 64 61 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20  data space */.  
15db0 69 6e 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20  int nHdr;       
15dc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15dd0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61   of bytes of hea
15de0 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  der space */.  i
15df0 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  64 nByte;       
15e00 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70        /* Data sp
15e10 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
15e20 20 74 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a   this record */.
15e30 20 20 69 36 34 20 6e 5a 65 72 6f 3b 20 20 20 20    i64 nZero;    
15e40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15e50 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73  er of zero bytes
15e60 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
15e70 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
15e80 6e 74 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20  nt nVarint;     
15e90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15ea0 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 76 61  of bytes in a va
15eb0 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65  rint */.  u32 se
15ec0 72 69 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20  rial_type;      
15ed0 20 2f 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a   /* Type field *
15ee0 2f 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b  /.  Mem *pData0;
15ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
15f00 72 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20  rst field to be 
15f10 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
15f20 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65  e record */.  Me
15f30 6d 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20  m *pLast;       
15f40 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65       /* Last fie
15f50 6c 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ld of the record
15f60 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
15f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15f80 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
15f90 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a   in the record *
15fa0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e  /.  char *zAffin
15fb0 69 74 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ity;       /* Th
15fc0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
15fd0 67 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  g for the record
15fe0 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66   */.  int file_f
15ff0 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20  ormat;       /* 
16000 46 69 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75  File format to u
16010 73 65 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20  se for encoding 
16020 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
16030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16040 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65  pace used in zNe
16050 77 52 65 63 6f 72 64 5b 5d 20 68 65 61 64 65 72  wRecord[] header
16060 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16080 53 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e  Space used in zN
16090 65 77 52 65 63 6f 72 64 5b 5d 20 63 6f 6e 74 65  ewRecord[] conte
160a0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  nt */.  u32 len;
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
160c0 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 20 66 69  * Length of a fi
160d0 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73  eld */..  /* Ass
160e0 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  uming the record
160f0 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c   contains N fiel
16100 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66  ds, the record f
16110 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a  ormat looks.  **
16120 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
16130 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  ** ----------
16140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
16180 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c   ** | hdr-size |
16190 20 74 79 70 65 20 30 20 7c 20 74 79 70 65 20 31   type 0 | type 1
161a0 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d   | ... | type N-
161b0 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20  1 | data0 | ... 
161c0 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20  | data N-1 | .  
161d0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
161e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a  -----------.  **
16220 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73  .  ** Data(0) is
16230 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
16240 73 74 65 72 20 50 31 2e 20 20 44 61 74 61 28 31  ster P1.  Data(1
16250 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67  ) comes from reg
16260 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20  ister P1+1.  ** 
16270 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20  and so forth..  
16280 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70  **.  ** Each typ
16290 65 20 66 69 65 6c 64 20 69 73 20 61 20 76 61 72  e field is a var
162a0 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  int representing
162b0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
162c0 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f   of the .  ** co
162d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
162e0 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71   element (see sq
162f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
16300 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a  ype()). The.  **
16310 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20   hdr-size field 
16320 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74  is also a varint
16330 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6f 66   which is the of
16340 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65  fset from the be
16350 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20  ginning.  ** of 
16360 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61  the record to da
16370 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74  ta0..  */.  nDat
16380 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  a = 0;         /
16390 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
163a0 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65 20  s of data space 
163b0 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20  */.  nHdr = 0;  
163c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
163d0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65  r of bytes of he
163e0 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20  ader space */.  
163f0 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20  nZero = 0;      
16400 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16410 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
16420 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63  e end of the rec
16430 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20  ord */.  nField 
16440 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66  = pOp->p1;.  zAf
16450 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34  finity = pOp->p4
16460 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46  .z;.  assert( nF
16470 69 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ield>0 && pOp->p
16480 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e  2>0 && pOp->p2+n
16490 46 69 65 6c 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  Field<=(p->nMem+
164a0 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b  1 - p->nCursor)+
164b0 31 20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20  1 );.  pData0 = 
164c0 26 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20  &aMem[nField];. 
164d0 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70   nField = pOp->p
164e0 32 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44  2;.  pLast = &pD
164f0 61 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a  ata0[nField-1];.
16500 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20    file_format = 
16510 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
16520 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49 64 65  ormat;..  /* Ide
16530 6e 74 69 66 79 20 74 68 65 20 6f 75 74 70 75 74  ntify the output
16540 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 61   register */.  a
16550 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70  ssert( pOp->p3<p
16560 4f 70 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70  Op->p1 || pOp->p
16570 33 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  3>=pOp->p1+pOp->
16580 70 32 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26  p2 );.  pOut = &
16590 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
165a0 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
165b0 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f  e(p, pOut);..  /
165c0 2a 20 41 70 70 6c 79 20 74 68 65 20 72 65 71 75  * Apply the requ
165d0 65 73 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  ested affinity t
165e0 6f 20 61 6c 6c 20 69 6e 70 75 74 73 0a 20 20 2a  o all inputs.  *
165f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74  /.  assert( pDat
16600 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 69  a0<=pLast );.  i
16610 66 28 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a  f( zAffinity ){.
16620 20 20 20 20 70 52 65 63 20 3d 20 70 44 61 74 61      pRec = pData
16630 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
16640 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
16650 52 65 63 2b 2b 2c 20 2a 28 7a 41 66 66 69 6e 69  Rec++, *(zAffini
16660 74 79 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67 29  ty++), encoding)
16670 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16680 7a 41 66 66 69 6e 69 74 79 5b 30 5d 3d 3d 30 20  zAffinity[0]==0 
16690 7c 7c 20 70 52 65 63 3c 3d 70 4c 61 73 74 20 29  || pRec<=pLast )
166a0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 7a 41  ;.    }while( zA
166b0 66 66 69 6e 69 74 79 5b 30 5d 20 29 3b 0a 20 20  ffinity[0] );.  
166c0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
166d0 5f 45 4e 41 42 4c 45 5f 4e 55 4c 4c 5f 54 52 49  _ENABLE_NULL_TRI
166e0 4d 0a 20 20 2f 2a 20 4e 55 4c 4c 73 20 63 61 6e  M.  /* NULLs can
166f0 20 62 65 20 73 61 66 65 6c 79 20 74 72 69 6d 6d   be safely trimm
16700 65 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ed from the end 
16710 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
16720 73 20 6c 6f 6e 67 20 61 73 0a 20 20 2a 2a 20 61  s long as.  ** a
16730 73 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  s the schema for
16740 6d 61 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  mat is 2 or more
16750 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   and none of the
16760 20 6f 6d 69 74 74 65 64 20 63 6f 6c 75 6d 6e 73   omitted columns
16770 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 6e 6f 6e  .  ** have a non
16780 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61  -NULL default va
16790 6c 75 65 2e 20 20 41 6c 73 6f 2c 20 74 68 65 20  lue.  Also, the 
167a0 72 65 63 6f 72 64 20 6d 75 73 74 20 62 65 20 6c  record must be l
167b0 65 66 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 74  eft with.  ** at
167c0 20 6c 65 61 73 74 20 6f 6e 65 20 66 69 65 6c 64   least one field
167d0 2e 20 20 49 66 20 50 35 3e 30 20 74 68 65 6e 20  .  If P5>0 then 
167e0 69 74 20 77 69 6c 6c 20 62 65 20 6f 6e 65 20 6d  it will be one m
167f0 6f 72 65 20 74 68 61 6e 20 74 68 65 0a 20 20 2a  ore than the.  *
16800 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72  * index of the r
16810 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
16820 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   with a non-NULL
16830 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   default value *
16840 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  /.  if( pOp->p5 
16850 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ){.    while( (p
16860 4c 61 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45  Last->flags & ME
16870 4d 5f 4e 75 6c 6c 29 21 3d 30 20 26 26 20 6e 46  M_Null)!=0 && nF
16880 69 65 6c 64 3e 70 4f 70 2d 3e 70 35 20 29 7b 0a  ield>pOp->p5 ){.
16890 20 20 20 20 20 20 70 4c 61 73 74 2d 2d 3b 0a 20        pLast--;. 
168a0 20 20 20 20 20 6e 46 69 65 6c 64 2d 2d 3b 0a 20       nField--;. 
168b0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
168c0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
168d0 67 68 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  gh the elements 
168e0 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  that will make u
168f0 70 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  p the record to 
16900 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20  figure.  ** out 
16910 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
16920 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  s required for t
16930 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20  he new record.. 
16940 20 2a 2f 0a 20 20 70 52 65 63 20 3d 20 70 4c 61   */.  pRec = pLa
16950 73 74 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73  st;.  do{.    as
16960 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
16970 28 70 52 65 63 29 20 29 3b 0a 20 20 20 20 70 52  (pRec) );.    pR
16980 65 63 2d 3e 75 54 65 6d 70 20 3d 20 73 65 72 69  ec->uTemp = seri
16990 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65  al_type = sqlite
169a0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
169b0 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61  pRec, file_forma
169c0 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66  t, &len);.    if
169d0 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20  ( pRec->flags & 
169e0 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
169f0 20 20 69 66 28 20 6e 44 61 74 61 20 29 7b 0a 20    if( nData ){. 
16a00 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
16a10 65 33 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42  e3VdbeMemExpandB
16a20 6c 6f 62 28 70 52 65 63 29 20 29 20 67 6f 74 6f  lob(pRec) ) goto
16a30 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 7d   no_mem;.      }
16a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 5a  else{.        nZ
16a50 65 72 6f 20 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e  ero += pRec->u.n
16a60 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 6c 65  Zero;.        le
16a70 6e 20 2d 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65  n -= pRec->u.nZe
16a80 72 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ro;.      }.    
16a90 7d 0a 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 6c  }.    nData += l
16aa0 65 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  en;.    testcase
16ab0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
16ac0 32 37 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  27 );.    testca
16ad0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
16ae0 3d 31 32 38 20 29 3b 0a 20 20 20 20 6e 48 64 72  =128 );.    nHdr
16af0 20 2b 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 3c   += serial_type<
16b00 3d 31 32 37 20 3f 20 31 20 3a 20 73 71 6c 69 74  =127 ? 1 : sqlit
16b10 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69  e3VarintLen(seri
16b20 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66  al_type);.    if
16b30 28 20 70 52 65 63 3d 3d 70 44 61 74 61 30 20 29  ( pRec==pData0 )
16b40 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 52 65 63   break;.    pRec
16b50 2d 2d 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  --;.  }while(1);
16b60 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
16b70 4f 46 3a 20 52 2d 32 32 35 36 34 2d 31 31 36 34  OF: R-22564-1164
16b80 37 20 54 68 65 20 68 65 61 64 65 72 20 62 65 67  7 The header beg
16b90 69 6e 73 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ins with a singl
16ba0 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 77 68  e varint.  ** wh
16bb0 69 63 68 20 64 65 74 65 72 6d 69 6e 65 73 20 74  ich determines t
16bc0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
16bd0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
16be0 68 65 61 64 65 72 2e 20 54 68 65 20 76 61 72 69  header. The vari
16bf0 6e 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 69 73  nt.  ** value is
16c00 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
16c10 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
16c20 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 73   including the s
16c30 69 7a 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20  ize varint.  ** 
16c40 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 74 65 73  itself. */.  tes
16c50 74 63 61 73 65 28 20 6e 48 64 72 3d 3d 31 32 36  tcase( nHdr==126
16c60 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
16c70 6e 48 64 72 3d 3d 31 32 37 20 29 3b 0a 20 20 69  nHdr==127 );.  i
16c80 66 28 20 6e 48 64 72 3c 3d 31 32 36 20 29 7b 0a  f( nHdr<=126 ){.
16c90 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f      /* The commo
16ca0 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 6e 48  n case */.    nH
16cb0 64 72 20 2b 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dr += 1;.  }else
16cc0 7b 0a 20 20 20 20 2f 2a 20 52 61 72 65 20 63 61  {.    /* Rare ca
16cd0 73 65 20 6f 66 20 61 20 72 65 61 6c 6c 79 20 6c  se of a really l
16ce0 61 72 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  arge header */. 
16cf0 20 20 20 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c     nVarint = sql
16d00 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48  ite3VarintLen(nH
16d10 64 72 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d  dr);.    nHdr +=
16d20 20 6e 56 61 72 69 6e 74 3b 0a 20 20 20 20 69 66   nVarint;.    if
16d30 28 20 6e 56 61 72 69 6e 74 3c 73 71 6c 69 74 65  ( nVarint<sqlite
16d40 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29  3VarintLen(nHdr)
16d50 20 29 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20   ) nHdr++;.  }. 
16d60 20 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b 6e 44   nByte = nHdr+nD
16d70 61 74 61 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  ata;.  if( nByte
16d80 2b 6e 5a 65 72 6f 3e 64 62 2d 3e 61 4c 69 6d 69  +nZero>db->aLimi
16d90 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
16da0 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f  ENGTH] ){.    go
16db0 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
16dc0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16dd0 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73  the output regis
16de0 74 65 72 20 68 61 73 20 61 20 62 75 66 66 65 72  ter has a buffer
16df0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
16e00 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65   store .  ** the
16e10 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68 65   new record. The
16e20 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   output register
16e30 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f   (pOp->p3) is no
16e40 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a  t allowed to.  *
16e50 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  * be one of the 
16e60 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20  input registers 
16e70 28 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 6c  (because the fol
16e80 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20  lowing call to. 
16e90 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d   ** sqlite3VdbeM
16ea0 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
16eb0 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62 65 72  () could clobber
16ec0 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
16ed0 65 20 69 74 20 69 73 20 75 73 65 64 29 2e 0a 20  e it is used).. 
16ee0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
16ef0 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
16f00 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 28 69 6e  Resize(pOut, (in
16f10 74 29 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  t)nByte) ){.    
16f20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
16f30 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d 20  .  zNewRecord = 
16f40 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a  (u8 *)pOut->z;..
16f50 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
16f60 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d 20 70  ecord */.  i = p
16f70 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65 77 52  utVarint32(zNewR
16f80 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a 20 20  ecord, nHdr);.  
16f90 6a 20 3d 20 6e 48 64 72 3b 0a 20 20 61 73 73 65  j = nHdr;.  asse
16fa0 72 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61 73  rt( pData0<=pLas
16fb0 74 20 29 3b 0a 20 20 70 52 65 63 20 3d 20 70 44  t );.  pRec = pD
16fc0 61 74 61 30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ata0;.  do{.    
16fd0 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 70 52  serial_type = pR
16fe0 65 63 2d 3e 75 54 65 6d 70 3b 0a 20 20 20 20 2f  ec->uTemp;.    /
16ff0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17000 2d 30 36 35 32 39 2d 34 37 33 36 32 20 46 6f 6c  -06529-47362 Fol
17010 6c 6f 77 69 6e 67 20 74 68 65 20 73 69 7a 65 20  lowing the size 
17020 76 61 72 69 6e 74 20 61 72 65 20 6f 6e 65 20 6f  varint are one o
17030 72 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 61 64  r more.    ** ad
17040 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 6e 74 73  ditional varints
17050 2c 20 6f 6e 65 20 70 65 72 20 63 6f 6c 75 6d 6e  , one per column
17060 2e 20 2a 2f 0a 20 20 20 20 69 20 2b 3d 20 70 75  . */.    i += pu
17070 74 56 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52  tVarint32(&zNewR
17080 65 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c  ecord[i], serial
17090 5f 74 79 70 65 29 3b 20 20 20 20 20 20 20 20 20  _type);         
170a0 20 20 20 2f 2a 20 73 65 72 69 61 6c 20 74 79 70     /* serial typ
170b0 65 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44  e */.    /* EVID
170c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35 33 36  ENCE-OF: R-64536
170d0 2d 35 31 37 32 38 20 54 68 65 20 76 61 6c 75 65  -51728 The value
170e0 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
170f0 6e 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 0a  n in the record.
17100 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
17110 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 68 65  ly follow the he
17120 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 6a 20 2b  ader. */.    j +
17130 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
17140 69 61 6c 50 75 74 28 26 7a 4e 65 77 52 65 63 6f  ialPut(&zNewReco
17150 72 64 5b 6a 5d 2c 20 70 52 65 63 2c 20 73 65 72  rd[j], pRec, ser
17160 69 61 6c 5f 74 79 70 65 29 3b 20 2f 2a 20 63 6f  ial_type); /* co
17170 6e 74 65 6e 74 20 2a 2f 0a 20 20 7d 77 68 69 6c  ntent */.  }whil
17180 65 28 20 28 2b 2b 70 52 65 63 29 3c 3d 70 4c 61  e( (++pRec)<=pLa
17190 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st );.  assert( 
171a0 69 3d 3d 6e 48 64 72 20 29 3b 0a 20 20 61 73 73  i==nHdr );.  ass
171b0 65 72 74 28 20 6a 3d 3d 6e 42 79 74 65 20 29 3b  ert( j==nByte );
171c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
171d0 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
171e0 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
171f0 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
17200 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e  pOut->n = (int)n
17210 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  Byte;.  pOut->fl
17220 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  ags = MEM_Blob;.
17230 20 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b 0a 20    if( nZero ){. 
17240 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f     pOut->u.nZero
17250 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4f   = nZero;.    pO
17260 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ut->flags |= MEM
17270 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 52 45 47  _Zero;.  }.  REG
17280 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
17290 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50  >p3, pOut);.  UP
172a0 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
172b0 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
172c0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
172d0 43 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20  Count P1 P2 * * 
172e0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
172f0 5b 50 32 5d 3d 63 6f 75 6e 74 28 29 0a 2a 2a 0a  [P2]=count().**.
17300 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d  ** Store the num
17310 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28  ber of entries (
17320 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
17330 29 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  ) in the table o
17340 72 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e  r index .** open
17350 65 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 20  ed by cursor P1 
17360 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
17370 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17380 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
17390 0a 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20  .case OP_Count: 
173a0 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74  {         /* out
173b0 32 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72  2 */.  i64 nEntr
173c0 79 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  y;.  BtCursor *p
173d0 43 72 73 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Crsr;..  assert(
173e0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
173f0 31 5d 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  1]->eCurType==CU
17400 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
17410 20 70 43 72 73 72 20 3d 20 70 2d 3e 61 70 43 73   pCrsr = p->apCs
17420 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 75 63 2e 70  r[pOp->p1]->uc.p
17430 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
17440 28 20 70 43 72 73 72 20 29 3b 0a 20 20 6e 45 6e  ( pCrsr );.  nEn
17450 74 72 79 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  try = 0;  /* Not
17460 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75   needed.  Only u
17470 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61  sed to silence a
17480 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72   warning. */.  r
17490 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
174a0 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e 45  Count(pCrsr, &nE
174b0 6e 74 72 79 29 3b 0a 20 20 69 66 28 20 72 63 20  ntry);.  if( rc 
174c0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
174d0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75  _to_error;.  pOu
174e0 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
174f0 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f  se(p, pOp);.  pO
17500 75 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74 72 79  ut->u.i = nEntry
17510 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
17520 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
17530 53 61 76 65 70 6f 69 6e 74 20 50 31 20 2a 20 2a  Savepoint P1 * *
17540 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e   P4 *.**.** Open
17550 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
17560 6c 62 61 63 6b 20 74 68 65 20 73 61 76 65 70 6f  lback the savepo
17570 69 6e 74 20 6e 61 6d 65 64 20 62 79 20 70 61 72  int named by par
17580 61 6d 65 74 65 72 20 50 34 2c 20 64 65 70 65 6e  ameter P4, depen
17590 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 76  ding.** on the v
175a0 61 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f 20 6f  alue of P1. To o
175b0 70 65 6e 20 61 20 6e 65 77 20 73 61 76 65 70 6f  pen a new savepo
175c0 69 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f 20 72  int, P1==0. To r
175d0 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
175e0 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 73  an.** existing s
175f0 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 31 2c  avepoint, P1==1,
17600 20 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20   or to rollback 
17610 61 6e 20 65 78 69 73 74 69 6e 67 20 73 61 76 65  an existing save
17620 70 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a 2f 0a  point P1==2..*/.
17630 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
17640 74 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20  t: {.  int p1;  
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
17670 6f 66 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  of P1 operand */
17680 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61     /* Name of sa
176b0 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  vepoint */.  int
176c0 20 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65 70 6f   nName;.  Savepo
176d0 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53 61 76  int *pNew;.  Sav
176e0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
176f0 6e 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20  nt;.  Savepoint 
17700 2a 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69 53 61  *pTmp;.  int iSa
17710 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20 69  vepoint;.  int i
17720 69 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e  i;..  p1 = pOp->
17730 70 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4f  p1;.  zName = pO
17740 70 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a 20 41  p->p4.z;..  /* A
17750 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 70  ssert that the p
17760 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 76  1 parameter is v
17770 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61 74 20  alid. Also that 
17780 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  if there is no o
17790 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  pen.  ** transac
177a0 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72 65  tion, then there
177b0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20 73   cannot be any s
177c0 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f  avepoints. .  */
177d0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
177e0 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20  Savepoint==0 || 
177f0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
17800 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17810 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  1==SAVEPOINT_BEG
17820 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e  IN||p1==SAVEPOIN
17830 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d 53  T_RELEASE||p1==S
17840 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
17850 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  K );.  assert( d
17860 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c 7c  b->pSavepoint ||
17870 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
17880 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  onSavepoint==0 )
17890 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68 65 63  ;.  assert( chec
178a0 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28  kSavepointCount(
178b0 64 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  db) );.  assert(
178c0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b   p->bIsReader );
178d0 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45  ..  if( p1==SAVE
178e0 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20  POINT_BEGIN ){. 
178f0 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
17900 57 72 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20  Write>0 ){.     
17910 20 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70 6f   /* A new savepo
17920 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 72  int cannot be cr
17930 65 61 74 65 64 20 69 66 20 74 68 65 72 65 20 61  eated if there a
17940 72 65 20 61 63 74 69 76 65 20 77 72 69 74 65 20  re active write 
17950 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
17960 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20  ents (i.e. open 
17970 72 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72 65  read/write incre
17980 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64  mental blob hand
17990 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  les)..      */. 
179a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
179b0 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74  Error(p, "cannot
179c0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20   open savepoint 
179d0 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  - SQL statements
179e0 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a   in progress");.
179f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17a00 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
17a10 65 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  e{.      nName =
17a20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17a30 28 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e 64 65  (zName);..#ifnde
17a40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
17a50 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
17a60 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
17a70 20 4f 6b 20 65 76 65 6e 20 69 66 20 74 68 69 73   Ok even if this
17a80 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
17a90 74 75 61 6c 6c 79 20 61 20 74 72 61 6e 73 61 63  tually a transac
17aa0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 73 61  tion.      ** sa
17ab0 76 65 70 6f 69 6e 74 20 28 61 6e 64 20 74 68 65  vepoint (and the
17ac0 72 65 66 6f 72 65 20 73 68 6f 75 6c 64 20 6e 6f  refore should no
17ad0 74 20 70 72 6f 6d 70 74 20 78 53 61 76 65 70 6f  t prompt xSavepo
17ae0 69 6e 74 28 29 29 20 63 61 6c 6c 62 61 63 6b 73  int()) callbacks
17af0 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  ..      ** If th
17b00 69 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  is is a transact
17b10 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 62 65  ion savepoint be
17b20 69 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74 20 69  ing opened, it i
17b30 73 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 20  s guaranteed.   
17b40 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64     ** that the d
17b50 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
17b60 61 79 20 69 73 20 65 6d 70 74 79 2e 20 20 2a 2f  ay is empty.  */
17b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
17b80 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
17b90 20 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e 73 3d   || db->nVTrans=
17ba0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
17bb0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
17bc0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
17bd0 49 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20 20 20  INT_BEGIN,.     
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e             db->n
17c00 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
17c10 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
17c20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17c30 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
17c40 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65  due_to_error;.#e
17c50 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 43  ndif..      /* C
17c60 72 65 61 74 65 20 61 20 6e 65 77 20 73 61 76 65  reate a new save
17c70 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e  point structure.
17c80 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   */.      pNew =
17c90 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17ca0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
17cb0 28 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d  (Savepoint)+nNam
17cc0 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e+1);.      if( 
17cd0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
17ce0 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
17cf0 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  har *)&pNew[1];.
17d00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
17d10 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  New->zName, zNam
17d20 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20  e, nName+1);.   
17d30 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20   .        /* If 
17d40 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
17d50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
17d60 65 6e 20 6d 61 72 6b 20 74 68 69 73 20 61 73 20  en mark this as 
17d70 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20  a special.      
17d80 20 20 2a 2a 20 22 74 72 61 6e 73 61 63 74 69 6f    ** "transactio
17d90 6e 20 73 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f  n savepoint". */
17da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
17db0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
17dc0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
17dd0 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  oCommit = 0;.   
17de0 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61         db->isTra
17df0 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
17e00 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
17e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17e20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b  db->nSavepoint++
17e30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
17e40 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65       /* Link the
17e50 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69   new savepoint i
17e60 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17e70 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20   handle's list. 
17e80 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
17e90 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61  >pNext = db->pSa
17ea0 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20  vepoint;.       
17eb0 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
17ec0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
17ed0 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43  pNew->nDeferredC
17ee0 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72  ons = db->nDefer
17ef0 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20  redCons;.       
17f00 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64   pNew->nDeferred
17f10 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44  ImmCons = db->nD
17f20 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a  eferredImmCons;.
17f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17f40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 61 76 65  }else{.    iSave
17f50 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  point = 0;..    
17f60 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  /* Find the name
17f70 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20  d savepoint. If 
17f80 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
17f90 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e   savepoint, then
17fa0 20 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   an.    ** an er
17fb0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
17fc0 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a 2f  to the user.  */
17fd0 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20  .    for(.      
17fe0 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d  pSavepoint = db-
17ff0 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20 20  >pSavepoint; .  
18000 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 26      pSavepoint &
18010 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
18020 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e 61  (pSavepoint->zNa
18030 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
18040 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70    pSavepoint = p
18050 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
18060 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 53  .    ){.      iS
18070 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20  avepoint++;.    
18080 7d 0a 20 20 20 20 69 66 28 20 21 70 53 61 76 65  }.    if( !pSave
18090 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  point ){.      s
180a0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
180b0 70 2c 20 22 6e 6f 20 73 75 63 68 20 73 61 76 65  p, "no such save
180c0 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61 6d  point: %s", zNam
180d0 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  e);.      rc = S
180e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
180f0 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6e   }else if( db->n
18100 56 64 62 65 57 72 69 74 65 3e 30 20 26 26 20 70  VdbeWrite>0 && p
18110 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
18120 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EASE ){.      /*
18130 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
18140 62 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 28  ble to release (
18150 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f  commit) a savepo
18160 69 6e 74 20 69 66 20 74 68 65 72 65 20 61 72 65  int if there are
18170 20 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 76   .      ** activ
18180 65 20 77 72 69 74 65 20 73 74 61 74 65 6d 65 6e  e write statemen
18190 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ts..      */.   
181a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
181b0 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20 72  ror(p, "cannot r
181c0 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e 74  elease savepoint
181d0 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
181f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
18200 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
18210 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18220 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
18230 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72  ..      /* Deter
18240 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
18250 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20 74 72  not this is a tr
18260 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
18270 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20  int. If so,.    
18280 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69 73    ** and this is
18290 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d 61   a RELEASE comma
182a0 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
182b0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
182c0 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f   .      ** is co
182d0 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20 20  mmitted. .      
182e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54  */.      int isT
182f0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53 61  ransaction = pSa
18300 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d 3d  vepoint->pNext==
18310 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e 73  0 && db->isTrans
18320 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3b  actionSavepoint;
18330 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72 61  .      if( isTra
18340 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d  nsaction && p1==
18350 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
18360 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  E ){.        if(
18370 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64   (rc = sqlite3Vd
18380 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29  beCheckFk(p, 1))
18390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
183a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64           goto vd
183b0 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  be_return;.     
183c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d     }.        db-
183d0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
183e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
183f0 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d  ite3VdbeHalt(p)=
18400 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
18410 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20            p->pc 
18420 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  = (int)(pOp - aO
18430 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  p);.          db
18440 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30  ->autoCommit = 0
18450 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
18460 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  c = rc = SQLITE_
18470 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
18480 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
18490 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
184a0 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61      db->isTransa
184b0 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
184c0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
184d0 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65   p->rc;.      }e
184e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
184f0 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3b   isSchemaChange;
18500 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70 6f  .        iSavepo
18510 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70  int = db->nSavep
18520 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e  oint - iSavepoin
18530 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t - 1;.        i
18540 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  f( p1==SAVEPOINT
18550 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
18560 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 43         isSchemaC
18570 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44 62  hange = (db->mDb
18580 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53  Flags & DBFLAG_S
18590 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30 3b  chemaChange)!=0;
185a0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
185b0 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
185c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
185d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
185e0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
185f0 6f 72 73 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  ors(db->aDb[ii].
18600 70 42 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pBt,.           
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18620 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18630 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
18640 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18660 20 20 20 20 20 20 20 20 20 20 69 73 53 63 68 65            isSche
18670 6d 61 43 68 61 6e 67 65 3d 3d 30 29 3b 0a 20 20  maChange==0);.  
18680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
18690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
186a0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
186b0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
186c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
186d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 63  {.          isSc
186e0 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 30 3b 0a  hemaChange = 0;.
186f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18700 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64    for(ii=0; ii<d
18710 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20  b->nDb; ii++){. 
18720 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
18730 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
18740 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  int(db->aDb[ii].
18750 70 42 74 2c 20 70 31 2c 20 69 53 61 76 65 70 6f  pBt, p1, iSavepo
18760 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
18770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
18790 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
187a0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
187b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
187c0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 53 63          if( isSc
187d0 68 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20  hemaChange ){.  
187e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
187f0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
18800 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
18810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
18820 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
18830 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20  onnection(db);. 
18840 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 44 62           db->mDb
18850 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
18860 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  SchemaChange;.  
18870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18880 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67 61    .      /* Rega
18890 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
188a0 72 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45  r this is a RELE
188b0 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c  ASE or ROLLBACK,
188c0 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20   destroy all .  
188d0 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74      ** savepoint
188e0 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65 20  s nested inside 
188f0 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  of the savepoint
18900 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20   being operated 
18910 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  on. */.      whi
18920 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
18930 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20 29  nt!=pSavepoint )
18940 7b 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20 3d  {.        pTmp =
18950 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
18960 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61  .        db->pSa
18970 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
18980 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
18990 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
189a0 20 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   pTmp);.        
189b0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d  db->nSavepoint--
189c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
189d0 20 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52   /* If it is a R
189e0 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73  ELEASE, then des
189f0 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
18a00 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65  nt being operate
18a10 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74  d on .      ** t
18a20 6f 6f 2e 20 49 66 20 69 74 20 69 73 20 61 20 52  oo. If it is a R
18a30 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68 65 6e  OLLBACK TO, then
18a40 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   set the number 
18a50 6f 66 20 64 65 66 65 72 72 65 64 20 0a 20 20 20  of deferred .   
18a60 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
18a70 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72 65 73   violations pres
18a80 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
18a90 61 73 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ase to the value
18aa0 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a   stored.      **
18ab0 20 77 68 65 6e 20 74 68 65 20 73 61 76 65 70 6f   when the savepo
18ac0 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e  int was created.
18ad0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
18ae0 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
18af0 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  EASE ){.        
18b00 61 73 73 65 72 74 28 20 70 53 61 76 65 70 6f 69  assert( pSavepoi
18b10 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  nt==db->pSavepoi
18b20 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62  nt );.        db
18b30 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
18b40 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
18b50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18b60 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 61 76  3DbFree(db, pSav
18b70 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
18b80 20 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74   if( !isTransact
18b90 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ion ){.         
18ba0 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d   db->nSavepoint-
18bb0 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
18bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18bd0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
18be0 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ons = pSavepoint
18bf0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b  ->nDeferredCons;
18c00 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  .        db->nDe
18c10 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
18c20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66  pSavepoint->nDef
18c30 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20  erredImmCons;.  
18c40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
18c50 20 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20   !isTransaction 
18c60 7c 7c 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  || p1==SAVEPOINT
18c70 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
18c80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18c90 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
18ca0 62 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e  b, p1, iSavepoin
18cb0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
18cc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18cd0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
18ce0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
18cf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
18d00 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
18d10 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a  _due_to_error;..
18d20 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
18d30 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d 6d 69  pcode: AutoCommi
18d40 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
18d50 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 61 74 61  .** Set the data
18d60 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  base auto-commit
18d70 20 66 6c 61 67 20 74 6f 20 50 31 20 28 31 20 6f   flag to P1 (1 o
18d80 72 20 30 29 2e 20 49 66 20 50 32 20 69 73 20 74  r 0). If P2 is t
18d90 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61 63  rue, roll.** bac
18da0 6b 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  k any currently 
18db0 61 63 74 69 76 65 20 62 74 72 65 65 20 74 72 61  active btree tra
18dc0 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66 20 74 68  nsactions. If th
18dd0 65 72 65 20 61 72 65 20 61 6e 79 20 61 63 74 69  ere are any acti
18de0 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61 72 74  ve.** VMs (apart
18df0 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65 29 2c   from this one),
18e00 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41 43 4b   then a ROLLBACK
18e10 20 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d 4d 49   fails.  A COMMI
18e20 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20 74 68  T fails if.** th
18e30 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77  ere are active w
18e40 72 69 74 69 6e 67 20 56 4d 73 20 6f 72 20 61 63  riting VMs or ac
18e50 74 69 76 65 20 56 4d 73 20 74 68 61 74 20 75 73  tive VMs that us
18e60 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 0a  e shared cache..
18e70 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
18e80 75 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74 68  uction causes th
18e90 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a 2f  e VM to halt..*/
18ea0 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d  .case OP_AutoCom
18eb0 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65 73  mit: {.  int des
18ec0 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a  iredAutoCommit;.
18ed0 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63 6b 3b    int iRollback;
18ee0 0a 0a 20 20 64 65 73 69 72 65 64 41 75 74 6f 43  ..  desiredAutoC
18ef0 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b  ommit = pOp->p1;
18f00 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d 20 70  .  iRollback = p
18f10 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74  Op->p2;.  assert
18f20 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
18f30 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69 72 65  mit==1 || desire
18f40 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  dAutoCommit==0 )
18f50 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69  ;.  assert( desi
18f60 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31  redAutoCommit==1
18f70 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d 3d 30   || iRollback==0
18f80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
18f90 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
18fa0 29 3b 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20  );  /* At least 
18fb0 74 68 69 73 20 6f 6e 65 20 56 4d 20 69 73 20 61  this one VM is a
18fc0 63 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72  ctive */.  asser
18fd0 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
18fe0 29 3b 0a 0a 20 20 69 66 28 20 64 65 73 69 72 65  );..  if( desire
18ff0 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d  dAutoCommit!=db-
19000 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
19010 20 20 20 69 66 28 20 69 52 6f 6c 6c 62 61 63 6b     if( iRollback
19020 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19030 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
19040 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mit==1 );.      
19050 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
19060 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
19070 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
19080 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
19090 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  mit = 1;.    }el
190a0 73 65 20 69 66 28 20 64 65 73 69 72 65 64 41 75  se if( desiredAu
190b0 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  toCommit && db->
190c0 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b 0a  nVdbeWrite>0 ){.
190d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
190e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70   instruction imp
190f0 6c 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54  lements a COMMIT
19100 20 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61   and other VMs a
19110 72 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20 20  re writing.     
19120 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 65 72   ** return an er
19130 72 6f 72 20 69 6e 64 69 63 61 74 69 6e 67 20 74  ror indicating t
19140 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d  hat the other VM
19150 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  s must complete 
19160 66 69 72 73 74 2e 20 0a 20 20 20 20 20 20 2a 2f  first. .      */
19170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19180 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e  beError(p, "cann
19190 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61  ot commit transa
191a0 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20  ction - ".      
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65      "SQL stateme
191d0 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22  nts in progress"
191e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
191f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
19200 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
19210 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65  to_error;.    }e
19220 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71  lse if( (rc = sq
19230 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
19240 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f  (p, 1))!=SQLITE_
19250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
19260 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
19270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
19280 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
19290 28 75 38 29 64 65 73 69 72 65 64 41 75 74 6f 43  (u8)desiredAutoC
192a0 6f 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ommit;.    }.   
192b0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
192c0 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Halt(p)==SQLITE_
192d0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d  BUSY ){.      p-
192e0 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20  >pc = (int)(pOp 
192f0 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 64 62  - aOp);.      db
19300 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 28  ->autoCommit = (
19310 75 38 29 28 31 2d 64 65 73 69 72 65 64 41 75 74  u8)(1-desiredAut
19320 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  oCommit);.      
19330 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c  p->rc = rc = SQL
19340 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
19350 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
19360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
19370 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
19380 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  nt==0 );.    sql
19390 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
193a0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28  nts(db);.    if(
193b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
193c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
193d0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
193e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
193f0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
19400 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
19410 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 7d  vdbe_return;.  }
19420 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
19430 33 56 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 20  3VdbeError(p,.  
19440 20 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41        (!desiredA
19450 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e  utoCommit)?"cann
19460 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
19470 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  action within a 
19480 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20  transaction":(. 
19490 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63         (iRollbac
194a0 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  k)?"cannot rollb
194b0 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
194c0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a  tion is active":
194d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
194e0 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d      "cannot comm
194f0 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
19500 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29  ion is active"))
19510 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;.         .    
19520 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
19530 52 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  R;.    goto abor
19540 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
19550 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
19560 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 6e 73  /* Opcode: Trans
19570 61 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20  action P1 P2 P3 
19580 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 65 67 69  P4 P5.**.** Begi
19590 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
195a0 6f 6e 20 64 61 74 61 62 61 73 65 20 50 31 20 69  on database P1 i
195b0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
195c0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
195d0 2a 20 61 63 74 69 76 65 2e 0a 2a 2a 20 49 66 20  * active..** If 
195e0 50 32 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P2 is non-zero, 
195f0 74 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  then a write-tra
19600 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
19610 74 65 64 2c 20 6f 72 20 69 66 20 61 20 0a 2a 2a  ted, or if a .**
19620 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
19630 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
19640 69 76 65 2c 20 69 74 20 69 73 20 75 70 67 72 61  ive, it is upgra
19650 64 65 64 20 74 6f 20 61 20 77 72 69 74 65 2d 74  ded to a write-t
19660 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49  ransaction..** I
19670 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74 68  f P2 is zero, th
19680 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
19690 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
196a0 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68  ..**.** P1 is th
196b0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
196c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
196d0 77 68 69 63 68 20 74 68 65 20 74 72 61 6e 73 61  which the transa
196e0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 73 74 61 72  ction is.** star
196f0 74 65 64 2e 20 20 49 6e 64 65 78 20 30 20 69 73  ted.  Index 0 is
19700 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19710 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 64 65  se file and inde
19720 78 20 31 20 69 73 20 74 68 65 0a 2a 2a 20 66 69  x 1 is the.** fi
19730 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  le used for temp
19740 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49  orary tables.  I
19750 6e 64 69 63 65 73 20 6f 66 20 32 20 6f 72 20 6d  ndices of 2 or m
19760 6f 72 65 20 61 72 65 20 75 73 65 64 20 66 6f 72  ore are used for
19770 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
19780 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  abases..**.** If
19790 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
197a0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
197b0 61 6e 64 20 74 68 65 20 56 64 62 65 2e 75 73 65  and the Vdbe.use
197c0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 66 6c 61  sStmtJournal fla
197d0 67 20 69 73 0a 2a 2a 20 74 72 75 65 20 28 74 68  g is.** true (th
197e0 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  is flag is set i
197f0 66 20 74 68 65 20 56 64 62 65 20 6d 61 79 20 6d  f the Vdbe may m
19800 6f 64 69 66 79 20 6d 6f 72 65 20 74 68 61 6e 20  odify more than 
19810 6f 6e 65 20 72 6f 77 20 61 6e 64 20 6d 61 79 0a  one row and may.
19820 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
19830 54 20 65 78 63 65 70 74 69 6f 6e 29 2c 20 61 20  T exception), a 
19840 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
19850 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 20 62  ction may also b
19860 65 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20 4d 6f 72  e opened..** Mor
19870 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
19880 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
19890 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  saction is opene
198a0 64 20 69 66 66 20 74 68 65 20 64 61 74 61 62 61  d iff the databa
198b0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
198c0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
198d0 74 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  t in autocommit 
198e0 6d 6f 64 65 2c 20 6f 72 20 69 66 20 74 68 65 72  mode, or if ther
198f0 65 20 61 72 65 20 6f 74 68 65 72 0a 2a 2a 20 61  e are other.** a
19900 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
19910 2e 20 41 20 73 74 61 74 65 6d 65 6e 74 20 74 72  . A statement tr
19920 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 77 73  ansaction allows
19930 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
19940 65 20 62 79 20 74 68 69 73 0a 2a 2a 20 56 44 42  e by this.** VDB
19950 45 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  E to be rolled b
19960 61 63 6b 20 61 66 74 65 72 20 61 6e 20 65 72 72  ack after an err
19970 6f 72 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  or without havin
19980 67 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  g to roll back t
19990 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 74 72 61  he.** entire tra
199a0 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 6e 6f 20  nsaction. If no 
199b0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
199c0 65 72 65 64 2c 20 74 68 65 20 73 74 61 74 65 6d  ered, the statem
199d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
199e0 2a 2a 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  ** will automati
199f0 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 20 77 68 65  cally commit whe
19a00 6e 20 74 68 65 20 56 44 42 45 20 68 61 6c 74 73  n the VDBE halts
19a10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30  ..**.** If P5!=0
19a20 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64   then this opcod
19a30 65 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68  e also checks th
19a40 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
19a50 61 67 61 69 6e 73 74 20 50 33 0a 2a 2a 20 61 6e  against P3.** an
19a60 64 20 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e  d the schema gen
19a70 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  eration counter 
19a80 61 67 61 69 6e 73 74 20 50 34 2e 0a 2a 2a 20 54  against P4..** T
19a90 68 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65  he cookie change
19aa0 73 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e  s its value when
19ab0 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
19ac0 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
19ad0 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74  ..** This operat
19ae0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64  ion is used to d
19af0 65 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20  etect when that 
19b00 74 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63  the cookie has c
19b10 68 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68  hanged.** and th
19b20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
19b30 72 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20  rocess needs to 
19b40 72 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d  reread the schem
19b50 61 2e 20 20 49 66 20 74 68 65 20 73 63 68 65 6d  a.  If the schem
19b60 61 0a 2a 2a 20 63 6f 6f 6b 69 65 20 69 6e 20 50  a.** cookie in P
19b70 33 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  3 differs from t
19b80 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
19b90 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
19ba0 20 68 65 61 64 65 72 20 6f 72 0a 2a 2a 20 69 66   header or.** if
19bb0 20 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e 65   the schema gene
19bc0 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  ration counter i
19bd0 6e 20 50 34 20 64 69 66 66 65 72 73 20 66 72 6f  n P4 differs fro
19be0 6d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  m the current.**
19bf0 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e   generation coun
19c00 74 65 72 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  ter, then an SQL
19c10 49 54 45 5f 53 43 48 45 4d 41 20 65 72 72 6f 72  ITE_SCHEMA error
19c20 20 69 73 20 72 61 69 73 65 64 20 61 6e 64 20 65   is raised and e
19c30 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 68 61 6c 74  xecution.** halt
19c40 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
19c50 73 74 65 70 28 29 20 77 72 61 70 70 65 72 20 66  step() wrapper f
19c60 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 74 68  unction might th
19c70 65 6e 20 72 65 70 72 65 70 61 72 65 20 74 68 65  en reprepare the
19c80 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  .** statement an
19c90 64 20 72 65 72 75 6e 20 69 74 20 66 72 6f 6d 20  d rerun it from 
19ca0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a  the beginning..*
19cb0 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61  /.case OP_Transa
19cc0 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65  ction: {.  Btree
19cd0 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 4d 65   *pBt;.  int iMe
19ce0 74 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e 3b 0a  ta;.  int iGen;.
19cf0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
19d00 73 52 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  sReader );.  ass
19d10 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  ert( p->readOnly
19d20 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d  ==0 || pOp->p2==
19d30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19d40 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
19d50 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
19d60 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
19d70 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  Test(p->btreeMas
19d80 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20  k, pOp->p1) );. 
19d90 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 26 20   if( pOp->p2 && 
19da0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
19db0 49 54 45 5f 51 75 65 72 79 4f 6e 6c 79 29 21 3d  ITE_QueryOnly)!=
19dc0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
19dd0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
19de0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
19df0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  e_to_error;.  }.
19e00 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b    pBt = db->aDb[
19e10 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20  pOp->p1].pBt;.. 
19e20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
19e30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
19e40 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
19e50 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 74   pOp->p2);.    t
19e60 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
19e70 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
19e80 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
19e90 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
19ea0 53 59 5f 52 45 43 4f 56 45 52 59 20 29 3b 0a 20  SY_RECOVERY );. 
19eb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19ec0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
19ed0 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
19ee0 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
19ef0 20 20 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74      p->pc = (int
19f00 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
19f10 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
19f20 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76  ;.        goto v
19f30 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
19f40 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 61    }.      goto a
19f50 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
19f60 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
19f70 28 20 70 4f 70 2d 3e 70 32 20 26 26 20 70 2d 3e  ( pOp->p2 && p->
19f80 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
19f90 0a 20 20 20 20 20 26 26 20 28 64 62 2d 3e 61 75  .     && (db->au
19fa0 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
19fb0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 29 20  b->nVdbeRead>1) 
19fc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
19fd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
19fe0 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
19ff0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
1a000 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >iStatement==0 )
1a010 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1a020 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
1a030 3e 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61 76 65  >=0 && db->nSave
1a040 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20  point>=0 );.    
1a050 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
1a060 6e 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20 70  nt++; .        p
1a070 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64  ->iStatement = d
1a080 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20  b->nSavepoint + 
1a090 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a  db->nStatement;.
1a0a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
1a0b0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
1a0c0 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
1a0d0 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 70 2d  EPOINT_BEGIN, p-
1a0e0 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 29 3b 0a  >iStatement-1);.
1a0f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a110 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1a120 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 70 42  treeBeginStmt(pB
1a130 74 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t, p->iStatement
1a140 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1a150 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 63    /* Store the c
1a160 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
1a170 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
1a180 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
1a190 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 2a  nstraint.      *
1a1a0 2a 20 63 6f 75 6e 74 65 72 2e 20 49 66 20 74 68  * counter. If th
1a1b0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1a1c0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
1a1d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
1a1e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
1a1f0 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f 75 6e  lue of this coun
1a200 74 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ter needs to be 
1a210 72 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20 2a  restored too.  *
1a220 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74  /.      p->nStmt
1a230 44 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44  DefCons = db->nD
1a240 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20  eferredCons;.   
1a250 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d     p->nStmtDefIm
1a260 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66  mCons = db->nDef
1a270 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20  erredImmCons;.  
1a280 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68    }..    /* Gath
1a290 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  er the schema ve
1a2a0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 66 6f 72  rsion number for
1a2b0 20 63 68 65 63 6b 69 6e 67 3a 0a 20 20 20 20 2a   checking:.    *
1a2c0 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
1a2d0 2d 4f 46 3a 20 52 2d 30 33 31 38 39 2d 35 31 31  -OF: R-03189-511
1a2e0 33 35 20 41 73 20 65 61 63 68 20 53 51 4c 20 73  35 As each SQL s
1a2f0 74 61 74 65 6d 65 6e 74 20 72 75 6e 73 2c 20 74  tatement runs, t
1a300 68 65 20 73 63 68 65 6d 61 0a 20 20 20 20 2a 2a  he schema.    **
1a310 20 76 65 72 73 69 6f 6e 20 69 73 20 63 68 65 63   version is chec
1a320 6b 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ked to ensure th
1a330 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  at the schema ha
1a340 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 73 69  s not changed si
1a350 6e 63 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  nce the.    ** S
1a360 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  QL statement was
1a370 20 70 72 65 70 61 72 65 64 2e 0a 20 20 20 20 2a   prepared..    *
1a380 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
1a390 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42  eeGetMeta(pBt, B
1a3a0 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
1a3b0 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d 65  ION, (u32 *)&iMe
1a3c0 74 61 29 3b 0a 20 20 20 20 69 47 65 6e 20 3d 20  ta);.    iGen = 
1a3d0 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
1a3e0 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72  .pSchema->iGener
1a3f0 61 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ation;.  }else{.
1a400 20 20 20 20 69 47 65 6e 20 3d 20 69 4d 65 74 61      iGen = iMeta
1a410 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
1a420 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c  rt( pOp->p5==0 |
1a430 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  | pOp->p4type==P
1a440 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 69 66 28  4_INT32 );.  if(
1a450 20 70 4f 70 2d 3e 70 35 20 26 26 20 28 69 4d 65   pOp->p5 && (iMe
1a460 74 61 21 3d 70 4f 70 2d 3e 70 33 20 7c 7c 20 69  ta!=pOp->p3 || i
1a470 47 65 6e 21 3d 70 4f 70 2d 3e 70 34 2e 69 29 20  Gen!=pOp->p4.i) 
1a480 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1a490 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
1a4a0 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
1a4b0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
1a4c0 53 74 72 44 75 70 28 64 62 2c 20 22 64 61 74 61  StrDup(db, "data
1a4d0 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
1a4e0 63 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f  changed");.    /
1a4f0 2a 20 49 66 20 74 68 65 20 73 63 68 65 6d 61 2d  * If the schema-
1a500 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20  cookie from the 
1a510 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
1a520 74 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69 65  tches the cookie
1a530 20 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20   .    ** stored 
1a540 77 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  with the in-memo
1a550 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
1a560 6e 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2c  n of the schema,
1a570 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72   do.    ** not r
1a580 65 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61  eload the schema
1a590 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1a5a0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  se file..    **.
1a5b0 20 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75 61      ** If virtua
1a5c0 6c 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e 20  l-tables are in 
1a5d0 75 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f 74  use, this is not
1a5e0 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a   just an optimiz
1a5f0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66  ation..    ** Of
1a600 74 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73 74  ten, v-tables st
1a610 6f 72 65 20 74 68 65 69 72 20 64 61 74 61 20 69  ore their data i
1a620 6e 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74  n other SQLite t
1a630 61 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20 20  ables, which.   
1a640 20 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64 20   ** are queried 
1a650 66 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65 78  from within xNex
1a660 74 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76 2d  t() and other v-
1a670 74 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75 73  table methods us
1a680 69 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70 61  ing.    ** prepa
1a690 72 65 64 20 71 75 65 72 69 65 73 2e 20 49 66 20  red queries. If 
1a6a0 73 75 63 68 20 61 20 71 75 65 72 79 20 69 73 20  such a query is 
1a6b0 6f 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20  out-of-date, we 
1a6c0 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20  do not want to. 
1a6d0 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68     ** discard th
1a6e0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1a6f0 61 2c 20 61 73 20 74 68 65 20 75 73 65 72 20 63  a, as the user c
1a700 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  ode implementing
1a710 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61   the.    ** v-ta
1a720 62 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74  ble would have t
1a730 6f 20 62 65 20 72 65 61 64 79 20 66 6f 72 20 74  o be ready for t
1a740 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  he sqlite3_vtab 
1a750 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
1a760 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  .    ** to be in
1a770 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65 76  validated whenev
1a780 65 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  er sqlite3_step(
1a790 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  ) is called from
1a7a0 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
1a7b0 61 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64  a v-table method
1a7c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a7d0 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
1a7e0 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
1a7f0 61 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20  a_cookie!=iMeta 
1a800 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a810 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64  ResetOneSchema(d
1a820 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20  b, pOp->p1);.   
1a830 20 7d 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65   }.    p->expire
1a840 64 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  d = 1;.    rc = 
1a850 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20  SQLITE_SCHEMA;. 
1a860 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
1a870 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1a880 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
1a890 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  }../* Opcode: Re
1a8a0 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50  adCookie P1 P2 P
1a8b0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64  3 * *.**.** Read
1a8c0 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50   cookie number P
1a8d0 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  3 from database 
1a8e0 50 31 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  P1 and write it 
1a8f0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
1a900 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74 68  ..** P3==1 is th
1a910 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
1a920 2e 20 20 50 33 3d 3d 32 20 69 73 20 74 68 65 20  .  P3==2 is the 
1a930 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e  database format.
1a940 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 68 65  .** P3==3 is the
1a950 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67   recommended pag
1a960 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61  er cache size, a
1a970 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31  nd so forth.  P1
1a980 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61  ==0 is.** the ma
1a990 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1a9a0 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68   and P1==1 is th
1a9b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a9c0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
1a9d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1a9e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  s..**.** There m
1a9f0 75 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f  ust be a read-lo
1aa00 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1aa10 73 65 20 28 65 69 74 68 65 72 20 61 20 74 72 61  se (either a tra
1aa20 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
1aa30 20 62 65 20 73 74 61 72 74 65 64 20 6f 72 20 74   be started or t
1aa40 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1aa50 6f 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66  open cursor) bef
1aa60 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67  ore.** executing
1aa70 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1aa80 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  n..*/.case OP_Re
1aa90 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20  adCookie: {     
1aaa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
1aab0 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 74 61  2 */.  int iMeta
1aac0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69  ;.  int iDb;.  i
1aad0 6e 74 20 69 43 6f 6f 6b 69 65 3b 0a 0a 20 20 61  nt iCookie;..  a
1aae0 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
1aaf0 64 65 72 20 29 3b 0a 20 20 69 44 62 20 3d 20 70  der );.  iDb = p
1ab00 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b 69  Op->p1;.  iCooki
1ab10 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61  e = pOp->p3;.  a
1ab20 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 53  ssert( pOp->p3<S
1ab30 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45  QLITE_N_BTREE_ME
1ab40 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TA );.  assert( 
1ab50 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
1ab60 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
1ab70 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
1ab80 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
1ab90 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  rt( DbMaskTest(p
1aba0 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62  ->btreeMask, iDb
1abb0 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ) );..  sqlite3B
1abc0 74 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d 3e  treeGetMeta(db->
1abd0 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 69 43  aDb[iDb].pBt, iC
1abe0 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29 26 69  ookie, (u32 *)&i
1abf0 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74 20 3d 20  Meta);.  pOut = 
1ac00 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
1ac10 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e  , pOp);.  pOut->
1ac20 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20 20 62  u.i = iMeta;.  b
1ac30 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1ac40 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20 50 31  de: SetCookie P1
1ac50 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
1ac60 20 57 72 69 74 65 20 74 68 65 20 69 6e 74 65 67   Write the integ
1ac70 65 72 20 76 61 6c 75 65 20 50 33 20 69 6e 74 6f  er value P3 into
1ac80 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50   cookie number P
1ac90 32 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31  2 of database P1
1aca0 2e 0a 2a 2a 20 50 32 3d 3d 31 20 69 73 20 74 68  ..** P2==1 is th
1acb0 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
1acc0 2e 20 20 50 32 3d 3d 32 20 69 73 20 74 68 65 20  .  P2==2 is the 
1acd0 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e  database format.
1ace0 0a 2a 2a 20 50 32 3d 3d 33 20 69 73 20 74 68 65  .** P2==3 is the
1acf0 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67   recommended pag
1ad00 65 72 20 63 61 63 68 65 20 0a 2a 2a 20 73 69 7a  er cache .** siz
1ad10 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  e, and so forth.
1ad20 20 20 50 31 3d 3d 30 20 69 73 20 74 68 65 20 6d    P1==0 is the m
1ad30 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1ad40 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74  e and P1==1 is t
1ad50 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
1ad60 66 69 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f  file used to sto
1ad70 72 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  re temporary tab
1ad80 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  les..**.** A tra
1ad90 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1ada0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1adb0 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 6f  executing this o
1adc0 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pcode..*/.case O
1add0 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 0a 20  P_SetCookie: {. 
1ade0 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65   Db *pDb;.  asse
1adf0 72 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49  rt( pOp->p2<SQLI
1ae00 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20  TE_N_BTREE_META 
1ae10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1ae20 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1ae30 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
1ae40 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
1ae50 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
1ae60 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61   pOp->p1) );.  a
1ae70 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e  ssert( p->readOn
1ae80 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d  ly==0 );.  pDb =
1ae90 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70   &db->aDb[pOp->p
1aea0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  1];.  assert( pD
1aeb0 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  b->pBt!=0 );.  a
1aec0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1aed0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1aee0 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29 3b  , pOp->p1, 0) );
1aef0 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20 61  .  /* See note a
1af00 62 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66 74  bout index shift
1af10 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43 6f  ing on OP_ReadCo
1af20 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73  okie */.  rc = s
1af30 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
1af40 65 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20  eMeta(pDb->pBt, 
1af50 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
1af60 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  );.  if( pOp->p2
1af70 3d 3d 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  ==BTREE_SCHEMA_V
1af80 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a  ERSION ){.    /*
1af90 20 57 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   When the schema
1afa0 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 2c   cookie changes,
1afb0 20 72 65 63 6f 72 64 20 74 68 65 20 6e 65 77 20   record the new 
1afc0 63 6f 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c 6c  cookie internall
1afd0 79 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53  y */.    pDb->pS
1afe0 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
1aff0 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  okie = pOp->p3;.
1b000 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
1b010 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
1b020 61 43 68 61 6e 67 65 3b 0a 20 20 7d 65 6c 73 65  aChange;.  }else
1b030 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54   if( pOp->p2==BT
1b040 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20  REE_FILE_FORMAT 
1b050 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  ){.    /* Record
1b060 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   changes in the 
1b070 66 69 6c 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  file format */. 
1b080 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d     pDb->pSchema-
1b090 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70  >file_format = p
1b0a0 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 69 66  Op->p3;.  }.  if
1b0b0 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b 0a  ( pOp->p1==1 ){.
1b0c0 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74      /* Invalidat
1b0d0 65 20 61 6c 6c 20 70 72 65 70 61 72 65 64 20 73  e all prepared s
1b0e0 74 61 74 65 6d 65 6e 74 73 20 77 68 65 6e 65 76  tatements whenev
1b0f0 65 72 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  er the TEMP data
1b100 62 61 73 65 0a 20 20 20 20 2a 2a 20 73 63 68 65  base.    ** sche
1b110 6d 61 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20  ma is changed.  
1b120 54 69 63 6b 65 74 20 23 31 36 34 34 20 2a 2f 0a  Ticket #1644 */.
1b130 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
1b140 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
1b150 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e  nts(db);.    p->
1b160 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d  expired = 0;.  }
1b170 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
1b180 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1b190 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ror;.  break;.}.
1b1a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e  ./* Opcode: Open
1b1b0 52 65 61 64 20 50 31 20 50 32 20 50 33 20 50 34  Read P1 P2 P3 P4
1b1c0 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
1b1d0 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a   root=P2 iDb=P3.
1b1e0 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61  **.** Open a rea
1b1f0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f  d-only cursor fo
1b200 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  r the database t
1b210 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  able whose root 
1b220 70 61 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e  page is.** P2 in
1b230 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1b240 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
1b250 66 69 6c 65 20 69 73 20 64 65 74 65 72 6d 69 6e  file is determin
1b260 65 64 20 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33  ed by P3. .** P3
1b270 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 20 6d 61  ==0 means the ma
1b280 69 6e 20 64 61 74 61 62 61 73 65 2c 20 50 33 3d  in database, P3=
1b290 3d 31 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  =1 means the dat
1b2a0 61 62 61 73 65 20 75 73 65 64 20 66 6f 72 20 0a  abase used for .
1b2b0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
1b2c0 6c 65 73 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65  les, and P3>1 me
1b2d0 61 6e 73 20 75 73 65 64 20 74 68 65 20 63 6f 72  ans used the cor
1b2e0 72 65 73 70 6f 6e 64 69 6e 67 20 61 74 74 61 63  responding attac
1b2f0 68 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  hed.** database.
1b300 20 20 47 69 76 65 20 74 68 65 20 6e 65 77 20 63    Give the new c
1b310 75 72 73 6f 72 20 61 6e 20 69 64 65 6e 74 69 66  ursor an identif
1b320 69 65 72 20 6f 66 20 50 31 2e 20 20 54 68 65 20  ier of P1.  The 
1b330 50 31 0a 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65  P1.** values nee
1b340 64 20 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67 75  d not be contigu
1b350 6f 75 73 20 62 75 74 20 61 6c 6c 20 50 31 20 76  ous but all P1 v
1b360 61 6c 75 65 73 20 73 68 6f 75 6c 64 20 62 65 20  alues should be 
1b370 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a  small integers..
1b380 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  ** It is an erro
1b390 72 20 66 6f 72 20 50 31 20 74 6f 20 62 65 20 6e  r for P1 to be n
1b3a0 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49  egative..**.** I
1b3b0 66 20 50 35 21 3d 30 20 74 68 65 6e 20 75 73 65  f P5!=0 then use
1b3c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1b3d0 72 65 67 69 73 74 65 72 20 50 32 20 61 73 20 74  register P2 as t
1b3e0 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f  he root page, no
1b3f0 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  t.** the value o
1b400 66 20 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  f P2 itself..**.
1b410 2a 2a 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65  ** There will be
1b420 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
1b430 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68 65  the database whe
1b440 6e 65 76 65 72 20 74 68 65 72 65 20 69 73 20 61  never there is a
1b450 6e 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  n.** open cursor
1b460 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1b470 73 65 20 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20  se was unlocked 
1b480 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 69 6e  prior to this in
1b490 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65  struction.** the
1b4a0 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
1b4b0 20 61 63 71 75 69 72 65 64 20 61 73 20 70 61 72   acquired as par
1b4c0 74 20 6f 66 20 74 68 69 73 20 69 6e 73 74 72 75  t of this instru
1b4d0 63 74 69 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a  ction.  A read.*
1b4e0 2a 20 6c 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74  * lock allows ot
1b4f0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f  her processes to
1b500 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
1b510 73 65 20 62 75 74 20 70 72 6f 68 69 62 69 74 73  se but prohibits
1b520 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 70 72  .** any other pr
1b530 6f 63 65 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66  ocess from modif
1b540 79 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ying the databas
1b550 65 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  e.  The read loc
1b560 6b 20 69 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64  k is.** released
1b570 20 77 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   when all cursor
1b580 73 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 20 49  s are closed.  I
1b590 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
1b5a0 6f 6e 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  on attempts.** t
1b5b0 6f 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63  o get a read loc
1b5c0 6b 20 62 75 74 20 66 61 69 6c 73 2c 20 74 68 65  k but fails, the
1b5d0 20 73 63 72 69 70 74 20 74 65 72 6d 69 6e 61 74   script terminat
1b5e0 65 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  es with an.** SQ
1b5f0 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
1b600 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
1b610 50 34 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  P4 value may be 
1b620 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65  either an intege
1b630 72 20 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20  r (P4_INT32) or 
1b640 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
1b650 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
1b660 75 72 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29  ure (P4_KEYINFO)
1b670 2e 20 49 66 20 69 74 20 69 73 20 61 20 70 6f 69  . If it is a poi
1b680 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
1b690 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  o .** structure,
1b6a0 20 74 68 65 6e 20 73 61 69 64 20 73 74 72 75 63   then said struc
1b6b0 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 65  ture defines the
1b6c0 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c   content and col
1b6d0 6c 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65  lating .** seque
1b6e0 6e 63 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  nce of the index
1b6f0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f   being opened. O
1b700 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 34 20  therwise, if P4 
1b710 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a  is an integer .*
1b720 2a 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20 73  * value, it is s
1b730 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1b740 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
1b750 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1b760 53 65 65 20 61 6c 73 6f 3a 20 4f 70 65 6e 57 72  See also: OpenWr
1b770 69 74 65 2c 20 52 65 6f 70 65 6e 49 64 78 0a 2a  ite, ReopenIdx.*
1b780 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6f  /./* Opcode: Reo
1b790 70 65 6e 49 64 78 20 50 31 20 50 32 20 50 33 20  penIdx P1 P2 P3 
1b7a0 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
1b7b0 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50  s: root=P2 iDb=P
1b7c0 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70  3.**.** The Reop
1b7d0 65 6e 49 64 78 20 6f 70 63 6f 64 65 20 77 6f 72  enIdx opcode wor
1b7e0 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20  ks exactly like 
1b7f0 52 65 61 64 4f 70 65 6e 20 65 78 63 65 70 74 20  ReadOpen except 
1b800 74 68 61 74 20 69 74 20 66 69 72 73 74 0a 2a 2a  that it first.**
1b810 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
1b820 66 20 74 68 65 20 63 75 72 73 6f 72 20 6f 6e 20  f the cursor on 
1b830 50 31 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  P1 is already op
1b840 65 6e 20 77 69 74 68 20 61 20 72 6f 6f 74 20 70  en with a root p
1b850 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  age.** number of
1b860 20 50 32 20 61 6e 64 20 69 66 20 69 74 20 69 73   P2 and if it is
1b870 20 74 68 69 73 20 6f 70 63 6f 64 65 20 62 65 63   this opcode bec
1b880 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  omes a no-op.  I
1b890 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
1b8a0 2a 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  * if the cursor 
1b8b0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
1b8c0 20 64 6f 20 6e 6f 74 20 72 65 6f 70 65 6e 20 69   do not reopen i
1b8d0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f  t..**.** The Reo
1b8e0 70 65 6e 49 64 78 20 6f 70 63 6f 64 65 20 6d 61  penIdx opcode ma
1b8f0 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
1b900 69 74 68 20 50 35 3d 3d 30 20 61 6e 64 20 77 69  ith P5==0 and wi
1b910 74 68 20 50 34 20 62 65 69 6e 67 0a 2a 2a 20 61  th P4 being.** a
1b920 20 50 34 5f 4b 45 59 49 4e 46 4f 20 6f 62 6a 65   P4_KEYINFO obje
1b930 63 74 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ct.  Furthermore
1b940 2c 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 6d  , the P3 value m
1b950 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
1b960 61 73 0a 2a 2a 20 65 76 65 72 79 20 6f 74 68 65  as.** every othe
1b970 72 20 52 65 6f 70 65 6e 49 64 78 20 6f 72 20 4f  r ReopenIdx or O
1b980 70 65 6e 52 65 61 64 20 66 6f 72 20 74 68 65 20  penRead for the 
1b990 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  same cursor numb
1b9a0 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  er..**.** See th
1b9b0 65 20 4f 70 65 6e 52 65 61 64 20 6f 70 63 6f 64  e OpenRead opcod
1b9c0 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  e documentation 
1b9d0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
1b9e0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f  nformation..*/./
1b9f0 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72  * Opcode: OpenWr
1ba00 69 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20  ite P1 P2 P3 P4 
1ba10 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
1ba20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a  root=P2 iDb=P3.*
1ba30 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64  *.** Open a read
1ba40 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 6e 61  /write cursor na
1ba50 6d 65 64 20 50 31 20 6f 6e 20 74 68 65 20 74 61  med P1 on the ta
1ba60 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f  ble or index who
1ba70 73 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  se root.** page 
1ba80 69 73 20 50 32 2e 20 20 4f 72 20 69 66 20 50 35  is P2.  Or if P5
1ba90 21 3d 30 20 75 73 65 20 74 68 65 20 63 6f 6e 74  !=0 use the cont
1baa0 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
1bab0 50 32 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  P2 to find the.*
1bac0 2a 20 72 6f 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a  * root page..**.
1bad0 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20  ** The P4 value 
1bae0 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e  may be either an
1baf0 20 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54   integer (P4_INT
1bb00 33 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  32) or a pointer
1bb10 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f   to.** a KeyInfo
1bb20 20 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b   structure (P4_K
1bb30 45 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69  EYINFO). If it i
1bb40 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1bb50 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
1bb60 75 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69  ucture, then sai
1bb70 64 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69  d structure defi
1bb80 6e 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nes the content 
1bb90 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a  and collating .*
1bba0 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  * sequence of th
1bbb0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70  e index being op
1bbc0 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ened. Otherwise,
1bbd0 20 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74   if P4 is an int
1bbe0 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20  eger .** value, 
1bbf0 69 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  it is set to the
1bc00 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
1bc10 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ns in the table,
1bc20 20 6f 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 61   or to the.** la
1bc30 72 67 65 73 74 20 69 6e 64 65 78 20 6f 66 20 61  rgest index of a
1bc40 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ny column of the
1bc50 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 61   table that is a
1bc60 63 74 75 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a  ctually used..**
1bc70 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63  .** This instruc
1bc80 74 69 6f 6e 20 77 6f 72 6b 73 20 6a 75 73 74 20  tion works just 
1bc90 6c 69 6b 65 20 4f 70 65 6e 52 65 61 64 20 65 78  like OpenRead ex
1bca0 63 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65  cept that it ope
1bcb0 6e 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ns the cursor.**
1bcc0 20 69 6e 20 72 65 61 64 2f 77 72 69 74 65 20 6d   in read/write m
1bcd0 6f 64 65 2e 20 20 46 6f 72 20 61 20 67 69 76 65  ode.  For a give
1bce0 6e 20 74 61 62 6c 65 2c 20 74 68 65 72 65 20 63  n table, there c
1bcf0 61 6e 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  an be one or mor
1bd00 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  e read-only.** c
1bd10 75 72 73 6f 72 73 20 6f 72 20 61 20 73 69 6e 67  ursors or a sing
1bd20 6c 65 20 72 65 61 64 2f 77 72 69 74 65 20 63 75  le read/write cu
1bd30 72 73 6f 72 20 62 75 74 20 6e 6f 74 20 62 6f 74  rsor but not bot
1bd40 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  h..**.** See als
1bd50 6f 20 4f 70 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63  o OpenRead..*/.c
1bd60 61 73 65 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78  ase OP_ReopenIdx
1bd70 3a 20 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  : {.  int nField
1bd80 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1bd90 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b  yInfo;.  int p2;
1bda0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e  .  int iDb;.  in
1bdb0 74 20 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65  t wrFlag;.  Btre
1bdc0 65 20 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72  e *pX;.  VdbeCur
1bdd0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20  sor *pCur;.  Db 
1bde0 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
1bdf0 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70   pOp->p5==0 || p
1be00 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53  Op->p5==OPFLAG_S
1be10 45 45 4b 45 51 20 29 3b 0a 20 20 61 73 73 65 72  EEKEQ );.  asser
1be20 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
1be30 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20  P4_KEYINFO );.  
1be40 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b  pCur = p->apCsr[
1be50 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
1be60 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 70 67  pCur && pCur->pg
1be70 6e 6f 52 6f 6f 74 3d 3d 28 75 33 32 29 70 4f 70  noRoot==(u32)pOp
1be80 2d 3e 70 32 20 29 7b 0a 20 20 20 20 61 73 73 65  ->p2 ){.    asse
1be90 72 74 28 20 70 43 75 72 2d 3e 69 44 62 3d 3d 70  rt( pCur->iDb==p
1bea0 4f 70 2d 3e 70 33 20 29 3b 20 20 20 20 20 20 2f  Op->p3 );      /
1beb0 2a 20 47 75 61 72 61 6e 74 65 65 64 20 62 79 20  * Guaranteed by 
1bec0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1bed0 6f 72 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6f  or */.    goto o
1bee0 70 65 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68  pen_cursor_set_h
1bef0 69 6e 74 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  ints;.  }.  /* I
1bf00 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1bf10 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
1bf20 65 6e 20 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  en or is open on
1bf30 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a   a different.  *
1bf40 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 66 61  * index, then fa
1bf50 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
1bf60 4f 50 5f 4f 70 65 6e 52 65 61 64 20 74 6f 20 66  OP_OpenRead to f
1bf70 6f 72 63 65 20 61 20 72 65 6f 70 65 6e 20 2a 2f  orce a reopen */
1bf80 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65 61  .case OP_OpenRea
1bf90 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57  d:.case OP_OpenW
1bfa0 72 69 74 65 3a 0a 0a 20 20 61 73 73 65 72 74 28  rite:..  assert(
1bfb0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1bfc0 5f 4f 70 65 6e 57 72 69 74 65 20 7c 7c 20 70 4f  _OpenWrite || pO
1bfd0 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d  p->p5==0 || pOp-
1bfe0 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b  >p5==OPFLAG_SEEK
1bff0 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
1c000 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a  p->bIsReader );.
1c010 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
1c020 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65  pcode==OP_OpenRe
1c030 61 64 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  ad || pOp->opcod
1c040 65 3d 3d 4f 50 5f 52 65 6f 70 65 6e 49 64 78 0a  e==OP_ReopenIdx.
1c050 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
1c060 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a  readOnly==0 );..
1c070 20 20 69 66 28 20 70 2d 3e 65 78 70 69 72 65 64    if( p->expired
1c080 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1c090 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
1c0a0 43 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f  CK;.    goto abo
1c0b0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1c0c0 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d  .  }..  nField =
1c0d0 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d   0;.  pKeyInfo =
1c0e0 20 30 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e   0;.  p2 = pOp->
1c0f0 70 32 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d  p2;.  iDb = pOp-
1c100 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 69  >p3;.  assert( i
1c110 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
1c120 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
1c130 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
1c140 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29 20  btreeMask, iDb) 
1c150 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
1c160 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d  aDb[iDb];.  pX =
1c170 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73   pDb->pBt;.  ass
1c180 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1c190 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
1c1a0 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b  =OP_OpenWrite ){
1c1b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 46  .    assert( OPF
1c1c0 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3d 3d 42  LAG_FORDELETE==B
1c1d0 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 29  TREE_FORDELETE )
1c1e0 3b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 42  ;.    wrFlag = B
1c1f0 54 52 45 45 5f 57 52 43 53 52 20 7c 20 28 70 4f  TREE_WRCSR | (pO
1c200 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 46  p->p5 & OPFLAG_F
1c210 4f 52 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 61  ORDELETE);.    a
1c220 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1c230 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1c240 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
1c250 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
1c260 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3c  a->file_format <
1c270 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
1c280 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20 20  Format ){.      
1c290 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
1c2a0 6f 72 6d 61 74 20 3d 20 70 44 62 2d 3e 70 53 63  ormat = pDb->pSc
1c2b0 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
1c2c0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
1c2d0 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 30  {.    wrFlag = 0
1c2e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
1c2f0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 32 49  >p5 & OPFLAG_P2I
1c300 53 52 45 47 20 29 7b 0a 20 20 20 20 61 73 73 65  SREG ){.    asse
1c310 72 74 28 20 70 32 3e 30 20 29 3b 0a 20 20 20 20  rt( p2>0 );.    
1c320 61 73 73 65 72 74 28 20 70 32 3c 3d 28 70 2d 3e  assert( p2<=(p->
1c330 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
1c340 73 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e 32  sor) );.    pIn2
1c350 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20   = &aMem[p2];.  
1c360 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
1c370 61 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a 20 20  alid(pIn2) );.  
1c380 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d    assert( (pIn2-
1c390 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1c3a0 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  )!=0 );.    sqli
1c3b0 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
1c3c0 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 20 20  rify(pIn2);.    
1c3d0 70 32 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e  p2 = (int)pIn2->
1c3e0 75 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  u.i;.    /* The 
1c3f0 70 32 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20  p2 value always 
1c400 63 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70 72 69  comes from a pri
1c410 6f 72 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  or OP_CreateBtre
1c420 65 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20 20 20  e opcode and.   
1c430 20 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64 65 20   ** that opcode 
1c440 77 69 6c 6c 20 61 6c 77 61 79 73 20 73 65 74 20  will always set 
1c450 74 68 65 20 70 32 20 76 61 6c 75 65 20 74 6f 20  the p2 value to 
1c460 32 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73  2 or more or els
1c470 65 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49  e fail..    ** I
1c480 66 20 74 68 65 72 65 20 77 65 72 65 20 61 20 66  f there were a f
1c490 61 69 6c 75 72 65 2c 20 74 68 65 20 70 72 65 70  ailure, the prep
1c4a0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  ared statement w
1c4b0 6f 75 6c 64 20 68 61 76 65 20 68 61 6c 74 65 64  ould have halted
1c4c0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72  .    ** before r
1c4d0 65 61 63 68 69 6e 67 20 74 68 69 73 20 69 6e 73  eaching this ins
1c4e0 74 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  truction. */.   
1c4f0 20 61 73 73 65 72 74 28 20 70 32 3e 3d 32 20 29   assert( p2>=2 )
1c500 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
1c510 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49  >p4type==P4_KEYI
1c520 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49  NFO ){.    pKeyI
1c530 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
1c540 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65  eyInfo;.    asse
1c550 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  rt( pKeyInfo->en
1c560 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20  c==ENC(db) );.  
1c570 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1c580 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  fo->db==db );.  
1c590 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49    nField = pKeyI
1c5a0 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3b 0a  nfo->nAllField;.
1c5b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
1c5c0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
1c5d0 32 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64 20  2 ){.    nField 
1c5e0 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d  = pOp->p4.i;.  }
1c5f0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1c600 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  p1>=0 );.  asser
1c610 74 28 20 6e 46 69 65 6c 64 3e 3d 30 20 29 3b 0a  t( nField>=0 );.
1c620 20 20 74 65 73 74 63 61 73 65 28 20 6e 46 69 65    testcase( nFie
1c630 6c 64 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 61 62  ld==0 );  /* Tab
1c640 6c 65 20 77 69 74 68 20 49 4e 54 45 47 45 52 20  le with INTEGER 
1c650 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20  PRIMARY KEY and 
1c660 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 2a 2f 0a  nothing else */.
1c670 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74    pCur = allocat
1c680 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
1c690 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62 2c  p1, nField, iDb,
1c6a0 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b   CURTYPE_BTREE);
1c6b0 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
1c6c0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
1c6d0 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20  pCur->nullRow = 
1c6e0 31 3b 0a 20 20 70 43 75 72 2d 3e 69 73 4f 72 64  1;.  pCur->isOrd
1c6f0 65 72 65 64 20 3d 20 31 3b 0a 20 20 70 43 75 72  ered = 1;.  pCur
1c700 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 70 32 3b  ->pgnoRoot = p2;
1c710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c720 45 42 55 47 0a 20 20 70 43 75 72 2d 3e 77 72 46  EBUG.  pCur->wrF
1c730 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 23 65  lag = wrFlag;.#e
1c740 6e 64 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69  ndif.  rc = sqli
1c750 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70  te3BtreeCursor(p
1c760 58 2c 20 70 32 2c 20 77 72 46 6c 61 67 2c 20 70  X, p2, wrFlag, p
1c770 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 2d 3e 75  KeyInfo, pCur->u
1c780 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 70 43  c.pCursor);.  pC
1c790 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1c7a0 4b 65 79 49 6e 66 6f 3b 0a 20 20 2f 2a 20 53 65  KeyInfo;.  /* Se
1c7b0 74 20 74 68 65 20 56 64 62 65 43 75 72 73 6f 72  t the VdbeCursor
1c7c0 2e 69 73 54 61 62 6c 65 20 76 61 72 69 61 62 6c  .isTable variabl
1c7d0 65 2e 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  e. Previous vers
1c7e0 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51 4c  ions of.  ** SQL
1c7f0 69 74 65 20 75 73 65 64 20 74 6f 20 63 68 65 63  ite used to chec
1c800 6b 20 69 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  k if the root-pa
1c810 67 65 20 66 6c 61 67 73 20 77 65 72 65 20 73 61  ge flags were sa
1c820 6e 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ne at this point
1c830 0a 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74  .  ** and report
1c840 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1c850 74 69 6f 6e 20 69 66 20 74 68 65 79 20 77 65 72  tion if they wer
1c860 65 20 6e 6f 74 2c 20 62 75 74 20 74 68 69 73 20  e not, but this 
1c870 63 68 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20 73  check has.  ** s
1c880 69 6e 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20  ince moved into 
1c890 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
1c8a0 20 20 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e 69    */  .  pCur->i
1c8b0 73 54 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70 34  sTable = pOp->p4
1c8c0 74 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f  type!=P4_KEYINFO
1c8d0 3b 0a 0a 6f 70 65 6e 5f 63 75 72 73 6f 72 5f 73  ;..open_cursor_s
1c8e0 65 74 5f 68 69 6e 74 73 3a 0a 20 20 61 73 73 65  et_hints:.  asse
1c8f0 72 74 28 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43  rt( OPFLAG_BULKC
1c900 53 52 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f  SR==BTREE_BULKLO
1c910 41 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AD );.  assert( 
1c920 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 3d 3d 42  OPFLAG_SEEKEQ==B
1c930 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 29 3b 0a  TREE_SEEK_EQ );.
1c940 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d    testcase( pOp-
1c950 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 42 55 4c  >p5 & OPFLAG_BUL
1c960 4b 43 53 52 20 29 3b 0a 23 69 66 64 65 66 20 53  KCSR );.#ifdef S
1c970 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
1c980 53 4f 52 5f 48 49 4e 54 53 0a 20 20 74 65 73 74  SOR_HINTS.  test
1c990 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 20 26 20  case( pOp->p2 & 
1c9a0 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b  OPFLAG_SEEKEQ );
1c9b0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1c9c0 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
1c9d0 46 6c 61 67 73 28 70 43 75 72 2d 3e 75 63 2e 70  Flags(pCur->uc.p
1c9e0 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20  Cursor,.        
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20         (pOp->p5 
1ca10 26 20 28 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  & (OPFLAG_BULKCS
1ca20 52 7c 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29  R|OPFLAG_SEEKEQ)
1ca30 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  ));.  if( rc ) g
1ca40 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1ca50 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
1ca60 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
1ca70 70 65 6e 44 75 70 20 50 31 20 50 32 20 2a 20 2a  penDup P1 P2 * *
1ca80 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20   *.**.** Open a 
1ca90 6e 65 77 20 63 75 72 73 6f 72 20 50 31 20 74 68  new cursor P1 th
1caa0 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  at points to the
1cab0 20 73 61 6d 65 20 65 70 68 65 6d 65 72 61 6c 20   same ephemeral 
1cac0 74 61 62 6c 65 20 61 73 0a 2a 2a 20 63 75 72 73  table as.** curs
1cad0 6f 72 20 50 32 2e 20 20 54 68 65 20 50 32 20 63  or P2.  The P2 c
1cae0 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1caf0 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61  been opened by a
1cb00 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
1cb10 68 65 6d 65 72 61 6c 0a 2a 2a 20 6f 70 63 6f 64  hemeral.** opcod
1cb20 65 2e 20 20 4f 6e 6c 79 20 65 70 68 65 6d 65 72  e.  Only ephemer
1cb30 61 6c 20 63 75 72 73 6f 72 73 20 6d 61 79 20 62  al cursors may b
1cb40 65 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  e duplicated..**
1cb50 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 65 70  .** Duplicate ep
1cb60 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73 20  hemeral cursors 
1cb70 61 72 65 20 75 73 65 64 20 66 6f 72 20 73 65 6c  are used for sel
1cb80 66 2d 6a 6f 69 6e 73 20 6f 66 20 6d 61 74 65 72  f-joins of mater
1cb90 69 61 6c 69 7a 65 64 20 76 69 65 77 73 2e 0a 2a  ialized views..*
1cba0 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 44 75  /.case OP_OpenDu
1cbb0 70 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  p: {.  VdbeCurso
1cbc0 72 20 2a 70 4f 72 69 67 3b 20 20 20 20 2f 2a 20  r *pOrig;    /* 
1cbd0 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 75 72  The original cur
1cbe0 73 6f 72 20 74 6f 20 62 65 20 64 75 70 6c 69 63  sor to be duplic
1cbf0 61 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 43 75  ated */.  VdbeCu
1cc00 72 73 6f 72 20 2a 70 43 78 3b 20 20 20 20 20 20  rsor *pCx;      
1cc10 2f 2a 20 54 68 65 20 6e 65 77 20 63 75 72 73 6f  /* The new curso
1cc20 72 20 2a 2f 0a 0a 20 20 70 4f 72 69 67 20 3d 20  r */..  pOrig = 
1cc30 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 32  p->apCsr[pOp->p2
1cc40 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  ];.  assert( pOr
1cc50 69 67 2d 3e 70 42 74 78 21 3d 30 20 29 3b 20 20  ig->pBtx!=0 );  
1cc60 2f 2a 20 4f 6e 6c 79 20 65 70 68 65 6d 65 72 61  /* Only ephemera
1cc70 6c 20 63 75 72 73 6f 72 73 20 63 61 6e 20 62 65  l cursors can be
1cc80 20 64 75 70 6c 69 63 61 74 65 64 20 2a 2f 0a 0a   duplicated */..
1cc90 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
1cca0 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1ccb0 31 2c 20 70 4f 72 69 67 2d 3e 6e 46 69 65 6c 64  1, pOrig->nField
1ccc0 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 42 54  , -1, CURTYPE_BT
1ccd0 52 45 45 29 3b 0a 20 20 69 66 28 20 70 43 78 3d  REE);.  if( pCx=
1cce0 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
1ccf0 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77  ;.  pCx->nullRow
1cd00 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73 45   = 1;.  pCx->isE
1cd10 70 68 65 6d 65 72 61 6c 20 3d 20 31 3b 0a 20 20  phemeral = 1;.  
1cd20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  pCx->pKeyInfo = 
1cd30 70 4f 72 69 67 2d 3e 70 4b 65 79 49 6e 66 6f 3b  pOrig->pKeyInfo;
1cd40 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20  .  pCx->isTable 
1cd50 3d 20 70 4f 72 69 67 2d 3e 69 73 54 61 62 6c 65  = pOrig->isTable
1cd60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1cd70 42 74 72 65 65 43 75 72 73 6f 72 28 70 4f 72 69  BtreeCursor(pOri
1cd80 67 2d 3e 70 42 74 78 2c 20 4d 41 53 54 45 52 5f  g->pBtx, MASTER_
1cd90 52 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52 43 53  ROOT, BTREE_WRCS
1cda0 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 78               pCx
1cdc0 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 43 78 2d  ->pKeyInfo, pCx-
1cdd0 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
1cde0 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  /* The sqlite3Bt
1cdf0 72 65 65 43 75 72 73 6f 72 28 29 20 72 6f 75 74  reeCursor() rout
1ce00 69 6e 65 20 63 61 6e 20 6f 6e 6c 79 20 66 61 69  ine can only fai
1ce10 6c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  l for the first 
1ce20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 6f 70 65 6e  cursor.  ** open
1ce30 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ed for a databas
1ce40 65 2e 20 20 53 69 6e 63 65 20 74 68 65 72 65 20  e.  Since there 
1ce50 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 6f 70  is already an op
1ce60 65 6e 20 63 75 72 73 6f 72 20 77 68 65 6e 20 74  en cursor when t
1ce70 68 69 73 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20  his.  ** opcode 
1ce80 69 73 20 72 75 6e 2c 20 74 68 65 20 73 71 6c 69  is run, the sqli
1ce90 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29  te3BtreeCursor()
1cea0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
1ceb0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1cec0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 62 72 65  LITE_OK );.  bre
1ced0 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.}.../* Opcod
1cee0 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  e: OpenEphemeral
1cef0 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a   P1 P2 * P4 P5.*
1cf00 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f 6c  * Synopsis: nCol
1cf10 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 4f 70 65  umn=P2.**.** Ope
1cf20 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 50  n a new cursor P
1cf30 31 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74  1 to a transient
1cf40 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63   table..** The c
1cf50 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 20  ursor is always 
1cf60 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74  opened read/writ
1cf70 65 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74 68  e even if .** th
1cf80 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1cf90 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54  is read-only.  T
1cfa0 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20  he ephemeral.** 
1cfb0 74 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65 64  table is deleted
1cfc0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
1cfd0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
1cfe0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
1cff0 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  P2 is the number
1d000 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
1d010 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
1d020 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  le..** The curso
1d030 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42 54  r points to a BT
1d040 72 65 65 20 74 61 62 6c 65 20 69 66 20 50 34 3d  ree table if P4=
1d050 3d 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72 65  =0 and to a BTre
1d060 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50 34  e index.** if P4
1d070 20 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20 50   is not 0.  If P
1d080 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  4 is not NULL, i
1d090 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65  t points to a Ke
1d0a0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  yInfo structure.
1d0b0 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  ** that defines 
1d0c0 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b 65  the format of ke
1d0d0 79 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ys in the index.
1d0e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 70 61  .**.** The P5 pa
1d0f0 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 61  rameter can be a
1d100 20 6d 61 73 6b 20 6f 66 20 74 68 65 20 42 54 52   mask of the BTR
1d110 45 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  EE_* flags defin
1d120 65 64 0a 2a 2a 20 69 6e 20 62 74 72 65 65 2e 68  ed.** in btree.h
1d130 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 63  .  These flags c
1d140 6f 6e 74 72 6f 6c 20 61 73 70 65 63 74 73 20 6f  ontrol aspects o
1d150 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
1d160 6f 66 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 2e  of.** the btree.
1d170 20 20 54 68 65 20 42 54 52 45 45 5f 4f 4d 49 54    The BTREE_OMIT
1d180 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 42 54 52  _JOURNAL and BTR
1d190 45 45 5f 53 49 4e 47 4c 45 20 66 6c 61 67 73 20  EE_SINGLE flags 
1d1a0 61 72 65 0a 2a 2a 20 61 64 64 65 64 20 61 75 74  are.** added aut
1d1b0 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f  omatically..*/./
1d1c0 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 41 75  * Opcode: OpenAu
1d1d0 74 6f 69 6e 64 65 78 20 50 31 20 50 32 20 2a 20  toindex P1 P2 * 
1d1e0 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  P4 *.** Synopsis
1d1f0 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a  : nColumn=P2.**.
1d200 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77  ** This opcode w
1d210 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 61 73  orks the same as
1d220 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1d230 6c 2e 20 20 49 74 20 68 61 73 20 61 0a 2a 2a 20  l.  It has a.** 
1d240 64 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 20 74  different name t
1d250 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 69 74  o distinguish it
1d260 73 20 75 73 65 2e 20 20 54 61 62 6c 65 73 20 63  s use.  Tables c
1d270 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  reated using.** 
1d280 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77  by this opcode w
1d290 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
1d2a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
1d2b0 65 61 74 65 64 20 74 72 61 6e 73 69 65 6e 74 0a  eated transient.
1d2c0 2a 2a 20 69 6e 64 69 63 65 73 20 69 6e 20 6a 6f  ** indices in jo
1d2d0 69 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ins..*/.case OP_
1d2e0 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 3a 20 0a  OpenAutoindex: .
1d2f0 63 61 73 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65  case OP_OpenEphe
1d300 6d 65 72 61 6c 3a 20 7b 0a 20 20 56 64 62 65 43  meral: {.  VdbeC
1d310 75 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 4b 65  ursor *pCx;.  Ke
1d320 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1d330 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ..  static const
1d340 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 3d 20   int vfsFlags = 
1d350 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  .      SQLITE_OP
1d360 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20  EN_READWRITE |. 
1d370 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1d380 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
1d390 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1d3a0 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 53 51  USIVE |.      SQ
1d3b0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1d3c0 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
1d3d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1d3e0 53 49 45 4e 54 5f 44 42 3b 0a 20 20 61 73 73 65  SIENT_DB;.  asse
1d3f0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
1d400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1d410 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20  >p2>=0 );.  pCx 
1d420 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
1d430 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  (p, pOp->p1, pOp
1d440 2d 3e 70 32 2c 20 2d 31 2c 20 43 55 52 54 59 50  ->p2, -1, CURTYP
1d450 45 5f 42 54 52 45 45 29 3b 0a 20 20 69 66 28 20  E_BTREE);.  if( 
1d460 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  pCx==0 ) goto no
1d470 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c  _mem;.  pCx->nul
1d480 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d  lRow = 1;.  pCx-
1d490 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 3d 20 31  >isEphemeral = 1
1d4a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d4b0 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
1d4c0 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 43 78 2d  fs, 0, db, &pCx-
1d4d0 3e 70 42 74 78 2c 20 0a 20 20 20 20 20 20 20 20  >pBtx, .        
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4f0 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  BTREE_OMIT_JOURN
1d500 41 4c 20 7c 20 42 54 52 45 45 5f 53 49 4e 47 4c  AL | BTREE_SINGL
1d510 45 20 7c 20 70 4f 70 2d 3e 70 35 2c 20 76 66 73  E | pOp->p5, vfs
1d520 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  Flags);.  if( rc
1d530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1d550 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
1d560 43 78 2d 3e 70 42 74 78 2c 20 31 29 3b 0a 20 20  Cx->pBtx, 1);.  
1d570 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1d580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
1d590 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69  If a transient i
1d5a0 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
1d5b0 2c 20 63 72 65 61 74 65 20 69 74 20 62 79 20 63  , create it by c
1d5c0 61 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 73 71  alling.    ** sq
1d5d0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
1d5e0 54 61 62 6c 65 28 29 20 77 69 74 68 20 74 68 65  Table() with the
1d5f0 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 66   BTREE_BLOBKEY f
1d600 6c 61 67 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  lag before.    *
1d610 2a 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20 49 66  * opening it. If
1d620 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
1d630 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20  le is required, 
1d640 6a 75 73 74 20 75 73 65 20 74 68 65 0a 20 20 20  just use the.   
1d650 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
1d660 79 20 63 72 65 61 74 65 64 20 74 61 62 6c 65 20  y created table 
1d670 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 31  with root-page 1
1d680 20 28 61 6e 20 42 4c 4f 42 5f 49 4e 54 4b 45 59   (an BLOB_INTKEY
1d690 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a 2f 0a   table)..    */.
1d6a0 20 20 20 20 69 66 28 20 28 70 43 78 2d 3e 70 4b      if( (pCx->pK
1d6b0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1d6c0 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
1d6d0 49 6e 66 6f 29 21 3d 30 20 29 7b 0a 20 20 20 20  Info)!=0 ){.    
1d6e0 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20    int pgno;.    
1d6f0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1d700 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46  4type==P4_KEYINF
1d710 4f 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  O );.      rc = 
1d720 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
1d730 74 65 54 61 62 6c 65 28 70 43 78 2d 3e 70 42 74  teTable(pCx->pBt
1d740 78 2c 20 26 70 67 6e 6f 2c 20 42 54 52 45 45 5f  x, &pgno, BTREE_
1d750 42 4c 4f 42 4b 45 59 20 7c 20 70 4f 70 2d 3e 70  BLOBKEY | pOp->p
1d760 35 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72  5); .      if( r
1d770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d780 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d790 70 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f  pgno==MASTER_ROO
1d7a0 54 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  T+1 );.        a
1d7b0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1d7c0 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20 20 20  >db==db );.     
1d7d0 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
1d7e0 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62  nfo->enc==ENC(db
1d7f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ) );.        rc 
1d800 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
1d810 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 78 2c 20  rsor(pCx->pBtx, 
1d820 70 67 6e 6f 2c 20 42 54 52 45 45 5f 57 52 43 53  pgno, BTREE_WRCS
1d830 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 20 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 78     pKeyInfo, pCx
1d860 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
1d870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 78       }.      pCx
1d880 2d 3e 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a 20  ->isTable = 0;. 
1d890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d8a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1d8b0 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74  eCursor(pCx->pBt
1d8c0 78 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  x, MASTER_ROOT, 
1d8d0 42 54 52 45 45 5f 57 52 43 53 52 2c 0a 20 20 20  BTREE_WRCSR,.   
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
1d900 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a  x->uc.pCursor);.
1d910 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62        pCx->isTab
1d920 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  le = 1;.    }.  
1d930 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  }.  if( rc ) got
1d940 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1d950 72 72 6f 72 3b 0a 20 20 70 43 78 2d 3e 69 73 4f  rror;.  pCx->isO
1d960 72 64 65 72 65 64 20 3d 20 28 70 4f 70 2d 3e 70  rdered = (pOp->p
1d970 35 21 3d 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  5!=BTREE_UNORDER
1d980 45 44 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ED);.  break;.}.
1d990 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74  ./* Opcode: Sort
1d9a0 65 72 4f 70 65 6e 20 50 31 20 50 32 20 50 33 20  erOpen P1 P2 P3 
1d9b0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  P4 *.**.** This 
1d9c0 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6c 69 6b  opcode works lik
1d9d0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
1d9e0 61 6c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  al except that i
1d9f0 74 20 6f 70 65 6e 73 0a 2a 2a 20 61 20 74 72 61  t opens.** a tra
1da00 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61  nsient index tha
1da10 74 20 69 73 20 73 70 65 63 69 66 69 63 61 6c 6c  t is specificall
1da20 79 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 6f  y designed to so
1da30 72 74 20 6c 61 72 67 65 0a 2a 2a 20 74 61 62 6c  rt large.** tabl
1da40 65 73 20 75 73 69 6e 67 20 61 6e 20 65 78 74 65  es using an exte
1da50 72 6e 61 6c 20 6d 65 72 67 65 2d 73 6f 72 74 20  rnal merge-sort 
1da60 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a  algorithm..**.**
1da70 20 49 66 20 61 72 67 75 6d 65 6e 74 20 50 33 20   If argument P3 
1da80 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1da90 6e 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 74  n it indicates t
1daa0 68 61 74 20 74 68 65 20 73 6f 72 74 65 72 20 6d  hat the sorter m
1dab0 61 79 0a 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  ay.** assume tha
1dac0 74 20 61 20 73 74 61 62 6c 65 20 73 6f 72 74 20  t a stable sort 
1dad0 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20  considering the 
1dae0 66 69 72 73 74 20 50 33 20 66 69 65 6c 64 73 20  first P3 fields 
1daf0 6f 66 20 65 61 63 68 0a 2a 2a 20 6b 65 79 20 69  of each.** key i
1db00 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
1db10 70 72 6f 64 75 63 65 20 74 68 65 20 72 65 71 75  produce the requ
1db20 69 72 65 64 20 72 65 73 75 6c 74 73 2e 0a 2a 2f  ired results..*/
1db30 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4f  .case OP_SorterO
1db40 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  pen: {.  VdbeCur
1db50 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73  sor *pCx;..  ass
1db60 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1db70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1db80 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43 78  ->p2>=0 );.  pCx
1db90 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f   = allocateCurso
1dba0 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  r(p, pOp->p1, pO
1dbb0 70 2d 3e 70 32 2c 20 2d 31 2c 20 43 55 52 54 59  p->p2, -1, CURTY
1dbc0 50 45 5f 53 4f 52 54 45 52 29 3b 0a 20 20 69 66  PE_SORTER);.  if
1dbd0 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20  ( pCx==0 ) goto 
1dbe0 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 70  no_mem;.  pCx->p
1dbf0 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
1dc00 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73  4.pKeyInfo;.  as
1dc10 73 65 72 74 28 20 70 43 78 2d 3e 70 4b 65 79 49  sert( pCx->pKeyI
1dc20 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  nfo->db==db );. 
1dc30 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 4b   assert( pCx->pK
1dc40 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43  eyInfo->enc==ENC
1dc50 28 64 62 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  (db) );.  rc = s
1dc60 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
1dc70 49 6e 69 74 28 64 62 2c 20 70 4f 70 2d 3e 70 33  Init(db, pOp->p3
1dc80 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 72 63  , pCx);.  if( rc
1dc90 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
1dca0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
1dcb0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1dcc0 65 3a 20 53 65 71 75 65 6e 63 65 54 65 73 74 20  e: SequenceTest 
1dcd0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
1dce0 79 6e 6f 70 73 69 73 3a 20 69 66 28 20 63 75 72  ynopsis: if( cur
1dcf0 73 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b 20 29 20  sor[P1].ctr++ ) 
1dd00 70 63 20 3d 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31  pc = P2.**.** P1
1dd10 20 69 73 20 61 20 73 6f 72 74 65 72 20 63 75 72   is a sorter cur
1dd20 73 6f 72 2e 20 49 66 20 74 68 65 20 73 65 71 75  sor. If the sequ
1dd30 65 6e 63 65 20 63 6f 75 6e 74 65 72 20 69 73 20  ence counter is 
1dd40 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2c 20  currently zero, 
1dd50 6a 75 6d 70 0a 2a 2a 20 74 6f 20 50 32 2e 20 52  jump.** to P2. R
1dd60 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
1dd70 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
1dd80 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 69  jump is taken, i
1dd90 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  ncrement the.** 
1dda0 74 68 65 20 73 65 71 75 65 6e 63 65 20 76 61 6c  the sequence val
1ddb0 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ue..*/.case OP_S
1ddc0 65 71 75 65 6e 63 65 54 65 73 74 3a 20 7b 0a 20  equenceTest: {. 
1ddd0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
1dde0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1ddf0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
1de00 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1de10 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
1de20 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
1de30 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20  t( isSorter(pC) 
1de40 29 3b 0a 20 20 69 66 28 20 28 70 43 2d 3e 73 65  );.  if( (pC->se
1de50 71 43 6f 75 6e 74 2b 2b 29 3d 3d 30 20 29 7b 0a  qCount++)==0 ){.
1de60 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
1de70 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
1de80 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1de90 4f 70 65 6e 50 73 65 75 64 6f 20 50 31 20 50 32  OpenPseudo P1 P2
1dea0 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
1deb0 73 69 73 3a 20 50 33 20 63 6f 6c 75 6d 6e 73 20  sis: P3 columns 
1dec0 69 6e 20 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 4f  in r[P2].**.** O
1ded0 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72  pen a new cursor
1dee0 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
1def0 61 20 66 61 6b 65 20 74 61 62 6c 65 20 74 68 61  a fake table tha
1df00 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  t contains a sin
1df10 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 66 20 64 61  gle.** row of da
1df20 74 61 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74  ta.  The content
1df30 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 72 6f 77   of that one row
1df40 20 69 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   is the content 
1df50 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  of memory.** reg
1df60 69 73 74 65 72 20 50 32 2e 20 20 49 6e 20 6f 74  ister P2.  In ot
1df70 68 65 72 20 77 6f 72 64 73 2c 20 63 75 72 73 6f  her words, curso
1df80 72 20 50 31 20 62 65 63 6f 6d 65 73 20 61 6e 20  r P1 becomes an 
1df90 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 0a 2a  alias for the .*
1dfa0 2a 20 4d 45 4d 5f 42 6c 6f 62 20 63 6f 6e 74 65  * MEM_Blob conte
1dfb0 6e 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  nt contained in 
1dfc0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
1dfd0 2a 2a 20 41 20 70 73 65 75 64 6f 2d 74 61 62 6c  ** A pseudo-tabl
1dfe0 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  e created by thi
1dff0 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  s opcode is used
1e000 20 74 6f 20 68 6f 6c 64 20 61 20 73 69 6e 67 6c   to hold a singl
1e010 65 0a 2a 2a 20 72 6f 77 20 6f 75 74 70 75 74 20  e.** row output 
1e020 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
1e030 73 6f 20 74 68 61 74 20 74 68 65 20 72 6f 77 20  so that the row 
1e040 63 61 6e 20 62 65 20 64 65 63 6f 6d 70 6f 73 65  can be decompose
1e050 64 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64 69 76 69  d into.** indivi
1e060 64 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 75 73 69  dual columns usi
1e070 6e 67 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  ng the OP_Column
1e080 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 4f 50   opcode.  The OP
1e090 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 0a 2a  _Column opcode.*
1e0a0 2a 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 75  * is the only cu
1e0b0 72 73 6f 72 20 6f 70 63 6f 64 65 20 74 68 61 74  rsor opcode that
1e0c0 20 77 6f 72 6b 73 20 77 69 74 68 20 61 20 70 73   works with a ps
1e0d0 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  eudo-table..**.*
1e0e0 2a 20 50 33 20 69 73 20 74 68 65 20 6e 75 6d 62  * P3 is the numb
1e0f0 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
1e100 74 68 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  the records that
1e110 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
1e120 62 79 0a 2a 2a 20 74 68 65 20 70 73 65 75 64 6f  by.** the pseudo
1e130 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20  -table..*/.case 
1e140 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 3a 20 7b  OP_OpenPseudo: {
1e150 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1e160 43 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Cx;..  assert( p
1e170 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61  Op->p1>=0 );.  a
1e180 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d  ssert( pOp->p3>=
1e190 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c  0 );.  pCx = all
1e1a0 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70  ocateCursor(p, p
1e1b0 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p1, pOp->p3,
1e1c0 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 50 53 45   -1, CURTYPE_PSE
1e1d0 55 44 4f 29 3b 0a 20 20 69 66 28 20 70 43 78 3d  UDO);.  if( pCx=
1e1e0 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
1e1f0 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77  ;.  pCx->nullRow
1e200 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 73 65 65   = 1;.  pCx->see
1e210 6b 52 65 73 75 6c 74 20 3d 20 70 4f 70 2d 3e 70  kResult = pOp->p
1e220 32 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c  2;.  pCx->isTabl
1e230 65 20 3d 20 31 3b 0a 20 20 2f 2a 20 47 69 76 65  e = 1;.  /* Give
1e240 20 74 68 69 73 20 70 73 65 75 64 6f 2d 63 75 72   this pseudo-cur
1e250 73 6f 72 20 61 20 66 61 6b 65 20 42 74 43 75 72  sor a fake BtCur
1e260 73 6f 72 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  sor pointer so t
1e270 68 61 74 20 70 43 78 0a 20 20 2a 2a 20 63 61 6e  hat pCx.  ** can
1e280 20 62 65 20 73 61 66 65 6c 79 20 70 61 73 73 65   be safely passe
1e290 64 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  d to sqlite3Vdbe
1e2a0 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 2e 20  CursorMoveto(). 
1e2b0 20 54 68 69 73 20 61 76 6f 69 64 73 20 61 20 74   This avoids a t
1e2c0 65 73 74 0a 20 20 2a 2a 20 66 6f 72 20 70 43 78  est.  ** for pCx
1e2d0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
1e2e0 59 50 45 5f 42 54 52 45 45 20 69 6e 73 69 64 65  YPE_BTREE inside
1e2f0 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 43   of sqlite3VdbeC
1e300 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 0a 20 20  ursorMoveto().  
1e310 2a 2a 20 77 68 69 63 68 20 69 73 20 61 20 70 65  ** which is a pe
1e320 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
1e330 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 70 43 78 2d  zation */.  pCx-
1e340 3e 75 63 2e 70 43 75 72 73 6f 72 20 3d 20 73 71  >uc.pCursor = sq
1e350 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61  lite3BtreeFakeVa
1e360 6c 69 64 43 75 72 73 6f 72 28 29 3b 0a 20 20 61  lidCursor();.  a
1e370 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d  ssert( pOp->p5==
1e380 30 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  0 );.  break;.}.
1e390 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f 73  ./* Opcode: Clos
1e3a0 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  e P1 * * * *.**.
1e3b0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
1e3c0 72 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  r previously ope
1e3d0 6e 65 64 20 61 73 20 50 31 2e 20 20 49 66 20 50  ned as P1.  If P
1e3e0 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72 72  1 is not.** curr
1e3f0 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69 73  ently open, this
1e400 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
1e410 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65  a no-op..*/.case
1e420 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 61   OP_Close: {.  a
1e430 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1e440 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
1e450 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c  nCursor );.  sql
1e460 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
1e470 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 70  or(p, p->apCsr[p
1e480 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e 61  Op->p1]);.  p->a
1e490 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20  pCsr[pOp->p1] = 
1e4a0 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23  0;.  break;.}..#
1e4b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1e4c0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
1e4d0 4d 41 53 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  MASK./* Opcode: 
1e4e0 43 6f 6c 75 6d 6e 73 55 73 65 64 20 50 31 20 2a  ColumnsUsed P1 *
1e4f0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   * P4 *.**.** Th
1e500 69 73 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68  is opcode (which
1e510 20 6f 6e 6c 79 20 65 78 69 73 74 73 20 69 66 20   only exists if 
1e520 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69  SQLite was compi
1e530 6c 65 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49  led with.** SQLI
1e540 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
1e550 5f 55 53 45 44 5f 4d 41 53 4b 29 20 69 64 65 6e  _USED_MASK) iden
1e560 74 69 66 69 65 73 20 77 68 69 63 68 20 63 6f 6c  tifies which col
1e570 75 6d 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  umns of the.** t
1e580 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 6f  able or index fo
1e590 72 20 63 75 72 73 6f 72 20 50 31 20 61 72 65 20  r cursor P1 are 
1e5a0 75 73 65 64 2e 20 20 50 34 20 69 73 20 61 20 36  used.  P4 is a 6
1e5b0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
1e5c0 20 28 50 34 5f 49 4e 54 36 34 29 20 69 6e 20 77   (P4_INT64) in w
1e5d0 68 69 63 68 20 74 68 65 20 66 69 72 73 74 20 36  hich the first 6
1e5e0 33 20 62 69 74 73 20 61 72 65 20 6f 6e 65 20 66  3 bits are one f
1e5f0 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
1e600 2a 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d  * first 63 colum
1e610 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
1e620 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  or index that ar
1e630 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a  e actually used.
1e640 2a 2a 20 62 79 20 74 68 65 20 63 75 72 73 6f 72  ** by the cursor
1e650 2e 20 20 54 68 65 20 68 69 67 68 2d 6f 72 64 65  .  The high-orde
1e660 72 20 62 69 74 20 69 73 20 73 65 74 20 69 66 20  r bit is set if 
1e670 61 6e 79 20 63 6f 6c 75 6d 6e 20 61 66 74 65 72  any column after
1e680 0a 2a 2a 20 74 68 65 20 36 34 74 68 20 69 73 20  .** the 64th is 
1e690 75 73 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  used..*/.case OP
1e6a0 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 3a 20 7b 0a  _ColumnsUsed: {.
1e6b0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1e6c0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1e6d0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
1e6e0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
1e6f0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
1e700 45 20 29 3b 0a 20 20 70 43 2d 3e 6d 61 73 6b 55  E );.  pC->maskU
1e710 73 65 64 20 3d 20 2a 28 75 36 34 2a 29 70 4f 70  sed = *(u64*)pOp
1e720 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62 72 65  ->p4.pI64;.  bre
1e730 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ak;.}.#endif../*
1e740 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 45 20   Opcode: SeekGE 
1e750 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
1e760 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
1e770 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66  [P3@P4].**.** If
1e780 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72   cursor P1 refer
1e790 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c  s to an SQL tabl
1e7a0 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75  e (B-Tree that u
1e7b0 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ses integer keys
1e7c0 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76  ), .** use the v
1e7d0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1e7e0 20 50 33 20 61 73 20 74 68 65 20 6b 65 79 2e 20   P3 as the key. 
1e7f0 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
1e800 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53  fers .** to an S
1e810 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50  QL index, then P
1e820 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  3 is the first i
1e830 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34  n an array of P4
1e840 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74   registers .** t
1e850 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
1e860 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
1e870 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65  x key. .**.** Re
1e880 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20  position cursor 
1e890 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70  P1 so that  it p
1e8a0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61  oints to the sma
1e8b0 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61 74  llest entry that
1e8c0 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20   .** is greater 
1e8d0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1e8e0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
1e8f0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1e900 72 65 63 6f 72 64 73 20 0a 2a 2a 20 67 72 65 61  records .** grea
1e910 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1e920 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64  l to the key and
1e930 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   P2 is not zero,
1e940 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
1e950 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1e960 75 72 73 6f 72 20 50 31 20 77 61 73 20 6f 70 65  ursor P1 was ope
1e970 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ned using the OP
1e980 46 4c 41 47 5f 53 45 45 4b 45 51 20 66 6c 61 67  FLAG_SEEKEQ flag
1e990 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 6f  , then this.** o
1e9a0 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79  pcode will alway
1e9b0 73 20 6c 61 6e 64 20 6f 6e 20 61 20 72 65 63 6f  s land on a reco
1e9c0 72 64 20 74 68 61 74 20 65 71 75 61 6c 6c 79 20  rd that equally 
1e9d0 65 71 75 61 6c 73 20 74 68 65 20 6b 65 79 2c 20  equals the key, 
1e9e0 6f 72 0a 2a 2a 20 65 6c 73 65 20 6a 75 6d 70 20  or.** else jump 
1e9f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
1ea00 32 2e 20 20 57 68 65 6e 20 74 68 65 20 63 75 72  2.  When the cur
1ea10 73 6f 72 20 69 73 20 4f 50 46 4c 41 47 5f 53 45  sor is OPFLAG_SE
1ea20 45 4b 45 51 2c 20 74 68 69 73 0a 2a 2a 20 6f 70  EKEQ, this.** op
1ea30 63 6f 64 65 20 6d 75 73 74 20 62 65 20 66 6f 6c  code must be fol
1ea40 6c 6f 77 65 64 20 62 79 20 61 6e 20 49 64 78 4c  lowed by an IdxL
1ea50 45 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74 68  E opcode with th
1ea60 65 20 73 61 6d 65 20 61 72 67 75 6d 65 6e 74 73  e same arguments
1ea70 2e 0a 2a 2a 20 54 68 65 20 49 64 78 4c 45 20 6f  ..** The IdxLE o
1ea80 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 73 6b  pcode will be sk
1ea90 69 70 70 65 64 20 69 66 20 74 68 69 73 20 6f 70  ipped if this op
1eaa0 63 6f 64 65 20 73 75 63 63 65 65 64 73 2c 20 62  code succeeds, b
1eab0 75 74 20 74 68 65 0a 2a 2a 20 49 64 78 4c 45 20  ut the.** IdxLE 
1eac0 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75  opcode will be u
1ead0 73 65 64 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  sed on subsequen
1eae0 74 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e  t loop iteration
1eaf0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  s..**.** This op
1eb00 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
1eb10 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65  cursor configure
1eb20 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72  d to move in for
1eb30 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66  ward order,.** f
1eb40 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
1eb50 67 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64  g toward the end
1eb60 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1eb70 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  s, the cursor is
1eb80 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74  .** configured t
1eb90 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20  o use Next, not 
1eba0 50 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  Prev..**.** See 
1ebb0 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
1ebc0 46 6f 75 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53  Found, SeekLt, S
1ebd0 65 65 6b 47 74 2c 20 53 65 65 6b 4c 65 0a 2a 2f  eekGt, SeekLe.*/
1ebe0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
1ebf0 47 54 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  GT P1 P2 P3 P4 *
1ec00 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
1ec10 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
1ec20 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
1ec30 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74  fers to an SQL t
1ec40 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61  able (B-Tree tha
1ec50 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b  t uses integer k
1ec60 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68  eys), .** use th
1ec70 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
1ec80 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e  ter P3 as a key.
1ec90 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
1eca0 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53  fers .** to an S
1ecb0 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50  QL index, then P
1ecc0 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  3 is the first i
1ecd0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34  n an array of P4
1ece0 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74   registers .** t
1ecf0 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
1ed00 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
1ed10 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65  x key. .**.** Re
1ed20 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20  position cursor 
1ed30 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70  P1 so that  it p
1ed40 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61  oints to the sma
1ed50 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61 74  llest entry that
1ed60 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20   .** is greater 
1ed70 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
1ed80 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ue. If there are
1ed90 20 6e 6f 20 72 65 63 6f 72 64 73 20 67 72 65 61   no records grea
1eda0 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65  ter than .** the
1edb0 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
1edc0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
1edd0 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
1ede0 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76  This opcode leav
1edf0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  es the cursor co
1ee00 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65  nfigured to move
1ee10 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65   in forward orde
1ee20 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62  r,.** from the b
1ee30 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20  eginning toward 
1ee40 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68  the end.  In oth
1ee50 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75  er words, the cu
1ee60 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69  rsor is.** confi
1ee70 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78  gured to use Nex
1ee80 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a  t, not Prev..**.
1ee90 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1eea0 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65  nd, NotFound, Se
1eeb0 65 6b 4c 74 2c 20 53 65 65 6b 47 65 2c 20 53 65  ekLt, SeekGe, Se
1eec0 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ekLe.*/./* Opcod
1eed0 65 3a 20 53 65 65 6b 4c 54 20 50 31 20 50 32 20  e: SeekLT P1 P2 
1eee0 50 33 20 50 34 20 2a 20 0a 2a 2a 20 53 79 6e 6f  P3 P4 * .** Syno
1eef0 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
1ef00 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73  4].**.** If curs
1ef10 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
1ef20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
1ef30 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
1ef40 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
1ef50 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
1ef60 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
1ef70 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73  s a key. If curs
1ef80 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
1ef90 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
1efa0 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
1efb0 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
1efc0 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
1efd0 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
1efe0 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
1eff0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
1f000 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
1f010 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
1f020 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
1f030 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
1f040 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c  ry that .** is l
1f050 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ess than the key
1f060 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1f070 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1f080 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74 68  less than .** th
1f090 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20  e key and P2 is 
1f0a0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a  not zero, then j
1f0b0 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
1f0c0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61   This opcode lea
1f0d0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63  ves the cursor c
1f0e0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76  onfigured to mov
1f0f0 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  e in reverse ord
1f100 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  er,.** from the 
1f110 65 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20 62  end toward the b
1f120 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74  eginning.  In ot
1f130 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1f140 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66  ursor is.** conf
1f150 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 50 72  igured to use Pr
1f160 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a  ev, not Next..**
1f170 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
1f180 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53  und, NotFound, S
1f190 65 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53  eekGt, SeekGe, S
1f1a0 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  eekLe.*/./* Opco
1f1b0 64 65 3a 20 53 65 65 6b 4c 45 20 50 31 20 50 32  de: SeekLE P1 P2
1f1c0 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
1f1d0 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
1f1e0 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73  4].**.** If curs
1f1f0 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
1f200 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
1f210 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
1f220 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
1f230 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
1f240 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
1f250 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73  s a key. If curs
1f260 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
1f270 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
1f280 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
1f290 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
1f2a0 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
1f2b0 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
1f2c0 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
1f2d0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
1f2e0 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
1f2f0 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
1f300 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1f310 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72  the largest entr
1f320 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65  y that .** is le
1f330 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1f340 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75   to the key valu
1f350 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  e. If there are 
1f360 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 6c  no records .** l
1f370 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1f380 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64  l to the key and
1f390 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   P2 is not zero,
1f3a0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
1f3b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
1f3c0 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
1f3d0 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64  ursor configured
1f3e0 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 65   to move in reve
1f3f0 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72  rse order,.** fr
1f400 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61 72  om the end towar
1f410 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e  d the beginning.
1f420 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1f430 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a  , the cursor is.
1f440 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  ** configured to
1f450 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e   use Prev, not N
1f460 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ext..**.** If th
1f470 65 20 63 75 72 73 6f 72 20 50 31 20 77 61 73 20  e cursor P1 was 
1f480 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65  opened using the
1f490 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 66   OPFLAG_SEEKEQ f
1f4a0 6c 61 67 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  lag, then this.*
1f4b0 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c  * opcode will al
1f4c0 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20 61 20 72  ways land on a r
1f4d0 65 63 6f 72 64 20 74 68 61 74 20 65 71 75 61 6c  ecord that equal
1f4e0 6c 79 20 65 71 75 61 6c 73 20 74 68 65 20 6b 65  ly equals the ke
1f4f0 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65 20 6a 75  y, or.** else ju
1f500 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
1f510 6f 20 50 32 2e 20 20 57 68 65 6e 20 74 68 65 20  o P2.  When the 
1f520 63 75 72 73 6f 72 20 69 73 20 4f 50 46 4c 41 47  cursor is OPFLAG
1f530 5f 53 45 45 4b 45 51 2c 20 74 68 69 73 0a 2a 2a  _SEEKEQ, this.**
1f540 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 62 65 20   opcode must be 
1f550 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 49  followed by an I
1f560 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69 74 68  dxGE opcode with
1f570 20 74 68 65 20 73 61 6d 65 20 61 72 67 75 6d 65   the same argume
1f580 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49 64 78 47  nts..** The IdxG
1f590 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65  E opcode will be
1f5a0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 69 73   skipped if this
1f5b0 20 6f 70 63 6f 64 65 20 73 75 63 63 65 65 64 73   opcode succeeds
1f5c0 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20 49 64 78  , but the.** Idx
1f5d0 47 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62  GE opcode will b
1f5e0 65 20 75 73 65 64 20 6f 6e 20 73 75 62 73 65 71  e used on subseq
1f5f0 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65 72 61 74  uent loop iterat
1f600 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ions..**.** See 
1f610 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
1f620 46 6f 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53  Found, SeekGt, S
1f630 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74 0a 2a 2f  eekGe, SeekLt.*/
1f640 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 54 3a  .case OP_SeekLT:
1f650 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
1f660 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
1f670 5f 53 65 65 6b 4c 45 3a 20 20 20 20 20 20 20 20  _SeekLE:        
1f680 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1f690 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 45 3a  .case OP_SeekGE:
1f6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
1f6b0 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
1f6c0 5f 53 65 65 6b 47 54 3a 20 7b 20 20 20 20 20 20  _SeekGT: {      
1f6d0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1f6e0 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
1f6f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
1f700 73 6f 6e 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  son result */.  
1f710 69 6e 74 20 6f 63 3b 20 20 20 20 20 20 20 20 20  int oc;         
1f720 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a     /* Opcode */.
1f730 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1f740 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  ;    /* The curs
1f750 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20  or to seek */.  
1f760 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72  UnpackedRecord r
1f770 3b 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f  ;  /* The key to
1f780 20 73 65 65 6b 20 66 6f 72 20 2a 2f 0a 20 20 69   seek for */.  i
1f790 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
1f7a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1f7b0 6f 6c 75 6d 6e 73 20 6f 72 20 66 69 65 6c 64 73  olumns or fields
1f7c0 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
1f7d0 20 69 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   i64 iKey;      
1f7e0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
1f7f0 20 77 65 20 61 72 65 20 74 6f 20 73 65 65 6b 20   we are to seek 
1f800 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 65 71 4f 6e  to */.  int eqOn
1f810 6c 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ly;        /* On
1f820 6c 79 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e  ly interested in
1f830 20 3d 3d 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a   == results */..
1f840 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1f850 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1f860 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1f870 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 21  assert( pOp->p2!
1f880 3d 30 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  =0 );.  pC = p->
1f890 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1f8a0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
1f8b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
1f8c0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
1f8d0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
1f8e0 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 20  sert( OP_SeekLE 
1f8f0 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 31 20 29  == OP_SeekLT+1 )
1f900 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53  ;.  assert( OP_S
1f910 65 65 6b 47 45 20 3d 3d 20 4f 50 5f 53 65 65 6b  eekGE == OP_Seek
1f920 4c 54 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  LT+2 );.  assert
1f930 28 20 4f 50 5f 53 65 65 6b 47 54 20 3d 3d 20 4f  ( OP_SeekGT == O
1f940 50 5f 53 65 65 6b 4c 54 2b 33 20 29 3b 0a 20 20  P_SeekLT+3 );.  
1f950 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72  assert( pC->isOr
1f960 64 65 72 65 64 20 29 3b 0a 20 20 61 73 73 65 72  dered );.  asser
1f970 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
1f980 72 21 3d 30 20 29 3b 0a 20 20 6f 63 20 3d 20 70  r!=0 );.  oc = p
1f990 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 65 71  Op->opcode;.  eq
1f9a0 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  Only = 0;.  pC->
1f9b0 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 23 69 66  nullRow = 0;.#if
1f9c0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f9d0 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20  .  pC->seekOp = 
1f9e0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e  pOp->opcode;.#en
1f9f0 64 69 66 0a 0a 20 20 69 66 28 20 70 43 2d 3e 69  dif..  if( pC->i
1fa00 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  sTable ){.    /*
1fa10 20 54 68 65 20 42 54 52 45 45 5f 53 45 45 4b 5f   The BTREE_SEEK_
1fa20 45 51 20 66 6c 61 67 20 69 73 20 6f 6e 6c 79 20  EQ flag is only 
1fa30 73 65 74 20 6f 6e 20 69 6e 64 65 78 20 63 75 72  set on index cur
1fa40 73 6f 72 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  sors */.    asse
1fa50 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1fa60 43 75 72 73 6f 72 48 61 73 48 69 6e 74 28 70 43  CursorHasHint(pC
1fa70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 42 54  ->uc.pCursor, BT
1fa80 52 45 45 5f 53 45 45 4b 5f 45 51 29 3d 3d 30 0a  REE_SEEK_EQ)==0.
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
1faa0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a   CORRUPT_DB );..
1fab0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74      /* The input
1fac0 20 76 61 6c 75 65 20 69 6e 20 50 33 20 6d 69 67   value in P3 mig
1fad0 68 74 20 62 65 20 6f 66 20 61 6e 79 20 74 79 70  ht be of any typ
1fae0 65 3a 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c  e: integer, real
1faf0 2c 20 73 74 72 69 6e 67 2c 0a 20 20 20 20 2a 2a  , string,.    **
1fb00 20 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20   blob, or NULL. 
1fb10 20 42 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f   But it needs to
1fb20 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62   be an integer b
1fb30 65 66 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a  efore we can do.
1fb40 20 20 20 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c      ** the seek,
1fb50 20 73 6f 20 63 6f 6e 76 65 72 74 20 69 74 2e 20   so convert it. 
1fb60 2a 2f 0a 20 20 20 20 70 49 6e 33 20 3d 20 26 61  */.    pIn3 = &a
1fb70 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
1fb80 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61    if( (pIn3->fla
1fb90 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  gs & (MEM_Int|ME
1fba0 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29  M_Real|MEM_Str))
1fbb0 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  ==MEM_Str ){.   
1fbc0 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41     applyNumericA
1fbd0 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 30 29  ffinity(pIn3, 0)
1fbe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4b 65 79  ;.    }.    iKey
1fbf0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
1fc00 74 56 61 6c 75 65 28 70 49 6e 33 29 3b 0a 0a 20  tValue(pIn3);.. 
1fc10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20     /* If the P3 
1fc20 76 61 6c 75 65 20 63 6f 75 6c 64 20 6e 6f 74 20  value could not 
1fc30 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
1fc40 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 77 69 74  o an integer wit
1fc50 68 6f 75 74 0a 20 20 20 20 2a 2a 20 6c 6f 73 73  hout.    ** loss
1fc60 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c   of information,
1fc70 20 74 68 65 6e 20 73 70 65 63 69 61 6c 20 70 72   then special pr
1fc80 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75  ocessing is requ
1fc90 69 72 65 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69  ired... */.    i
1fca0 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
1fcb0 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b  & MEM_Int)==0 ){
1fcc0 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 33  .      if( (pIn3
1fcd0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
1fce0 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)==0 ){.      
1fcf0 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76    /* If the P3 v
1fd00 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  alue cannot be c
1fd10 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
1fd20 79 20 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d 62  y kind of a numb
1fd30 65 72 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  er,.        ** t
1fd40 68 65 6e 20 74 68 65 20 73 65 65 6b 20 69 73 20  hen the seek is 
1fd50 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f  not possible, so
1fd60 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20   jump to P2 */. 
1fd70 20 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63         VdbeBranc
1fd80 68 54 61 6b 65 6e 28 31 2c 32 29 3b 20 67 6f 74  hTaken(1,2); got
1fd90 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
1fda0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fdb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1fdc0 66 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  f the approximat
1fdd0 69 6f 6e 20 69 4b 65 79 20 69 73 20 6c 61 72 67  ion iKey is larg
1fde0 65 72 20 74 68 61 6e 20 74 68 65 20 61 63 74 75  er than the actu
1fdf0 61 6c 20 72 65 61 6c 20 73 65 61 72 63 68 0a 20  al real search. 
1fe00 20 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75       ** term, su
1fe10 62 73 74 69 74 75 74 65 20 3e 3d 20 66 6f 72 20  bstitute >= for 
1fe20 3e 20 61 6e 64 20 3c 20 66 6f 72 20 3c 3d 2e 20  > and < for <=. 
1fe30 65 2e 67 2e 20 69 66 20 74 68 65 20 73 65 61 72  e.g. if the sear
1fe40 63 68 20 74 65 72 6d 0a 20 20 20 20 20 20 2a 2a  ch term.      **
1fe50 20 69 73 20 34 2e 39 20 61 6e 64 20 74 68 65 20   is 4.9 and the 
1fe60 69 6e 74 65 67 65 72 20 61 70 70 72 6f 78 69 6d  integer approxim
1fe70 61 74 69 6f 6e 20 35 3a 0a 20 20 20 20 20 20 2a  ation 5:.      *
1fe80 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
1fe90 20 20 28 78 20 3e 20 20 34 2e 39 29 20 20 20 20    (x >  4.9)    
1fea0 2d 3e 20 20 20 20 20 28 78 20 3e 3d 20 35 29 0a  ->     (x >= 5).
1feb0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
1fec0 28 78 20 3c 3d 20 34 2e 39 29 20 20 20 20 2d 3e  (x <= 4.9)    ->
1fed0 20 20 20 20 20 28 78 20 3c 20 20 35 29 0a 20 20       (x <  5).  
1fee0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1fef0 20 70 49 6e 33 2d 3e 75 2e 72 3c 28 64 6f 75 62   pIn3->u.r<(doub
1ff00 6c 65 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20  le)iKey ){.     
1ff10 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65     assert( OP_Se
1ff20 65 6b 47 45 3d 3d 28 4f 50 5f 53 65 65 6b 47 54  ekGE==(OP_SeekGT
1ff30 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  -1) );.        a
1ff40 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 54  ssert( OP_SeekLT
1ff50 3d 3d 28 4f 50 5f 53 65 65 6b 4c 45 2d 31 29 20  ==(OP_SeekLE-1) 
1ff60 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1ff70 74 28 20 28 4f 50 5f 53 65 65 6b 4c 45 20 26 20  t( (OP_SeekLE & 
1ff80 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65  0x0001)==(OP_See
1ff90 6b 47 54 20 26 20 30 78 30 30 30 31 29 20 29 3b  kGT & 0x0001) );
1ffa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 63  .        if( (oc
1ffb0 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f   & 0x0001)==(OP_
1ffc0 53 65 65 6b 47 54 20 26 20 30 78 30 30 30 31 29  SeekGT & 0x0001)
1ffd0 20 29 20 6f 63 2d 2d 3b 0a 20 20 20 20 20 20 7d   ) oc--;.      }
1ffe0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1fff0 65 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  e approximation 
20000 69 4b 65 79 20 69 73 20 73 6d 61 6c 6c 65 72 20  iKey is smaller 
20010 74 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20  than the actual 
20020 72 65 61 6c 20 73 65 61 72 63 68 0a 20 20 20 20  real search.    
20030 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62 73 74    ** term, subst
20040 69 74 75 74 65 20 3c 3d 20 66 6f 72 20 3c 20 61  itute <= for < a
20050 6e 64 20 3e 20 66 6f 72 20 3e 3d 2e 20 20 2a 2f  nd > for >=.  */
20060 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
20070 70 49 6e 33 2d 3e 75 2e 72 3e 28 64 6f 75 62 6c  pIn3->u.r>(doubl
20080 65 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  e)iKey ){.      
20090 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
200a0 6b 4c 45 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54 2b  kLE==(OP_SeekLT+
200b0 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  1) );.        as
200c0 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 3d  sert( OP_SeekGT=
200d0 3d 28 4f 50 5f 53 65 65 6b 47 45 2b 31 29 20 29  =(OP_SeekGE+1) )
200e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
200f0 28 20 28 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30  ( (OP_SeekLT & 0
20100 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b  x0001)==(OP_Seek
20110 47 45 20 26 20 30 78 30 30 30 31 29 20 29 3b 0a  GE & 0x0001) );.
20120 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 63 20          if( (oc 
20130 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53  & 0x0001)==(OP_S
20140 65 65 6b 4c 54 20 26 20 30 78 30 30 30 31 29 20  eekLT & 0x0001) 
20150 29 20 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ) oc++;.      }.
20160 20 20 20 20 7d 20 0a 20 20 20 20 72 63 20 3d 20      } .    rc = 
20170 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
20180 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75  toUnpacked(pC->u
20190 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  c.pCursor, 0, (u
201a0 36 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65 73  64)iKey, 0, &res
201b0 29 3b 0a 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74  );.    pC->movet
201c0 6f 54 61 72 67 65 74 20 3d 20 69 4b 65 79 3b 20  oTarget = iKey; 
201d0 20 2f 2a 20 55 73 65 64 20 62 79 20 4f 50 5f 44   /* Used by OP_D
201e0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 69 66 28  elete */.    if(
201f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20200 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  {.      goto abo
20210 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
20220 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
20230 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 75 72      /* For a cur
20240 73 6f 72 20 77 69 74 68 20 74 68 65 20 42 54 52  sor with the BTR
20250 45 45 5f 53 45 45 4b 5f 45 51 20 68 69 6e 74 2c  EE_SEEK_EQ hint,
20260 20 6f 6e 6c 79 20 74 68 65 20 4f 50 5f 53 65 65   only the OP_See
20270 6b 47 45 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4f  kGE and.    ** O
20280 50 5f 53 65 65 6b 4c 45 20 6f 70 63 6f 64 65 73  P_SeekLE opcodes
20290 20 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20 61 6e   are allowed, an
202a0 64 20 74 68 65 73 65 20 6d 75 73 74 20 62 65 20  d these must be 
202b0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
202c0 6f 77 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 61  owed.    ** by a
202d0 6e 20 4f 50 5f 49 64 78 47 54 20 6f 72 20 4f 50  n OP_IdxGT or OP
202e0 5f 49 64 78 4c 54 20 6f 70 63 6f 64 65 2c 20 72  _IdxLT opcode, r
202f0 65 73 70 65 63 74 69 76 65 6c 79 2c 20 77 69 74  espectively, wit
20300 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 2e 0a  h the same key..
20310 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
20320 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
20330 72 48 61 73 48 69 6e 74 28 70 43 2d 3e 75 63 2e  rHasHint(pC->uc.
20340 70 43 75 72 73 6f 72 2c 20 42 54 52 45 45 5f 53  pCursor, BTREE_S
20350 45 45 4b 5f 45 51 29 20 29 7b 0a 20 20 20 20 20  EEK_EQ) ){.     
20360 20 65 71 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20   eqOnly = 1;.   
20370 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
20380 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 47  opcode==OP_SeekG
20390 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  E || pOp->opcode
203a0 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20  ==OP_SeekLE );. 
203b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
203c0 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  [1].opcode==OP_I
203d0 64 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f  dxLT || pOp[1].o
203e0 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20  pcode==OP_IdxGT 
203f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20400 20 70 4f 70 5b 31 5d 2e 70 31 3d 3d 70 4f 70 5b   pOp[1].p1==pOp[
20410 30 5d 2e 70 31 20 29 3b 0a 20 20 20 20 20 20 61  0].p1 );.      a
20420 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 32  ssert( pOp[1].p2
20430 3d 3d 70 4f 70 5b 30 5d 2e 70 32 20 29 3b 0a 20  ==pOp[0].p2 );. 
20440 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
20450 5b 31 5d 2e 70 33 3d 3d 70 4f 70 5b 30 5d 2e 70  [1].p3==pOp[0].p
20460 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  3 );.      asser
20470 74 28 20 70 4f 70 5b 31 5d 2e 70 34 2e 69 3d 3d  t( pOp[1].p4.i==
20480 70 4f 70 5b 30 5d 2e 70 34 2e 69 20 29 3b 0a 20  pOp[0].p4.i );. 
20490 20 20 20 7d 0a 0a 20 20 20 20 6e 46 69 65 6c 64     }..    nField
204a0 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20   = pOp->p4.i;.  
204b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
204c0 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
204d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
204e0 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 20 20 72  Field>0 );.    r
204f0 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
20500 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e  pKeyInfo;.    r.
20510 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 46  nField = (u16)nF
20520 69 65 6c 64 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ield;..    /* Th
20530 65 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20 63  e next line of c
20540 6f 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73 20  ode computes as 
20550 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66 61  follows, only fa
20560 73 74 65 72 3a 0a 20 20 20 20 2a 2a 20 20 20 69  ster:.    **   i
20570 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54  f( oc==OP_SeekGT
20580 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c   || oc==OP_SeekL
20590 45 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  E ){.    **     
205a0 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d  r.default_rc = -
205b0 31 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73  1;.    **   }els
205c0 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 2e  e{.    **     r.
205d0 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2b 31 3b  default_rc = +1;
205e0 0a 20 20 20 20 2a 2a 20 20 20 7d 0a 20 20 20 20  .    **   }.    
205f0 2a 2f 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74  */.    r.default
20600 5f 72 63 20 3d 20 28 28 31 20 26 20 28 6f 63 20  _rc = ((1 & (oc 
20610 2d 20 4f 50 5f 53 65 65 6b 4c 54 29 29 20 3f 20  - OP_SeekLT)) ? 
20620 2d 31 20 3a 20 2b 31 29 3b 0a 20 20 20 20 61 73  -1 : +1);.    as
20630 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
20640 6b 47 54 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74  kGT || r.default
20650 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61  _rc==-1 );.    a
20660 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65  ssert( oc!=OP_Se
20670 65 6b 4c 45 20 7c 7c 20 72 2e 64 65 66 61 75 6c  ekLE || r.defaul
20680 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20  t_rc==-1 );.    
20690 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53  assert( oc!=OP_S
206a0 65 65 6b 47 45 20 7c 7c 20 72 2e 64 65 66 61 75  eekGE || r.defau
206b0 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 20 20 20  lt_rc==+1 );.   
206c0 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f   assert( oc!=OP_
206d0 53 65 65 6b 4c 54 20 7c 7c 20 72 2e 64 65 66 61  SeekLT || r.defa
206e0 75 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 0a 20  ult_rc==+1 );.. 
206f0 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65     r.aMem = &aMe
20700 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64  m[pOp->p3];.#ifd
20710 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
20720 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72      { int i; for
20730 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64  (i=0; i<r.nField
20740 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d  ; i++) assert( m
20750 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65  emIsValid(&r.aMe
20760 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69  m[i]) ); }.#endi
20770 66 0a 20 20 20 20 72 2e 65 71 53 65 65 6e 20 3d  f.    r.eqSeen =
20780 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
20790 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
207a0 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70  npacked(pC->uc.p
207b0 43 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c 20 30  Cursor, &r, 0, 0
207c0 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
207d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
207e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  {.      goto abo
207f0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
20800 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
20810 71 4f 6e 6c 79 20 26 26 20 72 2e 65 71 53 65 65  qOnly && r.eqSee
20820 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  n==0 ){.      as
20830 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a  sert( res!=0 );.
20840 20 20 20 20 20 20 67 6f 74 6f 20 73 65 65 6b 5f        goto seek_
20850 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d  not_found;.    }
20860 0a 20 20 7d 0a 20 20 70 43 2d 3e 64 65 66 65 72  .  }.  pC->defer
20870 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
20880 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
20890 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
208a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
208b0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61  ST.  sqlite3_sea
208c0 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
208d0 64 69 66 0a 20 20 69 66 28 20 6f 63 3e 3d 4f 50  dif.  if( oc>=OP
208e0 5f 53 65 65 6b 47 45 20 29 7b 20 20 61 73 73 65  _SeekGE ){  asse
208f0 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47  rt( oc==OP_SeekG
20900 45 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  E || oc==OP_Seek
20910 47 54 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  GT );.    if( re
20920 73 3c 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26  s<0 || (res==0 &
20930 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 29  & oc==OP_SeekGT)
20940 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
20950 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
20960 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
20970 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  C->uc.pCursor, 0
20980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
209a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
209b0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
209c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
209d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
209e0 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20   res = 1;.      
209f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20a00 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
20a10 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
20a20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
20a40 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  es = 0;.    }.  
20a50 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
20a60 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54  t( oc==OP_SeekLT
20a70 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c   || oc==OP_SeekL
20a80 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  E );.    if( res
20a90 3e 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26  >0 || (res==0 &&
20aa0 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 20   oc==OP_SeekLT) 
20ab0 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 30  ){.      res = 0
20ac0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
20ad0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
20ae0 73 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  s(pC->uc.pCursor
20af0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20b00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20b10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
20b20 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
20b30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
20b40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
20b50 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20      res = 1;.   
20b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20b70 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
20b80 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
20b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20ba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20bb0 20 20 2f 2a 20 72 65 73 20 6d 69 67 68 74 20 62    /* res might b
20bc0 65 20 6e 65 67 61 74 69 76 65 20 62 65 63 61 75  e negative becau
20bd0 73 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  se the table is 
20be0 65 6d 70 74 79 2e 20 20 43 68 65 63 6b 20 74 6f  empty.  Check to
20bf0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
20c00 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
20c10 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
20c20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42    res = sqlite3B
20c30 74 72 65 65 45 6f 66 28 70 43 2d 3e 75 63 2e 70  treeEof(pC->uc.p
20c40 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
20c50 20 7d 0a 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e   }.seek_not_foun
20c60 64 3a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  d:.  assert( pOp
20c70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 56 64 62 65  ->p2>0 );.  Vdbe
20c80 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
20c90 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73  =0,2);.  if( res
20ca0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d   ){.    goto jum
20cb0 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65  p_to_p2;.  }else
20cc0 20 69 66 28 20 65 71 4f 6e 6c 79 20 29 7b 0a 20   if( eqOnly ){. 
20cd0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31     assert( pOp[1
20ce0 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ].opcode==OP_Idx
20cf0 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63  LT || pOp[1].opc
20d00 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b  ode==OP_IdxGT );
20d10 0a 20 20 20 20 70 4f 70 2b 2b 3b 20 2f 2a 20 53  .    pOp++; /* S
20d20 6b 69 70 20 74 68 65 20 4f 50 5f 49 64 78 4c 74  kip the OP_IdxLt
20d30 20 6f 72 20 4f 50 5f 49 64 78 47 54 20 74 68 61   or OP_IdxGT tha
20d40 74 20 66 6f 6c 6c 6f 77 73 20 2a 2f 0a 20 20 7d  t follows */.  }
20d50 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
20d60 4f 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31  Opcode: Found P1
20d70 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53   P2 P3 P4 *.** S
20d80 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
20d90 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50  3@P4].**.** If P
20da0 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74  4==0 then regist
20db0 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c  er P3 holds a bl
20dc0 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ob constructed b
20dd0 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49  y MakeRecord.  I
20de0 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72  f.** P4>0 then r
20df0 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68  egister P3 is th
20e00 65 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65  e first of P4 re
20e10 67 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72  gisters that for
20e20 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a  m an unpacked.**
20e30 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 43   record..**.** C
20e40 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61  ursor P1 is on a
20e50 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20  n index btree.  
20e60 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64  If the record id
20e70 65 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61  entified by P3 a
20e80 6e 64 20 50 34 0a 2a 2a 20 69 73 20 61 20 70 72  nd P4.** is a pr
20e90 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72  efix of any entr
20ea0 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a  y in P1 then a j
20eb0 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50  ump is made to P
20ec0 32 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 6c  2 and.** P1 is l
20ed0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
20ee0 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74  the matching ent
20ef0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  ry..**.** This o
20f00 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20  peration leaves 
20f10 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20  the cursor in a 
20f20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63  state where it c
20f30 61 6e 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65  an be.** advance
20f40 64 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64  d in the forward
20f50 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 54 68 65   direction.  The
20f60 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   Next instructio
20f70 6e 20 77 69 6c 6c 20 77 6f 72 6b 2c 0a 2a 2a 20  n will work,.** 
20f80 62 75 74 20 6e 6f 74 20 74 68 65 20 50 72 65 76  but not the Prev
20f90 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
20fa0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f  .** See also: No
20fb0 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69  tFound, NoConfli
20fc0 63 74 2c 20 4e 6f 74 45 78 69 73 74 73 2e 20 53  ct, NotExists. S
20fd0 65 65 6b 47 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  eekGe.*/./* Opco
20fe0 64 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20  de: NotFound P1 
20ff0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
21000 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
21010 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  @P4].**.** If P4
21020 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65  ==0 then registe
21030 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f  r P3 holds a blo
21040 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  b constructed by
21050 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66   MakeRecord.  If
21060 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65  .** P4>0 then re
21070 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
21080 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67   first of P4 reg
21090 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d  isters that form
210a0 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20   an unpacked.** 
210b0 72 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43  record..** .** C
210c0 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61  ursor P1 is on a
210d0 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20  n index btree.  
210e0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64  If the record id
210f0 65 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61  entified by P3 a
21100 6e 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74 20  nd P4.** is not 
21110 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 61 6e  the prefix of an
21120 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68  y entry in P1 th
21130 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  en a jump is mad
21140 65 20 74 6f 20 50 32 2e 20 20 49 66 20 50 31 20  e to P2.  If P1 
21150 0a 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e  .** does contain
21160 20 61 6e 20 65 6e 74 72 79 20 77 68 6f 73 65 20   an entry whose 
21170 70 72 65 66 69 78 20 6d 61 74 63 68 65 73 20 74  prefix matches t
21180 68 65 20 50 33 2f 50 34 20 72 65 63 6f 72 64 20  he P3/P4 record 
21190 74 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20  then control.** 
211a0 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f  falls through to
211b0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
211c0 63 74 69 6f 6e 20 61 6e 64 20 50 31 20 69 73 20  ction and P1 is 
211d0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
211e0 20 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e 67   the.** matching
211f0 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
21200 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61  is operation lea
21210 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69  ves the cursor i
21220 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20  n a state where 
21230 69 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  it cannot be.** 
21240 61 64 76 61 6e 63 65 64 20 69 6e 20 65 69 74 68  advanced in eith
21250 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49  er direction.  I
21260 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
21270 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76  he Next and Prev
21280 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e  .** opcodes do n
21290 6f 74 20 77 6f 72 6b 20 61 66 74 65 72 20 74 68  ot work after th
212a0 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
212b0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
212c0 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20  und, NotExists, 
212d0 4e 6f 43 6f 6e 66 6c 69 63 74 0a 2a 2f 0a 2f 2a  NoConflict.*/./*
212e0 20 4f 70 63 6f 64 65 3a 20 4e 6f 43 6f 6e 66 6c   Opcode: NoConfl
212f0 69 63 74 20 50 31 20 50 32 20 50 33 20 50 34 20  ict P1 P2 P3 P4 
21300 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
21310 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
21320 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20  * If P4==0 then 
21330 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64  register P3 hold
21340 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75  s a blob constru
21350 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f  cted by MakeReco
21360 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20  rd.  If.** P4>0 
21370 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33  then register P3
21380 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66   is the first of
21390 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68   P4 registers th
213a0 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  at form an unpac
213b0 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a  ked.** record..*
213c0 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20  * .** Cursor P1 
213d0 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  is on an index b
213e0 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65  tree.  If the re
213f0 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20  cord identified 
21400 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20  by P3 and P4.** 
21410 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
21420 4c 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20 69 6d  L value, jump im
21430 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
21440 20 20 49 66 20 61 6c 6c 20 74 65 72 6d 73 20 6f    If all terms o
21450 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  f the.** record 
21460 61 72 65 20 6e 6f 74 2d 4e 55 4c 4c 20 74 68 65  are not-NULL the
21470 6e 20 61 20 63 68 65 63 6b 20 69 73 20 64 6f 6e  n a check is don
21480 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  e to determine i
21490 66 20 61 6e 79 20 72 6f 77 20 69 6e 20 74 68 65  f any row in the
214a0 0a 2a 2a 20 50 31 20 69 6e 64 65 78 20 62 74 72  .** P1 index btr
214b0 65 65 20 68 61 73 20 61 20 6d 61 74 63 68 69 6e  ee has a matchin
214c0 67 20 6b 65 79 20 70 72 65 66 69 78 2e 20 20 49  g key prefix.  I
214d0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
214e0 61 74 63 68 65 73 2c 20 6a 75 6d 70 0a 2a 2a 20  atches, jump.** 
214f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
21500 32 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  2.  If there is 
21510 61 20 6d 61 74 63 68 2c 20 66 61 6c 6c 20 74 68  a match, fall th
21520 72 6f 75 67 68 20 61 6e 64 20 6c 65 61 76 65 20  rough and leave 
21530 74 68 65 20 50 31 0a 2a 2a 20 63 75 72 73 6f 72  the P1.** cursor
21540 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
21550 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e 0a 2a   matching row..*
21560 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
21570 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 4f   is similar to O
21580 50 5f 4e 6f 74 46 6f 75 6e 64 20 77 69 74 68 20  P_NotFound with 
21590 74 68 65 20 65 78 63 65 70 74 69 6f 6e 73 20 74  the exceptions t
215a0 68 61 74 20 74 68 65 0a 2a 2a 20 62 72 61 6e 63  hat the.** branc
215b0 68 20 69 73 20 61 6c 77 61 79 73 20 74 61 6b 65  h is always take
215c0 6e 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  n if any part of
215d0 20 74 68 65 20 73 65 61 72 63 68 20 6b 65 79 20   the search key 
215e0 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  input is NULL..*
215f0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74  *.** This operat
21600 69 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20 63  ion leaves the c
21610 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65  ursor in a state
21620 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74   where it cannot
21630 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20   be.** advanced 
21640 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74  in either direct
21650 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
21660 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61  ords, the Next a
21670 6e 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64  nd Prev.** opcod
21680 65 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61  es do not work a
21690 66 74 65 72 20 74 68 69 73 20 6f 70 65 72 61 74  fter this operat
216a0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ion..**.** See a
216b0 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 46  lso: NotFound, F
216c0 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 0a  ound, NotExists.
216d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 43 6f 6e  */.case OP_NoCon
216e0 66 6c 69 63 74 3a 20 20 20 20 20 2f 2a 20 6a 75  flict:     /* ju
216f0 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  mp, in3 */.case 
21700 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20  OP_NotFound:    
21710 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
21720 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64  */.case OP_Found
21730 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
21740 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74  mp, in3 */.  int
21750 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a   alreadyExists;.
21760 20 20 69 6e 74 20 74 61 6b 65 4a 75 6d 70 3b 0a    int takeJump;.
21770 20 20 69 6e 74 20 69 69 3b 0a 20 20 56 64 62 65    int ii;.  Vdbe
21780 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e  Cursor *pC;.  in
21790 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65  t res;.  Unpacke
217a0 64 52 65 63 6f 72 64 20 2a 70 46 72 65 65 3b 0a  dRecord *pFree;.
217b0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
217c0 20 2a 70 49 64 78 4b 65 79 3b 0a 20 20 55 6e 70   *pIdxKey;.  Unp
217d0 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a  ackedRecord r;..
217e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
217f0 53 54 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ST.  if( pOp->op
21800 63 6f 64 65 21 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c  code!=OP_NoConfl
21810 69 63 74 20 29 20 73 71 6c 69 74 65 33 5f 66 6f  ict ) sqlite3_fo
21820 75 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  und_count++;.#en
21830 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
21840 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
21850 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
21860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
21870 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
21880 33 32 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  32 );.  pC = p->
21890 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
218a0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
218b0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
218c0 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65  _DEBUG.  pC->see
218d0 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  kOp = pOp->opcod
218e0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 33  e;.#endif.  pIn3
218f0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
21900 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  ];.  assert( pC-
21910 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
21920 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
21930 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75  sert( pC->uc.pCu
21940 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
21950 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65  ert( pC->isTable
21960 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  ==0 );.  if( pOp
21970 2d 3e 70 34 2e 69 3e 30 20 29 7b 0a 20 20 20 20  ->p4.i>0 ){.    
21980 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d  r.pKeyInfo = pC-
21990 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72  >pKeyInfo;.    r
219a0 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70  .nField = (u16)p
219b0 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72 2e  Op->p4.i;.    r.
219c0 61 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 23 69 66  aMem = pIn3;.#if
219d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
219e0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
219f0 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b  i<r.nField; ii++
21a00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21a10 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61   memIsValid(&r.a
21a20 4d 65 6d 5b 69 69 5d 29 20 29 3b 0a 20 20 20 20  Mem[ii]) );.    
21a30 20 20 61 73 73 65 72 74 28 20 28 72 2e 61 4d 65    assert( (r.aMe
21a40 6d 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45  m[ii].flags & ME
21a50 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 72 2e  M_Zero)==0 || r.
21a60 61 4d 65 6d 5b 69 69 5d 2e 6e 3d 3d 30 20 29 3b  aMem[ii].n==0 );
21a70 0a 20 20 20 20 20 20 69 66 28 20 69 69 20 29 20  .      if( ii ) 
21a80 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
21a90 4f 70 2d 3e 70 33 2b 69 69 2c 20 26 72 2e 61 4d  Op->p3+ii, &r.aM
21aa0 65 6d 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a 23  em[ii]);.    }.#
21ab0 65 6e 64 69 66 0a 20 20 20 20 70 49 64 78 4b 65  endif.    pIdxKe
21ac0 79 20 3d 20 26 72 3b 0a 20 20 20 20 70 46 72 65  y = &r;.    pFre
21ad0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
21ae0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 33      assert( pIn3
21af0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
21b00 6f 62 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 45  ob );.    rc = E
21b10 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b  xpandBlob(pIn3);
21b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
21b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
21b40 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
21b50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
21b60 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
21b70 70 46 72 65 65 20 3d 20 70 49 64 78 4b 65 79 20  pFree = pIdxKey 
21b80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c  = sqlite3VdbeAll
21b90 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
21ba0 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  (pC->pKeyInfo);.
21bb0 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
21bc0 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
21bd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
21be0 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
21bf0 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 49 6e 33  ->pKeyInfo, pIn3
21c00 2d 3e 6e 2c 20 70 49 6e 33 2d 3e 7a 2c 20 70 49  ->n, pIn3->z, pI
21c10 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 70 49  dxKey);.  }.  pI
21c20 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
21c30 63 20 3d 20 30 3b 0a 20 20 74 61 6b 65 4a 75 6d  c = 0;.  takeJum
21c40 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 70  p = 0;.  if( pOp
21c50 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 43  ->opcode==OP_NoC
21c60 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 2f  onflict ){.    /
21c70 2a 20 46 6f 72 20 74 68 65 20 4f 50 5f 4e 6f 43  * For the OP_NoC
21c80 6f 6e 66 6c 69 63 74 20 6f 70 63 6f 64 65 2c 20  onflict opcode, 
21c90 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
21ca0 20 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 20 20   any of the.    
21cb0 2a 2a 20 69 6e 70 75 74 20 66 69 65 6c 64 73 20  ** input fields 
21cc0 61 72 65 20 4e 55 4c 4c 2c 20 73 69 6e 63 65 20  are NULL, since 
21cd0 61 6e 79 20 6b 65 79 20 77 69 74 68 20 61 20 4e  any key with a N
21ce0 55 4c 4c 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  ULL will not.   
21cf0 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a   ** conflict */.
21d00 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
21d10 3c 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64  <pIdxKey->nField
21d20 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
21d30 66 28 20 70 49 64 78 4b 65 79 2d 3e 61 4d 65 6d  f( pIdxKey->aMem
21d40 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  [ii].flags & MEM
21d50 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Null ){.       
21d60 20 74 61 6b 65 4a 75 6d 70 20 3d 20 31 3b 0a 20   takeJump = 1;. 
21d70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21d80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
21da0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
21db0 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  d(pC->uc.pCursor
21dc0 2c 20 70 49 64 78 4b 65 79 2c 20 30 2c 20 30 2c  , pIdxKey, 0, 0,
21dd0 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 70 46   &res);.  if( pF
21de0 72 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ree ) sqlite3DbF
21df0 72 65 65 4e 4e 28 64 62 2c 20 70 46 72 65 65 29  reeNN(db, pFree)
21e00 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
21e10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
21e20 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
21e30 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e  rror;.  }.  pC->
21e40 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73  seekResult = res
21e50 3b 0a 20 20 61 6c 72 65 61 64 79 45 78 69 73 74  ;.  alreadyExist
21e60 73 20 3d 20 28 72 65 73 3d 3d 30 29 3b 0a 20 20  s = (res==0);.  
21e70 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 2d  pC->nullRow = 1-
21e80 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b 0a 20  alreadyExists;. 
21e90 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
21ea0 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63  eto = 0;.  pC->c
21eb0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
21ec0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
21ed0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
21ee0 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 56 64 62  Found ){.    Vdb
21ef0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 61 6c 72  eBranchTaken(alr
21f00 65 61 64 79 45 78 69 73 74 73 21 3d 30 2c 32 29  eadyExists!=0,2)
21f10 3b 0a 20 20 20 20 69 66 28 20 61 6c 72 65 61 64  ;.    if( alread
21f20 79 45 78 69 73 74 73 20 29 20 67 6f 74 6f 20 6a  yExists ) goto j
21f30 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c  ump_to_p2;.  }el
21f40 73 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  se{.    VdbeBran
21f50 63 68 54 61 6b 65 6e 28 74 61 6b 65 4a 75 6d 70  chTaken(takeJump
21f60 7c 7c 61 6c 72 65 61 64 79 45 78 69 73 74 73 3d  ||alreadyExists=
21f70 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 74  =0,2);.    if( t
21f80 61 6b 65 4a 75 6d 70 20 7c 7c 20 21 61 6c 72 65  akeJump || !alre
21f90 61 64 79 45 78 69 73 74 73 20 29 20 67 6f 74 6f  adyExists ) goto
21fa0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
21fb0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
21fc0 4f 70 63 6f 64 65 3a 20 53 65 65 6b 52 6f 77 69  Opcode: SeekRowi
21fd0 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
21fe0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b  * Synopsis: intk
21ff0 65 79 3d 72 5b 50 33 5d 0a 2a 2a 0a 2a 2a 20 50  ey=r[P3].**.** P
22000 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  1 is the index o
22010 66 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 20  f a cursor open 
22020 6f 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20  on an SQL table 
22030 62 74 72 65 65 20 28 77 69 74 68 20 69 6e 74 65  btree (with inte
22040 67 65 72 0a 2a 2a 20 6b 65 79 73 29 2e 20 20 49  ger.** keys).  I
22050 66 20 72 65 67 69 73 74 65 72 20 50 33 20 64 6f  f register P3 do
22060 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
22070 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
22080 50 31 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63  P1 does not.** c
22090 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20  ontain a record 
220a0 77 69 74 68 20 72 6f 77 69 64 20 50 33 20 74 68  with rowid P3 th
220b0 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  en jump immediat
220c0 65 6c 79 20 74 6f 20 50 32 2e 20 20 0a 2a 2a 20  ely to P2.  .** 
220d0 4f 72 2c 20 69 66 20 50 32 20 69 73 20 30 2c 20  Or, if P2 is 0, 
220e0 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f  raise an SQLITE_
220f0 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 49  CORRUPT error. I
22100 66 20 50 31 20 64 6f 65 73 20 63 6f 6e 74 61 69  f P1 does contai
22110 6e 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 77 69  n.** a record wi
22120 74 68 20 72 6f 77 69 64 20 50 33 20 74 68 65 6e  th rowid P3 then
22130 20 0a 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 63   .** leave the c
22140 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61  ursor pointing a
22150 74 20 74 68 61 74 20 72 65 63 6f 72 64 20 61 6e  t that record an
22160 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  d fall through t
22170 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e  o the next.** in
22180 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
22190 20 54 68 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74   The OP_NotExist
221a0 73 20 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d  s opcode perform
221b0 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61  s the same opera
221c0 74 69 6f 6e 2c 20 62 75 74 20 77 69 74 68 20 4f  tion, but with O
221d0 50 5f 4e 6f 74 45 78 69 73 74 73 0a 2a 2a 20 74  P_NotExists.** t
221e0 68 65 20 50 33 20 72 65 67 69 73 74 65 72 20 6d  he P3 register m
221f0 75 73 74 20 62 65 20 67 75 61 72 61 6e 74 65 65  ust be guarantee
22200 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20  d to contain an 
22210 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 20  integer value.  
22220 57 69 74 68 20 74 68 69 73 0a 2a 2a 20 6f 70 63  With this.** opc
22230 6f 64 65 2c 20 72 65 67 69 73 74 65 72 20 50 33  ode, register P3
22240 20 6d 69 67 68 74 20 6e 6f 74 20 63 6f 6e 74 61   might not conta
22250 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  in an integer..*
22260 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 46  *.** The OP_NotF
22270 6f 75 6e 64 20 6f 70 63 6f 64 65 20 70 65 72 66  ound opcode perf
22280 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70  orms the same op
22290 65 72 61 74 69 6f 6e 20 6f 6e 20 69 6e 64 65 78  eration on index
222a0 20 62 74 72 65 65 73 0a 2a 2a 20 28 77 69 74 68   btrees.** (with
222b0 20 61 72 62 69 74 72 61 72 79 20 6d 75 6c 74 69   arbitrary multi
222c0 2d 76 61 6c 75 65 20 6b 65 79 73 29 2e 0a 2a 2a  -value keys)..**
222d0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
222e0 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
222f0 72 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65  r in a state whe
22300 72 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20  re it cannot be 
22310 61 64 76 61 6e 63 65 64 0a 2a 2a 20 69 6e 20 65  advanced.** in e
22320 69 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e  ither direction.
22330 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
22340 2c 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50  , the Next and P
22350 72 65 76 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c  rev opcodes will
22360 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 6c  .** not work fol
22370 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 63 6f  lowing this opco
22380 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  de..**.** See al
22390 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f  so: Found, NotFo
223a0 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c  und, NoConflict,
223b0 20 53 65 65 6b 52 6f 77 69 64 0a 2a 2f 0a 2f 2a   SeekRowid.*/./*
223c0 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 45 78 69 73   Opcode: NotExis
223d0 74 73 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ts P1 P2 P3 * *.
223e0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74  ** Synopsis: int
223f0 6b 65 79 3d 72 5b 50 33 5d 0a 2a 2a 0a 2a 2a 20  key=r[P3].**.** 
22400 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  P1 is the index 
22410 6f 66 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  of a cursor open
22420 20 6f 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   on an SQL table
22430 20 62 74 72 65 65 20 28 77 69 74 68 20 69 6e 74   btree (with int
22440 65 67 65 72 0a 2a 2a 20 6b 65 79 73 29 2e 20 20  eger.** keys).  
22450 50 33 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  P3 is an integer
22460 20 72 6f 77 69 64 2e 20 20 49 66 20 50 31 20 64   rowid.  If P1 d
22470 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
22480 61 20 72 65 63 6f 72 64 20 77 69 74 68 0a 2a 2a  a record with.**
22490 20 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 6a   rowid P3 then j
224a0 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
224b0 74 6f 20 50 32 2e 20 20 4f 72 2c 20 69 66 20 50  to P2.  Or, if P
224c0 32 20 69 73 20 30 2c 20 72 61 69 73 65 20 61 6e  2 is 0, raise an
224d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
224e0 50 54 20 65 72 72 6f 72 2e 20 49 66 20 50 31 20  PT error. If P1 
224f0 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 72  does contain a r
22500 65 63 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64  ecord with rowid
22510 20 50 33 20 74 68 65 6e 20 0a 2a 2a 20 6c 65 61   P3 then .** lea
22520 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ve the cursor po
22530 69 6e 74 69 6e 67 20 61 74 20 74 68 61 74 20 72  inting at that r
22540 65 63 6f 72 64 20 61 6e 64 20 66 61 6c 6c 20 74  ecord and fall t
22550 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
22560 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  xt.** instructio
22570 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f  n..**.** The OP_
22580 53 65 65 6b 52 6f 77 69 64 20 6f 70 63 6f 64 65  SeekRowid opcode
22590 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61   performs the sa
225a0 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20 62 75 74  me operation but
225b0 20 61 6c 73 6f 20 61 6c 6c 6f 77 73 20 74 68 65   also allows the
225c0 0a 2a 2a 20 50 33 20 72 65 67 69 73 74 65 72 20  .** P3 register 
225d0 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6e 6f 6e  to contain a non
225e0 2d 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20  -integer value, 
225f0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
22600 65 20 6a 75 6d 70 20 69 73 0a 2a 2a 20 61 6c 77  e jump is.** alw
22610 61 79 73 20 74 61 6b 65 6e 2e 20 20 54 68 69 73  ays taken.  This
22620 20 6f 70 63 6f 64 65 20 72 65 71 75 69 72 65 73   opcode requires
22630 20 74 68 61 74 20 50 33 20 61 6c 77 61 79 73 20   that P3 always 
22640 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67  contain an integ
22650 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50  er..**.** The OP
22660 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64 65  _NotFound opcode
22670 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61   performs the sa
22680 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  me operation on 
22690 69 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a 20  index btrees.** 
226a0 28 77 69 74 68 20 61 72 62 69 74 72 61 72 79 20  (with arbitrary 
226b0 6d 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79 73  multi-value keys
226c0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  )..**.** This op
226d0 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
226e0 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74  cursor in a stat
226f0 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f  e where it canno
22700 74 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a 2a  t be advanced.**
22710 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63   in either direc
22720 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
22730 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20  words, the Next 
22740 61 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65 73  and Prev opcodes
22750 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72   will.** not wor
22760 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  k following this
22770 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53   opcode..**.** S
22780 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
22790 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66  NotFound, NoConf
227a0 6c 69 63 74 2c 20 53 65 65 6b 52 6f 77 69 64 0a  lict, SeekRowid.
227b0 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 52  */.case OP_SeekR
227c0 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 2f  owid: {        /
227d0 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20  * jump, in3 */. 
227e0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
227f0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
22800 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  sr;.  int res;. 
22810 20 75 36 34 20 69 4b 65 79 3b 0a 0a 20 20 70 49   u64 iKey;..  pI
22820 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
22830 70 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 33  p3];.  if( (pIn3
22840 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
22850 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70  t)==0 ){.    app
22860 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c  lyAffinity(pIn3,
22870 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
22880 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  RIC, encoding);.
22890 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66      if( (pIn3->f
228a0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d  lags & MEM_Int)=
228b0 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  =0 ) goto jump_t
228c0 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46  o_p2;.  }.  /* F
228d0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
228e0 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 2a 2f   OP_NotExists */
228f0 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 45 78 69 73  .case OP_NotExis
22900 74 73 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ts:          /* 
22910 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 70  jump, in3 */.  p
22920 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
22930 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
22940 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
22950 4d 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  M_Int );.  asser
22960 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
22970 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
22980 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
22990 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
229a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
229b0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
229c0 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65  E_DEBUG.  pC->se
229d0 65 6b 4f 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ekOp = 0;.#endif
229e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
229f0 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  sTable );.  asse
22a00 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
22a10 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
22a20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d  );.  pCrsr = pC-
22a30 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61  >uc.pCursor;.  a
22a40 73 73 65 72 74 28 20 70 43 72 73 72 21 3d 30 20  ssert( pCrsr!=0 
22a50 29 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20  );.  res = 0;.  
22a60 69 4b 65 79 20 3d 20 70 49 6e 33 2d 3e 75 2e 69  iKey = pIn3->u.i
22a70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22a80 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
22a90 6b 65 64 28 70 43 72 73 72 2c 20 30 2c 20 69 4b  ked(pCrsr, 0, iK
22aa0 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  ey, 0, &res);.  
22ab0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
22ac0 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20  TE_OK || res==0 
22ad0 29 3b 0a 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54  );.  pC->movetoT
22ae0 61 72 67 65 74 20 3d 20 69 4b 65 79 3b 20 20 2f  arget = iKey;  /
22af0 2a 20 55 73 65 64 20 62 79 20 4f 50 5f 44 65 6c  * Used by OP_Del
22b00 65 74 65 20 2a 2f 0a 20 20 70 43 2d 3e 6e 75 6c  ete */.  pC->nul
22b10 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  lRow = 0;.  pC->
22b20 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
22b30 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d  CHE_STALE;.  pC-
22b40 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
22b50 3d 20 30 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  = 0;.  VdbeBranc
22b60 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29  hTaken(res!=0,2)
22b70 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75  ;.  pC->seekResu
22b80 6c 74 20 3d 20 72 65 73 3b 0a 20 20 69 66 28 20  lt = res;.  if( 
22b90 72 65 73 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  res!=0 ){.    as
22ba0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
22bb0 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  _OK );.    if( p
22bc0 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20  Op->p2==0 ){.   
22bd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
22be0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
22bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f   }else{.      go
22c00 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
22c10 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
22c20 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
22c30 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
22c40 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
22c50 64 65 3a 20 53 65 71 75 65 6e 63 65 20 50 31 20  de: Sequence P1 
22c60 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
22c70 70 73 69 73 3a 20 72 5b 50 32 5d 3d 63 75 72 73  psis: r[P2]=curs
22c80 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b 0a 2a 2a 0a  or[P1].ctr++.**.
22c90 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74  ** Find the next
22ca0 20 61 76 61 69 6c 61 62 6c 65 20 73 65 71 75 65   available seque
22cb0 6e 63 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 63  nce number for c
22cc0 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 57 72 69  ursor P1..** Wri
22cd0 74 65 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  te the sequence 
22ce0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 72 65 67 69  number into regi
22cf0 73 74 65 72 20 50 32 2e 0a 2a 2a 20 54 68 65 20  ster P2..** The 
22d00 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20  sequence number 
22d10 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  on the cursor is
22d20 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 61 66 74   incremented aft
22d30 65 72 20 74 68 69 73 0a 2a 2a 20 69 6e 73 74 72  er this.** instr
22d40 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 63 61 73  uction.  .*/.cas
22d50 65 20 4f 50 5f 53 65 71 75 65 6e 63 65 3a 20 7b  e OP_Sequence: {
22d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
22d70 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t2 */.  assert( 
22d80 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
22d90 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
22da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
22db0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21  >apCsr[pOp->p1]!
22dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22dd0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
22de0 5d 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52  ]->eCurType!=CUR
22df0 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 70  TYPE_VTAB );.  p
22e00 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
22e10 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
22e20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61  pOut->u.i = p->a
22e30 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73  pCsr[pOp->p1]->s
22e40 65 71 43 6f 75 6e 74 2b 2b 3b 0a 20 20 62 72 65  eqCount++;.  bre
22e50 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.}.../* Opcod
22e60 65 3a 20 4e 65 77 52 6f 77 69 64 20 50 31 20 50  e: NewRowid P1 P
22e70 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
22e80 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69  psis: r[P2]=rowi
22e90 64 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65  d.**.** Get a ne
22ea0 77 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64  w integer record
22eb0 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22   number (a.k.a "
22ec0 72 6f 77 69 64 22 29 20 75 73 65 64 20 61 73 20  rowid") used as 
22ed0 74 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61 62  the key to a tab
22ee0 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72  le..** The recor
22ef0 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20  d number is not 
22f00 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 20  previously used 
22f10 61 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65 20  as a key in the 
22f20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
22f30 65 20 74 68 61 74 20 63 75 72 73 6f 72 20 50 31  e that cursor P1
22f40 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 65   points to.  The
22f50 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62   new record numb
22f60 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  er is written.**
22f70 20 77 72 69 74 74 65 6e 20 74 6f 20 72 65 67 69   written to regi
22f80 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49  ster P2..**.** I
22f90 66 20 50 33 3e 30 20 74 68 65 6e 20 50 33 20 69  f P3>0 then P3 i
22fa0 73 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20  s a register in 
22fb0 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f  the root frame o
22fc0 66 20 74 68 69 73 20 56 44 42 45 20 74 68 61 74  f this VDBE that
22fd0 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65 20 6c   holds .** the l
22fe0 61 72 67 65 73 74 20 70 72 65 76 69 6f 75 73 6c  argest previousl
22ff0 79 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f  y generated reco
23000 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e 65  rd number. No ne
23010 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73  w record numbers
23020 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20   are.** allowed 
23030 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
23040 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
23050 20 74 68 69 73 20 76 61 6c 75 65 20 72 65 61 63   this value reac
23060 68 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d 2c  hes its maximum,
23070 20 0a 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46   .** an SQLITE_F
23080 55 4c 4c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  ULL error is gen
23090 65 72 61 74 65 64 2e 20 54 68 65 20 50 33 20 72  erated. The P3 r
230a0 65 67 69 73 74 65 72 20 69 73 20 75 70 64 61 74  egister is updat
230b0 65 64 20 77 69 74 68 20 74 68 65 20 27 0a 2a 2a  ed with the '.**
230c0 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72   generated recor
230d0 64 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 50  d number. This P
230e0 33 20 6d 65 63 68 61 6e 69 73 6d 20 69 73 20 75  3 mechanism is u
230f0 73 65 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c  sed to help impl
23100 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54  ement the.** AUT
23110 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65 61 74 75  OINCREMENT featu
23120 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  re..*/.case OP_N
23130 65 77 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  ewRowid: {      
23140 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
23150 20 20 69 36 34 20 76 3b 20 20 20 20 20 20 20 20    i64 v;        
23160 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23170 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56  new rowid */.  V
23180 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20  dbeCursor *pC;  
23190 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
231a0 6f 66 20 74 61 62 6c 65 20 74 6f 20 67 65 74 20  of table to get 
231b0 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f  the new rowid */
231c0 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
231d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
231e0 75 6c 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ult of an sqlite
231f0 33 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a  3BtreeLast() */.
23200 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
23210 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
23220 74 65 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  ter to limit the
23230 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
23240 68 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  hes */.  Mem *pM
23250 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
23260 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
23270 69 6e 67 20 6c 61 72 67 65 73 74 20 72 6f 77 69  ing largest rowi
23280 64 20 66 6f 72 20 41 55 54 4f 49 4e 43 52 45 4d  d for AUTOINCREM
23290 45 4e 54 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ENT */.  VdbeFra
232a0 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20  me *pFrame;     
232b0 2f 2a 20 52 6f 6f 74 20 66 72 61 6d 65 20 6f 66  /* Root frame of
232c0 20 56 44 42 45 20 2a 2f 0a 0a 20 20 76 20 3d 20   VDBE */..  v = 
232d0 30 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20  0;.  res = 0;.  
232e0 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
232f0 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
23300 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
23310 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
23320 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
23330 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
23340 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
23350 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
23360 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
23370 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
23380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
23390 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
233a0 3b 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ;.  {.    /* The
233b0 20 6e 65 78 74 20 72 6f 77 69 64 20 6f 72 20 72   next rowid or r
233c0 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 64 69  ecord number (di
233d0 66 66 65 72 65 6e 74 20 74 65 72 6d 73 20 66 6f  fferent terms fo
233e0 72 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a  r the same.    *
233f0 2a 20 74 68 69 6e 67 29 20 69 73 20 6f 62 74 61  * thing) is obta
23400 69 6e 65 64 20 69 6e 20 61 20 74 77 6f 2d 73 74  ined in a two-st
23410 65 70 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20  ep algorithm..  
23420 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
23430 74 20 77 65 20 61 74 74 65 6d 70 74 20 74 6f 20  t we attempt to 
23440 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74  find the largest
23450 20 65 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20   existing rowid 
23460 61 6e 64 20 61 64 64 20 6f 6e 65 0a 20 20 20 20  and add one.    
23470 2a 2a 20 74 6f 20 74 68 61 74 2e 20 20 42 75 74  ** to that.  But
23480 20 69 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   if the largest 
23490 65 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20 69  existing rowid i
234a0 73 20 61 6c 72 65 61 64 79 20 74 68 65 20 6d 61  s already the ma
234b0 78 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 70 6f 73  ximum.    ** pos
234c0 69 74 69 76 65 20 69 6e 74 65 67 65 72 2c 20 77  itive integer, w
234d0 65 20 68 61 76 65 20 74 6f 20 66 61 6c 6c 20 74  e have to fall t
234e0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 73 65  hrough to the se
234f0 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70 72 6f 62  cond.    ** prob
23500 61 62 69 6c 69 73 74 69 63 20 61 6c 67 6f 72 69  abilistic algori
23510 74 68 6d 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  thm.    **.    *
23520 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 6c 67  * The second alg
23530 6f 72 69 74 68 6d 20 69 73 20 74 6f 20 73 65 6c  orithm is to sel
23540 65 63 74 20 61 20 72 6f 77 69 64 20 61 74 20 72  ect a rowid at r
23550 61 6e 64 6f 6d 20 61 6e 64 20 73 65 65 20 69 66  andom and see if
23560 0a 20 20 20 20 2a 2a 20 69 74 20 61 6c 72 65 61  .    ** it alrea
23570 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  dy exists in the
23580 20 74 61 62 6c 65 2e 20 20 49 66 20 69 74 20 64   table.  If it d
23590 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 77  oes not exist, w
235a0 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 73 75  e have.    ** su
235b0 63 63 65 65 64 65 64 2e 20 20 49 66 20 74 68 65  cceeded.  If the
235c0 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 64 6f   random rowid do
235d0 65 73 20 65 78 69 73 74 2c 20 77 65 20 73 65 6c  es exist, we sel
235e0 65 63 74 20 61 20 6e 65 77 20 6f 6e 65 0a 20 20  ect a new one.  
235f0 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 61 67 61    ** and try aga
23600 69 6e 2c 20 75 70 20 74 6f 20 31 30 30 20 74 69  in, up to 100 ti
23610 6d 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mes..    */.    
23620 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
23630 62 6c 65 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  ble );..#ifdef S
23640 51 4c 49 54 45 5f 33 32 42 49 54 5f 52 4f 57 49  QLITE_32BIT_ROWI
23650 44 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  D.#   define MAX
23660 5f 52 4f 57 49 44 20 30 78 37 66 66 66 66 66 66  _ROWID 0x7ffffff
23670 66 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53  f.#else.    /* S
23680 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 20 63 6f  ome compilers co
23690 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20 63 6f 6e  mplain about con
236a0 73 74 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  stants of the fo
236b0 72 6d 20 30 78 37 66 66 66 66 66 66 66 66 66 66  rm 0x7ffffffffff
236c0 66 66 66 66 66 2e 0a 20 20 20 20 2a 2a 20 4f 74  fffff..    ** Ot
236d0 68 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62  hers complain ab
236e0 6f 75 74 20 30 78 37 66 66 66 66 66 66 66 66 66  out 0x7fffffffff
236f0 66 66 66 66 66 66 66 4c 4c 2e 20 20 54 68 65 20  fffffffLL.  The 
23700 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20  following macro 
23710 73 65 65 6d 73 0a 20 20 20 20 2a 2a 20 74 6f 20  seems.    ** to 
23720 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 6e 73  provide the cons
23730 74 61 6e 74 20 77 68 69 6c 65 20 6d 61 6b 69 6e  tant while makin
23740 67 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 72 73 20  g all compilers 
23750 68 61 70 70 79 2e 0a 20 20 20 20 2a 2f 0a 23 20  happy..    */.# 
23760 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57    define MAX_ROW
23770 49 44 20 20 28 69 36 34 29 28 20 28 28 28 75 36  ID  (i64)( (((u6
23780 34 29 30 78 37 66 66 66 66 66 66 66 29 3c 3c 33  4)0x7fffffff)<<3
23790 32 29 20 7c 20 28 75 36 34 29 30 78 66 66 66 66  2) | (u64)0xffff
237a0 66 66 66 66 20 29 0a 23 65 6e 64 69 66 0a 0a 20  ffff ).#endif.. 
237b0 20 20 20 69 66 28 20 21 70 43 2d 3e 75 73 65 52     if( !pC->useR
237c0 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20  andomRowid ){.  
237d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
237e0 42 74 72 65 65 4c 61 73 74 28 70 43 2d 3e 75 63  BtreeLast(pC->uc
237f0 2e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  .pCursor, &res);
23800 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23820 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
23830 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
23840 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
23850 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20  es ){.        v 
23860 3d 20 31 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  = 1;   /* IMP: R
23870 2d 36 31 39 31 34 2d 34 38 30 37 34 20 2a 2f 0a  -61914-48074 */.
23880 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23890 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
238a0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
238b0 73 56 61 6c 69 64 28 70 43 2d 3e 75 63 2e 70 43  sValid(pC->uc.pC
238c0 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
238d0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 42 74 72    v = sqlite3Btr
238e0 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d  eeIntegerKey(pC-
238f0 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
23900 20 20 20 20 20 20 69 66 28 20 76 3e 3d 4d 41 58        if( v>=MAX
23910 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
23920 20 20 20 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f      pC->useRando
23930 6d 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20  mRowid = 1;.    
23940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23950 20 20 20 20 20 76 2b 2b 3b 20 20 20 2f 2a 20 49       v++;   /* I
23960 4d 50 3a 20 52 2d 32 39 35 33 38 2d 33 34 39 38  MP: R-29538-3498
23970 37 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  7 */.        }. 
23980 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
23990 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
239a0 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
239b0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20      if( pOp->p3 
239c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73 73 65  ){.      /* Asse
239d0 72 74 20 74 68 61 74 20 50 33 20 69 73 20 61 20  rt that P3 is a 
239e0 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c  valid memory cel
239f0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  l. */.      asse
23a00 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b  rt( pOp->p3>0 );
23a10 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 46  .      if( p->pF
23a20 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rame ){.        
23a30 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
23a40 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
23a50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
23a60 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
23a70 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 72          /* Asser
23a80 74 20 74 68 61 74 20 50 33 20 69 73 20 61 20 76  t that P3 is a v
23a90 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  alid memory cell
23aa0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
23ab0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 46  ert( pOp->p3<=pF
23ac0 72 61 6d 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  rame->nMem );.  
23ad0 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 26 70 46        pMem = &pF
23ae0 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  rame->aMem[pOp->
23af0 70 33 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p3];.      }else
23b00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73  {.        /* Ass
23b10 65 72 74 20 74 68 61 74 20 50 33 20 69 73 20 61  ert that P3 is a
23b20 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65   valid memory ce
23b30 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ll. */.        a
23b40 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d  ssert( pOp->p3<=
23b50 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
23b60 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
23b70 20 20 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d      pMem = &aMem
23b80 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20  [pOp->p3];.     
23b90 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
23ba0 6e 67 65 28 70 2c 20 70 4d 65 6d 29 3b 0a 20 20  nge(p, pMem);.  
23bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23bc0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
23bd0 4d 65 6d 29 20 29 3b 0a 0a 20 20 20 20 20 20 52  Mem) );..      R
23be0 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
23bf0 70 2d 3e 70 33 2c 20 70 4d 65 6d 29 3b 0a 20 20  p->p3, pMem);.  
23c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
23c10 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 4d 65  emIntegerify(pMe
23c20 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  m);.      assert
23c30 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
23c40 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 20   MEM_Int)!=0 ); 
23c50 20 2f 2a 20 6d 65 6d 28 50 33 29 20 68 6f 6c 64   /* mem(P3) hold
23c60 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
23c70 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
23c80 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57 49 44 20 7c  u.i==MAX_ROWID |
23c90 7c 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52  | pC->useRandomR
23ca0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
23cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
23cc0 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 37  ;   /* IMP: R-17
23cd0 38 31 37 2d 30 30 36 33 30 20 2a 2f 0a 20 20 20  817-00630 */.   
23ce0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
23cf0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
23d00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23d10 76 3c 70 4d 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b  v<pMem->u.i+1 ){
23d20 0a 20 20 20 20 20 20 20 20 76 20 3d 20 70 4d 65  .        v = pMe
23d30 6d 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20  m->u.i + 1;.    
23d40 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
23d50 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20 7d 0a 23  u.i = v;.    }.#
23d60 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 43  endif.    if( pC
23d70 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
23d80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50   ){.      /* IMP
23d90 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
23da0 52 2d 30 37 36 37 37 2d 34 31 38 38 31 20 49 66  R-07677-41881 If
23db0 20 74 68 65 20 6c 61 72 67 65 73 74 20 52 4f 57   the largest ROW
23dc0 49 44 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  ID is equal to t
23dd0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  he.      ** larg
23de0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 69 6e 74  est possible int
23df0 65 67 65 72 20 28 39 32 32 33 33 37 32 30 33 36  eger (9223372036
23e00 38 35 34 37 37 35 38 30 37 29 20 74 68 65 6e 20  854775807) then 
23e10 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
23e20 20 20 20 2a 2a 20 65 6e 67 69 6e 65 20 73 74 61     ** engine sta
23e30 72 74 73 20 70 69 63 6b 69 6e 67 20 70 6f 73 69  rts picking posi
23e40 74 69 76 65 20 63 61 6e 64 69 64 61 74 65 20 52  tive candidate R
23e50 4f 57 49 44 73 20 61 74 20 72 61 6e 64 6f 6d 20  OWIDs at random 
23e60 75 6e 74 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69  until.      ** i
23e70 74 20 66 69 6e 64 73 20 6f 6e 65 20 74 68 61 74  t finds one that
23e80 20 69 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73   is not previous
23e90 6c 79 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20  ly used. */.    
23ea0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
23eb0 33 3d 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 63  3==0 );  /* We c
23ec0 61 6e 6e 6f 74 20 62 65 20 69 6e 20 72 61 6e 64  annot be in rand
23ed0 6f 6d 20 72 6f 77 69 64 20 6d 6f 64 65 20 69 66  om rowid mode if
23ee0 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f00 20 20 20 20 20 20 2a 2a 20 61 6e 20 41 55 54 4f        ** an AUTO
23f10 49 4e 43 52 45 4d 45 4e 54 20 74 61 62 6c 65 2e  INCREMENT table.
23f20 20 2a 2f 0a 20 20 20 20 20 20 63 6e 74 20 3d 20   */.      cnt = 
23f30 30 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  0;.      do{.   
23f40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
23f50 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 76  domness(sizeof(v
23f60 29 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  ), &v);.        
23f70 76 20 26 3d 20 28 4d 41 58 5f 52 4f 57 49 44 3e  v &= (MAX_ROWID>
23f80 3e 31 29 3b 20 76 2b 2b 3b 20 20 2f 2a 20 45 6e  >1); v++;  /* En
23f90 73 75 72 65 20 74 68 61 74 20 76 20 69 73 20 67  sure that v is g
23fa0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
23fb0 20 2a 2f 0a 20 20 20 20 20 20 7d 77 68 69 6c 65   */.      }while
23fc0 28 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65  (  ((rc = sqlite
23fd0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
23fe0 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43 75 72  cked(pC->uc.pCur
23ff0 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 76 2c 0a  sor, 0, (u64)v,.
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24030 20 30 2c 20 26 72 65 73 29 29 3d 3d 53 51 4c 49   0, &res))==SQLI
24040 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 20 20 20  TE_OK).         
24050 20 20 20 26 26 20 28 72 65 73 3d 3d 30 29 0a 20     && (res==0). 
24060 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 2b             && (+
24070 2b 63 6e 74 3c 31 30 30 29 29 3b 0a 20 20 20 20  +cnt<100));.    
24080 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
24090 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
240a0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  or;.      if( re
240b0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
240c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
240d0 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38  ;   /* IMP: R-38
240e0 32 31 39 2d 35 33 30 30 32 20 2a 2f 0a 20 20 20  219-53002 */.   
240f0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
24100 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
24110 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
24120 72 74 28 20 76 3e 30 20 29 3b 20 20 2f 2a 20 45  rt( v>0 );  /* E
24130 56 3a 20 52 2d 34 30 38 31 32 2d 30 33 35 37 30  V: R-40812-03570
24140 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 43   */.    }.    pC
24150 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
24160 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61   = 0;.    pC->ca
24170 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
24180 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 70  E_STALE;.  }.  p
24190 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20  Out->u.i = v;.  
241a0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
241b0 6f 64 65 3a 20 49 6e 73 65 72 74 20 50 31 20 50  ode: Insert P1 P
241c0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
241d0 6e 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72  nopsis: intkey=r
241e0 5b 50 33 5d 20 64 61 74 61 3d 72 5b 50 32 5d 0a  [P3] data=r[P2].
241f0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  **.** Write an e
24200 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 74 61  ntry into the ta
24210 62 6c 65 20 6f 66 20 63 75 72 73 6f 72 20 50 31  ble of cursor P1
24220 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
24230 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 66 20  s.** created if 
24240 69 74 20 64 6f 65 73 6e 27 74 20 61 6c 72 65 61  it doesn't alrea
24250 64 79 20 65 78 69 73 74 20 6f 72 20 74 68 65 20  dy exist or the 
24260 64 61 74 61 20 66 6f 72 20 61 6e 20 65 78 69 73  data for an exis
24270 74 69 6e 67 0a 2a 2a 20 65 6e 74 72 79 20 69 73  ting.** entry is
24280 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 54   overwritten.  T
24290 68 65 20 64 61 74 61 20 69 73 20 74 68 65 20 76  he data is the v
242a0 61 6c 75 65 20 4d 45 4d 5f 42 6c 6f 62 20 73 74  alue MEM_Blob st
242b0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
242c0 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 32 2e 20 54  .** number P2. T
242d0 68 65 20 6b 65 79 20 69 73 20 73 74 6f 72 65 64  he key is stored
242e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
242f0 20 54 68 65 20 6b 65 79 20 6d 75 73 74 0a 2a 2a   The key must.**
24300 20 62 65 20 61 20 4d 45 4d 5f 49 6e 74 2e 0a 2a   be a MEM_Int..*
24310 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
24320 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20  AG_NCHANGE flag 
24330 6f 66 20 50 35 20 69 73 20 73 65 74 2c 20 74 68  of P5 is set, th
24340 65 6e 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67  en the row chang
24350 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a 20 69 6e  e count is.** in
24360 63 72 65 6d 65 6e 74 65 64 20 28 6f 74 68 65 72  cremented (other
24370 77 69 73 65 20 6e 6f 74 29 2e 20 20 49 66 20 74  wise not).  If t
24380 68 65 20 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f  he OPFLAG_LASTRO
24390 57 49 44 20 66 6c 61 67 20 6f 66 20 50 35 20 69  WID flag of P5 i
243a0 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 6e 20 72  s set,.** then r
243b0 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 66  owid is stored f
243c0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20 72 65  or subsequent re
243d0 74 75 72 6e 20 62 79 20 74 68 65 0a 2a 2a 20 73  turn by the.** s
243e0 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
243f0 72 74 5f 72 6f 77 69 64 28 29 20 66 75 6e 63 74  rt_rowid() funct
24400 69 6f 6e 20 28 6f 74 68 65 72 77 69 73 65 20 69  ion (otherwise i
24410 74 20 69 73 20 75 6e 6d 6f 64 69 66 69 65 64 29  t is unmodified)
24420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
24430 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
24440 55 4c 54 20 66 6c 61 67 20 6f 66 20 50 35 20 69  ULT flag of P5 i
24450 73 20 73 65 74 2c 20 74 68 65 20 69 6d 70 6c 65  s set, the imple
24460 6d 65 6e 74 61 74 69 6f 6e 20 6d 69 67 68 74 0a  mentation might.
24470 2a 2a 20 72 75 6e 20 66 61 73 74 65 72 20 62 79  ** run faster by
24480 20 61 76 6f 69 64 69 6e 67 20 61 6e 20 75 6e 6e   avoiding an unn
24490 65 63 65 73 73 61 72 79 20 73 65 65 6b 20 6f 6e  ecessary seek on
244a0 20 63 75 72 73 6f 72 20 50 31 2e 20 20 48 6f 77   cursor P1.  How
244b0 65 76 65 72 2c 0a 2a 2a 20 74 68 65 20 4f 50 46  ever,.** the OPF
244c0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
244d0 54 20 66 6c 61 67 20 6d 75 73 74 20 6f 6e 6c 79  T flag must only
244e0 20 62 65 20 73 65 74 20 69 66 20 74 68 65 72 65   be set if there
244f0 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 70 72   have been no pr
24500 69 6f 72 0a 2a 2a 20 73 65 65 6b 73 20 6f 6e 20  ior.** seeks on 
24510 74 68 65 20 63 75 72 73 6f 72 20 6f 72 20 69 66  the cursor or if
24520 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
24530 20 73 65 65 6b 20 75 73 65 64 20 61 20 6b 65 79   seek used a key
24540 20 65 71 75 61 6c 20 74 6f 20 50 33 2e 0a 2a 2a   equal to P3..**
24550 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
24560 47 5f 49 53 55 50 44 41 54 45 20 66 6c 61 67 20  G_ISUPDATE flag 
24570 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  is set, then thi
24580 73 20 6f 70 63 6f 64 65 20 69 73 20 70 61 72 74  s opcode is part
24590 20 6f 66 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45   of an.** UPDATE
245a0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f 74 68   operation.  Oth
245b0 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 66  erwise (if the f
245c0 6c 61 67 20 69 73 20 63 6c 65 61 72 29 20 74 68  lag is clear) th
245d0 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 0a 2a  en this opcode.*
245e0 2a 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  * is part of an 
245f0 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
24600 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
24610 65 20 69 73 20 6f 6e 6c 79 20 69 6d 70 6f 72 74  e is only import
24620 61 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 75 70  ant to.** the up
24630 64 61 74 65 20 68 6f 6f 6b 2e 0a 2a 2a 0a 2a 2a  date hook..**.**
24640 20 50 61 72 61 6d 65 74 65 72 20 50 34 20 6d 61   Parameter P4 ma
24650 79 20 70 6f 69 6e 74 20 74 6f 20 61 20 54 61 62  y point to a Tab
24660 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 6f 72  le structure, or
24670 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66   may be NULL. If
24680 20 69 74 20 69 73 20 0a 2a 2a 20 6e 6f 74 20 4e   it is .** not N
24690 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 75 70  ULL, then the up
246a0 64 61 74 65 2d 68 6f 6f 6b 20 28 73 71 6c 69 74  date-hook (sqlit
246b0 65 33 2e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  e3.xUpdateCallba
246c0 63 6b 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 0a  ck) is invoked .
246d0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 73  ** following a s
246e0 75 63 63 65 73 73 66 75 6c 20 69 6e 73 65 72 74  uccessful insert
246f0 2e 0a 2a 2a 0a 2a 2a 20 28 57 41 52 4e 49 4e 47  ..**.** (WARNING
24700 2f 54 4f 44 4f 3a 20 49 66 20 50 31 20 69 73 20  /TODO: If P1 is 
24710 61 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 20  a pseudo-cursor 
24720 61 6e 64 20 50 32 20 69 73 20 64 79 6e 61 6d 69  and P2 is dynami
24730 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
24740 65 64 2c 20 74 68 65 6e 20 6f 77 6e 65 72 73 68  ed, then ownersh
24750 69 70 20 6f 66 20 50 32 20 69 73 20 74 72 61 6e  ip of P2 is tran
24760 73 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 70  sferred to the p
24770 73 65 75 64 6f 2d 63 75 72 73 6f 72 0a 2a 2a 20  seudo-cursor.** 
24780 61 6e 64 20 72 65 67 69 73 74 65 72 20 50 32 20  and register P2 
24790 62 65 63 6f 6d 65 73 20 65 70 68 65 6d 65 72 61  becomes ephemera
247a0 6c 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  l.  If the curso
247b0 72 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  r is changed, th
247c0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 72 65  e.** value of re
247d0 67 69 73 74 65 72 20 50 32 20 77 69 6c 6c 20 74  gister P2 will t
247e0 68 65 6e 20 63 68 61 6e 67 65 2e 20 20 4d 61 6b  hen change.  Mak
247f0 65 20 73 75 72 65 20 74 68 69 73 20 64 6f 65 73  e sure this does
24800 20 6e 6f 74 0a 2a 2a 20 63 61 75 73 65 20 61 6e   not.** cause an
24810 79 20 70 72 6f 62 6c 65 6d 73 2e 29 0a 2a 2a 0a  y problems.).**.
24820 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
24830 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  ion only works o
24840 6e 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 65  n tables.  The e
24850 71 75 69 76 61 6c 65 6e 74 20 69 6e 73 74 72 75  quivalent instru
24860 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 69 6e 64  ction.** for ind
24870 69 63 65 73 20 69 73 20 4f 50 5f 49 64 78 49 6e  ices is OP_IdxIn
24880 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  sert..*/./* Opco
24890 64 65 3a 20 49 6e 73 65 72 74 49 6e 74 20 50 31  de: InsertInt P1
248a0 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
248b0 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79  Synopsis: intkey
248c0 3d 50 33 20 64 61 74 61 3d 72 5b 50 32 5d 0a 2a  =P3 data=r[P2].*
248d0 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
248e0 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 4f 50 5f  exactly like OP_
248f0 49 6e 73 65 72 74 20 65 78 63 65 70 74 20 74 68  Insert except th
24900 61 74 20 74 68 65 20 6b 65 79 20 69 73 20 74 68  at the key is th
24910 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c  e.** integer val
24920 75 65 20 50 33 2c 20 6e 6f 74 20 74 68 65 20 76  ue P3, not the v
24930 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
24940 67 65 72 20 73 74 6f 72 65 64 20 69 6e 20 72 65  ger stored in re
24950 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63 61  gister P3..*/.ca
24960 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a 20 0a 63  se OP_Insert: .c
24970 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  ase OP_InsertInt
24980 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61  : {.  Mem *pData
24990 3b 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63  ;       /* MEM c
249a0 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ell holding data
249b0 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
249c0 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a  to be inserted *
249d0 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65 79 3b 20 20  /.  Mem *pKey;  
249e0 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65 6c        /* MEM cel
249f0 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20 20 66  l holding key  f
24a00 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  or the record */
24a10 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
24a20 43 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74  C;   /* Cursor t
24a30 6f 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  o table into whi
24a40 63 68 20 69 6e 73 65 72 74 20 69 73 20 77 72 69  ch insert is wri
24a50 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65  tten */.  int se
24a60 65 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a 20 52  ekResult;   /* R
24a70 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 73  esult of prior s
24a80 65 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f 20 55  eek or 0 if no U
24a90 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61  SESEEKRESULT fla
24aa0 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
24ab0 72 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61 74 61  r *zDb;  /* data
24ac0 62 61 73 65 20 6e 61 6d 65 20 2d 20 75 73 65 64  base name - used
24ad0 20 62 79 20 74 68 65 20 75 70 64 61 74 65 20 68   by the update h
24ae0 6f 6f 6b 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ook */.  Table *
24af0 70 54 61 62 3b 20 20 20 20 20 20 2f 2a 20 54 61  pTab;      /* Ta
24b00 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 2d 20  ble structure - 
24b10 75 73 65 64 20 62 79 20 75 70 64 61 74 65 20 61  used by update a
24b20 6e 64 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  nd pre-update ho
24b30 6f 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  oks */.  int op;
24b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
24b50 63 6f 64 65 20 66 6f 72 20 75 70 64 61 74 65 20  code for update 
24b60 68 6f 6f 6b 3a 20 53 51 4c 49 54 45 5f 55 50 44  hook: SQLITE_UPD
24b70 41 54 45 20 6f 72 20 53 51 4c 49 54 45 5f 49 4e  ATE or SQLITE_IN
24b80 53 45 52 54 20 2a 2f 0a 20 20 42 74 72 65 65 50  SERT */.  BtreeP
24b90 61 79 6c 6f 61 64 20 78 3b 20 20 20 2f 2a 20 50  ayload x;   /* P
24ba0 61 79 6c 6f 61 64 20 74 6f 20 62 65 20 69 6e 73  ayload to be ins
24bb0 65 72 74 65 64 20 2a 2f 0a 0a 20 20 6f 70 20 3d  erted */..  op =
24bc0 20 30 3b 0a 20 20 70 44 61 74 61 20 3d 20 26 61   0;.  pData = &a
24bd0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
24be0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
24bf0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
24c00 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
24c10 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
24c20 28 70 44 61 74 61 29 20 29 3b 0a 20 20 70 43 20  (pData) );.  pC 
24c30 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
24c40 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
24c50 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
24c60 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
24c70 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
24c80 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75  .  assert( pC->u
24c90 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
24ca0 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 2d 3e    assert( (pOp->
24cb0 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f  p5 & OPFLAG_ISNO
24cc0 4f 50 29 20 7c 7c 20 70 43 2d 3e 69 73 54 61 62  OP) || pC->isTab
24cd0 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
24ce0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
24cf0 54 41 42 4c 45 20 7c 7c 20 70 4f 70 2d 3e 70 34  TABLE || pOp->p4
24d00 74 79 70 65 3e 3d 50 34 5f 53 54 41 54 49 43 20  type>=P4_STATIC 
24d10 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
24d20 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 44 61  ACE(pOp->p2, pDa
24d30 74 61 29 3b 0a 0a 20 20 69 66 28 20 70 4f 70 2d  ta);..  if( pOp-
24d40 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65  >opcode==OP_Inse
24d50 72 74 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  rt ){.    pKey =
24d60 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
24d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65  .    assert( pKe
24d80 79 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  y->flags & MEM_I
24d90 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nt );.    assert
24da0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4b 65  ( memIsValid(pKe
24db0 79 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54  y) );.    REGIST
24dc0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
24dd0 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 78 2e 6e  , pKey);.    x.n
24de0 4b 65 79 20 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b  Key = pKey->u.i;
24df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
24e00 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
24e10 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 49 6e 74 20  e==OP_InsertInt 
24e20 29 3b 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d 20  );.    x.nKey = 
24e30 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 0a 20 20  pOp->p3;.  }..  
24e40 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
24e50 3d 50 34 5f 54 41 42 4c 45 20 26 26 20 48 41 53  =P4_TABLE && HAS
24e60 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 28 64 62 29  _UPDATE_HOOK(db)
24e70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24e80 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20  pC->iDb>=0 );.  
24e90 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
24ea0 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  pC->iDb].zDbSNam
24eb0 65 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4f  e;.    pTab = pO
24ec0 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20 20 20 20  p->p4.pTab;.    
24ed0 61 73 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35  assert( (pOp->p5
24ee0 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50   & OPFLAG_ISNOOP
24ef0 29 20 7c 7c 20 48 61 73 52 6f 77 69 64 28 70 54  ) || HasRowid(pT
24f00 61 62 29 20 29 3b 0a 20 20 20 20 6f 70 20 3d 20  ab) );.    op = 
24f10 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ((pOp->p5 & OPFL
24f20 41 47 5f 49 53 55 50 44 41 54 45 29 20 3f 20 53  AG_ISUPDATE) ? S
24f30 51 4c 49 54 45 5f 55 50 44 41 54 45 20 3a 20 53  QLITE_UPDATE : S
24f40 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3b 0a 20  QLITE_INSERT);. 
24f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
24f60 20 3d 20 30 3b 20 2f 2a 20 4e 6f 74 20 6e 65 65   = 0; /* Not nee
24f70 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20  ded.  Silence a 
24f80 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
24f90 2e 20 2a 2f 0a 20 20 20 20 7a 44 62 20 3d 20 30  . */.    zDb = 0
24fa0 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
24fb0 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d  .  Silence a com
24fc0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a  piler warning. *
24fd0 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  /.  }..#ifdef SQ
24fe0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
24ff0 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20  PDATE_HOOK.  /* 
25000 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75  Invoke the pre-u
25010 70 64 61 74 65 20 68 6f 6f 6b 2c 20 69 66 20 61  pdate hook, if a
25020 6e 79 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ny */.  if( db->
25030 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
25040 63 6b 20 0a 20 20 20 26 26 20 70 4f 70 2d 3e 70  ck .   && pOp->p
25050 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 0a  4type==P4_TABLE.
25060 20 20 20 26 26 20 21 28 70 4f 70 2d 3e 70 35 20     && !(pOp->p5 
25070 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  & OPFLAG_ISUPDAT
25080 45 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  E).  ){.    sqli
25090 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
250a0 48 6f 6f 6b 28 70 2c 20 70 43 2c 20 53 51 4c 49  Hook(p, pC, SQLI
250b0 54 45 5f 49 4e 53 45 52 54 2c 20 7a 44 62 2c 20  TE_INSERT, zDb, 
250c0 70 54 61 62 2c 20 78 2e 6e 4b 65 79 2c 20 70 4f  pTab, x.nKey, pO
250d0 70 2d 3e 70 32 29 3b 0a 20 20 7d 0a 20 20 69 66  p->p2);.  }.  if
250e0 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ( pOp->p5 & OPFL
250f0 41 47 5f 49 53 4e 4f 4f 50 20 29 20 62 72 65 61  AG_ISNOOP ) brea
25100 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  k;.#endif..  if(
25110 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
25120 47 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e  G_NCHANGE ) p->n
25130 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20  Change++;.  if( 
25140 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
25150 5f 4c 41 53 54 52 4f 57 49 44 20 29 20 64 62 2d  _LASTROWID ) db-
25160 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 78 2e 6e  >lastRowid = x.n
25170 4b 65 79 3b 0a 20 20 69 66 28 20 70 44 61 74 61  Key;.  if( pData
25180 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
25190 6c 6c 20 29 7b 0a 20 20 20 20 78 2e 70 44 61 74  ll ){.    x.pDat
251a0 61 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6e 44 61  a = 0;.    x.nDa
251b0 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
251c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 61  .    assert( pDa
251d0 74 61 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  ta->flags & (MEM
251e0 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29  _Blob|MEM_Str) )
251f0 3b 0a 20 20 20 20 78 2e 70 44 61 74 61 20 3d 20  ;.    x.pData = 
25200 70 44 61 74 61 2d 3e 7a 3b 0a 20 20 20 20 78 2e  pData->z;.    x.
25210 6e 44 61 74 61 20 3d 20 70 44 61 74 61 2d 3e 6e  nData = pData->n
25220 3b 0a 20 20 7d 0a 20 20 73 65 65 6b 52 65 73 75  ;.  }.  seekResu
25230 6c 74 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26  lt = ((pOp->p5 &
25240 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
25250 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65  ESULT) ? pC->see
25260 6b 52 65 73 75 6c 74 20 3a 20 30 29 3b 0a 20 20  kResult : 0);.  
25270 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73  if( pData->flags
25280 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
25290 20 20 20 78 2e 6e 5a 65 72 6f 20 3d 20 70 44 61     x.nZero = pDa
252a0 74 61 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  ta->u.nZero;.  }
252b0 65 6c 73 65 7b 0a 20 20 20 20 78 2e 6e 5a 65 72  else{.    x.nZer
252c0 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 78 2e 70  o = 0;.  }.  x.p
252d0 4b 65 79 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  Key = 0;.  rc = 
252e0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
252f0 72 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  rt(pC->uc.pCurso
25300 72 2c 20 26 78 2c 0a 20 20 20 20 20 20 28 70 4f  r, &x,.      (pO
25310 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47 5f  p->p5 & (OPFLAG_
25320 41 50 50 45 4e 44 7c 4f 50 46 4c 41 47 5f 53 41  APPEND|OPFLAG_SA
25330 56 45 50 4f 53 49 54 49 4f 4e 29 29 2c 20 73 65  VEPOSITION)), se
25340 65 6b 52 65 73 75 6c 74 0a 20 20 29 3b 0a 20 20  ekResult.  );.  
25350 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
25360 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61  to = 0;.  pC->ca
25370 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
25380 45 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49  E_STALE;..  /* I
25390 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65  nvoke the update
253a0 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65  -hook if require
253b0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29  d. */.  if( rc )
253c0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
253d0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  to_error;.  if( 
253e0 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
253f0 61 63 6b 20 26 26 20 6f 70 20 29 7b 0a 20 20 20  ack && op ){.   
25400 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
25410 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65  back(db->pUpdate
25420 41 72 67 2c 20 6f 70 2c 20 7a 44 62 2c 20 70 54  Arg, op, zDb, pT
25430 61 62 2d 3e 7a 4e 61 6d 65 2c 20 78 2e 6e 4b 65  ab->zName, x.nKe
25440 79 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  y);.  }.  break;
25450 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
25460 65 6c 65 74 65 20 50 31 20 50 32 20 50 33 20 50  elete P1 P2 P3 P
25470 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  4 P5.**.** Delet
25480 65 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 20  e the record at 
25490 77 68 69 63 68 20 74 68 65 20 50 31 20 63 75 72  which the P1 cur
254a0 73 6f 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  sor is currently
254b0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
254c0 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 53   If the OPFLAG_S
254d0 41 56 45 50 4f 53 49 54 49 4f 4e 20 62 69 74 20  AVEPOSITION bit 
254e0 6f 66 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  of the P5 parame
254f0 74 65 72 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ter is set, then
25500 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77  .** the cursor w
25510 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
25520 74 69 6e 67 20 61 74 20 20 65 69 74 68 65 72 20  ting at  either 
25530 74 68 65 20 6e 65 78 74 20 6f 72 20 74 68 65 20  the next or the 
25540 70 72 65 76 69 6f 75 73 0a 2a 2a 20 72 65 63 6f  previous.** reco
25550 72 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  rd in the table.
25560 20 49 66 20 69 74 20 69 73 20 6c 65 66 74 20 70   If it is left p
25570 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6e  ointing at the n
25580 65 78 74 20 72 65 63 6f 72 64 2c 20 74 68 65 6e  ext record, then
25590 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 4e 65 78  .** the next Nex
255a0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  t instruction wi
255b0 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 41  ll be a no-op. A
255c0 73 20 61 20 72 65 73 75 6c 74 2c 20 69 6e 20 74  s a result, in t
255d0 68 69 73 20 63 61 73 65 0a 2a 2a 20 69 74 20 69  his case.** it i
255e0 73 20 6f 6b 20 74 6f 20 64 65 6c 65 74 65 20 61  s ok to delete a
255f0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 77 69 74   record from wit
25600 68 69 6e 20 61 20 4e 65 78 74 20 6c 6f 6f 70 2e  hin a Next loop.
25610 20 49 66 20 0a 2a 2a 20 4f 50 46 4c 41 47 5f 53   If .** OPFLAG_S
25620 41 56 45 50 4f 53 49 54 49 4f 4e 20 62 69 74 20  AVEPOSITION bit 
25630 6f 66 20 50 35 20 69 73 20 63 6c 65 61 72 2c 20  of P5 is clear, 
25640 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
25650 77 69 6c 6c 20 62 65 0a 2a 2a 20 6c 65 66 74 20  will be.** left 
25660 69 6e 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 20  in an undefined 
25670 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
25680 74 68 65 20 4f 50 46 4c 41 47 5f 41 55 58 44 45  the OPFLAG_AUXDE
25690 4c 45 54 45 20 62 69 74 20 69 73 20 73 65 74 20  LETE bit is set 
256a0 6f 6e 20 50 35 2c 20 74 68 61 74 20 69 6e 64 69  on P5, that indi
256b0 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73 0a  cates that this.
256c0 2a 2a 20 64 65 6c 65 74 65 20 6f 6e 65 20 6f 66  ** delete one of
256d0 20 73 65 76 65 72 61 6c 20 61 73 73 6f 63 69 61   several associa
256e0 74 65 64 20 77 69 74 68 20 64 65 6c 65 74 69 6e  ted with deletin
256f0 67 20 61 20 74 61 62 6c 65 20 72 6f 77 20 61 6e  g a table row an
25700 64 20 61 6c 6c 20 69 74 73 0a 2a 2a 20 61 73 73  d all its.** ass
25710 6f 63 69 61 74 65 64 20 69 6e 64 65 78 20 65 6e  ociated index en
25720 74 72 69 65 73 2e 20 20 45 78 61 63 74 6c 79 20  tries.  Exactly 
25730 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c  one of those del
25740 65 74 65 73 20 69 73 20 74 68 65 20 22 70 72 69  etes is the "pri
25750 6d 61 72 79 22 0a 2a 2a 20 64 65 6c 65 74 65 2e  mary".** delete.
25760 20 20 54 68 65 20 6f 74 68 65 72 73 20 61 72 65    The others are
25770 20 61 6c 6c 20 6f 6e 20 4f 50 46 4c 41 47 5f 46   all on OPFLAG_F
25780 4f 52 44 45 4c 45 54 45 20 63 75 72 73 6f 72 73  ORDELETE cursors
25790 20 6f 72 20 65 6c 73 65 20 61 72 65 0a 2a 2a 20   or else are.** 
257a0 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20  marked with the 
257b0 41 55 58 44 45 4c 45 54 45 20 66 6c 61 67 2e 0a  AUXDELETE flag..
257c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
257d0 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67  LAG_NCHANGE flag
257e0 20 6f 66 20 50 32 20 28 4e 42 3a 20 50 32 20 6e   of P2 (NB: P2 n
257f0 6f 74 20 50 35 29 20 69 73 20 73 65 74 2c 20 74  ot P5) is set, t
25800 68 65 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 63  hen the row.** c
25810 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 20 69  hange count is i
25820 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f 74 68 65  ncremented (othe
25830 72 77 69 73 65 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a  rwise not)..**.*
25840 2a 20 50 31 20 6d 75 73 74 20 6e 6f 74 20 62 65  * P1 must not be
25850 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20   pseudo-table.  
25860 49 74 20 68 61 73 20 74 6f 20 62 65 20 61 20 72  It has to be a r
25870 65 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 2a  eal table with.*
25880 2a 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e  * multiple rows.
25890 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20  .**.** If P4 is 
258a0 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
258b0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 54 61 62   points to a Tab
258c0 6c 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 74 68  le object. In th
258d0 69 73 20 63 61 73 65 20 65 69 74 68 65 72 20 0a  is case either .
258e0 2a 2a 20 74 68 65 20 75 70 64 61 74 65 20 6f 72  ** the update or
258f0 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
25900 2c 20 6f 72 20 62 6f 74 68 2c 20 6d 61 79 20 62  , or both, may b
25910 65 20 69 6e 76 6f 6b 65 64 2e 20 54 68 65 20 50  e invoked. The P
25920 31 20 63 75 72 73 6f 72 20 6d 75 73 74 0a 2a 2a  1 cursor must.**
25930 20 68 61 76 65 20 62 65 65 6e 20 70 6f 73 69 74   have been posit
25940 69 6f 6e 65 64 20 75 73 69 6e 67 20 4f 50 5f 4e  ioned using OP_N
25950 6f 74 46 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f  otFound prior to
25960 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f   invoking this o
25970 70 63 6f 64 65 20 69 6e 20 0a 2a 2a 20 74 68 69  pcode in .** thi
25980 73 20 63 61 73 65 2e 20 53 70 65 63 69 66 69 63  s case. Specific
25990 61 6c 6c 79 2c 20 69 66 20 6f 6e 65 20 69 73 20  ally, if one is 
259a0 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 65 20  configured, the 
259b0 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
259c0 69 73 20 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 69  is .** invoked i
259d0 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f P4 is not NULL
259e0 2e 20 54 68 65 20 75 70 64 61 74 65 2d 68 6f 6f  . The update-hoo
259f0 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
25a00 6f 6e 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  one is configure
25a10 64 2c 20 0a 2a 2a 20 50 34 20 69 73 20 6e 6f 74  d, .** P4 is not
25a20 20 4e 55 4c 4c 2c 20 61 6e 64 20 74 68 65 20 4f   NULL, and the O
25a30 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c  PFLAG_NCHANGE fl
25a40 61 67 20 69 73 20 73 65 74 20 69 6e 20 50 32 2e  ag is set in P2.
25a50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
25a60 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66 6c  FLAG_ISUPDATE fl
25a70 61 67 20 69 73 20 73 65 74 20 69 6e 20 50 32 2c  ag is set in P2,
25a80 20 74 68 65 6e 20 50 33 20 63 6f 6e 74 61 69 6e   then P3 contain
25a90 73 20 74 68 65 20 61 64 64 72 65 73 73 0a 2a 2a  s the address.**
25aa0 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
25ab0 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ell that contain
25ac0 73 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  s the value that
25ad0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
25ae0 65 20 72 6f 77 20 77 69 6c 6c 0a 2a 2a 20 62 65  e row will.** be
25af0 20 73 65 74 20 74 6f 20 62 79 20 74 68 65 20 75   set to by the u
25b00 70 64 61 74 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pdate..*/.case O
25b10 50 5f 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64  P_Delete: {.  Vd
25b20 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
25b30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
25b40 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
25b50 20 20 69 6e 74 20 6f 70 66 6c 61 67 73 3b 0a 0a    int opflags;..
25b60 20 20 6f 70 66 6c 61 67 73 20 3d 20 70 4f 70 2d    opflags = pOp-
25b70 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p2;.  assert( p
25b80 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
25b90 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
25ba0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
25bb0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
25bc0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
25bd0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
25be0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
25bf0 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
25c00 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
25c10 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
25c20 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
25c30 76 65 74 6f 3d 3d 30 20 29 3b 0a 0a 23 69 66 64  veto==0 );..#ifd
25c40 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
25c50 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
25c60 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26 26 20 48  e==P4_TABLE && H
25c70 61 73 52 6f 77 69 64 28 70 4f 70 2d 3e 70 34 2e  asRowid(pOp->p4.
25c80 70 54 61 62 29 20 26 26 20 70 4f 70 2d 3e 70 35  pTab) && pOp->p5
25c90 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
25ca0 20 70 35 20 69 73 20 7a 65 72 6f 2c 20 74 68 65   p5 is zero, the
25cb0 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
25cc0 74 68 61 74 20 70 6f 73 69 74 69 6f 6e 65 64 20  that positioned 
25cd0 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
25ce0 20 74 6f 0a 20 20 20 20 2a 2a 20 4f 50 5f 44 65   to.    ** OP_De
25cf0 6c 65 74 65 20 77 69 6c 6c 20 68 61 76 65 20 61  lete will have a
25d00 6c 73 6f 20 73 65 74 20 74 68 65 20 70 43 2d 3e  lso set the pC->
25d10 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 66 69 65  movetoTarget fie
25d20 6c 64 20 74 6f 20 74 68 65 20 72 6f 77 69 64 20  ld to the rowid 
25d30 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 6f  of.    ** the ro
25d40 77 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  w that is being 
25d50 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 20 20 69  deleted */.    i
25d60 36 34 20 69 4b 65 79 20 3d 20 73 71 6c 69 74 65  64 iKey = sqlite
25d70 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79  3BtreeIntegerKey
25d80 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  (pC->uc.pCursor)
25d90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
25da0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3d 3d  ->movetoTarget==
25db0 69 4b 65 79 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  iKey );.  }.#end
25dc0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
25dd0 75 70 64 61 74 65 2d 68 6f 6f 6b 20 6f 72 20 70  update-hook or p
25de0 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 20 77  re-update-hook w
25df0 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20  ill be invoked, 
25e00 73 65 74 20 7a 44 62 20 74 6f 0a 20 20 2a 2a 20  set zDb to.  ** 
25e10 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
25e20 64 62 20 74 6f 20 70 61 73 73 20 61 73 20 74 6f  db to pass as to
25e30 20 69 74 2e 20 41 6c 73 6f 20 73 65 74 20 6c 6f   it. Also set lo
25e40 63 61 6c 20 70 54 61 62 20 74 6f 20 61 20 63 6f  cal pTab to a co
25e50 70 79 0a 20 20 2a 2a 20 6f 66 20 70 34 2e 70 54  py.  ** of p4.pT
25e60 61 62 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  ab. Finally, if 
25e70 70 35 20 69 73 20 74 72 75 65 2c 20 69 6e 64 69  p5 is true, indi
25e80 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 69 73  cating that this
25e90 20 63 75 72 73 6f 72 20 77 61 73 0a 20 20 2a 2a   cursor was.  **
25ea0 20 6c 61 73 74 20 6d 6f 76 65 64 20 77 69 74 68   last moved with
25eb0 20 4f 50 5f 4e 65 78 74 20 6f 72 20 4f 50 5f 50   OP_Next or OP_P
25ec0 72 65 76 2c 20 6e 6f 74 20 53 65 65 6b 20 6f 72  rev, not Seek or
25ed0 20 4e 6f 74 46 6f 75 6e 64 2c 20 73 65 74 20 0a   NotFound, set .
25ee0 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2e    ** VdbeCursor.
25ef0 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 74 6f 20  movetoTarget to 
25f00 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69  the current rowi
25f10 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70  d.  */.  if( pOp
25f20 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42  ->p4type==P4_TAB
25f30 4c 45 20 26 26 20 48 41 53 5f 55 50 44 41 54 45  LE && HAS_UPDATE
25f40 5f 48 4f 4f 4b 28 64 62 29 20 29 7b 0a 20 20 20  _HOOK(db) ){.   
25f50 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44 62   assert( pC->iDb
25f60 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >=0 );.    asser
25f70 74 28 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 21  t( pOp->p4.pTab!
25f80 3d 30 20 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20  =0 );.    zDb = 
25f90 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d  db->aDb[pC->iDb]
25fa0 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 70  .zDbSName;.    p
25fb0 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 54  Tab = pOp->p4.pT
25fc0 61 62 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70  ab;.    if( (pOp
25fd0 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 53 41  ->p5 & OPFLAG_SA
25fe0 56 45 50 4f 53 49 54 49 4f 4e 29 21 3d 30 20 26  VEPOSITION)!=0 &
25ff0 26 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b  & pC->isTable ){
26000 0a 20 20 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74  .      pC->movet
26010 6f 54 61 72 67 65 74 20 3d 20 73 71 6c 69 74 65  oTarget = sqlite
26020 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79  3BtreeIntegerKey
26030 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  (pC->uc.pCursor)
26040 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
26050 0a 20 20 20 20 7a 44 62 20 3d 20 30 3b 20 20 20  .    zDb = 0;   
26060 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
26070 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c  Silence a compil
26080 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20  er warning. */. 
26090 20 20 20 70 54 61 62 20 3d 20 30 3b 20 20 2f 2a     pTab = 0;  /*
260a0 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 69   Not needed.  Si
260b0 6c 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65 72  lence a compiler
260c0 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 7d   warning. */.  }
260d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
260e0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
260f0 5f 48 4f 4f 4b 0a 20 20 2f 2a 20 49 6e 76 6f 6b  _HOOK.  /* Invok
26100 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  e the pre-update
26110 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65  -hook if require
26120 64 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  d. */.  if( db->
26130 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
26140 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e 70 54  ck && pOp->p4.pT
26150 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
26160 28 20 21 28 6f 70 66 6c 61 67 73 20 26 20 4f 50  ( !(opflags & OP
26170 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 0a  FLAG_ISUPDATE) .
26180 20 20 20 20 20 20 20 20 20 7c 7c 20 48 61 73 52           || HasR
26190 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20 0a 20  owid(pTab)==0 . 
261a0 20 20 20 20 20 20 20 20 7c 7c 20 28 61 4d 65 6d          || (aMem
261b0 5b 70 4f 70 2d 3e 70 33 5d 2e 66 6c 61 67 73 20  [pOp->p3].flags 
261c0 26 20 4d 45 4d 5f 49 6e 74 29 20 0a 20 20 20 20  & MEM_Int) .    
261d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
261e0 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28  bePreUpdateHook(
261f0 70 2c 20 70 43 2c 0a 20 20 20 20 20 20 20 20 28  p, pC,.        (
26200 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  opflags & OPFLAG
26210 5f 49 53 55 50 44 41 54 45 29 20 3f 20 53 51 4c  _ISUPDATE) ? SQL
26220 49 54 45 5f 55 50 44 41 54 45 20 3a 20 53 51 4c  ITE_UPDATE : SQL
26230 49 54 45 5f 44 45 4c 45 54 45 2c 20 0a 20 20 20  ITE_DELETE, .   
26240 20 20 20 20 20 7a 44 62 2c 20 70 54 61 62 2c 20       zDb, pTab, 
26250 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
26260 2c 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ,.        pOp->p
26270 33 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69  3.    );.  }.  i
26280 66 28 20 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  f( opflags & OPF
26290 4c 41 47 5f 49 53 4e 4f 4f 50 20 29 20 62 72 65  LAG_ISNOOP ) bre
262a0 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 0a 20 20 2f  ak;.#endif. .  /
262b0 2a 20 4f 6e 6c 79 20 66 6c 61 67 73 20 74 68 61  * Only flags tha
262c0 74 20 63 61 6e 20 62 65 20 73 65 74 20 61 72 65  t can be set are
262d0 20 53 41 56 45 50 4f 49 53 54 49 4f 4e 20 61 6e   SAVEPOISTION an
262e0 64 20 41 55 58 44 45 4c 45 54 45 20 2a 2f 20 0a  d AUXDELETE */ .
262f0 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 2d 3e    assert( (pOp->
26300 70 35 20 26 20 7e 28 4f 50 46 4c 41 47 5f 53 41  p5 & ~(OPFLAG_SA
26310 56 45 50 4f 53 49 54 49 4f 4e 7c 4f 50 46 4c 41  VEPOSITION|OPFLA
26320 47 5f 41 55 58 44 45 4c 45 54 45 29 29 3d 3d 30  G_AUXDELETE))==0
26330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50   );.  assert( OP
26340 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
26350 4e 3d 3d 42 54 52 45 45 5f 53 41 56 45 50 4f 53  N==BTREE_SAVEPOS
26360 49 54 49 4f 4e 20 29 3b 0a 20 20 61 73 73 65 72  ITION );.  asser
26370 74 28 20 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c  t( OPFLAG_AUXDEL
26380 45 54 45 3d 3d 42 54 52 45 45 5f 41 55 58 44 45  ETE==BTREE_AUXDE
26390 4c 45 54 45 20 29 3b 0a 0a 23 69 66 64 65 66 20  LETE );..#ifdef 
263a0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
263b0 66 28 20 70 2d 3e 70 46 72 61 6d 65 3d 3d 30 20  f( p->pFrame==0 
263c0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69  ){.    if( pC->i
263d0 73 45 70 68 65 6d 65 72 61 6c 3d 3d 30 0a 20 20  sEphemeral==0.  
263e0 20 20 20 20 20 20 26 26 20 28 70 4f 70 2d 3e 70        && (pOp->p
263f0 35 20 26 20 4f 50 46 4c 41 47 5f 41 55 58 44 45  5 & OPFLAG_AUXDE
26400 4c 45 54 45 29 3d 3d 30 0a 20 20 20 20 20 20 20  LETE)==0.       
26410 20 26 26 20 28 70 43 2d 3e 77 72 46 6c 61 67 20   && (pC->wrFlag 
26420 26 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  & OPFLAG_FORDELE
26430 54 45 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a  TE)==0.      ){.
26440 20 20 20 20 20 20 6e 45 78 74 72 61 44 65 6c 65        nExtraDele
26450 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  te++;.    }.    
26460 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f 50  if( pOp->p2 & OP
26470 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 7b 0a  FLAG_NCHANGE ){.
26480 20 20 20 20 20 20 6e 45 78 74 72 61 44 65 6c 65        nExtraDele
26490 74 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  te--;.    }.  }.
264a0 23 65 6e 64 69 66 0a 0a 20 20 72 63 20 3d 20 73  #endif..  rc = s
264b0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
264c0 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  e(pC->uc.pCursor
264d0 2c 20 70 4f 70 2d 3e 70 35 29 3b 0a 20 20 70 43  , pOp->p5);.  pC
264e0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
264f0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70  CACHE_STALE;.  p
26500 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20  C->seekResult = 
26510 30 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  0;.  if( rc ) go
26520 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
26530 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 6e 76  error;..  /* Inv
26540 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d 68  oke the update-h
26550 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e  ook if required.
26560 20 2a 2f 0a 20 20 69 66 28 20 6f 70 66 6c 61 67   */.  if( opflag
26570 73 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  s & OPFLAG_NCHAN
26580 47 45 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68  GE ){.    p->nCh
26590 61 6e 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ange++;.    if( 
265a0 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
265b0 61 63 6b 20 26 26 20 48 61 73 52 6f 77 69 64 28  ack && HasRowid(
265c0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64  pTab) ){.      d
265d0 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
265e0 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72  ck(db->pUpdateAr
265f0 67 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  g, SQLITE_DELETE
26600 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61  , zDb, pTab->zNa
26610 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  me,.          pC
26620 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b  ->movetoTarget);
26630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26640 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20  C->iDb>=0 );.   
26650 20 7d 0a 20 20 7d 0a 0a 20 20 62 72 65 61 6b 3b   }.  }..  break;
26660 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  .}./* Opcode: Re
26670 73 65 74 43 6f 75 6e 74 20 2a 20 2a 20 2a 20 2a  setCount * * * *
26680 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c   *.**.** The val
26690 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
266a0 20 63 6f 75 6e 74 65 72 20 69 73 20 63 6f 70 69   counter is copi
266b0 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
266c0 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 63 68 61  se handle.** cha
266d0 6e 67 65 20 63 6f 75 6e 74 65 72 20 28 72 65 74  nge counter (ret
266e0 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
266f0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
26700 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 29 2e  ite3_changes()).
26710 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 56 4d 73  .** Then the VMs
26720 20 69 6e 74 65 72 6e 61 6c 20 63 68 61 6e 67 65   internal change
26730 20 63 6f 75 6e 74 65 72 20 72 65 73 65 74 73 20   counter resets 
26740 74 6f 20 30 2e 0a 2a 2a 20 54 68 69 73 20 69 73  to 0..** This is
26750 20 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72   used by trigger
26760 20 70 72 6f 67 72 61 6d 73 2e 0a 2a 2f 0a 63 61   programs..*/.ca
26770 73 65 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74  se OP_ResetCount
26780 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  : {.  sqlite3Vdb
26790 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
267a0 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 70  p->nChange);.  p
267b0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
267c0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
267d0 63 6f 64 65 3a 20 53 6f 72 74 65 72 43 6f 6d 70  code: SorterComp
267e0 61 72 65 20 50 31 20 50 32 20 50 33 20 50 34 0a  are P1 P2 P3 P4.
267f0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20  ** Synopsis: if 
26800 6b 65 79 28 50 31 29 21 3d 74 72 69 6d 28 72 5b  key(P1)!=trim(r[
26810 50 33 5d 2c 50 34 29 20 67 6f 74 6f 20 50 32 0a  P3],P4) goto P2.
26820 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 73 6f  **.** P1 is a so
26830 72 74 65 72 20 63 75 72 73 6f 72 2e 20 54 68 69  rter cursor. Thi
26840 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f  s instruction co
26850 6d 70 61 72 65 73 20 61 20 70 72 65 66 69 78 20  mpares a prefix 
26860 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  of the.** record
26870 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65   blob in registe
26880 72 20 50 33 20 61 67 61 69 6e 73 74 20 61 20 70  r P3 against a p
26890 72 65 66 69 78 20 6f 66 20 74 68 65 20 65 6e 74  refix of the ent
268a0 72 79 20 74 68 61 74 20 0a 2a 2a 20 74 68 65 20  ry that .** the 
268b0 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20 63 75  sorter cursor cu
268c0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
268d0 6f 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  o.  Only the fir
268e0 73 74 20 50 34 20 66 69 65 6c 64 73 0a 2a 2a 20  st P4 fields.** 
268f0 6f 66 20 72 5b 50 33 5d 20 61 6e 64 20 74 68 65  of r[P3] and the
26900 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 61   sorter record a
26910 72 65 20 63 6f 6d 70 61 72 65 64 2e 0a 2a 2a 0a  re compared..**.
26920 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 33 20  ** If either P3 
26930 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20 63 6f  or the sorter co
26940 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20 69 6e  ntains a NULL in
26950 20 6f 6e 65 20 6f 66 20 74 68 65 69 72 20 73 69   one of their si
26960 67 6e 69 66 69 63 61 6e 74 0a 2a 2a 20 66 69 65  gnificant.** fie
26970 6c 64 73 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  lds (not countin
26980 67 20 74 68 65 20 50 34 20 66 69 65 6c 64 73 20  g the P4 fields 
26990 61 74 20 74 68 65 20 65 6e 64 20 77 68 69 63 68  at the end which
269a0 20 61 72 65 20 69 67 6e 6f 72 65 64 29 20 74 68   are ignored) th
269b0 65 6e 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  en.** the compar
269c0 69 73 6f 6e 20 69 73 20 61 73 73 75 6d 65 64 20  ison is assumed 
269d0 74 6f 20 62 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a  to be equal..**.
269e0 2a 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  ** Fall through 
269f0 74 6f 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  to next instruct
26a00 69 6f 6e 20 69 66 20 74 68 65 20 74 77 6f 20 72  ion if the two r
26a10 65 63 6f 72 64 73 20 63 6f 6d 70 61 72 65 20 65  ecords compare e
26a20 71 75 61 6c 20 74 6f 0a 2a 2a 20 65 61 63 68 20  qual to.** each 
26a30 6f 74 68 65 72 2e 20 20 4a 75 6d 70 20 74 6f 20  other.  Jump to 
26a40 50 32 20 69 66 20 74 68 65 79 20 61 72 65 20 64  P2 if they are d
26a50 69 66 66 65 72 65 6e 74 2e 0a 2a 2f 0a 63 61 73  ifferent..*/.cas
26a60 65 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61  e OP_SorterCompa
26a70 72 65 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  re: {.  VdbeCurs
26a80 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65  or *pC;.  int re
26a90 73 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c  s;.  int nKeyCol
26aa0 3b 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  ;..  pC = p->apC
26ab0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
26ac0 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
26ad0 70 43 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pC) );.  assert(
26ae0 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
26af0 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 49 6e 33  _INT32 );.  pIn3
26b00 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
26b10 5d 3b 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70  ];.  nKeyCol = p
26b20 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 73 20  Op->p4.i;.  res 
26b30 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
26b40 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6f 6d  te3VdbeSorterCom
26b50 70 61 72 65 28 70 43 2c 20 70 49 6e 33 2c 20 6e  pare(pC, pIn3, n
26b60 4b 65 79 43 6f 6c 2c 20 26 72 65 73 29 3b 0a 20  KeyCol, &res);. 
26b70 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
26b80 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66  (res!=0,2);.  if
26b90 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
26ba0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
26bb0 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f    if( res ) goto
26bc0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62   jump_to_p2;.  b
26bd0 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f 2a 20 4f 70 63  reak;.};../* Opc
26be0 6f 64 65 3a 20 53 6f 72 74 65 72 44 61 74 61 20  ode: SorterData 
26bf0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
26c00 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
26c10 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  data.**.** Write
26c20 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
26c30 32 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 6f  2 the current so
26c40 72 74 65 72 20 64 61 74 61 20 66 6f 72 20 73 6f  rter data for so
26c50 72 74 65 72 20 63 75 72 73 6f 72 20 50 31 2e 0a  rter cursor P1..
26c60 2a 2a 20 54 68 65 6e 20 63 6c 65 61 72 20 74 68  ** Then clear th
26c70 65 20 63 6f 6c 75 6d 6e 20 68 65 61 64 65 72 20  e column header 
26c80 63 61 63 68 65 20 6f 6e 20 63 75 72 73 6f 72 20  cache on cursor 
26c90 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  P3..**.** This o
26ca0 70 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c  pcode is normall
26cb0 79 20 75 73 65 20 74 6f 20 6d 6f 76 65 20 61 20  y use to move a 
26cc0 72 65 63 6f 72 64 20 6f 75 74 20 6f 66 20 74 68  record out of th
26cd0 65 20 73 6f 72 74 65 72 20 61 6e 64 20 69 6e 74  e sorter and int
26ce0 6f 0a 2a 2a 20 61 20 72 65 67 69 73 74 65 72 20  o.** a register 
26cf0 74 68 61 74 20 69 73 20 74 68 65 20 73 6f 75 72  that is the sour
26d00 63 65 20 66 6f 72 20 61 20 70 73 65 75 64 6f 2d  ce for a pseudo-
26d10 74 61 62 6c 65 20 63 75 72 73 6f 72 20 63 72 65  table cursor cre
26d20 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 4f 70  ated using.** Op
26d30 65 6e 50 73 65 75 64 6f 2e 20 20 54 68 61 74 20  enPseudo.  That 
26d40 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72  pseudo-table cur
26d50 73 6f 72 20 69 73 20 74 68 65 20 6f 6e 65 20 74  sor is the one t
26d60 68 61 74 20 69 73 20 69 64 65 6e 74 69 66 69 65  hat is identifie
26d70 64 20 62 79 0a 2a 2a 20 70 61 72 61 6d 65 74 65  d by.** paramete
26d80 72 20 50 33 2e 20 20 43 6c 65 61 72 69 6e 67 20  r P3.  Clearing 
26d90 74 68 65 20 50 33 20 63 6f 6c 75 6d 6e 20 63 61  the P3 column ca
26da0 63 68 65 20 61 73 20 70 61 72 74 20 6f 66 20 74  che as part of t
26db0 68 69 73 20 6f 70 63 6f 64 65 20 73 61 76 65 73  his opcode saves
26dc0 0a 2a 2a 20 75 73 20 66 72 6f 6d 20 68 61 76 69  .** us from havi
26dd0 6e 67 20 74 6f 20 69 73 73 75 65 20 61 20 73 65  ng to issue a se
26de0 70 61 72 61 74 65 20 4e 75 6c 6c 52 6f 77 20 69  parate NullRow i
26df0 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 63 6c  nstruction to cl
26e00 65 61 72 20 74 68 61 74 20 63 61 63 68 65 2e 0a  ear that cache..
26e10 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65  */.case OP_Sorte
26e20 72 44 61 74 61 3a 20 7b 0a 20 20 56 64 62 65 43  rData: {.  VdbeC
26e30 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 70 4f  ursor *pC;..  pO
26e40 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
26e50 70 32 5d 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  p2];.  pC = p->a
26e60 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
26e70 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65   assert( isSorte
26e80 72 28 70 43 29 20 29 3b 0a 20 20 72 63 20 3d 20  r(pC) );.  rc = 
26e90 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
26ea0 72 52 6f 77 6b 65 79 28 70 43 2c 20 70 4f 75 74  rRowkey(pC, pOut
26eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
26ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
26ed0 4f 75 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Out->flags & MEM
26ee0 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65  _Blob) );.  asse
26ef0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
26f00 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
26f10 72 73 6f 72 20 29 3b 0a 20 20 69 66 28 20 72 63  rsor );.  if( rc
26f20 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
26f30 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 2d  e_to_error;.  p-
26f40 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 33 5d 2d  >apCsr[pOp->p3]-
26f50 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
26f60 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 62 72  ACHE_STALE;.  br
26f70 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
26f80 65 3a 20 52 6f 77 44 61 74 61 20 50 31 20 50 32  e: RowData P1 P2
26f90 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
26fa0 73 69 73 3a 20 72 5b 50 32 5d 3d 64 61 74 61 0a  sis: r[P2]=data.
26fb0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f  **.** Write into
26fc0 20 72 65 67 69 73 74 65 72 20 50 32 20 74 68 65   register P2 the
26fd0 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20 63 6f   complete row co
26fe0 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 72 6f  ntent for the ro
26ff0 77 20 61 74 20 0a 2a 2a 20 77 68 69 63 68 20 63  w at .** which c
27000 75 72 73 6f 72 20 50 31 20 69 73 20 63 75 72 72  ursor P1 is curr
27010 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
27020 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 69  ** There is no i
27030 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66  nterpretation of
27040 20 74 68 65 20 64 61 74 61 2e 20 20 0a 2a 2a 20   the data.  .** 
27050 49 74 20 69 73 20 6a 75 73 74 20 63 6f 70 69 65  It is just copie
27060 64 20 6f 6e 74 6f 20 74 68 65 20 50 32 20 72 65  d onto the P2 re
27070 67 69 73 74 65 72 20 65 78 61 63 74 6c 79 20 61  gister exactly a
27080 73 20 0a 2a 2a 20 69 74 20 69 73 20 66 6f 75 6e  s .** it is foun
27090 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
270a0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
270b0 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 61 6e   cursor P1 is an
270c0 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 74 68 65   index, then the
270d0 20 63 6f 6e 74 65 6e 74 20 69 73 20 74 68 65 20   content is the 
270e0 6b 65 79 20 6f 66 20 74 68 65 20 72 6f 77 2e 0a  key of the row..
270f0 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 32 20  ** If cursor P2 
27100 69 73 20 61 20 74 61 62 6c 65 2c 20 74 68 65 6e  is a table, then
27110 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 65 78 74   the content ext
27120 72 61 63 74 65 64 20 69 73 20 74 68 65 20 64 61  racted is the da
27130 74 61 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ta..**.** If the
27140 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20   P1 cursor must 
27150 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  be pointing to a
27160 20 76 61 6c 69 64 20 72 6f 77 20 28 6e 6f 74 20   valid row (not 
27170 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f  a NULL row).** o
27180 66 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20  f a real table, 
27190 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62  not a pseudo-tab
271a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 21  le..**.** If P3!
271b0 3d 30 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63  =0 then this opc
271c0 6f 64 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ode is allowed t
271d0 6f 20 6d 61 6b 65 20 61 6e 20 65 70 68 65 72 6d  o make an epherm
271e0 65 72 61 6c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  eral pointer.** 
271f0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
27200 65 20 70 61 67 65 2e 20 20 54 68 61 74 20 6d 65  e page.  That me
27210 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ans that the con
27220 74 65 6e 74 20 6f 66 20 74 68 65 20 6f 75 74 70  tent of the outp
27230 75 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 77  ut.** register w
27240 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
27250 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  ed as soon as th
27260 65 20 63 75 72 73 6f 72 20 6d 6f 76 65 73 20 2d  e cursor moves -
27270 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 6d 6f   including.** mo
27280 76 65 73 20 63 61 75 73 65 64 20 62 79 20 6f 74  ves caused by ot
27290 68 65 72 20 63 75 72 73 6f 72 73 20 74 68 61 74  her cursors that
272a0 20 22 73 61 76 65 22 20 74 68 65 20 74 68 65 20   "save" the the 
272b0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 73 0a  current cursors.
272c0 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6f  ** position in o
272d0 72 64 65 72 20 74 68 61 74 20 74 68 65 79 20 63  rder that they c
272e0 61 6e 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  an write to the 
272f0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 49 66 20  same table.  If 
27300 50 33 3d 3d 30 0a 2a 2a 20 74 68 65 6e 20 61 20  P3==0.** then a 
27310 63 6f 70 79 20 6f 66 20 74 68 65 20 64 61 74 61  copy of the data
27320 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
27330 6d 6f 72 79 2e 20 20 50 33 21 3d 30 20 69 73 20  mory.  P3!=0 is 
27340 66 61 73 74 65 72 2c 20 62 75 74 0a 2a 2a 20 50  faster, but.** P
27350 33 3d 3d 30 20 69 73 20 73 61 66 65 72 2e 0a 2a  3==0 is safer..*
27360 2a 0a 2a 2a 20 49 66 20 50 33 21 3d 30 20 74 68  *.** If P3!=0 th
27370 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
27380 66 20 74 68 65 20 50 32 20 72 65 67 69 73 74 65  f the P2 registe
27390 72 20 69 73 20 75 6e 73 75 69 74 61 62 6c 65 20  r is unsuitable 
273a0 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 4f 50  for use.** in OP
273b0 5f 52 65 73 75 6c 74 20 61 6e 64 20 61 6e 79 20  _Result and any 
273c0 4f 50 5f 52 65 73 75 6c 74 20 77 69 6c 6c 20 69  OP_Result will i
273d0 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 50 32  nvalidate the P2
273e0 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e   register conten
273f0 74 2e 0a 2a 2a 20 54 68 65 20 50 32 20 72 65 67  t..** The P2 reg
27400 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 20 69 73  ister content is
27410 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
27420 6f 70 63 6f 64 65 73 20 6c 69 6b 65 20 4f 50 5f  opcodes like OP_
27430 46 75 6e 63 74 69 6f 6e 20 6f 72 0a 2a 2a 20 62  Function or.** b
27440 79 20 61 6e 79 20 75 73 65 20 6f 66 20 61 6e 6f  y any use of ano
27450 74 68 65 72 20 63 75 72 73 6f 72 20 70 6f 69 6e  ther cursor poin
27460 74 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ting to the same
27470 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20   table..*/.case 
27480 4f 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20 20  OP_RowData: {.  
27490 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
274a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
274b0 72 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 70  r;.  u32 n;..  p
274c0 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
274d0 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 0a 20  ease(p, pOp);.. 
274e0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
274f0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
27500 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
27510 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
27520 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
27530 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
27540 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
27550 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
27560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  );.  assert( isS
27570 6f 72 74 65 72 28 70 43 29 3d 3d 30 20 29 3b 0a  orter(pC)==0 );.
27580 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6e 75    assert( pC->nu
27590 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  llRow==0 );.  as
275a0 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75  sert( pC->uc.pCu
275b0 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 70 43 72  rsor!=0 );.  pCr
275c0 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72  sr = pC->uc.pCur
275d0 73 6f 72 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f  sor;..  /* The O
275e0 50 5f 52 6f 77 44 61 74 61 20 6f 70 63 6f 64 65  P_RowData opcode
275f0 73 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 20  s always follow 
27600 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 0a  OP_NotExists or.
27610 20 20 2a 2a 20 4f 50 5f 53 65 65 6b 52 6f 77 69    ** OP_SeekRowi
27620 64 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2f 4f  d or OP_Rewind/O
27630 70 5f 4e 65 78 74 20 77 69 74 68 20 6e 6f 20 69  p_Next with no i
27640 6e 74 65 72 76 65 6e 69 6e 67 20 69 6e 73 74 72  ntervening instr
27650 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74 68 61  uctions.  ** tha
27660 74 20 6d 69 67 68 74 20 69 6e 76 61 6c 69 64 61  t might invalida
27670 74 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 20  te the cursor.. 
27680 20 2a 2a 20 49 66 20 74 68 69 73 20 77 68 65 72   ** If this wher
27690 65 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20  e not the case, 
276a0 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
276b0 69 6e 67 20 61 73 73 65 72 74 28 29 73 0a 20 20  ing assert()s.  
276c0 2a 2a 20 77 6f 75 6c 64 20 66 61 69 6c 2e 20 20  ** would fail.  
276d0 53 68 6f 75 6c 64 20 74 68 69 73 20 65 76 65 72  Should this ever
276e0 20 63 68 61 6e 67 65 20 28 62 65 63 61 75 73 65   change (because
276f0 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74   of changes in t
27700 68 65 20 63 6f 64 65 0a 20 20 2a 2a 20 67 65 6e  he code.  ** gen
27710 65 72 61 74 6f 72 29 20 74 68 65 6e 20 74 68 65  erator) then the
27720 20 66 69 78 20 77 6f 75 6c 64 20 62 65 20 74 6f   fix would be to
27730 20 69 6e 73 65 72 74 20 61 20 63 61 6c 6c 20 74   insert a call t
27740 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64  o.  ** sqlite3Vd
27750 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29  beCursorMoveto()
27760 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
27770 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
27780 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eto==0 );.  asse
27790 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
277a0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
277b0 72 73 72 29 20 29 3b 0a 23 69 66 20 30 20 20 2f  rsr) );.#if 0  /
277c0 2a 20 4e 6f 74 20 72 65 71 75 69 72 65 64 20 64  * Not required d
277d0 75 65 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ue to the previo
277e0 75 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 73  us to assert() s
277f0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 72  tatements */.  r
27800 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
27810 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b  ursorMoveto(pC);
27820 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27830 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
27840 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
27850 23 65 6e 64 69 66 0a 0a 20 20 6e 20 3d 20 73 71  #endif..  n = sq
27860 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
27870 64 53 69 7a 65 28 70 43 72 73 72 29 3b 0a 20 20  dSize(pCrsr);.  
27880 69 66 28 20 6e 3e 28 75 33 32 29 64 62 2d 3e 61  if( n>(u32)db->a
27890 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
278a0 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
278b0 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
278c0 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
278d0 6e 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  n==0 );.  rc = s
278e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
278f0 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 30 2c  mBtree(pCrsr, 0,
27900 20 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 69 66 28   n, pOut);.  if(
27910 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
27920 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
27930 20 69 66 28 20 21 70 4f 70 2d 3e 70 33 20 29 20   if( !pOp->p3 ) 
27940 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 70  Deephemeralize(p
27950 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  Out);.  UPDATE_M
27960 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
27970 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
27980 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
27990 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
279a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 69 64  /* Opcode: Rowid
279b0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
279c0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
279d0 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  rowid.**.** Stor
279e0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
279f0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
27a00 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66 20  h is the key of 
27a10 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
27a20 74 68 61 74 0a 2a 2a 20 50 31 20 69 73 20 63 75  that.** P1 is cu
27a30 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
27a40 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61 6e 20 62  ..**.** P1 can b
27a50 65 20 65 69 74 68 65 72 20 61 6e 20 6f 72 64 69  e either an ordi
27a60 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 61 20  nary table or a 
27a70 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
27a80 54 68 65 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a  There used to.**
27a90 20 62 65 20 61 20 73 65 70 61 72 61 74 65 20 4f   be a separate O
27aa0 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f 64 65 20  P_VRowid opcode 
27ab0 66 6f 72 20 75 73 65 20 77 69 74 68 20 76 69 72  for use with vir
27ac0 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 62 75 74  tual tables, but
27ad0 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63   this.** one opc
27ae0 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73 20 66 6f  ode now works fo
27af0 72 20 62 6f 74 68 20 74 61 62 6c 65 20 74 79 70  r both table typ
27b00 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  es..*/.case OP_R
27b10 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
27b20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
27b30 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
27b40 2a 70 43 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  *pC;.  i64 v;.  
27b50 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
27b60 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  tab;.  const sql
27b70 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
27b80 64 75 6c 65 3b 0a 0a 20 20 70 4f 75 74 20 3d 20  dule;..  pOut = 
27b90 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
27ba0 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73 65 72 74  , pOp);.  assert
27bb0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
27bc0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
27bd0 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
27be0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
27bf0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
27c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
27c10 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
27c20 50 45 5f 50 53 45 55 44 4f 20 7c 7c 20 70 43 2d  PE_PSEUDO || pC-
27c30 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 20 69 66  >nullRow );.  if
27c40 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  ( pC->nullRow ){
27c50 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
27c60 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
27c70 20 62 72 65 61 6b 3b 0a 20 20 7d 65 6c 73 65 20   break;.  }else 
27c80 69 66 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  if( pC->deferred
27c90 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 76 20  Moveto ){.    v 
27ca0 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  = pC->movetoTarg
27cb0 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  et;.#ifndef SQLI
27cc0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
27cd0 41 42 4c 45 0a 20 20 7d 65 6c 73 65 20 69 66 28  ABLE.  }else if(
27ce0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
27cf0 55 52 54 59 50 45 5f 56 54 41 42 20 29 7b 0a 20  URTYPE_VTAB ){. 
27d00 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75     assert( pC->u
27d10 63 2e 70 56 43 75 72 21 3d 30 20 29 3b 0a 20 20  c.pVCur!=0 );.  
27d20 20 20 70 56 74 61 62 20 3d 20 70 43 2d 3e 75 63    pVtab = pC->uc
27d30 2e 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20  .pVCur->pVtab;. 
27d40 20 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74     pModule = pVt
27d50 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
27d60 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
27d70 2d 3e 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->xRowid );.    
27d80 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  rc = pModule->xR
27d90 6f 77 69 64 28 70 43 2d 3e 75 63 2e 70 56 43 75  owid(pC->uc.pVCu
27da0 72 2c 20 26 76 29 3b 0a 20 20 20 20 73 71 6c 69  r, &v);.    sqli
27db0 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
27dc0 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20  msg(p, pVtab);. 
27dd0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
27de0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
27df0 72 6f 72 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ror;.#endif /* S
27e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
27e10 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 7d 65 6c  ALTABLE */.  }el
27e20 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
27e30 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
27e40 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
27e50 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75     assert( pC->u
27e60 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
27e70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27e80 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
27e90 65 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20 72  e(pC);.    if( r
27ea0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
27eb0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
27ec0 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77   if( pC->nullRow
27ed0 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
27ee0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
27ef0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27f00 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c     }.    v = sql
27f10 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
27f20 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  Key(pC->uc.pCurs
27f30 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d  or);.  }.  pOut-
27f40 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61  >u.i = v;.  brea
27f50 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
27f60 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a 20 2a 20   NullRow P1 * * 
27f70 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74  * *.**.** Move t
27f80 68 65 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20  he cursor P1 to 
27f90 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20 41 6e 79  a null row.  Any
27fa0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 65 72 61   OP_Column opera
27fb0 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 6f 63  tions.** that oc
27fc0 63 75 72 20 77 68 69 6c 65 20 74 68 65 20 63 75  cur while the cu
27fd0 72 73 6f 72 20 69 73 20 6f 6e 20 74 68 65 20 6e  rsor is on the n
27fe0 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20 61 6c 77  ull row will alw
27ff0 61 79 73 0a 2a 2a 20 77 72 69 74 65 20 61 20 4e  ays.** write a N
28000 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
28010 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20 56 64 62  NullRow: {.  Vdb
28020 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20  eCursor *pC;..  
28030 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
28040 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
28050 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
28060 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
28070 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
28080 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6e  pC!=0 );.  pC->n
28090 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43  ullRow = 1;.  pC
280a0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
280b0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69  CACHE_STALE;.  i
280c0 66 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  f( pC->eCurType=
280d0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
280e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
280f0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
28100 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
28110 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
28120 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a  C->uc.pCursor);.
28130 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
28140 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 45  /* Opcode: SeekE
28150 6e 64 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  nd P1 * * * *.**
28160 0a 2a 2a 20 50 6f 73 69 74 69 6f 6e 20 63 75 72  .** Position cur
28170 73 6f 72 20 50 31 20 61 74 20 74 68 65 20 65 6e  sor P1 at the en
28180 64 20 6f 66 20 74 68 65 20 62 74 72 65 65 20 66  d of the btree f
28190 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
281a0 66 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 61  f.** appending a
281b0 20 6e 65 77 20 65 6e 74 72 79 20 6f 6e 74 6f 20   new entry onto 
281c0 74 68 65 20 62 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  the btree..**.**
281d0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
281e0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
281f0 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20  s used only for 
28200 61 70 70 65 6e 64 69 6e 67 20 61 6e 64 20 73 6f  appending and so
28210 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 73 6f  .** if the curso
28220 72 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 6e  r is valid, then
28230 20 74 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   the cursor must
28240 20 61 6c 72 65 61 64 79 20 62 65 20 70 6f 69 6e   already be poin
28250 74 69 6e 67 0a 2a 2a 20 61 74 20 74 68 65 20 65  ting.** at the e
28260 6e 64 20 6f 66 20 74 68 65 20 62 74 72 65 65 20  nd of the btree 
28270 61 6e 64 20 73 6f 20 6e 6f 20 63 68 61 6e 67 65  and so no change
28280 73 20 61 72 65 20 6d 61 64 65 20 74 6f 0a 2a 2a  s are made to.**
28290 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
282a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 61 73 74 20  /* Opcode: Last 
282b0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
282c0 2a 20 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f  * The next use o
282d0 66 20 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43  f the Rowid or C
282e0 6f 6c 75 6d 6e 20 6f 72 20 50 72 65 76 20 69 6e  olumn or Prev in
282f0 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31  struction for P1
28300 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20   .** will refer 
28310 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
28320 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
28330 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
28340 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  ..** If the tabl
28350 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d  e or index is em
28360 70 74 79 20 61 6e 64 20 50 32 3e 30 2c 20 74 68  pty and P2>0, th
28370 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  en jump immediat
28380 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66  ely to P2..** If
28390 20 50 32 20 69 73 20 30 20 6f 72 20 69 66 20 74   P2 is 0 or if t
283a0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
283b0 78 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  x is not empty, 
283c0 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20  fall through.** 
283d0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
283e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
283f0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
28400 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
28410 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  r configured to 
28420 6d 6f 76 65 20 69 6e 20 72 65 76 65 72 73 65 20  move in reverse 
28430 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74  order,.** from t
28440 68 65 20 65 6e 64 20 74 6f 77 61 72 64 20 74 68  he end toward th
28450 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e  e beginning.  In
28460 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
28470 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63  e cursor is.** c
28480 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
28490 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e   Prev, not Next.
284a0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b  .*/.case OP_Seek
284b0 45 6e 64 3a 0a 63 61 73 65 20 4f 50 5f 4c 61 73  End:.case OP_Las
284c0 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  t: {        /* j
284d0 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ump */.  VdbeCur
284e0 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
284f0 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e  sor *pCrsr;.  in
28500 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74  t res;..  assert
28510 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
28520 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
28530 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
28540 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
28550 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
28560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
28570 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
28580 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43  PE_BTREE );.  pC
28590 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  rsr = pC->uc.pCu
285a0 72 73 6f 72 3b 0a 20 20 72 65 73 20 3d 20 30 3b  rsor;.  res = 0;
285b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72  .  assert( pCrsr
285c0 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !=0 );.#ifdef SQ
285d0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d  LITE_DEBUG.  pC-
285e0 3e 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f  >seekOp = pOp->o
285f0 70 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20  pcode;.#endif.  
28600 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
28610 3d 4f 50 5f 53 65 65 6b 45 6e 64 20 29 7b 0a 20  =OP_SeekEnd ){. 
28620 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
28630 70 32 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43 2d  p2==0 );.    pC-
28640 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 2d 31  >seekResult = -1
28650 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
28660 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
28670 6c 69 64 4e 4e 28 70 43 72 73 72 29 20 29 7b 0a  lidNN(pCrsr) ){.
28680 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28690 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71   }.  }.  rc = sq
286a0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70  lite3BtreeLast(p
286b0 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 70  Crsr, &res);.  p
286c0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38  C->nullRow = (u8
286d0 29 72 65 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65  )res;.  pC->defe
286e0 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
286f0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
28700 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
28710 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
28720 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
28730 72 6f 72 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ror;.  if( pOp->
28740 70 32 3e 30 20 29 7b 0a 20 20 20 20 56 64 62 65  p2>0 ){.    Vdbe
28750 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
28760 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 72  =0,2);.    if( r
28770 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  es ) goto jump_t
28780 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61  o_p2;.  }.  brea
28790 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
287a0 20 49 66 53 6d 61 6c 6c 65 72 20 50 31 20 50 32   IfSmaller P1 P2
287b0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 45 73   P3 * *.**.** Es
287c0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
287d0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
287e0 20 74 61 62 6c 65 20 50 31 2e 20 20 4a 75 6d 70   table P1.  Jump
287f0 20 74 6f 20 50 32 20 69 66 20 74 68 61 74 0a 2a   to P2 if that.*
28800 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 6c 65  * estimate is le
28810 73 73 20 74 68 61 6e 20 61 70 70 72 6f 78 69 6d  ss than approxim
28820 61 74 65 6c 79 20 32 2a 2a 28 30 2e 31 2a 50 33  ately 2**(0.1*P3
28830 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66  )..*/.case OP_If
28840 53 6d 61 6c 6c 65 72 3a 20 7b 20 20 20 20 20 20  Smaller: {      
28850 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56    /* jump */.  V
28860 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
28870 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72   BtCursor *pCrsr
28880 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  ;.  int res;.  i
28890 36 34 20 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74  64 sz;..  assert
288a0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
288b0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
288c0 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
288d0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
288e0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
288f0 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d  );.  pCrsr = pC-
28900 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61  >uc.pCursor;.  a
28910 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a  ssert( pCrsr );.
28920 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
28930 72 65 65 46 69 72 73 74 28 70 43 72 73 72 2c 20  reeFirst(pCrsr, 
28940 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20  &res);.  if( rc 
28950 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
28960 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  _to_error;.  if(
28970 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73   res==0 ){.    s
28980 7a 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  z = sqlite3Btree
28990 52 6f 77 43 6f 75 6e 74 45 73 74 28 70 43 72 73  RowCountEst(pCrs
289a0 72 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41  r);.    if( ALWA
289b0 59 53 28 73 7a 3e 3d 30 29 20 26 26 20 73 71 6c  YS(sz>=0) && sql
289c0 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
289d0 73 7a 29 3c 70 4f 70 2d 3e 70 33 20 29 20 72 65  sz)<pOp->p3 ) re
289e0 73 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 56 64 62  s = 1;.  }.  Vdb
289f0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
28a00 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65  !=0,2);.  if( re
28a10 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  s ) goto jump_to
28a20 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
28a30 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  ../* Opcode: Sor
28a40 74 65 72 53 6f 72 74 20 50 31 20 50 32 20 2a 20  terSort P1 P2 * 
28a50 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  * *.**.** After 
28a60 61 6c 6c 20 72 65 63 6f 72 64 73 20 68 61 76 65  all records have
28a70 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
28a80 6e 74 6f 20 74 68 65 20 53 6f 72 74 65 72 20 6f  nto the Sorter o
28a90 62 6a 65 63 74 0a 2a 2a 20 69 64 65 6e 74 69 66  bject.** identif
28aa0 69 65 64 20 62 79 20 50 31 2c 20 69 6e 76 6f 6b  ied by P1, invok
28ab0 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f  e this opcode to
28ac0 20 61 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65   actually do the
28ad0 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 20 4a 75 6d   sorting..** Jum
28ae0 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 72 65  p to P2 if there
28af0 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
28b00 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2a  to be sorted..**
28b10 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
28b20 69 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20  is an alias for 
28b30 4f 50 5f 53 6f 72 74 20 61 6e 64 20 4f 50 5f 52  OP_Sort and OP_R
28b40 65 77 69 6e 64 20 74 68 61 74 20 69 73 20 75 73  ewind that is us
28b50 65 64 0a 2a 2a 20 66 6f 72 20 53 6f 72 74 65 72  ed.** for Sorter
28b60 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 2f 2a 20   objects..*/./* 
28b70 4f 70 63 6f 64 65 3a 20 53 6f 72 74 20 50 31 20  Opcode: Sort P1 
28b80 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
28b90 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
28ba0 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
28bb0 20 74 68 69 6e 67 20 61 73 20 4f 50 5f 52 65 77   thing as OP_Rew
28bc0 69 6e 64 20 65 78 63 65 70 74 20 74 68 61 74 0a  ind except that.
28bd0 2a 2a 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 73  ** it increments
28be0 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
28bf0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
28c00 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
28c10 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67  g..**.** Sorting
28c20 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
28c30 20 62 79 20 77 72 69 74 69 6e 67 20 72 65 63 6f   by writing reco
28c40 72 64 73 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  rds into a sorti
28c50 6e 67 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  ng index,.** the
28c60 6e 20 72 65 77 69 6e 64 69 6e 67 20 74 68 61 74  n rewinding that
28c70 20 69 6e 64 65 78 20 61 6e 64 20 70 6c 61 79 69   index and playi
28c80 6e 67 20 69 74 20 62 61 63 6b 20 66 72 6f 6d 20  ng it back from 
28c90 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20  beginning to.** 
28ca0 65 6e 64 2e 20 20 57 65 20 75 73 65 20 74 68 65  end.  We use the
28cb0 20 4f 50 5f 53 6f 72 74 20 6f 70 63 6f 64 65 20   OP_Sort opcode 
28cc0 69 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f 52 65  instead of OP_Re
28cd0 77 69 6e 64 20 74 6f 20 64 6f 20 74 68 65 0a 2a  wind to do the.*
28ce0 2a 20 72 65 77 69 6e 64 69 6e 67 20 73 6f 20 74  * rewinding so t
28cf0 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 76  hat the global v
28d00 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
28d10 69 6e 63 72 65 6d 65 6e 74 65 64 20 61 6e 64 0a  incremented and.
28d20 2a 2a 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65  ** regression te
28d30 73 74 73 20 63 61 6e 20 64 65 74 65 72 6d 69 6e  sts can determin
28d40 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
28d50 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   the optimizer i
28d60 73 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6f  s.** correctly o
28d70 70 74 69 6d 69 7a 69 6e 67 20 6f 75 74 20 73 6f  ptimizing out so
28d80 72 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  rts..*/.case OP_
28d90 53 6f 72 74 65 72 53 6f 72 74 3a 20 20 20 20 2f  SorterSort:    /
28da0 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f  * jump */.case O
28db0 50 5f 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20  P_Sort: {       
28dc0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64   /* jump */.#ifd
28dd0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
28de0 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f   sqlite3_sort_co
28df0 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
28e00 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b  _search_count--;
28e10 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f  .#endif.  p->aCo
28e20 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d  unter[SQLITE_STM
28e30 54 53 54 41 54 55 53 5f 53 4f 52 54 5d 2b 2b 3b  TSTATUS_SORT]++;
28e40 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
28e50 67 68 20 69 6e 74 6f 20 4f 50 5f 52 65 77 69 6e  gh into OP_Rewin
28e60 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65  d */.}./* Opcode
28e70 3a 20 52 65 77 69 6e 64 20 50 31 20 50 32 20 2a  : Rewind P1 P2 *
28e80 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   * *.**.** The n
28e90 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52  ext use of the R
28ea0 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f  owid or Column o
28eb0 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  r Next instructi
28ec0 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69  on for P1 .** wi
28ed0 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ll refer to the 
28ee0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
28ef0 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
28f00 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49  e or index..** I
28f10 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
28f20 6e 64 65 78 20 69 73 20 65 6d 70 74 79 2c 20 6a  ndex is empty, j
28f30 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
28f40 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 74 68 65  to P2..** If the
28f50 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
28f60 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61  is not empty, fa
28f70 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
28f80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  e following .** 
28f90 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
28fa0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
28fb0 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
28fc0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d   configured to m
28fd0 6f 76 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f  ove in forward o
28fe0 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68  rder,.** from th
28ff0 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61  e beginning towa
29000 72 64 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20  rd the end.  In 
29010 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
29020 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f   cursor is.** co
29030 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
29040 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a  Next, not Prev..
29050 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 77 69 6e  */.case OP_Rewin
29060 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  d: {        /* j
29070 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ump */.  VdbeCur
29080 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
29090 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e  sor *pCrsr;.  in
290a0 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74  t res;..  assert
290b0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
290c0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
290d0 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
290e0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
290f0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
29100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  );.  assert( isS
29110 6f 72 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d  orter(pC)==(pOp-
29120 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74  >opcode==OP_Sort
29130 65 72 53 6f 72 74 29 20 29 3b 0a 20 20 72 65 73  erSort) );.  res
29140 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
29150 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e  ITE_DEBUG.  pC->
29160 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69  seekOp = OP_Rewi
29170 6e 64 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  nd;.#endif.  if(
29180 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b   isSorter(pC) ){
29190 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
291a0 33 56 64 62 65 53 6f 72 74 65 72 52 65 77 69 6e  3VdbeSorterRewin
291b0 64 28 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d  d(pC, &res);.  }
291c0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
291d0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
291e0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
291f0 0a 20 20 20 20 70 43 72 73 72 20 3d 20 70 43 2d  .    pCrsr = pC-
29200 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 20  >uc.pCursor;.   
29210 20 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29   assert( pCrsr )
29220 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
29230 65 33 42 74 72 65 65 46 69 72 73 74 28 70 43 72  e3BtreeFirst(pCr
29240 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70  sr, &res);.    p
29250 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
29260 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63  o = 0;.    pC->c
29270 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
29280 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20  HE_STALE;.  }.  
29290 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
292a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
292b0 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
292c0 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 61 73 73  = (u8)res;.  ass
292d0 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26  ert( pOp->p2>0 &
292e0 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70  & pOp->p2<p->nOp
292f0 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68   );.  VdbeBranch
29300 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b  Taken(res!=0,2);
29310 0a 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74  .  if( res ) got
29320 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
29330 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
29340 6f 64 65 3a 20 4e 65 78 74 20 50 31 20 50 32 20  ode: Next P1 P2 
29350 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 41  P3 P4 P5.**.** A
29360 64 76 61 6e 63 65 20 63 75 72 73 6f 72 20 50 31  dvance cursor P1
29370 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
29380 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6b  ts to the next k
29390 65 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e 20  ey/data pair in 
293a0 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  its.** table or 
293b0 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72 65  index.  If there
293c0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6b 65 79   are no more key
293d0 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65  /value pairs the
293e0 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a  n fall through.*
293f0 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * to the followi
29400 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ng instruction. 
29410 20 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73   But if the curs
29420 6f 72 20 61 64 76 61 6e 63 65 20 77 61 73 20 73  or advance was s
29430 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75  uccessful,.** ju
29440 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
29450 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o P2..**.** The 
29460 4e 65 78 74 20 6f 70 63 6f 64 65 20 69 73 20 6f  Next opcode is o
29470 6e 6c 79 20 76 61 6c 69 64 20 66 6f 6c 6c 6f 77  nly valid follow
29480 69 6e 67 20 61 6e 20 53 65 65 6b 47 54 2c 20 53  ing an SeekGT, S
29490 65 65 6b 47 45 2c 20 6f 72 0a 2a 2a 20 4f 50 5f  eekGE, or.** OP_
294a0 52 65 77 69 6e 64 20 6f 70 63 6f 64 65 20 75 73  Rewind opcode us
294b0 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
294c0 68 65 20 63 75 72 73 6f 72 2e 20 20 4e 65 78 74  he cursor.  Next
294d0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a   is not allowed.
294e0 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53 65 65  ** to follow See
294f0 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72 20  kLT, SeekLE, or 
29500 4f 50 5f 4c 61 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  OP_Last..**.** T
29510 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
29520 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20  t be for a real 
29530 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65  table, not a pse
29540 75 64 6f 2d 74 61 62 6c 65 2e 20 20 50 31 20 6d  udo-table.  P1 m
29550 75 73 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ust have.** been
29560 20 6f 70 65 6e 65 64 20 70 72 69 6f 72 20 74 6f   opened prior to
29570 20 74 68 69 73 20 6f 70 63 6f 64 65 20 6f 72 20   this opcode or 
29580 74 68 65 20 70 72 6f 67 72 61 6d 20 77 69 6c 6c  the program will
29590 20 73 65 67 66 61 75 6c 74 2e 0a 2a 2a 0a 2a 2a   segfault..**.**
295a0 20 54 68 65 20 50 33 20 76 61 6c 75 65 20 69 73   The P3 value is
295b0 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62   a hint to the b
295c0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
295d0 69 6f 6e 2e 20 49 66 20 50 33 3d 3d 31 2c 20 74  ion. If P3==1, t
295e0 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 50 31 20  hat.** means P1 
295f0 69 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  is an SQL index 
29600 61 6e 64 20 74 68 61 74 20 74 68 69 73 20 69 6e  and that this in
29610 73 74 72 75 63 74 69 6f 6e 20 63 6f 75 6c 64 20  struction could 
29620 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69  have been.** omi
29630 74 74 65 64 20 69 66 20 74 68 61 74 20 69 6e 64  tted if that ind
29640 65 78 20 68 61 64 20 62 65 65 6e 20 75 6e 69 71  ex had been uniq
29650 75 65 2e 20 20 50 33 20 69 73 20 75 73 75 61 6c  ue.  P3 is usual
29660 6c 79 20 30 2e 20 20 50 33 20 69 73 0a 2a 2a 20  ly 0.  P3 is.** 
29670 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 30 20  always either 0 
29680 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  or 1..**.** P4 i
29690 73 20 61 6c 77 61 79 73 20 6f 66 20 74 79 70 65  s always of type
296a0 20 50 34 5f 41 44 56 41 4e 43 45 2e 20 54 68 65   P4_ADVANCE. The
296b0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
296c0 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73  r points to.** s
296d0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
296e0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  )..**.** If P5 i
296f0 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74  s positive and t
29700 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
29710 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75  , then event cou
29720 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50  nter.** number P
29730 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65 70 61  5-1 in the prepa
29740 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
29750 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
29760 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 50 72  .** See also: Pr
29770 65 76 2c 20 4e 65 78 74 49 66 4f 70 65 6e 0a 2a  ev, NextIfOpen.*
29780 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78  /./* Opcode: Nex
29790 74 49 66 4f 70 65 6e 20 50 31 20 50 32 20 50 33  tIfOpen P1 P2 P3
297a0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69   P4 P5.**.** Thi
297b0 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a  s opcode works j
297c0 75 73 74 20 6c 69 6b 65 20 4e 65 78 74 20 65 78  ust like Next ex
297d0 63 65 70 74 20 74 68 61 74 20 69 66 20 63 75 72  cept that if cur
297e0 73 6f 72 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a  sor P1 is not.**
297f0 20 6f 70 65 6e 20 69 74 20 62 65 68 61 76 65 73   open it behaves
29800 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20   a no-op..*/./* 
29810 4f 70 63 6f 64 65 3a 20 50 72 65 76 20 50 31 20  Opcode: Prev P1 
29820 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
29830 2a 20 42 61 63 6b 20 75 70 20 63 75 72 73 6f 72  * Back up cursor
29840 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70   P1 so that it p
29850 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 72 65  oints to the pre
29860 76 69 6f 75 73 20 6b 65 79 2f 64 61 74 61 20 70  vious key/data p
29870 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61  air in its.** ta
29880 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49  ble or index.  I
29890 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72  f there is no pr
298a0 65 76 69 6f 75 73 20 6b 65 79 2f 76 61 6c 75 65  evious key/value
298b0 20 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c   pairs then fall
298c0 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
298d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
298e0 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69  truction.  But i
298f0 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 61 63  f the cursor bac
29900 6b 75 70 20 77 61 73 20 73 75 63 63 65 73 73 66  kup was successf
29910 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65  ul,.** jump imme
29920 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a  diately to P2..*
29930 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 72 65 76  *.**.** The Prev
29940 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20   opcode is only 
29950 76 61 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  valid following 
29960 61 6e 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c  an SeekLT, SeekL
29970 45 2c 20 6f 72 0a 2a 2a 20 4f 50 5f 4c 61 73 74  E, or.** OP_Last
29980 20 6f 70 63 6f 64 65 20 75 73 65 64 20 74 6f 20   opcode used to 
29990 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72  position the cur
299a0 73 6f 72 2e 20 20 50 72 65 76 20 69 73 20 6e 6f  sor.  Prev is no
299b0 74 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  t allowed.** to 
299c0 66 6f 6c 6c 6f 77 20 53 65 65 6b 47 54 2c 20 53  follow SeekGT, S
299d0 65 65 6b 47 45 2c 20 6f 72 20 4f 50 5f 52 65 77  eekGE, or OP_Rew
299e0 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ind..**.** The P
299f0 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  1 cursor must be
29a00 20 66 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c   for a real tabl
29a10 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d  e, not a pseudo-
29a20 74 61 62 6c 65 2e 20 20 49 66 20 50 31 20 69 73  table.  If P1 is
29a30 0a 2a 2a 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65  .** not open the
29a40 6e 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 69  n the behavior i
29a50 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  s undefined..**.
29a60 2a 2a 20 54 68 65 20 50 33 20 76 61 6c 75 65 20  ** The P3 value 
29a70 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
29a80 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
29a90 61 74 69 6f 6e 2e 20 49 66 20 50 33 3d 3d 31 2c  ation. If P3==1,
29aa0 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 50   that.** means P
29ab0 31 20 69 73 20 61 6e 20 53 51 4c 20 69 6e 64 65  1 is an SQL inde
29ac0 78 20 61 6e 64 20 74 68 61 74 20 74 68 69 73 20  x and that this 
29ad0 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 75 6c  instruction coul
29ae0 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6f  d have been.** o
29af0 6d 69 74 74 65 64 20 69 66 20 74 68 61 74 20 69  mitted if that i
29b00 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 75 6e  ndex had been un
29b10 69 71 75 65 2e 20 20 50 33 20 69 73 20 75 73 75  ique.  P3 is usu
29b20 61 6c 6c 79 20 30 2e 20 20 50 33 20 69 73 0a 2a  ally 0.  P3 is.*
29b30 2a 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  * always either 
29b40 30 20 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34  0 or 1..**.** P4
29b50 20 69 73 20 61 6c 77 61 79 73 20 6f 66 20 74 79   is always of ty
29b60 70 65 20 50 34 5f 41 44 56 41 4e 43 45 2e 20 54  pe P4_ADVANCE. T
29b70 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
29b80 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
29b90 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
29ba0 76 69 6f 75 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  vious()..**.** I
29bb0 66 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65  f P5 is positive
29bc0 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73   and the jump is
29bd0 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65   taken, then eve
29be0 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75  nt counter.** nu
29bf0 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65  mber P5-1 in the
29c00 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
29c10 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ent is increment
29c20 65 64 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ed..*/./* Opcode
29c30 3a 20 50 72 65 76 49 66 4f 70 65 6e 20 50 31 20  : PrevIfOpen P1 
29c40 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
29c50 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f  * This opcode wo
29c60 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 50 72  rks just like Pr
29c70 65 76 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ev except that i
29c80 66 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 6e  f cursor P1 is n
29c90 6f 74 0a 2a 2a 20 6f 70 65 6e 20 69 74 20 62 65  ot.** open it be
29ca0 68 61 76 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  haves a no-op..*
29cb0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  /./* Opcode: Sor
29cc0 74 65 72 4e 65 78 74 20 50 31 20 50 32 20 2a 20  terNext P1 P2 * 
29cd0 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  * P5.**.** This 
29ce0 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73  opcode works jus
29cf0 74 20 6c 69 6b 65 20 4f 50 5f 4e 65 78 74 20 65  t like OP_Next e
29d00 78 63 65 70 74 20 74 68 61 74 20 50 31 20 6d 75  xcept that P1 mu
29d10 73 74 20 62 65 20 61 0a 2a 2a 20 73 6f 72 74 65  st be a.** sorte
29d20 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 77 68 69  r object for whi
29d30 63 68 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  ch the OP_Sorter
29d40 53 6f 72 74 20 6f 70 63 6f 64 65 20 68 61 73 20  Sort opcode has 
29d50 62 65 65 6e 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e  been.** invoked.
29d60 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 61 64    This opcode ad
29d70 76 61 6e 63 65 73 20 74 68 65 20 63 75 72 73 6f  vances the curso
29d80 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 6f  r to the next so
29d90 72 74 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2c 20  rted.** record, 
29da0 6f 72 20 6a 75 6d 70 73 20 74 6f 20 50 32 20 69  or jumps to P2 i
29db0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  f there are no m
29dc0 6f 72 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72  ore sorted recor
29dd0 64 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ds..*/.case OP_S
29de0 6f 72 74 65 72 4e 65 78 74 3a 20 7b 20 20 2f 2a  orterNext: {  /*
29df0 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43   jump */.  VdbeC
29e00 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 70 43  ursor *pC;..  pC
29e10 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
29e20 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
29e30 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a  isSorter(pC) );.
29e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
29e50 62 65 53 6f 72 74 65 72 4e 65 78 74 28 64 62 2c  beSorterNext(db,
29e60 20 70 43 29 3b 0a 20 20 67 6f 74 6f 20 6e 65 78   pC);.  goto nex
29e70 74 5f 74 61 69 6c 3b 0a 63 61 73 65 20 4f 50 5f  t_tail;.case OP_
29e80 50 72 65 76 49 66 4f 70 65 6e 3a 20 20 20 20 2f  PrevIfOpen:    /
29e90 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f  * jump */.case O
29ea0 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 20 20 20  P_NextIfOpen:   
29eb0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66   /* jump */.  if
29ec0 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  ( p->apCsr[pOp->
29ed0 70 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  p1]==0 ) break;.
29ee0 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
29ef0 68 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72 65  h */.case OP_Pre
29f00 76 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  v:          /* j
29f10 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  ump */.case OP_N
29f20 65 78 74 3a 20 20 20 20 20 20 20 20 20 20 2f 2a  ext:          /*
29f30 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72   jump */.  asser
29f40 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
29f50 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
29f60 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
29f70 20 70 4f 70 2d 3e 70 35 3c 41 72 72 61 79 53 69   pOp->p5<ArraySi
29f80 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 72 29 20  ze(p->aCounter) 
29f90 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
29fa0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
29fb0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
29fc0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
29fd0 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
29fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
29ff0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
2a000 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
2a010 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2a020 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 70 4f  e!=OP_Next || pO
2a030 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d  p->p4.xAdvance==
2a040 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2a050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2a060 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72  p->opcode!=OP_Pr
2a070 65 76 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41  ev || pOp->p4.xA
2a080 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42  dvance==sqlite3B
2a090 74 72 65 65 50 72 65 76 69 6f 75 73 20 29 3b 0a  treePrevious );.
2a0a0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
2a0b0 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 49 66  pcode!=OP_NextIf
2a0c0 4f 70 65 6e 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e  Open || pOp->p4.
2a0d0 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65  xAdvance==sqlite
2a0e0 33 42 74 72 65 65 4e 65 78 74 20 29 3b 0a 20 20  3BtreeNext );.  
2a0f0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
2a100 6f 64 65 21 3d 4f 50 5f 50 72 65 76 49 66 4f 70  ode!=OP_PrevIfOp
2a110 65 6e 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41  en || pOp->p4.xA
2a120 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42  dvance==sqlite3B
2a130 74 72 65 65 50 72 65 76 69 6f 75 73 29 3b 0a 0a  treePrevious);..
2a140 20 20 2f 2a 20 54 68 65 20 4e 65 78 74 20 6f 70    /* The Next op
2a150 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  code is only use
2a160 64 20 61 66 74 65 72 20 53 65 65 6b 47 54 2c 20  d after SeekGT, 
2a170 53 65 65 6b 47 45 2c 20 61 6e 64 20 52 65 77 69  SeekGE, and Rewi
2a180 6e 64 2e 0a 20 20 2a 2a 20 54 68 65 20 50 72 65  nd..  ** The Pre
2a190 76 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79  v opcode is only
2a1a0 20 75 73 65 64 20 61 66 74 65 72 20 53 65 65 6b   used after Seek
2a1b0 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 61 6e 64 20  LT, SeekLE, and 
2a1c0 4c 61 73 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72  Last. */.  asser
2a1d0 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  t( pOp->opcode!=
2a1e0 4f 50 5f 4e 65 78 74 20 7c 7c 20 70 4f 70 2d 3e  OP_Next || pOp->
2a1f0 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 49  opcode!=OP_NextI
2a200 66 4f 70 65 6e 0a 20 20 20 20 20 20 20 7c 7c 20  fOpen.       || 
2a210 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53  pC->seekOp==OP_S
2a220 65 65 6b 47 54 20 7c 7c 20 70 43 2d 3e 73 65 65  eekGT || pC->see
2a230 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 0a 20  kOp==OP_SeekGE. 
2a240 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65        || pC->see
2a250 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 7c  kOp==OP_Rewind |
2a260 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50  | pC->seekOp==OP
2a270 5f 46 6f 75 6e 64 29 3b 0a 20 20 61 73 73 65 72  _Found);.  asser
2a280 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  t( pOp->opcode!=
2a290 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d 3e  OP_Prev || pOp->
2a2a0 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 49  opcode!=OP_PrevI
2a2b0 66 4f 70 65 6e 0a 20 20 20 20 20 20 20 7c 7c 20  fOpen.       || 
2a2c0 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53  pC->seekOp==OP_S
2a2d0 65 65 6b 4c 54 20 7c 7c 20 70 43 2d 3e 73 65 65  eekLT || pC->see
2a2e0 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 0a 20  kOp==OP_SeekLE. 
2a2f0 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65        || pC->see
2a300 6b 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a  kOp==OP_Last );.
2a310 0a 20 20 72 63 20 3d 20 70 4f 70 2d 3e 70 34 2e  .  rc = pOp->p4.
2a320 78 41 64 76 61 6e 63 65 28 70 43 2d 3e 75 63 2e  xAdvance(pC->uc.
2a330 70 43 75 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 33  pCursor, pOp->p3
2a340 29 3b 0a 6e 65 78 74 5f 74 61 69 6c 3a 0a 20 20  );.next_tail:.  
2a350 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
2a360 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
2a370 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
2a380 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2c 32  (rc==SQLITE_OK,2
2a390 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2a3a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
2a3b0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
2a3c0 20 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 70     p->aCounter[p
2a3d0 4f 70 2d 3e 70 35 5d 2b 2b 3b 0a 23 69 66 64 65  Op->p5]++;.#ifde
2a3e0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2a3f0 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
2a400 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
2a410 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
2a420 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66  o_p2_and_check_f
2a430 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20  or_interrupt;.  
2a440 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
2a450 54 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f 20 61  TE_DONE ) goto a
2a460 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2a470 72 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  r;.  rc = SQLITE
2a480 5f 4f 4b 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  _OK;.  pC->nullR
2a490 6f 77 20 3d 20 31 3b 0a 20 20 67 6f 74 6f 20 63  ow = 1;.  goto c
2a4a0 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
2a4b0 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  pt;.}../* Opcode
2a4c0 3a 20 49 64 78 49 6e 73 65 72 74 20 50 31 20 50  : IdxInsert P1 P
2a4d0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
2a4e0 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32  nopsis: key=r[P2
2a4f0 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ].**.** Register
2a500 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c   P2 holds an SQL
2a510 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20   index key made 
2a520 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b  using the.** Mak
2a530 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74  eRecord instruct
2a540 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63 6f  ions.  This opco
2a550 64 65 20 77 72 69 74 65 73 20 74 68 61 74 20 6b  de writes that k
2a560 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69  ey.** into the i
2a570 6e 64 65 78 20 50 31 2e 20 20 44 61 74 61 20 66  ndex P1.  Data f
2a580 6f 72 20 74 68 65 20 65 6e 74 72 79 20 69 73 20  or the entry is 
2a590 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  nil..**.** If P4
2a5a0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
2a5b0 65 6e 20 69 74 20 69 73 20 74 68 65 20 6e 75 6d  en it is the num
2a5c0 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20 69 6e  ber of values in
2a5d0 20 74 68 65 20 75 6e 70 61 63 6b 65 64 0a 2a 2a   the unpacked.**
2a5e0 20 6b 65 79 20 6f 66 20 72 65 67 28 50 32 29 2e   key of reg(P2).
2a5f0 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
2a600 50 33 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  P3 is the index 
2a610 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
2a620 69 73 74 65 72 0a 2a 2a 20 66 6f 72 20 74 68 65  ister.** for the
2a630 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 2e 20 20   unpacked key.  
2a640 54 68 65 20 61 76 61 69 6c 61 62 69 6c 69 74 79  The availability
2a650 20 6f 66 20 74 68 65 20 75 6e 70 61 63 6b 65 64   of the unpacked
2a660 20 6b 65 79 20 63 61 6e 20 73 6f 6d 65 74 69 6d   key can sometim
2a670 65 73 0a 2a 2a 20 62 65 20 61 6e 20 6f 70 74 69  es.** be an opti
2a680 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
2a690 49 66 20 50 35 20 68 61 73 20 74 68 65 20 4f 50  If P5 has the OP
2a6a0 46 4c 41 47 5f 41 50 50 45 4e 44 20 62 69 74 20  FLAG_APPEND bit 
2a6b0 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20 68  set, that is a h
2a6c0 69 6e 74 20 74 6f 20 74 68 65 20 62 2d 74 72 65  int to the b-tre
2a6d0 65 20 6c 61 79 65 72 0a 2a 2a 20 74 68 61 74 20  e layer.** that 
2a6e0 74 68 69 73 20 69 6e 73 65 72 74 20 69 73 20 6c  this insert is l
2a6f0 69 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e 20 61  ikely to be an a
2a700 70 70 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ppend..**.** If 
2a710 50 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c 41  P5 has the OPFLA
2a720 47 5f 4e 43 48 41 4e 47 45 20 62 69 74 20 73 65  G_NCHANGE bit se
2a730 74 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  t, then the chan
2a740 67 65 20 63 6f 75 6e 74 65 72 20 69 73 0a 2a 2a  ge counter is.**
2a750 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
2a760 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
2a770 2e 20 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  .  If the OPFLAG
2a780 5f 4e 43 48 41 4e 47 45 20 62 69 74 20 69 73 20  _NCHANGE bit is 
2a790 63 6c 65 61 72 2c 0a 2a 2a 20 74 68 65 6e 20 74  clear,.** then t
2a7a0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
2a7b0 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  r is unchanged..
2a7c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
2a7d0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
2a7e0 54 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20  T flag of P5 is 
2a7f0 73 65 74 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  set, the impleme
2a800 6e 74 61 74 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a  ntation might.**
2a810 20 72 75 6e 20 66 61 73 74 65 72 20 62 79 20 61   run faster by a
2a820 76 6f 69 64 69 6e 67 20 61 6e 20 75 6e 6e 65 63  voiding an unnec
2a830 65 73 73 61 72 79 20 73 65 65 6b 20 6f 6e 20 63  essary seek on c
2a840 75 72 73 6f 72 20 50 31 2e 20 20 48 6f 77 65 76  ursor P1.  Howev
2a850 65 72 2c 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41  er,.** the OPFLA
2a860 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20  G_USESEEKRESULT 
2a870 66 6c 61 67 20 6d 75 73 74 20 6f 6e 6c 79 20 62  flag must only b
2a880 65 20 73 65 74 20 69 66 20 74 68 65 72 65 20 68  e set if there h
2a890 61 76 65 20 62 65 65 6e 20 6e 6f 20 70 72 69 6f  ave been no prio
2a8a0 72 0a 2a 2a 20 73 65 65 6b 73 20 6f 6e 20 74 68  r.** seeks on th
2a8b0 65 20 63 75 72 73 6f 72 20 6f 72 20 69 66 20 74  e cursor or if t
2a8c0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
2a8d0 65 65 6b 20 75 73 65 64 20 61 20 6b 65 79 20 65  eek used a key e
2a8e0 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20 74 6f 20  quivalent.** to 
2a8f0 50 32 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  P2. .**.** This 
2a900 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79  instruction only
2a910 20 77 6f 72 6b 73 20 66 6f 72 20 69 6e 64 69 63   works for indic
2a920 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c  es.  The equival
2a930 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ent instruction.
2a940 2a 2a 20 66 6f 72 20 74 61 62 6c 65 73 20 69 73  ** for tables is
2a950 20 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f   OP_Insert..*/./
2a960 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72  * Opcode: Sorter
2a970 49 6e 73 65 72 74 20 50 31 20 50 32 20 2a 20 2a  Insert P1 P2 * *
2a980 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
2a990 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20  key=r[P2].**.** 
2a9a0 52 65 67 69 73 74 65 72 20 50 32 20 68 6f 6c 64  Register P2 hold
2a9b0 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b  s an SQL index k
2a9c0 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68  ey made using th
2a9d0 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20  e.** MakeRecord 
2a9e0 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54  instructions.  T
2a9f0 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69 74 65  his opcode write
2aa00 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e  s that key.** in
2aa10 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 50 31  to the sorter P1
2aa20 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  .  Data for the 
2aa30 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2f  entry is nil..*/
2aa40 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 49  .case OP_SorterI
2aa50 6e 73 65 72 74 3a 20 20 20 20 20 20 20 2f 2a 20  nsert:       /* 
2aa60 69 6e 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  in2 */.case OP_I
2aa70 64 78 49 6e 73 65 72 74 3a 20 7b 20 20 20 20 20  dxInsert: {     
2aa80 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
2aa90 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
2aaa0 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 78 3b   BtreePayload x;
2aab0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
2aac0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
2aad0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
2aae0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
2aaf0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
2ab00 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
2ab10 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
2ab20 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64  pC)==(pOp->opcod
2ab30 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  e==OP_SorterInse
2ab40 72 74 29 20 29 3b 0a 20 20 70 49 6e 32 20 3d 20  rt) );.  pIn2 = 
2ab50 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
2ab60 20 20 61 73 73 65 72 74 28 20 70 49 6e 32 2d 3e    assert( pIn2->
2ab70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
2ab80 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
2ab90 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  5 & OPFLAG_NCHAN
2aba0 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b  GE ) p->nChange+
2abb0 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  +;.  assert( pC-
2abc0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
2abd0 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 4f 70 2d  PE_BTREE || pOp-
2abe0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74  >opcode==OP_Sort
2abf0 65 72 49 6e 73 65 72 74 20 29 3b 0a 20 20 61 73  erInsert );.  as
2ac00 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
2ac10 65 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 45  e==0 );.  rc = E
2ac20 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b  xpandBlob(pIn2);
2ac30 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2ac40 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2ac50 72 6f 72 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ror;.  if( pOp->
2ac60 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65  opcode==OP_Sorte
2ac70 72 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 72  rInsert ){.    r
2ac80 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
2ac90 6f 72 74 65 72 57 72 69 74 65 28 70 43 2c 20 70  orterWrite(pC, p
2aca0 49 6e 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  In2);.  }else{. 
2acb0 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70 49 6e 32     x.nKey = pIn2
2acc0 2d 3e 6e 3b 0a 20 20 20 20 78 2e 70 4b 65 79 20  ->n;.    x.pKey 
2acd0 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20 20 20 20 78  = pIn2->z;.    x
2ace0 2e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 2b 20 70  .aMem = aMem + p
2acf0 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 78 2e 6e 4d  Op->p3;.    x.nM
2ad00 65 6d 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70  em = (u16)pOp->p
2ad10 34 2e 69 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  4.i;.    rc = sq
2ad20 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
2ad30 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
2ad40 20 26 78 2c 0a 20 20 20 20 20 20 20 20 20 28 70   &x,.         (p
2ad50 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47  Op->p5 & (OPFLAG
2ad60 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41 47 5f 53  _APPEND|OPFLAG_S
2ad70 41 56 45 50 4f 53 49 54 49 4f 4e 29 29 2c 20 0a  AVEPOSITION)), .
2ad80 20 20 20 20 20 20 20 20 28 28 70 4f 70 2d 3e 70          ((pOp->p
2ad90 35 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  5 & OPFLAG_USESE
2ada0 45 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e  EKRESULT) ? pC->
2adb0 73 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 0a  seekResult : 0).
2adc0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 61          );.    a
2add0 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72  ssert( pC->defer
2ade0 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a  redMoveto==0 );.
2adf0 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61      pC->cacheSta
2ae00 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
2ae10 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 29  E;.  }.  if( rc)
2ae20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2ae30 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
2ae40 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2ae50 20 49 64 78 44 65 6c 65 74 65 20 50 31 20 50 32   IdxDelete P1 P2
2ae60 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
2ae70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 40 50 33  sis: key=r[P2@P3
2ae80 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ].**.** The cont
2ae90 65 6e 74 20 6f 66 20 50 33 20 72 65 67 69 73 74  ent of P3 regist
2aea0 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
2aeb0 72 65 67 69 73 74 65 72 20 50 32 20 66 6f 72 6d  register P2 form
2aec0 0a 2a 2a 20 61 6e 20 75 6e 70 61 63 6b 65 64 20  .** an unpacked 
2aed0 69 6e 64 65 78 20 6b 65 79 2e 20 54 68 69 73 20  index key. This 
2aee0 6f 70 63 6f 64 65 20 72 65 6d 6f 76 65 73 20 74  opcode removes t
2aef0 68 61 74 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  hat entry from t
2af00 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f 70 65  he .** index ope
2af10 6e 65 64 20 62 79 20 63 75 72 73 6f 72 20 50 31  ned by cursor P1
2af20 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  ..*/.case OP_Idx
2af30 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62 65  Delete: {.  Vdbe
2af40 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
2af50 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
2af60 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61   int res;.  Unpa
2af70 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20  ckedRecord r;.. 
2af80 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
2af90 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2afa0 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70  pOp->p2>0 && pOp
2afb0 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 3c 3d 28 70  ->p2+pOp->p3<=(p
2afc0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
2afd0 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 61 73  ursor)+1 );.  as
2afe0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2aff0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2b000 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2b010 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2b020 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2b030 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2b040 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
2b050 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
2b060 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63    pCrsr = pC->uc
2b070 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65  .pCursor;.  asse
2b080 72 74 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a  rt( pCrsr!=0 );.
2b090 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2b0a0 35 3d 3d 30 20 29 3b 0a 20 20 72 2e 70 4b 65 79  5==0 );.  r.pKey
2b0b0 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
2b0c0 6e 66 6f 3b 0a 20 20 72 2e 6e 46 69 65 6c 64 20  nfo;.  r.nField 
2b0d0 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 33 3b 0a  = (u16)pOp->p3;.
2b0e0 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d    r.default_rc =
2b0f0 20 30 3b 0a 20 20 72 2e 61 4d 65 6d 20 3d 20 26   0;.  r.aMem = &
2b100 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
2b110 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2b120 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
2b130 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c 20 30  (pCrsr, &r, 0, 0
2b140 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
2b150 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2b160 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69  ue_to_error;.  i
2b170 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
2b180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2b190 65 65 44 65 6c 65 74 65 28 70 43 72 73 72 2c 20  eeDelete(pCrsr, 
2b1a0 42 54 52 45 45 5f 41 55 58 44 45 4c 45 54 45 29  BTREE_AUXDELETE)
2b1b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2b1c0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2b1d0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73  _error;.  }.  as
2b1e0 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
2b1f0 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
2b200 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
2b210 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
2b220 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74    pC->seekResult
2b230 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
2b240 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 66  ../* Opcode: Def
2b250 65 72 72 65 64 53 65 65 6b 20 50 31 20 2a 20 50  erredSeek P1 * P
2b260 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
2b270 69 73 3a 20 4d 6f 76 65 20 50 33 20 74 6f 20 50  is: Move P3 to P
2b280 31 2e 72 6f 77 69 64 20 69 66 20 6e 65 65 64 65  1.rowid if neede
2b290 64 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 6e  d.**.** P1 is an
2b2a0 20 6f 70 65 6e 20 69 6e 64 65 78 20 63 75 72 73   open index curs
2b2b0 6f 72 20 61 6e 64 20 50 33 20 69 73 20 61 20 63  or and P3 is a c
2b2c0 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 63 6f 72  ursor on the cor
2b2d0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61  responding.** ta
2b2e0 62 6c 65 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ble.  This opcod
2b2f0 65 20 64 6f 65 73 20 61 20 64 65 66 65 72 72 65  e does a deferre
2b300 64 20 73 65 65 6b 20 6f 66 20 74 68 65 20 50 33  d seek of the P3
2b310 20 74 61 62 6c 65 20 63 75 72 73 6f 72 0a 2a 2a   table cursor.**
2b320 20 74 6f 20 74 68 65 20 72 6f 77 20 74 68 61 74   to the row that
2b330 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2b340 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
2b350 6f 66 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  of P1..**.** Thi
2b360 73 20 69 73 20 61 20 64 65 66 65 72 72 65 64 20  s is a deferred 
2b370 73 65 65 6b 2e 20 20 4e 6f 74 68 69 6e 67 20 61  seek.  Nothing a
2b380 63 74 75 61 6c 6c 79 20 68 61 70 70 65 6e 73 20  ctually happens 
2b390 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 63 75 72  until.** the cur
2b3a0 73 6f 72 20 69 73 20 75 73 65 64 20 74 6f 20 72  sor is used to r
2b3b0 65 61 64 20 61 20 72 65 63 6f 72 64 2e 20 20 54  ead a record.  T
2b3c0 68 61 74 20 77 61 79 2c 20 69 66 20 6e 6f 20 72  hat way, if no r
2b3d0 65 61 64 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e  eads.** occur, n
2b3e0 6f 20 75 6e 6e 65 63 65 73 73 61 72 79 20 49 2f  o unnecessary I/
2b3f0 4f 20 68 61 70 70 65 6e 73 2e 0a 2a 2a 0a 2a 2a  O happens..**.**
2b400 20 50 34 20 6d 61 79 20 62 65 20 61 6e 20 61 72   P4 may be an ar
2b410 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
2b420 28 74 79 70 65 20 50 34 5f 49 4e 54 41 52 52 41  (type P4_INTARRA
2b430 59 29 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  Y) containing.**
2b440 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
2b450 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ach column in th
2b460 65 20 50 33 20 74 61 62 6c 65 2e 20 20 49 66 20  e P3 table.  If 
2b470 61 72 72 61 79 20 65 6e 74 72 79 20 61 28 69 29  array entry a(i)
2b480 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  .** is non-zero,
2b490 20 74 68 65 6e 20 72 65 61 64 69 6e 67 20 63 6f   then reading co
2b4a0 6c 75 6d 6e 20 61 28 69 29 2d 31 20 66 72 6f 6d  lumn a(i)-1 from
2b4b0 20 63 75 72 73 6f 72 20 50 33 20 69 73 20 0a 2a   cursor P3 is .*
2b4c0 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
2b4d0 70 65 72 66 6f 72 6d 69 6e 67 20 74 68 65 20 64  performing the d
2b4e0 65 66 65 72 72 65 64 20 73 65 65 6b 20 61 6e 64  eferred seek and
2b4f0 20 74 68 65 6e 20 72 65 61 64 69 6e 67 20 63 6f   then reading co
2b500 6c 75 6d 6e 20 69 20 0a 2a 2a 20 66 72 6f 6d 20  lumn i .** from 
2b510 50 31 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  P1.  This inform
2b520 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20  ation is stored 
2b530 69 6e 20 50 33 20 61 6e 64 20 75 73 65 64 20 74  in P3 and used t
2b540 6f 20 72 65 64 69 72 65 63 74 0a 2a 2a 20 72 65  o redirect.** re
2b550 61 64 73 20 61 67 61 69 6e 73 74 20 50 33 20 6f  ads against P3 o
2b560 76 65 72 20 74 6f 20 50 31 2c 20 74 68 75 73 20  ver to P1, thus 
2b570 70 6f 73 73 69 62 6c 79 20 61 76 6f 69 64 69 6e  possibly avoidin
2b580 67 20 74 68 65 20 6e 65 65 64 20 74 6f 0a 2a 2a  g the need to.**
2b590 20 73 65 65 6b 20 61 6e 64 20 72 65 61 64 20 63   seek and read c
2b5a0 75 72 73 6f 72 20 50 33 2e 0a 2a 2f 0a 2f 2a 20  ursor P3..*/./* 
2b5b0 4f 70 63 6f 64 65 3a 20 49 64 78 52 6f 77 69 64  Opcode: IdxRowid
2b5c0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
2b5d0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
2b5e0 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 57 72 69 74  rowid.**.** Writ
2b5f0 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
2b600 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  P2 an integer wh
2b610 69 63 68 20 69 73 20 74 68 65 20 6c 61 73 74 20  ich is the last 
2b620 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 63  entry in the rec
2b630 6f 72 64 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ord at.** the en
2b640 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b  d of the index k
2b650 65 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ey pointed to by
2b660 20 63 75 72 73 6f 72 20 50 31 2e 20 20 54 68 69   cursor P1.  Thi
2b670 73 20 69 6e 74 65 67 65 72 20 73 68 6f 75 6c 64  s integer should
2b680 20 62 65 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64   be.** the rowid
2b690 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e   of the table en
2b6a0 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 69  try to which thi
2b6b0 73 20 69 6e 64 65 78 20 65 6e 74 72 79 20 70 6f  s index entry po
2b6c0 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ints..**.** See 
2b6d0 61 6c 73 6f 3a 20 52 6f 77 69 64 2c 20 4d 61 6b  also: Rowid, Mak
2b6e0 65 52 65 63 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65  eRecord..*/.case
2b6f0 20 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b   OP_DeferredSeek
2b700 3a 0a 63 61 73 65 20 4f 50 5f 49 64 78 52 6f 77  :.case OP_IdxRow
2b710 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  id: {           
2b720 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62  /* out2 */.  Vdb
2b730 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20  eCursor *pC;    
2b740 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b750 50 31 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  P1 index cursor 
2b760 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
2b770 2a 70 54 61 62 43 75 72 3b 20 20 20 20 20 20 20  *pTabCur;       
2b780 20 2f 2a 20 54 68 65 20 50 32 20 74 61 62 6c 65   /* The P2 table
2b790 20 63 75 72 73 6f 72 20 28 4f 50 5f 44 65 66 65   cursor (OP_Defe
2b7a0 72 72 65 64 53 65 65 6b 20 6f 6e 6c 79 29 20 2a  rredSeek only) *
2b7b0 2f 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 20 20  /.  i64 rowid;  
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7d0 2f 2a 20 52 6f 77 69 64 20 74 68 61 74 20 50 31  /* Rowid that P1
2b7e0 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 73 20   current points 
2b7f0 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
2b800 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
2b810 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
2b820 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
2b830 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
2b840 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
2b850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2b860 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
2b870 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
2b880 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
2b890 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
2b8a0 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d  rt( pC->isTable=
2b8b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b8c0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
2b8d0 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  to==0 );.  asser
2b8e0 74 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  t( !pC->nullRow 
2b8f0 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  || pOp->opcode==
2b900 4f 50 5f 49 64 78 52 6f 77 69 64 20 29 3b 0a 0a  OP_IdxRowid );..
2b910 20 20 2f 2a 20 54 68 65 20 49 64 78 52 6f 77 69    /* The IdxRowi
2b920 64 20 61 6e 64 20 53 65 65 6b 20 6f 70 63 6f 64  d and Seek opcod
2b930 65 73 20 61 72 65 20 63 6f 6d 62 69 6e 65 64 20  es are combined 
2b940 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 63  because of the c
2b950 6f 6d 6d 6f 6e 61 6c 69 74 79 0a 20 20 2a 2a 20  ommonality.  ** 
2b960 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  of sqlite3VdbeCu
2b970 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 61 6e  rsorRestore() an
2b980 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  d sqlite3VdbeIdx
2b990 52 6f 77 69 64 28 29 2e 20 2a 2f 0a 20 20 72 63  Rowid(). */.  rc
2b9a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2b9b0 72 73 6f 72 52 65 73 74 6f 72 65 28 70 43 29 3b  rsorRestore(pC);
2b9c0 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 62  ..  /* sqlite3Vb
2b9d0 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
2b9e0 20 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69   can only fail i
2b9f0 66 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  f the record has
2ba00 20 62 65 65 6e 20 64 65 6c 65 74 65 64 0a 20 20   been deleted.  
2ba10 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ** out from unde
2ba20 72 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  r the cursor.  T
2ba30 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 68  hat will never h
2ba40 61 70 70 65 6e 73 20 66 6f 72 20 61 6e 20 49 64  appens for an Id
2ba50 78 52 6f 77 69 64 0a 20 20 2a 2a 20 6f 72 20 53  xRowid.  ** or S
2ba60 65 65 6b 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  eek opcode */.  
2ba70 69 66 28 20 4e 45 56 45 52 28 72 63 21 3d 53 51  if( NEVER(rc!=SQ
2ba80 4c 49 54 45 5f 4f 4b 29 20 29 20 67 6f 74 6f 20  LITE_OK) ) goto 
2ba90 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2baa0 6f 72 3b 0a 0a 20 20 69 66 28 20 21 70 43 2d 3e  or;..  if( !pC->
2bab0 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 72  nullRow ){.    r
2bac0 6f 77 69 64 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f  owid = 0;  /* No
2bad0 74 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20  t needed.  Only 
2bae0 75 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65 20  used to silence 
2baf0 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20  a warning. */.  
2bb00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
2bb10 62 65 49 64 78 52 6f 77 69 64 28 64 62 2c 20 70  beIdxRowid(db, p
2bb20 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26  C->uc.pCursor, &
2bb30 72 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  rowid);.    if( 
2bb40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2bb50 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
2bb60 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2bb70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
2bb80 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  p->opcode==OP_De
2bb90 66 65 72 72 65 64 53 65 65 6b 20 29 7b 0a 20 20  ferredSeek ){.  
2bba0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
2bbb0 3e 70 33 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p3>=0 && pOp->p
2bbc0 33 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  3<p->nCursor );.
2bbd0 20 20 20 20 20 20 70 54 61 62 43 75 72 20 3d 20        pTabCur = 
2bbe0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 33  p->apCsr[pOp->p3
2bbf0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
2bc00 20 70 54 61 62 43 75 72 21 3d 30 20 29 3b 0a 20   pTabCur!=0 );. 
2bc10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2bc20 62 43 75 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d  bCur->eCurType==
2bc30 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
2bc40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2bc50 54 61 62 43 75 72 2d 3e 75 63 2e 70 43 75 72 73  TabCur->uc.pCurs
2bc60 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  or!=0 );.      a
2bc70 73 73 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e  ssert( pTabCur->
2bc80 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  isTable );.     
2bc90 20 70 54 61 62 43 75 72 2d 3e 6e 75 6c 6c 52 6f   pTabCur->nullRo
2bca0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  w = 0;.      pTa
2bcb0 62 43 75 72 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  bCur->movetoTarg
2bcc0 65 74 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20  et = rowid;.    
2bcd0 20 20 70 54 61 62 43 75 72 2d 3e 64 65 66 65 72    pTabCur->defer
2bce0 72 65 64 4d 6f 76 65 74 6f 20 3d 20 31 3b 0a 20  redMoveto = 1;. 
2bcf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
2bd00 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
2bd10 41 52 52 41 59 20 7c 7c 20 70 4f 70 2d 3e 70 34  ARRAY || pOp->p4
2bd20 2e 61 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  .ai==0 );.      
2bd30 70 54 61 62 43 75 72 2d 3e 61 41 6c 74 4d 61 70  pTabCur->aAltMap
2bd40 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20   = pOp->p4.ai;. 
2bd50 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 70 41       pTabCur->pA
2bd60 6c 74 43 75 72 73 6f 72 20 3d 20 70 43 3b 0a 20  ltCursor = pC;. 
2bd70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bd80 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
2bd90 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
2bda0 20 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d       pOut->u.i =
2bdb0 20 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20   rowid;.    }.  
2bdc0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2bdd0 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
2bde0 4f 50 5f 49 64 78 52 6f 77 69 64 20 29 3b 0a 20  OP_IdxRowid );. 
2bdf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
2be00 6d 53 65 74 4e 75 6c 6c 28 26 61 4d 65 6d 5b 70  mSetNull(&aMem[p
2be10 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 7d 0a 20 20  Op->p2]);.  }.  
2be20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2be30 6f 64 65 3a 20 49 64 78 47 45 20 50 31 20 50 32  ode: IdxGE P1 P2
2be40 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
2be50 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
2be60 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  P4].**.** The P4
2be70 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
2be80 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
2be90 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
2bea0 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
2beb0 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
2bec0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 43   PRIMARY KEY.  C
2bed0 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20  ompare this key 
2bee0 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68  value against th
2bef0 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74  e index .** that
2bf00 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79   P1 is currently
2bf10 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67   pointing to, ig
2bf20 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41  noring the PRIMA
2bf30 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 20  RY KEY or ROWID 
2bf40 0a 2a 2a 20 66 69 65 6c 64 73 20 61 74 20 74 68  .** fields at th
2bf50 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e end..**.** If 
2bf60 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74  the P1 index ent
2bf70 72 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ry is greater th
2bf80 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
2bf90 68 65 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20  he key value.** 
2bfa0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
2bfb0 20 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c    Otherwise fall
2bfc0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2bfd0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2bfe0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
2bff0 49 64 78 47 54 20 50 31 20 50 32 20 50 33 20 50  IdxGT P1 P2 P3 P
2c000 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
2c010 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a  : key=r[P3@P4].*
2c020 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69  *.** The P4 regi
2c030 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69  ster values begi
2c040 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f  nning with P3 fo
2c050 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  rm an unpacked i
2c060 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61  ndex .** key tha
2c070 74 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d  t omits the PRIM
2c080 41 52 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61 72  ARY KEY.  Compar
2c090 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65  e this key value
2c0a0 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64   against the ind
2c0b0 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69  ex .** that P1 i
2c0c0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2c0d0 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e  ting to, ignorin
2c0e0 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
2c0f0 59 20 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20 66  Y or ROWID .** f
2c100 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64  ields at the end
2c110 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
2c120 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  1 index entry is
2c130 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
2c140 65 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74  e key value.** t
2c150 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20  hen jump to P2. 
2c160 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2c170 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
2c180 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
2c190 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
2c1a0 64 78 4c 54 20 50 31 20 50 32 20 50 33 20 50 34  dxLT P1 P2 P3 P4
2c1b0 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
2c1c0 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
2c1d0 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73  .** The P4 regis
2c1e0 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e  ter values begin
2c1f0 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72  ning with P3 for
2c200 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  m an unpacked in
2c210 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74  dex .** key that
2c220 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41   omits the PRIMA
2c230 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e  RY KEY or ROWID.
2c240 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b    Compare this k
2c250 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74  ey value against
2c260 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68  .** the index th
2c270 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74  at P1 is current
2c280 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20  ly pointing to, 
2c290 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49  ignoring the PRI
2c2a0 4d 41 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52  MARY KEY or.** R
2c2b0 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69  OWID on the P1 i
2c2c0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
2c2d0 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72  he P1 index entr
2c2e0 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  y is less than t
2c2f0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74 68 65  he key value the
2c300 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
2c310 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2c320 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
2c330 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
2c340 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
2c350 64 78 4c 45 20 50 31 20 50 32 20 50 33 20 50 34  dxLE P1 P2 P3 P4
2c360 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
2c370 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
2c380 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73  .** The P4 regis
2c390 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e  ter values begin
2c3a0 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72  ning with P3 for
2c3b0 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  m an unpacked in
2c3c0 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74  dex .** key that
2c3d0 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41   omits the PRIMA
2c3e0 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e  RY KEY or ROWID.
2c3f0 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b    Compare this k
2c400 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74  ey value against
2c410 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68  .** the index th
2c420 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74  at P1 is current
2c430 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20  ly pointing to, 
2c440 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49  ignoring the PRI
2c450 4d 41 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52  MARY KEY or.** R
2c460 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69  OWID on the P1 i
2c470 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
2c480 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72  he P1 index entr
2c490 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  y is less than o
2c4a0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
2c4b0 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75  ey value then ju
2c4c0 6d 70 0a 2a 2a 20 74 6f 20 50 32 2e 20 4f 74 68  mp.** to P2. Oth
2c4d0 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f  erwise fall thro
2c4e0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2c4f0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2c500 63 61 73 65 20 4f 50 5f 49 64 78 4c 45 3a 20 20  case OP_IdxLE:  
2c510 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
2c520 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 47 54  */.case OP_IdxGT
2c530 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  :          /* ju
2c540 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64  mp */.case OP_Id
2c550 78 4c 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a  xLT:          /*
2c560 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50   jump */.case OP
2c570 5f 49 64 78 47 45 3a 20 20 7b 20 20 20 20 20 20  _IdxGE:  {      
2c580 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64   /* jump */.  Vd
2c590 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
2c5a0 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63  int res;.  Unpac
2c5b0 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20  kedRecord r;..  
2c5c0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2c5d0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
2c5e0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
2c5f0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2c600 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2c610 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
2c620 74 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64  t( pC->isOrdered
2c630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c640 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
2c650 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
2c660 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
2c670 75 72 73 6f 72 21 3d 30 29 3b 0a 20 20 61 73 73  ursor!=0);.  ass
2c680 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
2c690 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
2c6a0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d  assert( pOp->p5=
2c6b0 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31  =0 || pOp->p5==1
2c6c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2c6d0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
2c6e0 54 33 32 20 29 3b 0a 20 20 72 2e 70 4b 65 79 49  T32 );.  r.pKeyI
2c6f0 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
2c700 66 6f 3b 0a 20 20 72 2e 6e 46 69 65 6c 64 20 3d  fo;.  r.nField =
2c710 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b   (u16)pOp->p4.i;
2c720 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
2c730 64 65 3c 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20  de<OP_IdxLT ){. 
2c740 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
2c750 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 45  opcode==OP_IdxLE
2c760 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
2c770 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
2c780 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20   r.default_rc = 
2c790 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
2c7a0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2c7b0 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c  code==OP_IdxGE |
2c7c0 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
2c7d0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 72  P_IdxLT );.    r
2c7e0 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  .default_rc = 0;
2c7f0 0a 20 20 7d 0a 20 20 72 2e 61 4d 65 6d 20 3d 20  .  }.  r.aMem = 
2c800 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
2c810 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2c820 42 55 47 0a 20 20 7b 20 69 6e 74 20 69 3b 20 66  BUG.  { int i; f
2c830 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65  or(i=0; i<r.nFie
2c840 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  ld; i++) assert(
2c850 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61   memIsValid(&r.a
2c860 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e  Mem[i]) ); }.#en
2c870 64 69 66 0a 20 20 72 65 73 20 3d 20 30 3b 20 20  dif.  res = 0;  
2c880 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
2c890 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c  Only used to sil
2c8a0 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20  ence a warning. 
2c8b0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2c8c0 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
2c8d0 72 65 28 64 62 2c 20 70 43 2c 20 26 72 2c 20 26  re(db, pC, &r, &
2c8e0 72 65 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20  res);.  assert( 
2c8f0 28 4f 50 5f 49 64 78 4c 45 26 31 29 3d 3d 28 4f  (OP_IdxLE&1)==(O
2c900 50 5f 49 64 78 4c 54 26 31 29 20 26 26 20 28 4f  P_IdxLT&1) && (O
2c910 50 5f 49 64 78 47 45 26 31 29 3d 3d 28 4f 50 5f  P_IdxGE&1)==(OP_
2c920 49 64 78 47 54 26 31 29 20 29 3b 0a 20 20 69 66  IdxGT&1) );.  if
2c930 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 26 31  ( (pOp->opcode&1
2c940 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26 31 29 20  )==(OP_IdxLT&1) 
2c950 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2c960 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2c970 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  dxLE || pOp->opc
2c980 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b  ode==OP_IdxLT );
2c990 0a 20 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b  .    res = -res;
2c9a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2c9b0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2c9c0 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20 70  e==OP_IdxGE || p
2c9d0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2c9e0 64 78 47 54 20 29 3b 0a 20 20 20 20 72 65 73 2b  dxGT );.    res+
2c9f0 2b 3b 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61  +;.  }.  VdbeBra
2ca00 6e 63 68 54 61 6b 65 6e 28 72 65 73 3e 30 2c 32  nchTaken(res>0,2
2ca10 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2ca20 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2ca30 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73  error;.  if( res
2ca40 3e 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  >0 ) goto jump_t
2ca50 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
2ca60 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 73  ../* Opcode: Des
2ca70 74 72 6f 79 20 50 31 20 50 32 20 50 33 20 2a 20  troy P1 P2 P3 * 
2ca80 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  *.**.** Delete a
2ca90 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  n entire databas
2caa0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
2cab0 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65   whose root page
2cac0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2cad0 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69 76 65  .** file is give
2cae0 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54  n by P1..**.** T
2caf0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2cb00 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e 20 74  estroyed is in t
2cb10 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2cb20 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30 2e 20   file if P3==0. 
2cb30 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74 68 65   If.** P3==1 the
2cb40 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  n the table to b
2cb50 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  e clear is in th
2cb60 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
2cb70 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61  base file.** tha
2cb80 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
2cb90 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65  re tables create
2cba0 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45   using CREATE TE
2cbb0 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a  MPORARY TABLE..*
2cbc0 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55  *.** If AUTOVACU
2cbd0 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68  UM is enabled th
2cbe0 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  en it is possibl
2cbf0 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 72  e that another r
2cc00 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  oot page.** migh
2cc10 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20  t be moved into 
2cc20 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65 74 65  the newly delete
2cc30 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 6f  d root page in o
2cc40 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61 6c 6c  rder to keep all
2cc50 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 63  .** root pages c
2cc60 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74 68 65  ontiguous at the
2cc70 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2cc80 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
2cc90 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c 75 65   former.** value
2cca0 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   of the root pag
2ccb0 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d 20 69  e that moved - i
2ccc0 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  ts value before 
2ccd0 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72 72 65  the move occurre
2cce0 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  d -.** is stored
2ccf0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
2cd00 20 49 66 20 6e 6f 20 70 61 67 65 20 6d 6f 76 65   If no page move
2cd10 6d 65 6e 74 20 77 61 73 20 72 65 71 75 69 72 65  ment was require
2cd20 64 20 28 62 65 63 61 75 73 65 20 74 68 65 0a 2a  d (because the.*
2cd30 2a 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  * table being dr
2cd40 6f 70 70 65 64 20 77 61 73 20 61 6c 72 65 61 64  opped was alread
2cd50 79 20 74 68 65 20 6c 61 73 74 20 6f 6e 65 20 69  y the last one i
2cd60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 29 20  n the database) 
2cd70 74 68 65 6e 20 61 20 0a 2a 2a 20 7a 65 72 6f 20  then a .** zero 
2cd80 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
2cd90 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 41 55  ister P2.  If AU
2cda0 54 4f 56 41 43 55 55 4d 20 69 73 20 64 69 73 61  TOVACUUM is disa
2cdb0 62 6c 65 64 20 74 68 65 6e 20 61 20 7a 65 72 6f  bled then a zero
2cdc0 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69   .** is stored i
2cdd0 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
2cde0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
2cdf0 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72   throws an error
2ce00 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2ce10 79 20 61 63 74 69 76 65 20 72 65 61 64 65 72 20  y active reader 
2ce20 56 4d 73 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  VMs when.** it i
2ce30 73 20 69 6e 76 6f 6b 65 64 2e 20 54 68 69 73 20  s invoked. This 
2ce40 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
2ce50 20 74 68 65 20 64 69 66 66 69 63 75 6c 74 79 20   the difficulty 
2ce60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2ce70 0a 2a 2a 20 75 70 64 61 74 69 6e 67 20 65 78 69  .** updating exi
2ce80 73 74 69 6e 67 20 63 75 72 73 6f 72 73 20 77 68  sting cursors wh
2ce90 65 6e 20 61 20 72 6f 6f 74 20 70 61 67 65 20 69  en a root page i
2cea0 73 20 6d 6f 76 65 64 20 69 6e 20 61 6e 20 41 55  s moved in an AU
2ceb0 54 4f 56 41 43 55 55 4d 20 0a 2a 2a 20 64 61 74  TOVACUUM .** dat
2cec0 61 62 61 73 65 2e 20 54 68 69 73 20 65 72 72 6f  abase. This erro
2ced0 72 20 69 73 20 74 68 72 6f 77 6e 20 65 76 65 6e  r is thrown even
2cee0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2cef0 20 69 73 20 6e 6f 74 20 61 6e 20 41 55 54 4f 56   is not an AUTOV
2cf00 41 43 55 55 4d 20 0a 2a 2a 20 64 62 20 69 6e 20  ACUUM .** db in 
2cf10 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 69  order to avoid i
2cf20 6e 74 72 6f 64 75 63 69 6e 67 20 61 6e 20 69 6e  ntroducing an in
2cf30 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 62 65  compatibility be
2cf40 74 77 65 65 6e 20 61 75 74 6f 76 61 63 75 75 6d  tween autovacuum
2cf50 20 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 2d 61 75 74   .** and non-aut
2cf60 6f 76 61 63 75 75 6d 20 6d 6f 64 65 73 2e 0a 2a  ovacuum modes..*
2cf70 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43  *.** See also: C
2cf80 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lear.*/.case OP_
2cf90 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20 20 2f  Destroy: {     /
2cfa0 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20  * out2 */.  int 
2cfb0 69 4d 6f 76 65 64 3b 0a 20 20 69 6e 74 20 69 44  iMoved;.  int iD
2cfc0 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  b;..  assert( p-
2cfd0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
2cfe0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2cff0 31 3e 31 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  1>1 );.  pOut = 
2d000 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
2d010 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e  , pOp);.  pOut->
2d020 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
2d030 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62  ;.  if( db->nVdb
2d040 65 52 65 61 64 20 3e 20 64 62 2d 3e 6e 56 44 65  eRead > db->nVDe
2d050 73 74 72 6f 79 2b 31 20 29 7b 0a 20 20 20 20 72  stroy+1 ){.    r
2d060 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
2d070 44 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  D;.    p->errorA
2d080 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
2d090 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
2d0a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2d0b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 44 62 20   }else{.    iDb 
2d0c0 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61  = pOp->p3;.    a
2d0d0 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73  ssert( DbMaskTes
2d0e0 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
2d0f0 69 44 62 29 20 29 3b 0a 20 20 20 20 69 4d 6f 76  iDb) );.    iMov
2d100 65 64 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  ed = 0;  /* Not 
2d110 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 74 6f  needed.  Only to
2d120 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69   silence a warni
2d130 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
2d140 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
2d150 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 69 44  Table(db->aDb[iD
2d160 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c  b].pBt, pOp->p1,
2d170 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20 20 20 70   &iMoved);.    p
2d180 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
2d190 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  _Int;.    pOut->
2d1a0 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b 0a 20 20  u.i = iMoved;.  
2d1b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2d1c0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2d1d0 6f 72 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  or;.#ifndef SQLI
2d1e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2d1f0 55 4d 0a 20 20 20 20 69 66 28 20 69 4d 6f 76 65  UM.    if( iMove
2d200 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d!=0 ){.      sq
2d210 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
2d220 65 64 28 64 62 2c 20 69 44 62 2c 20 69 4d 6f 76  ed(db, iDb, iMov
2d230 65 64 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20  ed, pOp->p1);.  
2d240 20 20 20 20 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65      /* All OP_De
2d250 73 74 72 6f 79 20 6f 70 65 72 61 74 69 6f 6e 73  stroy operations
2d260 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 73 61   occur on the sa
2d270 6d 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  me btree */.    
2d280 20 20 61 73 73 65 72 74 28 20 72 65 73 65 74 53    assert( resetS
2d290 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 30 20  chemaOnFault==0 
2d2a0 7c 7c 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e  || resetSchemaOn
2d2b0 46 61 75 6c 74 3d 3d 69 44 62 2b 31 20 29 3b 0a  Fault==iDb+1 );.
2d2c0 20 20 20 20 20 20 72 65 73 65 74 53 63 68 65 6d        resetSchem
2d2d0 61 4f 6e 46 61 75 6c 74 20 3d 20 69 44 62 2b 31  aOnFault = iDb+1
2d2e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2d2f0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
2d300 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 65 61 72 20  * Opcode: Clear 
2d310 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44  P1 P2 P3.**.** D
2d320 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e  elete all conten
2d330 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
2d340 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  se table or inde
2d350 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67  x whose root pag
2d360 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
2d370 62 61 73 65 20 66 69 6c 65 20 69 73 20 67 69 76  base file is giv
2d380 65 6e 20 62 79 20 50 31 2e 20 20 42 75 74 2c 20  en by P1.  But, 
2d390 75 6e 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c 20  unlike Destroy, 
2d3a0 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65  do not.** remove
2d3b0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
2d3c0 64 65 78 20 66 72 6f 6d 20 74 68 65 20 64 61 74  dex from the dat
2d3d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2d3e0 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
2d3f0 67 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  g clear is in th
2d400 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2d410 66 69 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20 20  file if P2==0.  
2d420 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65 6e  If.** P2==1 then
2d430 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
2d440 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65   clear is in the
2d450 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2d460 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74  ase file.** that
2d470 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2d480 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65 20  e tables create 
2d490 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d  using CREATE TEM
2d4a0 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a  PORARY TABLE..**
2d4b0 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 76 61  .** If the P3 va
2d4c0 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  lue is non-zero,
2d4d0 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   then the table 
2d4e0 72 65 66 65 72 72 65 64 20 74 6f 20 6d 75 73 74  referred to must
2d4f0 20 62 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79   be an.** intkey
2d500 20 74 61 62 6c 65 20 28 61 6e 20 53 51 4c 20 74   table (an SQL t
2d510 61 62 6c 65 2c 20 6e 6f 74 20 61 6e 20 69 6e 64  able, not an ind
2d520 65 78 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ex). In this cas
2d530 65 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65  e the row change
2d540 20 0a 2a 2a 20 63 6f 75 6e 74 20 69 73 20 69 6e   .** count is in
2d550 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  cremented by the
2d560 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2d570 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  in the table bei
2d580 6e 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2a 20  ng cleared. .** 
2d590 49 66 20 50 33 20 69 73 20 67 72 65 61 74 65 72  If P3 is greater
2d5a0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
2d5b0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
2d5c0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
2d5d0 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63 72   is.** also incr
2d5e0 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e  emented by the n
2d5f0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2d600 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2d610 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
2d620 53 65 65 20 61 6c 73 6f 3a 20 44 65 73 74 72 6f  See also: Destro
2d630 79 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 65  y.*/.case OP_Cle
2d640 61 72 3a 20 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ar: {.  int nCha
2d650 6e 67 65 3b 0a 20 0a 20 20 6e 43 68 61 6e 67 65  nge;. .  nChange
2d660 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2d670 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
2d680 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  ;.  assert( DbMa
2d690 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
2d6a0 61 73 6b 2c 20 70 4f 70 2d 3e 70 32 29 20 29 3b  ask, pOp->p2) );
2d6b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2d6c0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 0a  treeClearTable(.
2d6d0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 4f        db->aDb[pO
2d6e0 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70 2d  p->p2].pBt, pOp-
2d6f0 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33 20 3f 20  >p1, (pOp->p3 ? 
2d700 26 6e 43 68 61 6e 67 65 20 3a 20 30 29 0a 20 20  &nChange : 0).  
2d710 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  );.  if( pOp->p3
2d720 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e   ){.    p->nChan
2d730 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  ge += nChange;. 
2d740 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e 30     if( pOp->p3>0
2d750 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2d760 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
2d770 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a  em[pOp->p3]) );.
2d780 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
2d790 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b  Change(p, &aMem[
2d7a0 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20  pOp->p3]);.     
2d7b0 20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75   aMem[pOp->p3].u
2d7c0 2e 69 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  .i += nChange;. 
2d7d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2d7e0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2d7f0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
2d800 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2d810 64 65 3a 20 52 65 73 65 74 53 6f 72 74 65 72 20  de: ResetSorter 
2d820 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
2d830 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74   Delete all cont
2d840 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 65 70  ents from the ep
2d850 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 72  hemeral table or
2d860 20 73 6f 72 74 65 72 0a 2a 2a 20 74 68 61 74 20   sorter.** that 
2d870 69 73 20 6f 70 65 6e 20 6f 6e 20 63 75 72 73 6f  is open on curso
2d880 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r P1..**.** This
2d890 20 6f 70 63 6f 64 65 20 6f 6e 6c 79 20 77 6f 72   opcode only wor
2d8a0 6b 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20 75  ks for cursors u
2d8b0 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  sed for sorting 
2d8c0 61 6e 64 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69  and.** opened wi
2d8d0 74 68 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  th OP_OpenEpheme
2d8e0 72 61 6c 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72  ral or OP_Sorter
2d8f0 4f 70 65 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Open..*/.case OP
2d900 5f 52 65 73 65 74 53 6f 72 74 65 72 3a 20 7b 0a  _ResetSorter: {.
2d910 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2d920 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 70 4f  ;. .  assert( pO
2d930 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2d940 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
2d950 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
2d960 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2d970 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
2d980 20 69 66 28 20 69 73 53 6f 72 74 65 72 28 70 43   if( isSorter(pC
2d990 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2d9a0 56 64 62 65 53 6f 72 74 65 72 52 65 73 65 74 28  VdbeSorterReset(
2d9b0 64 62 2c 20 70 43 2d 3e 75 63 2e 70 53 6f 72 74  db, pC->uc.pSort
2d9c0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
2d9d0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
2d9e0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
2d9f0 42 54 52 45 45 20 29 3b 0a 20 20 20 20 61 73 73  BTREE );.    ass
2da00 65 72 74 28 20 70 43 2d 3e 69 73 45 70 68 65 6d  ert( pC->isEphem
2da10 65 72 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  eral );.    rc =
2da20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2da30 61 72 54 61 62 6c 65 4f 66 43 75 72 73 6f 72 28  arTableOfCursor(
2da40 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  pC->uc.pCursor);
2da50 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2da60 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2da70 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72 65  error;.  }.  bre
2da80 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2da90 3a 20 43 72 65 61 74 65 42 74 72 65 65 20 50 31  : CreateBtree P1
2daa0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
2dab0 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f  nopsis: r[P2]=ro
2dac0 6f 74 20 69 44 62 3d 50 31 20 66 6c 61 67 73 3d  ot iDb=P1 flags=
2dad0 50 33 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  P3.**.** Allocat
2dae0 65 20 61 20 6e 65 77 20 62 2d 74 72 65 65 20 69  e a new b-tree i
2daf0 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
2db00 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d  ase file if P1==
2db10 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 54  0 or in the.** T
2db20 45 4d 50 20 64 61 74 61 62 61 73 65 20 66 69 6c  EMP database fil
2db30 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e  e if P1==1 or in
2db40 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
2db50 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31  abase if.** P1>1
2db60 2e 20 20 54 68 65 20 50 33 20 61 72 67 75 6d 65  .  The P3 argume
2db70 6e 74 20 6d 75 73 74 20 62 65 20 31 20 28 42 54  nt must be 1 (BT
2db80 52 45 45 5f 49 4e 54 4b 45 59 29 20 66 6f 72 20  REE_INTKEY) for 
2db90 61 20 72 6f 77 69 64 20 74 61 62 6c 65 0a 2a 2a  a rowid table.**
2dba0 20 69 74 20 6d 75 73 74 20 62 65 20 32 20 28 42   it must be 2 (B
2dbb0 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 20 66 6f  TREE_BLOBKEY) fo
2dbc0 72 20 61 20 69 6e 64 65 78 20 6f 72 20 57 49 54  r a index or WIT
2dbd0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
2dbe0 2e 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61  ..** The root pa
2dbf0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2dc00 20 6e 65 77 20 62 2d 74 72 65 65 20 69 73 20 73   new b-tree is s
2dc10 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
2dc20 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
2dc30 5f 43 72 65 61 74 65 42 74 72 65 65 3a 20 7b 20  _CreateBtree: { 
2dc40 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
2dc50 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a   */.  int pgno;.
2dc60 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 70 4f    Db *pDb;..  pO
2dc70 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
2dc80 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
2dc90 67 6e 6f 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  gno = 0;.  asser
2dca0 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45  t( pOp->p3==BTRE
2dcb0 45 5f 49 4e 54 4b 45 59 20 7c 7c 20 70 4f 70 2d  E_INTKEY || pOp-
2dcc0 3e 70 33 3d 3d 42 54 52 45 45 5f 42 4c 4f 42 4b  >p3==BTREE_BLOBK
2dcd0 45 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EY );.  assert( 
2dce0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2dcf0 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
2dd00 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
2dd10 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61  kTest(p->btreeMa
2dd20 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a  sk, pOp->p1) );.
2dd30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
2dd40 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44  dOnly==0 );.  pD
2dd50 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70  b = &db->aDb[pOp
2dd60 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2dd70 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a   pDb->pBt!=0 );.
2dd80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2dd90 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
2dda0 44 62 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20  Db->pBt, &pgno, 
2ddb0 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 69 66 28 20  pOp->p3);.  if( 
2ddc0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2ddd0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2dde0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f  pOut->u.i = pgno
2ddf0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2de00 20 4f 70 63 6f 64 65 3a 20 53 71 6c 45 78 65 63   Opcode: SqlExec
2de10 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
2de20 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74  * Run the SQL st
2de30 61 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74 65  atement or state
2de40 6d 65 6e 74 73 20 73 70 65 63 69 66 69 65 64 20  ments specified 
2de50 69 6e 20 74 68 65 20 50 34 20 73 74 72 69 6e 67  in the P4 string
2de60 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 71 6c  ..*/.case OP_Sql
2de70 45 78 65 63 3a 20 7b 0a 20 20 64 62 2d 3e 6e 53  Exec: {.  db->nS
2de80 71 6c 45 78 65 63 2b 2b 3b 0a 20 20 72 63 20 3d  qlExec++;.  rc =
2de90 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
2dea0 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 30 2c 20  , pOp->p4.z, 0, 
2deb0 30 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 6e 53 71  0, 0);.  db->nSq
2dec0 6c 45 78 65 63 2d 2d 3b 0a 20 20 69 66 28 20 72  lExec--;.  if( r
2ded0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2dee0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
2def0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2df00 64 65 3a 20 50 61 72 73 65 53 63 68 65 6d 61 20  de: ParseSchema 
2df10 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2df20 2a 20 52 65 61 64 20 61 6e 64 20 70 61 72 73 65  * Read and parse
2df30 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 66 72 6f   all entries fro
2df40 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
2df50 54 45 52 20 74 61 62 6c 65 20 6f 66 20 64 61 74  TER table of dat
2df60 61 62 61 73 65 20 50 31 0a 2a 2a 20 74 68 61 74  abase P1.** that
2df70 20 6d 61 74 63 68 20 74 68 65 20 57 48 45 52 45   match the WHERE
2df80 20 63 6c 61 75 73 65 20 50 34 2e 20 0a 2a 2a 0a   clause P4. .**.
2df90 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
2dfa0 6e 76 6f 6b 65 73 20 74 68 65 20 70 61 72 73 65  nvokes the parse
2dfb0 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
2dfc0 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  w virtual machin
2dfd0 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 75 6e 73 20  e,.** then runs 
2dfe0 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20  the new virtual 
2dff0 6d 61 63 68 69 6e 65 2e 20 20 49 74 20 69 73 20  machine.  It is 
2e000 74 68 75 73 20 61 20 72 65 2d 65 6e 74 72 61 6e  thus a re-entran
2e010 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73  t opcode..*/.cas
2e020 65 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  e OP_ParseSchema
2e030 3a 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  : {.  int iDb;. 
2e040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
2e050 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 53  ster;.  char *zS
2e060 71 6c 3b 0a 20 20 49 6e 69 74 44 61 74 61 20 69  ql;.  InitData i
2e070 6e 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a 20 41  nitData;..  /* A
2e080 6e 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ny prepared stat
2e090 65 6d 65 6e 74 20 74 68 61 74 20 69 6e 76 6f 6b  ement that invok
2e0a0 65 73 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77  es this opcode w
2e0b0 69 6c 6c 20 68 6f 6c 64 20 6d 75 74 65 78 65 73  ill hold mutexes
2e0c0 0a 20 20 2a 2a 20 6f 6e 20 65 76 65 72 79 20 62  .  ** on every b
2e0d0 74 72 65 65 2e 20 20 54 68 69 73 20 69 73 20 61  tree.  This is a
2e0e0 20 70 72 65 72 65 71 75 69 73 69 74 65 20 66 6f   prerequisite fo
2e0f0 72 20 69 6e 76 6f 6b 69 6e 67 20 0a 20 20 2a 2a  r invoking .  **
2e100 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c   sqlite3InitCall
2e110 62 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a 23 69 66  back()..  */.#if
2e120 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2e130 0a 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44  .  for(iDb=0; iD
2e140 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
2e150 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
2e160 44 62 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33  Db==1 || sqlite3
2e170 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2e180 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
2e190 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ) );.  }.#endif.
2e1a0 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31  .  iDb = pOp->p1
2e1b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
2e1c0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
2e1d0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44  b );.  assert( D
2e1e0 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
2e1f0 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c   iDb, DB_SchemaL
2e200 6f 61 64 65 64 29 20 29 3b 0a 20 20 2f 2a 20 55  oaded) );.  /* U
2e210 73 65 64 20 74 6f 20 62 65 20 61 20 63 6f 6e 64  sed to be a cond
2e220 69 74 69 6f 6e 61 6c 20 2a 2f 20 7b 0a 20 20 20  itional */ {.   
2e230 20 7a 4d 61 73 74 65 72 20 3d 20 4d 41 53 54 45   zMaster = MASTE
2e240 52 5f 4e 41 4d 45 3b 0a 20 20 20 20 69 6e 69 74  R_NAME;.    init
2e250 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20  Data.db = db;.  
2e260 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20 3d    initData.iDb =
2e270 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69 6e   pOp->p1;.    in
2e280 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20  itData.pzErrMsg 
2e290 3d 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20  = &p->zErrMsg;. 
2e2a0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2e2b0 33 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20 20 20  3MPrintf(db,.   
2e2c0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
2e2d0 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20  , rootpage, sql 
2e2e0 46 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48 45  FROM '%q'.%s WHE
2e2f0 52 45 20 25 73 20 4f 52 44 45 52 20 42 59 20 72  RE %s ORDER BY r
2e300 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 64 62  owid",.       db
2e310 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
2e320 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4f  ame, zMaster, pO
2e330 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66  p->p4.z);.    if
2e340 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
2e350 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2e360 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2e370 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2e380 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  rt( db->init.bus
2e390 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 64 62  y==0 );.      db
2e3a0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 31 3b  ->init.busy = 1;
2e3b0 0a 20 20 20 20 20 20 69 6e 69 74 44 61 74 61 2e  .      initData.
2e3c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e3d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
2e3e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2e3f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
2e400 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
2e410 53 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69 74  Sql, sqlite3Init
2e420 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44  Callback, &initD
2e430 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ata, 0);.      i
2e440 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e450 20 29 20 72 63 20 3d 20 69 6e 69 74 44 61 74 61   ) rc = initData
2e460 2e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  .rc;.      sqlit
2e470 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 7a  e3DbFreeNN(db, z
2e480 53 71 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Sql);.      db->
2e490 69 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20  init.busy = 0;. 
2e4a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2e4b0 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
2e4c0 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
2e4d0 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
2e4e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e4f0 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
2e500 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
2e510 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 61      }.    goto a
2e520 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2e530 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20  r;.  }.  break; 
2e540 20 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   .}..#if !define
2e550 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  d(SQLITE_OMIT_AN
2e560 41 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64 65  ALYZE)./* Opcode
2e570 3a 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20 50  : LoadAnalysis P
2e580 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
2e590 52 65 61 64 20 74 68 65 20 73 71 6c 69 74 65 5f  Read the sqlite_
2e5a0 73 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72 20  stat1 table for 
2e5b0 64 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20  database P1 and 
2e5c0 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  load the content
2e5d0 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c  .** of that tabl
2e5e0 65 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72  e into the inter
2e5f0 6e 61 6c 20 69 6e 64 65 78 20 68 61 73 68 20 74  nal index hash t
2e600 61 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  able.  This will
2e610 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e   cause.** the an
2e620 61 6c 79 73 69 73 20 74 6f 20 62 65 20 75 73 65  alysis to be use
2e630 64 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67  d when preparing
2e640 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
2e650 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65  queries..*/.case
2e660 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73   OP_LoadAnalysis
2e670 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  : {.  assert( pO
2e680 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2e690 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
2e6a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e 61   rc = sqlite3Ana
2e6b0 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 70 4f  lysisLoad(db, pO
2e6c0 70 2d 3e 70 31 29 3b 0a 20 20 69 66 28 20 72 63  p->p1);.  if( rc
2e6d0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2e6e0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
2e6f0 65 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  eak;  .}.#endif 
2e700 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
2e710 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29  TE_OMIT_ANALYZE)
2e720 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20   */../* Opcode: 
2e730 44 72 6f 70 54 61 62 6c 65 20 50 31 20 2a 20 2a  DropTable P1 * *
2e740 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f   P4 *.**.** Remo
2e750 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ve the internal 
2e760 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61  (in-memory) data
2e770 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
2e780 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65   describe.** the
2e790 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 50 34 20   table named P4 
2e7a0 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  in database P1. 
2e7b0 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
2e7c0 61 66 74 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a  after a table.**
2e7d0 20 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   is dropped from
2e7e0 20 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65   disk (using the
2e7f0 20 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29   Destroy opcode)
2e800 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
2e810 70 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e  p .** the intern
2e820 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
2e830 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65  n of the.** sche
2e840 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69  ma consistent wi
2e850 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
2e860 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  sk..*/.case OP_D
2e870 72 6f 70 54 61 62 6c 65 3a 20 7b 0a 20 20 73 71  ropTable: {.  sq
2e880 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
2e890 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 4f  leteTable(db, pO
2e8a0 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a  p->p1, pOp->p4.z
2e8b0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
2e8c0 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 49 6e  * Opcode: DropIn
2e8d0 64 65 78 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  dex P1 * * P4 *.
2e8e0 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
2e8f0 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65   internal (in-me
2e900 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63  mory) data struc
2e910 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
2e920 69 62 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  ibe.** the index
2e930 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74   named P4 in dat
2e940 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20  abase P1.  This 
2e950 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2e960 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 64  an index.** is d
2e970 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b  ropped from disk
2e980 20 28 75 73 69 6e 67 20 74 68 65 20 44 65 73 74   (using the Dest
2e990 72 6f 79 20 6f 70 63 6f 64 65 29 0a 2a 2a 20 69  roy opcode).** i
2e9a0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
2e9b0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
2e9c0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2e9d0 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e  he.** schema con
2e9e0 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61  sistent with wha
2e9f0 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  t is on disk..*/
2ea00 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 49 6e 64  .case OP_DropInd
2ea10 65 78 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55  ex: {.  sqlite3U
2ea20 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
2ea30 64 65 78 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  dex(db, pOp->p1,
2ea40 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62   pOp->p4.z);.  b
2ea50 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2ea60 64 65 3a 20 44 72 6f 70 54 72 69 67 67 65 72 20  de: DropTrigger 
2ea70 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
2ea80 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74  * Remove the int
2ea90 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79  ernal (in-memory
2eaa0 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  ) data structure
2eab0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a  s that describe.
2eac0 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 6e  ** the trigger n
2ead0 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61 62  amed P4 in datab
2eae0 61 73 65 20 50 31 2e 20 20 54 68 69 73 20 69 73  ase P1.  This is
2eaf0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
2eb00 74 72 69 67 67 65 72 0a 2a 2a 20 69 73 20 64 72  trigger.** is dr
2eb10 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20  opped from disk 
2eb20 28 75 73 69 6e 67 20 74 68 65 20 44 65 73 74 72  (using the Destr
2eb30 6f 79 20 6f 70 63 6f 64 65 29 20 69 6e 20 6f 72  oy opcode) in or
2eb40 64 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a 2a 20  der to keep .** 
2eb50 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
2eb60 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2eb70 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e  he.** schema con
2eb80 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61  sistent with wha
2eb90 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  t is on disk..*/
2eba0 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 72 69  .case OP_DropTri
2ebb0 67 67 65 72 3a 20 7b 0a 20 20 73 71 6c 69 74 65  gger: {.  sqlite
2ebc0 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
2ebd0 54 72 69 67 67 65 72 28 64 62 2c 20 70 4f 70 2d  Trigger(db, pOp-
2ebe0 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
2ebf0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69  .  break;.}...#i
2ec00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ec10 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2ec20 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74  K./* Opcode: Int
2ec30 65 67 72 69 74 79 43 6b 20 50 31 20 50 32 20 50  egrityCk P1 P2 P
2ec40 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f  3 P4 P5.**.** Do
2ec50 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
2ec60 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
2ec70 65 6e 20 64 61 74 61 62 61 73 65 2e 20 20 53 74  en database.  St
2ec80 6f 72 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  ore in.** regist
2ec90 65 72 20 50 31 20 74 68 65 20 74 65 78 74 20 6f  er P1 the text o
2eca0 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  f an error messa
2ecb0 67 65 20 64 65 73 63 72 69 62 69 6e 67 20 61 6e  ge describing an
2ecc0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49  y problems..** I
2ecd0 66 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72  f no problems ar
2ece0 65 20 66 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61  e found, store a
2ecf0 20 4e 55 4c 4c 20 69 6e 20 72 65 67 69 73 74 65   NULL in registe
2ed00 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  r P1..**.** The 
2ed10 72 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74  register P3 cont
2ed20 61 69 6e 73 20 6f 6e 65 20 6c 65 73 73 20 74 68  ains one less th
2ed30 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  an the maximum n
2ed40 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65 64  umber of allowed
2ed50 20 65 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d   errors..** At m
2ed60 6f 73 74 20 72 65 67 28 50 33 29 20 65 72 72 6f  ost reg(P3) erro
2ed70 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  rs will be repor
2ed80 74 65 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ted..** In other
2ed90 20 77 6f 72 64 73 2c 20 74 68 65 20 61 6e 61 6c   words, the anal
2eda0 79 73 69 73 20 73 74 6f 70 73 20 61 73 20 73 6f  ysis stops as so
2edb0 6f 6e 20 61 73 20 72 65 67 28 50 31 29 20 65 72  on as reg(P1) er
2edc0 72 6f 72 73 20 61 72 65 20 0a 2a 2a 20 73 65 65  rors are .** see
2edd0 6e 2e 20 20 52 65 67 28 50 31 29 20 69 73 20 75  n.  Reg(P1) is u
2ede0 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
2edf0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
2ee00 20 72 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a   remaining..**.*
2ee10 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
2ee20 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20 74  numbers of all t
2ee30 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74  ables in the dat
2ee40 61 62 61 73 65 20 61 72 65 20 69 6e 74 65 67 65  abase are intege
2ee50 72 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  rs.** stored in 
2ee60 50 34 5f 49 4e 54 41 52 52 41 59 20 61 72 67 75  P4_INTARRAY argu
2ee70 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  ment..**.** If P
2ee80 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  5 is not zero, t
2ee90 68 65 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65  he check is done
2eea0 20 6f 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   on the auxiliar
2eeb0 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
2eec0 6c 65 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e  le, not the main
2eed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2eee0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
2eef0 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
2ef00 6c 65 6d 65 6e 74 20 74 68 65 20 69 6e 74 65 67  lement the integ
2ef10 72 69 74 79 5f 63 68 65 63 6b 20 70 72 61 67 6d  rity_check pragm
2ef20 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  a..*/.case OP_In
2ef30 74 65 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69  tegrityCk: {.  i
2ef40 6e 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f  nt nRoot;      /
2ef50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  * Number of tabl
2ef60 65 73 20 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e  es to check.  (N
2ef70 75 6d 62 65 72 20 6f 66 20 72 6f 6f 74 20 70 61  umber of root pa
2ef80 67 65 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a  ges.) */.  int *
2ef90 61 52 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72  aRoot;     /* Ar
2efa0 72 61 79 20 6f 66 20 72 6f 6f 74 70 61 67 65 20  ray of rootpage 
2efb0 6e 75 6d 62 65 72 73 20 66 6f 72 20 74 61 62 6c  numbers for tabl
2efc0 65 73 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  es to be checked
2efd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20   */.  int nErr; 
2efe0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2eff0 6f 66 20 65 72 72 6f 72 73 20 72 65 70 6f 72 74  of errors report
2f000 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
2f010 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
2f020 6f 66 20 74 68 65 20 65 72 72 6f 72 20 72 65 70  of the error rep
2f030 6f 72 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e  ort */.  Mem *pn
2f040 45 72 72 3b 20 20 20 20 20 2f 2a 20 52 65 67 69  Err;     /* Regi
2f050 73 74 65 72 20 6b 65 65 70 69 6e 67 20 74 72 61  ster keeping tra
2f060 63 6b 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d  ck of errors rem
2f070 61 69 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  aining */..  ass
2f080 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
2f090 72 20 29 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20 70  r );.  nRoot = p
2f0a0 4f 70 2d 3e 70 32 3b 0a 20 20 61 52 6f 6f 74 20  Op->p2;.  aRoot 
2f0b0 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20  = pOp->p4.ai;.  
2f0c0 61 73 73 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20  assert( nRoot>0 
2f0d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52 6f  );.  assert( aRo
2f0e0 6f 74 5b 30 5d 3d 3d 6e 52 6f 6f 74 20 29 3b 0a  ot[0]==nRoot );.
2f0f0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2f100 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d  3>0 && pOp->p3<=
2f110 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
2f120 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 6e  nCursor) );.  pn
2f130 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Err = &aMem[pOp-
2f140 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
2f150 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20  (pnErr->flags & 
2f160 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20  MEM_Int)!=0 );. 
2f170 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72 2d   assert( (pnErr-
2f180 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74  >flags & (MEM_St
2f190 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  r|MEM_Blob))==0 
2f1a0 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  );.  pIn1 = &aMe
2f1b0 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
2f1c0 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62  sert( pOp->p5<db
2f1d0 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
2f1e0 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
2f1f0 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d  >btreeMask, pOp-
2f200 3e 70 35 29 20 29 3b 0a 20 20 7a 20 3d 20 73 71  >p5) );.  z = sq
2f210 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72  lite3BtreeIntegr
2f220 69 74 79 43 68 65 63 6b 28 64 62 2d 3e 61 44 62  ityCheck(db->aDb
2f230 5b 70 4f 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 26  [pOp->p5].pBt, &
2f240 61 52 6f 6f 74 5b 31 5d 2c 20 6e 52 6f 6f 74 2c  aRoot[1], nRoot,
2f250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f270 20 20 28 69 6e 74 29 70 6e 45 72 72 2d 3e 75 2e    (int)pnErr->u.
2f280 69 2b 31 2c 20 26 6e 45 72 72 29 3b 0a 20 20 73  i+1, &nErr);.  s
2f290 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
2f2a0 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69 66  Null(pIn1);.  if
2f2b0 28 20 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ( nErr==0 ){.   
2f2c0 20 61 73 73 65 72 74 28 20 7a 3d 3d 30 20 29 3b   assert( z==0 );
2f2d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d 3d  .  }else if( z==
2f2e0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  0 ){.    goto no
2f2f0 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _mem;.  }else{. 
2f300 20 20 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d     pnErr->u.i -=
2f310 20 6e 45 72 72 2d 31 3b 0a 20 20 20 20 73 71 6c   nErr-1;.    sql
2f320 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
2f330 72 28 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53  r(pIn1, z, -1, S
2f340 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69  QLITE_UTF8, sqli
2f350 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20  te3_free);.  }. 
2f360 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
2f370 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71  SIZE(pIn1);.  sq
2f380 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
2f390 6e 63 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e  ncoding(pIn1, en
2f3a0 63 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b  coding);.  break
2f3b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2f3c0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
2f3d0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a  ITY_CHECK */../*
2f3e0 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41   Opcode: RowSetA
2f3f0 64 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  dd P1 P2 * * *.*
2f400 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 77 73  * Synopsis: rows
2f410 65 74 28 50 31 29 3d 72 5b 50 32 5d 0a 2a 2a 0a  et(P1)=r[P2].**.
2f420 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69 6e  ** Insert the in
2f430 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64  teger value held
2f440 20 62 79 20 72 65 67 69 73 74 65 72 20 50 32 20   by register P2 
2f450 69 6e 74 6f 20 61 20 52 6f 77 53 65 74 20 6f 62  into a RowSet ob
2f460 6a 65 63 74 0a 2a 2a 20 68 65 6c 64 20 69 6e 20  ject.** held in 
2f470 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a  register P1..**.
2f480 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  ** An assertion 
2f490 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 20 6e  fails if P2 is n
2f4a0 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  ot an integer..*
2f4b0 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
2f4c0 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  Add: {       /* 
2f4d0 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49  in1, in2 */.  pI
2f4e0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
2f4f0 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  p1];.  pIn2 = &a
2f500 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
2f510 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66  assert( (pIn2->f
2f520 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
2f530 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  =0 );.  if( (pIn
2f540 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
2f550 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20  owSet)==0 ){.   
2f560 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2f570 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a  etRowSet(pIn1);.
2f580 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
2f590 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
2f5a0 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  t)==0 ) goto no_
2f5b0 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  mem;.  }.  sqlit
2f5c0 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70  e3RowSetInsert(p
2f5d0 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
2f5e0 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72  pIn2->u.i);.  br
2f5f0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2f600 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50 31  e: RowSetRead P1
2f610 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
2f620 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 6f  nopsis: r[P3]=ro
2f630 77 73 65 74 28 50 31 29 0a 2a 2a 0a 2a 2a 20 45  wset(P1).**.** E
2f640 78 74 72 61 63 74 20 74 68 65 20 73 6d 61 6c 6c  xtract the small
2f650 65 73 74 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  est value from t
2f660 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  he RowSet object
2f670 20 69 6e 20 50 31 0a 2a 2a 20 61 6e 64 20 70 75   in P1.** and pu
2f680 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 74  t that value int
2f690 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
2f6a0 2a 20 4f 72 2c 20 69 66 20 52 6f 77 53 65 74 20  * Or, if RowSet 
2f6b0 6f 62 6a 65 63 74 20 50 31 20 69 73 20 69 6e 69  object P1 is ini
2f6c0 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20 6c 65  tially empty, le
2f6d0 61 76 65 20 50 33 0a 2a 2a 20 75 6e 63 68 61 6e  ave P3.** unchan
2f6e0 67 65 64 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  ged and jump to 
2f6f0 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a  instruction P2..
2f700 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65  */.case OP_RowSe
2f710 74 52 65 61 64 3a 20 7b 20 20 20 20 20 20 20 2f  tRead: {       /
2f720 2a 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 6f 75 74  * jump, in1, out
2f730 33 20 2a 2f 0a 20 20 69 36 34 20 76 61 6c 3b 0a  3 */.  i64 val;.
2f740 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
2f750 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
2f760 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
2f770 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 0a 20  EM_RowSet)==0 . 
2f780 20 20 7c 7c 20 73 71 6c 69 74 65 33 52 6f 77 53    || sqlite3RowS
2f790 65 74 4e 65 78 74 28 70 49 6e 31 2d 3e 75 2e 70  etNext(pIn1->u.p
2f7a0 52 6f 77 53 65 74 2c 20 26 76 61 6c 29 3d 3d 30  RowSet, &val)==0
2f7b0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  .  ){.    /* The
2f7c0 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 69   boolean index i
2f7d0 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 73  s empty */.    s
2f7e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
2f7f0 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 20 20  Null(pIn1);.    
2f800 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
2f810 31 2c 32 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6a  1,2);.    goto j
2f820 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68  ump_to_p2_and_ch
2f830 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
2f840 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
2f850 2f 2a 20 41 20 76 61 6c 75 65 20 77 61 73 20 70  /* A value was p
2f860 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 69  ulled from the i
2f870 6e 64 65 78 20 2a 2f 0a 20 20 20 20 56 64 62 65  ndex */.    Vdbe
2f880 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c 32 29  BranchTaken(0,2)
2f890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2f8a0 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d  eMemSetInt64(&aM
2f8b0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2c 20 76 61 6c  em[pOp->p3], val
2f8c0 29 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 63 68  );.  }.  goto ch
2f8d0 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
2f8e0 74 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  t;.}../* Opcode:
2f8f0 20 52 6f 77 53 65 74 54 65 73 74 20 50 31 20 50   RowSetTest P1 P
2f900 32 20 50 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70  2 P3 P4.** Synop
2f910 73 69 73 3a 20 69 66 20 72 5b 50 33 5d 20 69 6e  sis: if r[P3] in
2f920 20 72 6f 77 73 65 74 28 50 31 29 20 67 6f 74 6f   rowset(P1) goto
2f930 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74   P2.**.** Regist
2f940 65 72 20 50 33 20 69 73 20 61 73 73 75 6d 65 64  er P3 is assumed
2f950 20 74 6f 20 68 6f 6c 64 20 61 20 36 34 2d 62 69   to hold a 64-bi
2f960 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  t integer value.
2f970 20 49 66 20 72 65 67 69 73 74 65 72 20 50 31 0a   If register P1.
2f980 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 52 6f  ** contains a Ro
2f990 77 53 65 74 20 6f 62 6a 65 63 74 20 61 6e 64 20  wSet object and 
2f9a0 74 68 61 74 20 52 6f 77 53 65 74 20 6f 62 6a 65  that RowSet obje
2f9b0 63 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ct contains.** t
2f9c0 68 65 20 76 61 6c 75 65 20 68 65 6c 64 20 69 6e  he value held in
2f9d0 20 50 33 2c 20 6a 75 6d 70 20 74 6f 20 72 65 67   P3, jump to reg
2f9e0 69 73 74 65 72 20 50 32 2e 20 4f 74 68 65 72 77  ister P2. Otherw
2f9f0 69 73 65 2c 20 69 6e 73 65 72 74 20 74 68 65 0a  ise, insert the.
2fa00 2a 2a 20 69 6e 74 65 67 65 72 20 69 6e 20 50 33  ** integer in P3
2fa10 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
2fa20 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 6f 6e   and continue on
2fa30 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20   to the.** next 
2fa40 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  opcode..**.** Th
2fa50 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  e RowSet object 
2fa60 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72  is optimized for
2fa70 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
2fa80 73 65 74 73 20 6f 66 20 69 6e 74 65 67 65 72 73  sets of integers
2fa90 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
2faa0 20 69 6e 20 64 69 73 74 69 6e 63 74 20 70 68 61   in distinct pha
2fab0 73 65 73 2c 20 77 68 69 63 68 20 65 61 63 68 20  ses, which each 
2fac0 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  set contains no 
2fad0 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 45  duplicates..** E
2fae0 61 63 68 20 73 65 74 20 69 73 20 69 64 65 6e 74  ach set is ident
2faf0 69 66 69 65 64 20 62 79 20 61 20 75 6e 69 71 75  ified by a uniqu
2fb00 65 20 50 34 20 76 61 6c 75 65 2e 20 54 68 65 20  e P4 value. The 
2fb10 66 69 72 73 74 20 73 65 74 0a 2a 2a 20 6d 75 73  first set.** mus
2fb20 74 20 68 61 76 65 20 50 34 3d 3d 30 2c 20 74 68  t have P4==0, th
2fb30 65 20 66 69 6e 61 6c 20 73 65 74 20 6d 75 73 74  e final set must
2fb40 20 68 61 76 65 20 50 34 3d 3d 2d 31 2c 20 61 6e   have P4==-1, an
2fb50 64 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20  d for all other 
2fb60 73 65 74 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  sets.** must hav
2fb70 65 20 50 34 3e 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  e P4>0..**.** Th
2fb80 69 73 20 61 6c 6c 6f 77 73 20 6f 70 74 69 6d 69  is allows optimi
2fb90 7a 61 74 69 6f 6e 73 3a 20 28 61 29 20 77 68 65  zations: (a) whe
2fba0 6e 20 50 34 3d 3d 30 20 74 68 65 72 65 20 69 73  n P4==0 there is
2fbb0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
2fbc0 0a 2a 2a 20 74 68 65 20 52 6f 77 53 65 74 20 6f  .** the RowSet o
2fbd0 62 6a 65 63 74 20 66 6f 72 20 50 33 2c 20 61 73  bject for P3, as
2fbe0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2fbf0 64 20 6e 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e  d not to contain
2fc00 20 69 74 2c 0a 2a 2a 20 28 62 29 20 77 68 65 6e   it,.** (b) when
2fc10 20 50 34 3d 3d 2d 31 20 74 68 65 72 65 20 69 73   P4==-1 there is
2fc20 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 73 65   no need to inse
2fc30 72 74 20 74 68 65 20 76 61 6c 75 65 2c 20 61 73  rt the value, as
2fc40 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65   it will.** neve
2fc50 72 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 2c  r be tested for,
2fc60 20 61 6e 64 20 28 63 29 20 77 68 65 6e 20 61 20   and (c) when a 
2fc70 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 70 61  value that is pa
2fc80 72 74 20 6f 66 20 73 65 74 20 58 20 69 73 0a 2a  rt of set X is.*
2fc90 2a 20 69 6e 73 65 72 74 65 64 2c 20 74 68 65 72  * inserted, ther
2fca0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
2fcb0 73 65 61 72 63 68 20 74 6f 20 73 65 65 20 69 66  search to see if
2fcc0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
2fcd0 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
2fce0 79 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  y inserted as pa
2fcf0 72 74 20 6f 66 20 73 65 74 20 58 20 28 6f 6e 6c  rt of set X (onl
2fd00 79 20 69 66 20 69 74 20 77 61 73 20 70 72 65 76  y if it was prev
2fd10 69 6f 75 73 6c 79 0a 2a 2a 20 69 6e 73 65 72 74  iously.** insert
2fd20 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 6f  ed as part of so
2fd30 6d 65 20 6f 74 68 65 72 20 73 65 74 29 2e 0a 2a  me other set)..*
2fd40 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
2fd50 54 65 73 74 3a 20 7b 20 20 20 20 20 20 20 20 20  Test: {         
2fd60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
2fd70 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
2fd80 0a 20 20 69 6e 74 20 69 53 65 74 3b 0a 20 20 69  .  int iSet;.  i
2fd90 6e 74 20 65 78 69 73 74 73 3b 0a 0a 20 20 70 49  nt exists;..  pI
2fda0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
2fdb0 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61  p1];.  pIn3 = &a
2fdc0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
2fdd0 69 53 65 74 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  iSet = pOp->p4.i
2fde0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 33  ;.  assert( pIn3
2fdf0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
2fe00 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
2fe10 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74  e is anything ot
2fe20 68 65 72 20 74 68 61 6e 20 61 20 72 6f 77 73 65  her than a rowse
2fe30 74 20 6f 62 6a 65 63 74 20 69 6e 20 6d 65 6d 6f  t object in memo
2fe40 72 79 20 63 65 6c 6c 20 50 31 2c 0a 20 20 2a 2a  ry cell P1,.  **
2fe50 20 64 65 6c 65 74 65 20 69 74 20 6e 6f 77 20 61   delete it now a
2fe60 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 50 31  nd initialize P1
2fe70 20 77 69 74 68 20 61 6e 20 65 6d 70 74 79 20 72   with an empty r
2fe80 6f 77 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28  owset.  */.  if(
2fe90 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
2fea0 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
2feb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2fec0 65 4d 65 6d 53 65 74 52 6f 77 53 65 74 28 70 49  eMemSetRowSet(pI
2fed0 6e 31 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49  n1);.    if( (pI
2fee0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
2fef0 52 6f 77 53 65 74 29 3d 3d 30 20 29 20 67 6f 74  RowSet)==0 ) got
2ff00 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20  o no_mem;.  }.. 
2ff10 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
2ff20 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
2ff30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 65 74  ;.  assert( iSet
2ff40 3d 3d 2d 31 20 7c 7c 20 69 53 65 74 3e 3d 30 20  ==-1 || iSet>=0 
2ff50 29 3b 0a 20 20 69 66 28 20 69 53 65 74 20 29 7b  );.  if( iSet ){
2ff60 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 73 71  .    exists = sq
2ff70 6c 69 74 65 33 52 6f 77 53 65 74 54 65 73 74 28  lite3RowSetTest(
2ff80 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
2ff90 20 69 53 65 74 2c 20 70 49 6e 33 2d 3e 75 2e 69   iSet, pIn3->u.i
2ffa0 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  );.    VdbeBranc
2ffb0 68 54 61 6b 65 6e 28 65 78 69 73 74 73 21 3d 30  hTaken(exists!=0
2ffc0 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 65 78 69  ,2);.    if( exi
2ffd0 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  sts ) goto jump_
2ffe0 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28  to_p2;.  }.  if(
2fff0 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20   iSet>=0 ){.    
30000 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e 73  sqlite3RowSetIns
30010 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77  ert(pIn1->u.pRow
30020 53 65 74 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b  Set, pIn3->u.i);
30030 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
30040 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30050 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f  _OMIT_TRIGGER../
30060 2a 20 4f 70 63 6f 64 65 3a 20 50 72 6f 67 72 61  * Opcode: Progra
30070 6d 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  m P1 P2 P3 P4 P5
30080 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  .**.** Execute t
30090 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  he trigger progr
300a0 61 6d 20 70 61 73 73 65 64 20 61 73 20 50 34 20  am passed as P4 
300b0 28 74 79 70 65 20 50 34 5f 53 55 42 50 52 4f 47  (type P4_SUBPROG
300c0 52 41 4d 29 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20  RAM). .**.** P1 
300d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64  contains the add
300e0 72 65 73 73 20 6f 66 20 74 68 65 20 6d 65 6d 6f  ress of the memo
300f0 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e  ry cell that con
30100 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20  tains the first 
30110 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
30120 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 76  in an array of v
30130 61 6c 75 65 73 20 75 73 65 64 20 61 73 20 61 72  alues used as ar
30140 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 73  guments to the s
30150 75 62 2d 70 72 6f 67 72 61 6d 2e 20 50 32 20 0a  ub-program. P2 .
30160 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
30170 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  address to jump 
30180 74 6f 20 69 66 20 74 68 65 20 73 75 62 2d 70 72  to if the sub-pr
30190 6f 67 72 61 6d 20 74 68 72 6f 77 73 20 61 6e 20  ogram throws an 
301a0 49 47 4e 4f 52 45 20 0a 2a 2a 20 65 78 63 65 70  IGNORE .** excep
301b0 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 52  tion using the R
301c0 41 49 53 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e  AISE() function.
301d0 20 52 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e   Register P3 con
301e0 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73  tains the addres
301f0 73 20 0a 2a 2a 20 6f 66 20 61 20 6d 65 6d 6f 72  s .** of a memor
30200 79 20 63 65 6c 6c 20 69 6e 20 74 68 69 73 20 28  y cell in this (
30210 74 68 65 20 70 61 72 65 6e 74 29 20 56 4d 20 74  the parent) VM t
30220 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 61  hat is used to a
30230 6c 6c 6f 63 61 74 65 20 74 68 65 20 0a 2a 2a 20  llocate the .** 
30240 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20  memory required 
30250 62 79 20 74 68 65 20 73 75 62 2d 76 64 62 65 20  by the sub-vdbe 
30260 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a  at runtime..**.*
30270 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
30280 72 20 74 6f 20 74 68 65 20 56 4d 20 63 6f 6e 74  r to the VM cont
30290 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67  aining the trigg
302a0 65 72 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  er program..**.*
302b0 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a  * If P5 is non-z
302c0 65 72 6f 2c 20 74 68 65 6e 20 72 65 63 75 72 73  ero, then recurs
302d0 69 76 65 20 70 72 6f 67 72 61 6d 20 69 6e 76 6f  ive program invo
302e0 63 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  cation is enable
302f0 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72  d..*/.case OP_Pr
30300 6f 67 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20  ogram: {        
30310 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74  /* jump */.  int
30320 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
30330 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30340 66 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  f memory registe
30350 72 73 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72  rs for sub-progr
30360 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  am */.  int nByt
30370 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
30380 2f 2a 20 42 79 74 65 73 20 6f 66 20 72 75 6e 74  /* Bytes of runt
30390 69 6d 65 20 73 70 61 63 65 20 72 65 71 75 69 72  ime space requir
303a0 65 64 20 66 6f 72 20 73 75 62 2d 70 72 6f 67 72  ed for sub-progr
303b0 61 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 74  am */.  Mem *pRt
303c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
303d0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 61  /* Register to a
303e0 6c 6c 6f 63 61 74 65 20 72 75 6e 74 69 6d 65 20  llocate runtime 
303f0 73 70 61 63 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  space */.  Mem *
30400 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pMem;           
30410 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
30420 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6d 65  erate through me
30430 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  mory cells */.  
30440 4d 65 6d 20 2a 70 45 6e 64 3b 20 20 20 20 20 20  Mem *pEnd;      
30450 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
30460 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 6e  memory cell in n
30470 65 77 20 61 72 72 61 79 20 2a 2f 0a 20 20 56 64  ew array */.  Vd
30480 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
30490 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76 64 62        /* New vdb
304a0 65 20 66 72 61 6d 65 20 74 6f 20 65 78 65 63 75  e frame to execu
304b0 74 65 20 69 6e 20 2a 2f 0a 20 20 53 75 62 50 72  te in */.  SubPr
304c0 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72 61 6d 3b  ogram *pProgram;
304d0 20 20 20 2f 2a 20 53 75 62 2d 70 72 6f 67 72 61     /* Sub-progra
304e0 6d 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  m to execute */.
304f0 20 20 76 6f 69 64 20 2a 74 3b 20 20 20 20 20 20    void *t;      
30500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b            /* Tok
30510 65 6e 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74  en identifying t
30520 72 69 67 67 65 72 20 2a 2f 0a 0a 20 20 70 50 72  rigger */..  pPr
30530 6f 67 72 61 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ogram = pOp->p4.
30540 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 52 74 20  pProgram;.  pRt 
30550 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
30560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 6f  ;.  assert( pPro
30570 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  gram->nOp>0 );. 
30580 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 35   .  /* If the p5
30590 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
305a0 74 68 65 6e 20 72 65 63 75 72 73 69 76 65 20 69  then recursive i
305b0 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72 69  nvocation of tri
305c0 67 67 65 72 73 20 69 73 20 0a 20 20 2a 2a 20 64  ggers is .  ** d
305d0 69 73 61 62 6c 65 64 20 66 6f 72 20 62 61 63 6b  isabled for back
305e0 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
305f0 69 74 79 20 28 70 35 20 69 73 20 73 65 74 20 69  ity (p5 is set i
30600 66 20 74 68 69 73 20 73 75 62 2d 70 72 6f 67 72  f this sub-progr
30610 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65 61 6c 6c  am.  ** is reall
30620 79 20 61 20 74 72 69 67 67 65 72 2c 20 6e 6f 74  y a trigger, not
30630 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61   a foreign key a
30640 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 20 66  ction, and the f
30650 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20 61 6e 64  lag set.  ** and
30660 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 20   cleared by the 
30670 22 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76  "PRAGMA recursiv
30680 65 5f 74 72 69 67 67 65 72 73 22 20 63 6f 6d 6d  e_triggers" comm
30690 61 6e 64 20 69 73 20 63 6c 65 61 72 29 2e 0a 20  and is clear).. 
306a0 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20 69 73 20   ** .  ** It is 
306b0 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61  recursive invoca
306c0 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73  tion of triggers
306d0 2c 20 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76  , at the SQL lev
306e0 65 6c 2c 20 74 68 61 74 20 69 73 20 0a 20 20 2a  el, that is .  *
306f0 2a 20 64 69 73 61 62 6c 65 64 2e 20 49 6e 20 73  * disabled. In s
30700 6f 6d 65 20 63 61 73 65 73 20 61 20 73 69 6e 67  ome cases a sing
30710 6c 65 20 74 72 69 67 67 65 72 20 6d 61 79 20 67  le trigger may g
30720 65 6e 65 72 61 74 65 20 6d 6f 72 65 20 74 68 61  enerate more tha
30730 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53 75 62 50  n one .  ** SubP
30740 72 6f 67 72 61 6d 20 28 69 66 20 74 68 65 20 74  rogram (if the t
30750 72 69 67 67 65 72 20 6d 61 79 20 62 65 20 65 78  rigger may be ex
30760 65 63 75 74 65 64 20 77 69 74 68 20 6d 6f 72 65  ecuted with more
30770 20 74 68 61 6e 20 6f 6e 65 20 64 69 66 66 65 72   than one differ
30780 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20 43 4f 4e  ent .  ** ON CON
30790 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 29  FLICT algorithm)
307a0 2e 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74 72  . SubProgram str
307b0 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
307c0 65 64 20 77 69 74 68 20 61 0a 20 20 2a 2a 20 73  ed with a.  ** s
307d0 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20 61 6c  ingle trigger al
307e0 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  l have the same 
307f0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 53 75  value for the Su
30800 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e 20 0a  bProgram.token .
30810 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
30820 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  */.  if( pOp->p5
30830 20 29 7b 0a 20 20 20 20 74 20 3d 20 70 50 72 6f   ){.    t = pPro
30840 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  gram->token;.   
30850 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
30860 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 20 26 26  Frame; pFrame &&
30870 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 21 3d   pFrame->token!=
30880 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
30890 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
308a0 69 66 28 20 70 46 72 61 6d 65 20 29 20 62 72 65  if( pFrame ) bre
308b0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ak;.  }..  if( p
308c0 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e 61 4c  ->nFrame>=db->aL
308d0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
308e0 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d  T_TRIGGER_DEPTH]
308f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
30900 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
30910 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
30920 70 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  p, "too many lev
30930 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72  els of trigger r
30940 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20  ecursion");.    
30950 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
30960 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  o_error;.  }..  
30970 2f 2a 20 52 65 67 69 73 74 65 72 20 70 52 74 20  /* Register pRt 
30980 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
30990 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
309a0 69 72 65 64 20 74 6f 20 73 61 76 65 20 74 68 65  ired to save the
309b0 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
309c0 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72  he current progr
309d0 61 6d 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  am, and the memo
309e0 72 79 20 72 65 71 75 69 72 65 64 20 61 74 20 72  ry required at r
309f0 75 6e 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74  untime to execut
30a00 65 0a 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67  e.  ** the trigg
30a10 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74  er program. If t
30a20 68 69 73 20 74 72 69 67 67 65 72 20 68 61 73 20  his trigger has 
30a30 62 65 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72  been fired befor
30a40 65 2c 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a  e, then pRt .  *
30a50 2a 20 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c  * is already all
30a60 6f 63 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73  ocated. Otherwis
30a70 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e  e, it must be in
30a80 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20  itialized.  */. 
30a90 20 69 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73   if( (pRt->flags
30aa0 26 4d 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20 29  &MEM_Frame)==0 )
30ab0 7b 0a 20 20 20 20 2f 2a 20 53 75 62 50 72 6f 67  {.    /* SubProg
30ac0 72 61 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20  ram.nMem is set 
30ad0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
30ae0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73   memory cells us
30af0 65 64 20 62 79 20 74 68 65 20 0a 20 20 20 20 2a  ed by the .    *
30b00 2a 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  * program stored
30b10 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e 61   in SubProgram.a
30b20 4f 70 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74  Op. As well as t
30b30 68 65 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79  hese, one memory
30b40 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20  .    ** cell is 
30b50 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
30b60 68 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  h cursor used by
30b70 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 53 65   the program. Se
30b80 74 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  t local.    ** v
30b90 61 72 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e  ariable nMem (an
30ba0 64 20 6c 61 74 65 72 2c 20 56 64 62 65 46 72 61  d later, VdbeFra
30bb0 6d 65 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f  me.nChildMem) to
30bc0 20 74 68 69 73 20 76 61 6c 75 65 2e 0a 20 20 20   this value..   
30bd0 20 2a 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70   */.    nMem = p
30be0 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20  Program->nMem + 
30bf0 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a  pProgram->nCsr;.
30c00 20 20 20 20 61 73 73 65 72 74 28 20 6e 4d 65 6d      assert( nMem
30c10 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  >0 );.    if( pP
30c20 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30 20  rogram->nCsr==0 
30c30 29 20 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 6e 42  ) nMem++;.    nB
30c40 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
30c50 65 6f 66 28 56 64 62 65 46 72 61 6d 65 29 29 0a  eof(VdbeFrame)).
30c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
30c70 6e 4d 65 6d 20 2a 20 73 69 7a 65 6f 66 28 4d 65  nMem * sizeof(Me
30c80 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m).             
30c90 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73   + pProgram->nCs
30ca0 72 20 2a 20 73 69 7a 65 6f 66 28 56 64 62 65 43  r * sizeof(VdbeC
30cb0 75 72 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20  ursor*).        
30cc0 20 20 20 20 20 20 2b 20 28 70 50 72 6f 67 72 61        + (pProgra
30cd0 6d 2d 3e 6e 4f 70 20 2b 20 37 29 2f 38 3b 0a 20  m->nOp + 7)/8;. 
30ce0 20 20 20 70 46 72 61 6d 65 20 3d 20 73 71 6c 69     pFrame = sqli
30cf0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
30d00 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
30d10 69 66 28 20 21 70 46 72 61 6d 65 20 29 7b 0a 20  if( !pFrame ){. 
30d20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
30d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
30d40 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
30d50 65 28 70 52 74 29 3b 0a 20 20 20 20 70 52 74 2d  e(pRt);.    pRt-
30d60 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 46 72 61  >flags = MEM_Fra
30d70 6d 65 3b 0a 20 20 20 20 70 52 74 2d 3e 75 2e 70  me;.    pRt->u.p
30d80 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a  Frame = pFrame;.
30d90 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d  .    pFrame->v =
30da0 20 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e   p;.    pFrame->
30db0 6e 43 68 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d  nChildMem = nMem
30dc0 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43  ;.    pFrame->nC
30dd0 68 69 6c 64 43 73 72 20 3d 20 70 50 72 6f 67 72  hildCsr = pProgr
30de0 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46  am->nCsr;.    pF
30df0 72 61 6d 65 2d 3e 70 63 20 3d 20 28 69 6e 74 29  rame->pc = (int)
30e00 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20  (pOp - aOp);.   
30e10 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20   pFrame->aMem = 
30e20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46 72  p->aMem;.    pFr
30e30 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e  ame->nMem = p->n
30e40 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  Mem;.    pFrame-
30e50 3e 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43 73  >apCsr = p->apCs
30e60 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  r;.    pFrame->n
30e70 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75 72  Cursor = p->nCur
30e80 73 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  sor;.    pFrame-
30e90 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  >aOp = p->aOp;. 
30ea0 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d     pFrame->nOp =
30eb0 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46 72   p->nOp;.    pFr
30ec0 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50 72  ame->token = pPr
30ed0 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 23 69  ogram->token;.#i
30ee0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
30ef0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
30f00 55 53 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  US.    pFrame->a
30f10 6e 45 78 65 63 20 3d 20 70 2d 3e 61 6e 45 78 65  nExec = p->anExe
30f20 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70  c;.#endif..    p
30f30 45 6e 64 20 3d 20 26 56 64 62 65 46 72 61 6d 65  End = &VdbeFrame
30f40 4d 65 6d 28 70 46 72 61 6d 65 29 5b 70 46 72 61  Mem(pFrame)[pFra
30f50 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  me->nChildMem];.
30f60 20 20 20 20 66 6f 72 28 70 4d 65 6d 3d 56 64 62      for(pMem=Vdb
30f70 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65  eFrameMem(pFrame
30f80 29 3b 20 70 4d 65 6d 21 3d 70 45 6e 64 3b 20 70  ); pMem!=pEnd; p
30f90 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d  Mem++){.      pM
30fa0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
30fb0 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20  Undefined;.     
30fc0 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a   pMem->db = db;.
30fd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
30fe0 20 20 20 70 46 72 61 6d 65 20 3d 20 70 52 74 2d     pFrame = pRt-
30ff0 3e 75 2e 70 46 72 61 6d 65 3b 0a 20 20 20 20 61  >u.pFrame;.    a
31000 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
31010 3e 6e 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e  >nMem+pProgram->
31020 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43  nCsr==pFrame->nC
31030 68 69 6c 64 4d 65 6d 20 0a 20 20 20 20 20 20 20  hildMem .       
31040 20 7c 7c 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e   || (pProgram->n
31050 43 73 72 3d 3d 30 20 26 26 20 70 50 72 6f 67 72  Csr==0 && pProgr
31060 61 6d 2d 3e 6e 4d 65 6d 2b 31 3d 3d 70 46 72 61  am->nMem+1==pFra
31070 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 20 29  me->nChildMem) )
31080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
31090 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46  rogram->nCsr==pF
310a0 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20  rame->nChildCsr 
310b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
310c0 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3d  int)(pOp - aOp)=
310d0 3d 70 46 72 61 6d 65 2d 3e 70 63 20 29 3b 0a 20  =pFrame->pc );. 
310e0 20 7d 0a 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 2b   }..  p->nFrame+
310f0 2b 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61  +;.  pFrame->pPa
31100 72 65 6e 74 20 3d 20 70 2d 3e 70 46 72 61 6d 65  rent = p->pFrame
31110 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  ;.  pFrame->last
31120 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74  Rowid = db->last
31130 52 6f 77 69 64 3b 0a 20 20 70 46 72 61 6d 65 2d  Rowid;.  pFrame-
31140 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d 3e 6e 43  >nChange = p->nC
31150 68 61 6e 67 65 3b 0a 20 20 70 46 72 61 6d 65 2d  hange;.  pFrame-
31160 3e 6e 44 62 43 68 61 6e 67 65 20 3d 20 70 2d 3e  >nDbChange = p->
31170 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 61  db->nChange;.  a
31180 73 73 65 72 74 28 20 70 46 72 61 6d 65 2d 3e 70  ssert( pFrame->p
31190 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  AuxData==0 );.  
311a0 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
311b0 20 3d 20 70 2d 3e 70 41 75 78 44 61 74 61 3b 0a   = p->pAuxData;.
311c0 20 20 70 2d 3e 70 41 75 78 44 61 74 61 20 3d 20    p->pAuxData = 
311d0 30 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  0;.  p->nChange 
311e0 3d 20 30 3b 0a 20 20 70 2d 3e 70 46 72 61 6d 65  = 0;.  p->pFrame
311f0 20 3d 20 70 46 72 61 6d 65 3b 0a 20 20 70 2d 3e   = pFrame;.  p->
31200 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 3d 20 56 64  aMem = aMem = Vd
31210 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d  beFrameMem(pFram
31220 65 29 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  e);.  p->nMem = 
31230 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65  pFrame->nChildMe
31240 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  m;.  p->nCursor 
31250 3d 20 28 75 31 36 29 70 46 72 61 6d 65 2d 3e 6e  = (u16)pFrame->n
31260 43 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d 3e 61  ChildCsr;.  p->a
31270 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
31280 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
31290 4d 65 6d 5d 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  Mem];.  pFrame->
312a0 61 4f 6e 63 65 20 3d 20 28 75 38 2a 29 26 70 2d  aOnce = (u8*)&p-
312b0 3e 61 70 43 73 72 5b 70 50 72 6f 67 72 61 6d 2d  >apCsr[pProgram-
312c0 3e 6e 43 73 72 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCsr];.  memset
312d0 28 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 2c 20  (pFrame->aOnce, 
312e0 30 2c 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  0, (pProgram->nO
312f0 70 20 2b 20 37 29 2f 38 29 3b 0a 20 20 70 2d 3e  p + 7)/8);.  p->
31300 61 4f 70 20 3d 20 61 4f 70 20 3d 20 70 50 72 6f  aOp = aOp = pPro
31310 67 72 61 6d 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e  gram->aOp;.  p->
31320 6e 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  nOp = pProgram->
31330 6e 4f 70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  nOp;.#ifdef SQLI
31340 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
31350 43 41 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61  CANSTATUS.  p->a
31360 6e 45 78 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  nExec = 0;.#endi
31370 66 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 2d  f.  pOp = &aOp[-
31380 31 5d 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  1];..  break;.}.
31390 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61  ./* Opcode: Para
313a0 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  m P1 P2 * * *.**
313b0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
313c0 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65  is only ever pre
313d0 73 65 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67  sent in sub-prog
313e0 72 61 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20  rams called via 
313f0 74 68 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72  the .** OP_Progr
31400 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  am instruction. 
31410 43 6f 70 79 20 61 20 76 61 6c 75 65 20 63 75 72  Copy a value cur
31420 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
31430 20 61 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65   a memory .** ce
31440 6c 6c 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e  ll of the callin
31450 67 20 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65  g (parent) frame
31460 20 74 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74   to cell P2 in t
31470 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
31480 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
31490 61 63 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ace. This is use
314a0 64 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f  d by trigger pro
314b0 67 72 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20  grams to access 
314c0 74 68 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e  the new.* .** an
314d0 64 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a  d old.* values..
314e0 2a 2a 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73  **.** The addres
314f0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e  s of the cell in
31500 20 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d   the parent fram
31510 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
31520 62 79 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65  by adding.** the
31530 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
31540 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
31550 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
31560 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
31570 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50  .** calling OP_P
31580 72 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69  rogram instructi
31590 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  on..*/.case OP_P
315a0 61 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20  aram: {         
315b0 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56    /* out2 */.  V
315c0 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
315d0 3b 0a 20 20 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20  ;.  Mem *pIn;.  
315e0 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
315f0 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
31600 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72   pFrame = p->pFr
31610 61 6d 65 3b 0a 20 20 70 49 6e 20 3d 20 26 70 46  ame;.  pIn = &pF
31620 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  rame->aMem[pOp->
31630 70 31 20 2b 20 70 46 72 61 6d 65 2d 3e 61 4f 70  p1 + pFrame->aOp
31640 5b 70 46 72 61 6d 65 2d 3e 70 63 5d 2e 70 31 5d  [pFrame->pc].p1]
31650 3b 20 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64  ;   .  sqlite3Vd
31660 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
31670 28 70 4f 75 74 2c 20 70 49 6e 2c 20 4d 45 4d 5f  (pOut, pIn, MEM_
31680 45 70 68 65 6d 29 3b 0a 20 20 62 72 65 61 6b 3b  Ephem);.  break;
31690 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69  .}..#endif /* #i
316a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
316b0 54 5f 54 52 49 47 47 45 52 20 2a 2f 0a 0a 23 69  T_TRIGGER */..#i
316c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
316d0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 2f 2a  T_FOREIGN_KEY./*
316e0 20 4f 70 63 6f 64 65 3a 20 46 6b 43 6f 75 6e 74   Opcode: FkCount
316f0 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  er P1 P2 * * *.*
31700 2a 20 53 79 6e 6f 70 73 69 73 3a 20 66 6b 63 74  * Synopsis: fkct
31710 72 5b 50 31 5d 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20  r[P1]+=P2.**.** 
31720 49 6e 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e  Increment a "con
31730 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22  straint counter"
31740 20 62 79 20 50 32 20 28 50 32 20 6d 61 79 20 62   by P2 (P2 may b
31750 65 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f  e negative or po
31760 73 69 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50  sitive)..** If P
31770 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  1 is non-zero, t
31780 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73  he database cons
31790 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69  traint counter i
317a0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a  s incremented .*
317b0 2a 20 28 64 65 66 65 72 72 65 64 20 66 6f 72 65  * (deferred fore
317c0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
317d0 6e 74 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  nts). Otherwise,
317e0 20 69 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20   if P1 is zero, 
317f0 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
31800 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63  t counter is inc
31810 72 65 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69  remented (immedi
31820 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
31830 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f  constraints)..*/
31840 0a 63 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74  .case OP_FkCount
31850 65 72 3a 20 7b 0a 20 20 69 66 28 20 64 62 2d 3e  er: {.  if( db->
31860 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  flags & SQLITE_D
31870 65 66 65 72 46 4b 73 20 29 7b 0a 20 20 20 20 64  eferFKs ){.    d
31880 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
31890 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  ons += pOp->p2;.
318a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
318b0 3e 70 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >p1 ){.    db->n
318c0 44 65 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20  DeferredCons += 
318d0 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65  pOp->p2;.  }else
318e0 7b 0a 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73  {.    p->nFkCons
318f0 74 72 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70  traint += pOp->p
31900 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
31910 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b  }../* Opcode: Fk
31920 49 66 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a  IfZero P1 P2 * *
31930 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
31940 69 66 20 66 6b 63 74 72 5b 50 31 5d 3d 3d 30 20  if fkctr[P1]==0 
31950 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68  goto P2.**.** Th
31960 69 73 20 6f 70 63 6f 64 65 20 74 65 73 74 73 20  is opcode tests 
31970 69 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  if a foreign key
31980 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e   constraint-coun
31990 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
319a0 20 7a 65 72 6f 2e 0a 2a 2a 20 49 66 20 73 6f 2c   zero..** If so,
319b0 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
319c0 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77 69  tion P2. Otherwi
319d0 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  se, fall through
319e0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a   to the next .**
319f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
31a00 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e  .** If P1 is non
31a10 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
31a20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
31a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
31a40 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72  nstraint-counter
31a50 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 28 74 68 65  .** is zero (the
31a60 20 6f 6e 65 20 74 68 61 74 20 63 6f 75 6e 74 73   one that counts
31a70 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
31a80 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29  aint violations)
31a90 2e 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 7a 65  . If P1 is.** ze
31aa0 72 6f 2c 20 74 68 65 20 6a 75 6d 70 20 69 73 20  ro, the jump is 
31ab0 74 61 6b 65 6e 20 69 66 20 74 68 65 20 73 74 61  taken if the sta
31ac0 74 65 6d 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  tement constrain
31ad0 74 2d 63 6f 75 6e 74 65 72 20 69 73 20 7a 65 72  t-counter is zer
31ae0 6f 0a 2a 2a 20 28 69 6d 6d 65 64 69 61 74 65 20  o.** (immediate 
31af0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
31b00 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
31b10 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46  s)..*/.case OP_F
31b20 6b 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20  kIfZero: {      
31b30 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
31b40 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  if( pOp->p1 ){. 
31b50 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
31b60 65 6e 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  en(db->nDeferred
31b70 43 6f 6e 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e  Cons==0 && db->n
31b80 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d  DeferredImmCons=
31b90 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20  =0, 2);.    if( 
31ba0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
31bb0 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66  s==0 && db->nDef
31bc0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20  erredImmCons==0 
31bd0 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
31be0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
31bf0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
31c00 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
31c10 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65  ==0 && db->nDefe
31c20 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20  rredImmCons==0, 
31c30 32 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  2);.    if( p->n
31c40 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20  FkConstraint==0 
31c50 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
31c60 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74  ImmCons==0 ) got
31c70 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
31c80 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
31c90 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
31ca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
31cb0 47 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64  GN_KEY */..#ifnd
31cc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31cd0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20  UTOINCREMENT./* 
31ce0 4f 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50  Opcode: MemMax P
31cf0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
31d00 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 6d 61  nopsis: r[P1]=ma
31d10 78 28 72 5b 50 31 5d 2c 72 5b 50 32 5d 29 0a 2a  x(r[P1],r[P2]).*
31d20 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 72 65 67  *.** P1 is a reg
31d30 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 6f 6f  ister in the roo
31d40 74 20 66 72 61 6d 65 20 6f 66 20 74 68 69 73 20  t frame of this 
31d50 56 4d 20 28 74 68 65 20 72 6f 6f 74 20 66 72 61  VM (the root fra
31d60 6d 65 20 69 73 0a 2a 2a 20 64 69 66 66 65 72 65  me is.** differe
31d70 6e 74 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  nt from the curr
31d80 65 6e 74 20 66 72 61 6d 65 20 69 66 20 74 68 69  ent frame if thi
31d90 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
31da0 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 0a   being executed.
31db0 2a 2a 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d  ** within a sub-
31dc0 70 72 6f 67 72 61 6d 29 2e 20 53 65 74 20 74 68  program). Set th
31dd0 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
31de0 74 65 72 20 50 31 20 74 6f 20 74 68 65 20 6d 61  ter P1 to the ma
31df0 78 69 6d 75 6d 20 6f 66 20 0a 2a 2a 20 69 74 73  ximum of .** its
31e00 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
31e10 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  nd the value in 
31e20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
31e30 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
31e40 69 6f 6e 20 74 68 72 6f 77 73 20 61 6e 20 65 72  ion throws an er
31e50 72 6f 72 20 69 66 20 74 68 65 20 6d 65 6d 6f 72  ror if the memor
31e60 79 20 63 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e  y cell is not in
31e70 69 74 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  itially.** an in
31e80 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f  teger..*/.case O
31e90 50 5f 4d 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20  P_MemMax: {     
31ea0 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56     /* in2 */.  V
31eb0 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
31ec0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  ;.  if( p->pFram
31ed0 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 46 72  e ){.    for(pFr
31ee0 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
31ef0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
31f00 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
31f10 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 70 49 6e  Parent);.    pIn
31f20 31 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65  1 = &pFrame->aMe
31f30 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65  m[pOp->p1];.  }e
31f40 6c 73 65 7b 0a 20 20 20 20 70 49 6e 31 20 3d 20  lse{.    pIn1 = 
31f50 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
31f60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65    }.  assert( me
31f70 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29  mIsValid(pIn1) )
31f80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
31f90 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
31fa0 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1);.  pIn2 = &aM
31fb0 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73  em[pOp->p2];.  s
31fc0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
31fd0 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20  egerify(pIn2);. 
31fe0 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70   if( pIn1->u.i<p
31ff0 49 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70  In2->u.i){.    p
32000 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d  In1->u.i = pIn2-
32010 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61  >u.i;.  }.  brea
32020 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
32030 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
32040 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20  NCREMENT */../* 
32050 4f 70 63 6f 64 65 3a 20 49 66 50 6f 73 20 50 31  Opcode: IfPos P1
32060 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
32070 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d  nopsis: if r[P1]
32080 3e 30 20 74 68 65 6e 20 72 5b 50 31 5d 2d 3d 50  >0 then r[P1]-=P
32090 33 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a  3, goto P2.**.**
320a0 20 52 65 67 69 73 74 65 72 20 50 31 20 6d 75 73   Register P1 mus
320b0 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
320c0 65 67 65 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20  eger..** If the 
320d0 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
320e0 72 20 50 31 20 69 73 20 31 20 6f 72 20 67 72 65  r P1 is 1 or gre
320f0 61 74 65 72 2c 20 73 75 62 74 72 61 63 74 20 50  ater, subtract P
32100 33 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 76 61  3 from the.** va
32110 6c 75 65 20 69 6e 20 50 31 20 61 6e 64 20 6a 75  lue in P1 and ju
32120 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
32130 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  If the initial v
32140 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
32150 20 50 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e   P1 is less than
32160 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20   1, then the.** 
32170 76 61 6c 75 65 20 69 73 20 75 6e 63 68 61 6e 67  value is unchang
32180 65 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 70  ed and control p
32190 61 73 73 65 73 20 74 68 72 6f 75 67 68 20 74 6f  asses through to
321a0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
321b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
321c0 50 5f 49 66 50 6f 73 3a 20 7b 20 20 20 20 20 20  P_IfPos: {      
321d0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
321e0 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
321f0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
32200 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
32210 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64  &MEM_Int );.  Vd
32220 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 70  beBranchTaken( p
32230 49 6e 31 2d 3e 75 2e 69 3e 30 2c 20 32 29 3b 0a  In1->u.i>0, 2);.
32240 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e    if( pIn1->u.i>
32250 30 20 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75  0 ){.    pIn1->u
32260 2e 69 20 2d 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  .i -= pOp->p3;. 
32270 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
32280 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
32290 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
322a0 66 66 73 65 74 4c 69 6d 69 74 20 50 31 20 50 32  ffsetLimit P1 P2
322b0 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
322c0 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20  sis: if r[P1]>0 
322d0 74 68 65 6e 20 72 5b 50 32 5d 3d 72 5b 50 31 5d  then r[P2]=r[P1]
322e0 2b 6d 61 78 28 30 2c 72 5b 50 33 5d 29 20 65 6c  +max(0,r[P3]) el
322f0 73 65 20 72 5b 50 32 5d 3d 28 2d 31 29 0a 2a 2a  se r[P2]=(-1).**
32300 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
32310 70 65 72 66 6f 72 6d 73 20 61 20 63 6f 6d 6d 6f  performs a commo
32320 6e 6c 79 20 75 73 65 64 20 63 6f 6d 70 75 74 61  nly used computa
32330 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
32340 77 69 74 68 0a 2a 2a 20 4c 49 4d 49 54 20 61 6e  with.** LIMIT an
32350 64 20 4f 46 46 53 45 54 20 70 72 6f 63 65 73 73  d OFFSET process
32360 2e 20 20 72 5b 50 31 5d 20 68 6f 6c 64 73 20 74  .  r[P1] holds t
32370 68 65 20 6c 69 6d 69 74 20 63 6f 75 6e 74 65 72  he limit counter
32380 2e 20 20 72 5b 50 33 5d 0a 2a 2a 20 68 6f 6c 64  .  r[P3].** hold
32390 73 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  s the offset cou
323a0 6e 74 65 72 2e 20 20 54 68 65 20 6f 70 63 6f 64  nter.  The opcod
323b0 65 20 63 6f 6d 70 75 74 65 73 20 74 68 65 20 63  e computes the c
323c0 6f 6d 62 69 6e 65 64 20 76 61 6c 75 65 0a 2a 2a  ombined value.**
323d0 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   of the LIMIT an
323e0 64 20 4f 46 46 53 45 54 20 61 6e 64 20 73 74 6f  d OFFSET and sto
323f0 72 65 73 20 74 68 61 74 20 76 61 6c 75 65 20 69  res that value i
32400 6e 20 72 5b 50 32 5d 2e 20 20 54 68 65 20 72 5b  n r[P2].  The r[
32410 50 32 5d 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 6d  P2].** value com
32420 70 75 74 65 64 20 69 73 20 74 68 65 20 74 6f 74  puted is the tot
32430 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
32440 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
32450 20 74 6f 20 62 65 0a 2a 2a 20 76 69 73 69 74 65   to be.** visite
32460 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  d in order to co
32470 6d 70 6c 65 74 65 20 74 68 65 20 71 75 65 72 79  mplete the query
32480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 5b 50 33 5d  ..**.** If r[P3]
32490 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
324a0 74 69 76 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  tive, that means
324b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 46 46   there is no OFF
324c0 53 45 54 0a 2a 2a 20 61 6e 64 20 72 5b 50 32 5d  SET.** and r[P2]
324d0 20 69 73 20 73 65 74 20 74 6f 20 62 65 20 74 68   is set to be th
324e0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4c  e value of the L
324f0 49 4d 49 54 2c 20 72 5b 50 31 5d 2e 0a 2a 2a 0a  IMIT, r[P1]..**.
32500 2a 2a 20 69 66 20 72 5b 50 31 5d 20 69 73 20 7a  ** if r[P1] is z
32510 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c  ero or negative,
32520 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72   that means ther
32530 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 0a 2a 2a  e is no LIMIT.**
32540 20 61 6e 64 20 72 5b 50 32 5d 20 69 73 20 73 65   and r[P2] is se
32550 74 20 74 6f 20 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20  t to -1. .**.** 
32560 4f 74 68 65 72 77 69 73 65 2c 20 72 5b 50 32 5d  Otherwise, r[P2]
32570 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
32580 75 6d 20 6f 66 20 72 5b 50 31 5d 20 61 6e 64 20  um of r[P1] and 
32590 72 5b 50 33 5d 2e 0a 2a 2f 0a 63 61 73 65 20 4f  r[P3]..*/.case O
325a0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 3a 20 7b  P_OffsetLimit: {
325b0 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32      /* in1, out2
325c0 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 36 34 20 78  , in3 */.  i64 x
325d0 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
325e0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
325f0 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
32600 33 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  3];.  pOut = out
32610 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
32620 4f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Op);.  assert( p
32630 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
32640 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  _Int );.  assert
32650 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20  ( pIn3->flags & 
32660 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 78 20 3d  MEM_Int );.  x =
32670 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 69 66   pIn1->u.i;.  if
32680 28 20 78 3c 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ( x<=0 || sqlite
32690 33 41 64 64 49 6e 74 36 34 28 26 78 2c 20 70 49  3AddInt64(&x, pI
326a0 6e 33 2d 3e 75 2e 69 3e 30 3f 70 49 6e 33 2d 3e  n3->u.i>0?pIn3->
326b0 75 2e 69 3a 30 29 20 29 7b 0a 20 20 20 20 2f 2a  u.i:0) ){.    /*
326c0 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   If the LIMIT is
326d0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
326e0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 6c 6f 6f  ual to zero, loo
326f0 70 20 66 6f 72 65 76 65 72 2e 20 20 54 68 69 73  p forever.  This
32700 0a 20 20 20 20 2a 2a 20 69 73 20 64 6f 63 75 6d  .    ** is docum
32710 65 6e 74 65 64 2e 20 20 42 75 74 20 61 6c 73 6f  ented.  But also
32720 2c 20 69 66 20 74 68 65 20 4c 49 4d 49 54 2b 4f  , if the LIMIT+O
32730 46 46 53 45 54 20 65 78 63 65 65 64 73 20 32 5e  FFSET exceeds 2^
32740 36 33 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  63 then.    ** a
32750 6c 73 6f 20 6c 6f 6f 70 20 66 6f 72 65 76 65 72  lso loop forever
32760 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
32770 75 6d 65 6e 74 65 64 2e 20 20 49 6e 20 66 61 63  umented.  In fac
32780 74 2c 20 6f 6e 65 20 63 6f 75 6c 64 20 61 72 67  t, one could arg
32790 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ue.    ** that t
327a0 68 65 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 20 74  he loop should t
327b0 65 72 6d 69 6e 61 74 65 2e 20 20 42 75 74 20 61  erminate.  But a
327c0 73 73 75 6d 69 6e 67 20 31 20 62 69 6c 6c 69 6f  ssuming 1 billio
327d0 6e 20 69 74 65 72 61 74 69 6f 6e 73 0a 20 20 20  n iterations.   
327e0 20 2a 2a 20 70 65 72 20 73 65 63 6f 6e 64 20 28   ** per second (
327f0 66 61 72 20 65 78 63 65 65 64 69 6e 67 20 74 68  far exceeding th
32800 65 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 6f  e capabilities o
32810 66 20 61 6e 79 20 63 75 72 72 65 6e 74 20 68 61  f any current ha
32820 72 64 77 61 72 65 29 0a 20 20 20 20 2a 2a 20 69  rdware).    ** i
32830 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 6e 65 61  t would take nea
32840 72 6c 79 20 33 30 30 20 79 65 61 72 73 20 74 6f  rly 300 years to
32850 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 20   actually reach 
32860 74 68 65 20 6c 69 6d 69 74 2e 20 20 53 6f 0a 20  the limit.  So. 
32870 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 66 6f     ** looping fo
32880 72 65 76 65 72 20 69 73 20 61 20 72 65 61 73 6f  rever is a reaso
32890 6e 61 62 6c 65 20 61 70 70 72 6f 78 69 6d 61 74  nable approximat
328a0 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 4f 75 74  ion. */.    pOut
328b0 2d 3e 75 2e 69 20 3d 20 2d 31 3b 0a 20 20 7d 65  ->u.i = -1;.  }e
328c0 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  lse{.    pOut->u
328d0 2e 69 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 62 72  .i = x;.  }.  br
328e0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
328f0 65 3a 20 49 66 4e 6f 74 5a 65 72 6f 20 50 31 20  e: IfNotZero P1 
32900 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
32910 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d  psis: if r[P1]!=
32920 30 20 74 68 65 6e 20 72 5b 50 31 5d 2d 2d 2c 20  0 then r[P1]--, 
32930 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65  goto P2.**.** Re
32940 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 63  gister P1 must c
32950 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
32960 72 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 74 65  r.  If the conte
32970 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
32980 31 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  1 is.** initiall
32990 79 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  y greater than z
329a0 65 72 6f 2c 20 74 68 65 6e 20 64 65 63 72 65 6d  ero, then decrem
329b0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ent the value in
329c0 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
329d0 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
329e0 72 6f 20 28 6e 65 67 61 74 69 76 65 20 6f 72 20  ro (negative or 
329f0 70 6f 73 69 74 69 76 65 29 20 61 6e 64 20 74 68  positive) and th
32a00 65 6e 20 61 6c 73 6f 20 6a 75 6d 70 20 74 6f 20  en also jump to 
32a10 50 32 2e 20 20 0a 2a 2a 20 49 66 20 72 65 67 69  P2.  .** If regi
32a20 73 74 65 72 20 50 31 20 69 73 20 69 6e 69 74 69  ster P1 is initi
32a30 61 6c 6c 79 20 7a 65 72 6f 2c 20 6c 65 61 76 65  ally zero, leave
32a40 20 69 74 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   it unchanged an
32a50 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  d fall through..
32a60 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74  */.case OP_IfNot
32a70 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 2f  Zero: {        /
32a80 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
32a90 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
32aa0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
32ab0 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45  ( pIn1->flags&ME
32ac0 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 42  M_Int );.  VdbeB
32ad0 72 61 6e 63 68 54 61 6b 65 6e 28 70 49 6e 31 2d  ranchTaken(pIn1-
32ae0 3e 75 2e 69 3c 30 2c 20 32 29 3b 0a 20 20 69 66  >u.i<0, 2);.  if
32af0 28 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 0a 20  ( pIn1->u.i ){. 
32b00 20 20 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e      if( pIn1->u.
32b10 69 3e 30 20 29 20 70 49 6e 31 2d 3e 75 2e 69 2d  i>0 ) pIn1->u.i-
32b20 2d 3b 0a 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d  -;.     goto jum
32b30 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
32b40 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
32b50 64 65 3a 20 44 65 63 72 4a 75 6d 70 5a 65 72 6f  de: DecrJumpZero
32b60 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
32b70 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 28 2d 2d  Synopsis: if (--
32b80 72 5b 50 31 5d 29 3d 3d 30 20 67 6f 74 6f 20 50  r[P1])==0 goto P
32b90 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  2.**.** Register
32ba0 20 50 31 20 6d 75 73 74 20 68 6f 6c 64 20 61 6e   P1 must hold an
32bb0 20 69 6e 74 65 67 65 72 2e 20 20 44 65 63 72 65   integer.  Decre
32bc0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 69  ment the value i
32bd0 6e 20 50 31 0a 2a 2a 20 61 6e 64 20 6a 75 6d 70  n P1.** and jump
32be0 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 6e 65   to P2 if the ne
32bf0 77 20 76 61 6c 75 65 20 69 73 20 65 78 61 63 74  w value is exact
32c00 6c 79 20 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65  ly zero..*/.case
32c10 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
32c20 3a 20 7b 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  : {      /* jump
32c30 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
32c40 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
32c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
32c60 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
32c70 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
32c80 2e 69 3e 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  .i>SMALLEST_INT6
32c90 34 20 29 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b  4 ) pIn1->u.i--;
32ca0 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
32cb0 65 6e 28 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 2c  en(pIn1->u.i==0,
32cc0 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d   2);.  if( pIn1-
32cd0 3e 75 2e 69 3d 3d 30 20 29 20 67 6f 74 6f 20 6a  >u.i==0 ) goto j
32ce0 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
32cf0 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.}.../* Opcod
32d00 65 3a 20 41 67 67 53 74 65 70 30 20 2a 20 50 32  e: AggStep0 * P2
32d10 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
32d20 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50  opsis: accum=r[P
32d30 33 5d 20 73 74 65 70 28 72 5b 50 32 40 50 35 5d  3] step(r[P2@P5]
32d40 29 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ).**.** Execute 
32d50 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
32d60 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  n for an aggrega
32d70 74 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63  te.  The.** func
32d80 74 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75  tion has P5 argu
32d90 6d 65 6e 74 73 2e 20 20 20 50 34 20 69 73 20 61  ments.   P4 is a
32da0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
32db0 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63  FuncDef.** struc
32dc0 74 75 72 65 20 74 68 61 74 20 73 70 65 63 69 66  ture that specif
32dd0 69 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ies the function
32de0 2e 20 20 52 65 67 69 73 74 65 72 20 50 33 20 69  .  Register P3 i
32df0 73 20 74 68 65 0a 2a 2a 20 61 63 63 75 6d 75 6c  s the.** accumul
32e00 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
32e10 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  P5 arguments are
32e20 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
32e30 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a  ster P2 and its.
32e40 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a  ** successors..*
32e50 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67  /./* Opcode: Agg
32e60 53 74 65 70 20 2a 20 50 32 20 50 33 20 50 34 20  Step * P2 P3 P4 
32e70 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
32e80 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70  accum=r[P3] step
32e90 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a  (r[P2@P5]).**.**
32ea0 20 45 78 65 63 75 74 65 20 74 68 65 20 73 74 65   Execute the ste
32eb0 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  p function for a
32ec0 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
32ed0 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61  e.** function ha
32ee0 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20  s P5 arguments. 
32ef0 20 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65    P4 is a pointe
32f00 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
32f10 63 6f 6e 74 65 78 74 0a 2a 2a 20 6f 62 6a 65 63  context.** objec
32f20 74 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  t that is used t
32f30 6f 20 72 75 6e 20 74 68 65 20 66 75 6e 63 74 69  o run the functi
32f40 6f 6e 2e 20 20 52 65 67 69 73 74 65 72 20 50 33  on.  Register P3
32f50 20 69 73 0a 2a 2a 20 61 73 20 74 68 65 20 61 63   is.** as the ac
32f60 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
32f70 20 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e 74   The P5 argument
32f80 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
32f90 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64   register P2 and
32fa0 20 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73 6f   its.** successo
32fb0 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  rs..**.** This o
32fc0 70 63 6f 64 65 20 69 73 20 69 6e 69 74 69 61 6c  pcode is initial
32fd0 6c 79 20 63 6f 64 65 64 20 61 73 20 4f 50 5f 41  ly coded as OP_A
32fe0 67 67 53 74 65 70 30 2e 20 20 4f 6e 20 66 69 72  ggStep0.  On fir
32ff0 73 74 20 65 76 61 6c 75 61 74 69 6f 6e 2c 0a 2a  st evaluation,.*
33000 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74  * the FuncDef st
33010 6f 72 65 64 20 69 6e 20 50 34 20 69 73 20 63 6f  ored in P4 is co
33020 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
33030 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
33040 61 6e 64 0a 2a 2a 20 74 68 65 20 6f 70 63 6f 64  and.** the opcod
33050 65 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20 49  e is changed.  I
33060 6e 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  n this way, the 
33070 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
33080 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  f the.** sqlite3
33090 5f 63 6f 6e 74 65 78 74 20 6f 6e 6c 79 20 68 61  _context only ha
330a0 70 70 65 6e 73 20 6f 6e 63 65 2c 20 69 6e 73 74  ppens once, inst
330b0 65 61 64 20 6f 66 20 6f 6e 20 65 61 63 68 20 63  ead of on each c
330c0 61 6c 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  all to the.** st
330d0 65 70 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ep function..*/.
330e0 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65 70 30  case OP_AggStep0
330f0 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  : {.  int n;.  s
33100 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
33110 70 43 74 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  pCtx;..  assert(
33120 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
33130 5f 46 55 4e 43 44 45 46 20 29 3b 0a 20 20 6e 20  _FUNCDEF );.  n 
33140 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73  = pOp->p5;.  ass
33150 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
33160 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  & pOp->p3<=(p->n
33170 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
33180 6f 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  or) );.  assert(
33190 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e 70   n==0 || (pOp->p
331a0 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e  2>0 && pOp->p2+n
331b0 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
331c0 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 29 20 29 3b  ->nCursor)+1) );
331d0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
331e0 70 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f  p3<pOp->p2 || pO
331f0 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e  p->p3>=pOp->p2+n
33200 20 29 3b 0a 20 20 70 43 74 78 20 3d 20 73 71 6c   );.  pCtx = sql
33210 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
33220 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 43  N(db, sizeof(*pC
33230 74 78 29 20 2b 20 28 6e 2d 31 29 2a 73 69 7a 65  tx) + (n-1)*size
33240 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  of(sqlite3_value
33250 2a 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  *));.  if( pCtx=
33260 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
33270 3b 0a 20 20 70 43 74 78 2d 3e 70 4d 65 6d 20 3d  ;.  pCtx->pMem =
33280 20 30 3b 0a 20 20 70 43 74 78 2d 3e 70 46 75 6e   0;.  pCtx->pFun
33290 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  c = pOp->p4.pFun
332a0 63 3b 0a 20 20 70 43 74 78 2d 3e 69 4f 70 20 3d  c;.  pCtx->iOp =
332b0 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
332c0 29 3b 0a 20 20 70 43 74 78 2d 3e 70 56 64 62 65  );.  pCtx->pVdbe
332d0 20 3d 20 70 3b 0a 20 20 70 43 74 78 2d 3e 61 72   = p;.  pCtx->ar
332e0 67 63 20 3d 20 6e 3b 0a 20 20 70 4f 70 2d 3e 70  gc = n;.  pOp->p
332f0 34 74 79 70 65 20 3d 20 50 34 5f 46 55 4e 43 43  4type = P4_FUNCC
33300 54 58 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 43  TX;.  pOp->p4.pC
33310 74 78 20 3d 20 70 43 74 78 3b 0a 20 20 70 4f 70  tx = pCtx;.  pOp
33320 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 67  ->opcode = OP_Ag
33330 67 53 74 65 70 3b 0a 20 20 2f 2a 20 46 61 6c 6c  gStep;.  /* Fall
33340 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50   through into OP
33350 5f 41 67 67 53 74 65 70 20 2a 2f 0a 7d 0a 63 61  _AggStep */.}.ca
33360 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b  se OP_AggStep: {
33370 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
33380 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
33390 78 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a  x;.  Mem *pMem;.
333a0 20 20 4d 65 6d 20 74 3b 0a 0a 20 20 61 73 73 65    Mem t;..  asse
333b0 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
333c0 3d 50 34 5f 46 55 4e 43 43 54 58 20 29 3b 0a 20  =P4_FUNCCTX );. 
333d0 20 70 43 74 78 20 3d 20 70 4f 70 2d 3e 70 34 2e   pCtx = pOp->p4.
333e0 70 43 74 78 3b 0a 20 20 70 4d 65 6d 20 3d 20 26  pCtx;.  pMem = &
333f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 0a  aMem[pOp->p3];..
33400 20 20 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e    /* If this fun
33410 63 74 69 6f 6e 20 69 73 20 69 6e 73 69 64 65 20  ction is inside 
33420 6f 66 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  of a trigger, th
33430 65 20 72 65 67 69 73 74 65 72 20 61 72 72 61 79  e register array
33440 20 69 6e 20 61 4d 65 6d 5b 5d 0a 20 20 2a 2a 20   in aMem[].  ** 
33450 6d 69 67 68 74 20 63 68 61 6e 67 65 20 66 72 6f  might change fro
33460 6d 20 6f 6e 65 20 65 76 61 6c 75 61 74 69 6f 6e  m one evaluation
33470 20 74 6f 20 74 68 65 20 6e 65 78 74 2e 20 20 54   to the next.  T
33480 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
33490 20 63 6f 64 65 0a 20 20 2a 2a 20 63 68 65 63 6b   code.  ** check
334a0 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  s to see if the 
334b0 72 65 67 69 73 74 65 72 20 61 72 72 61 79 20 68  register array h
334c0 61 73 20 63 68 61 6e 67 65 64 2c 20 61 6e 64 20  as changed, and 
334d0 69 66 20 73 6f 20 69 74 0a 20 20 2a 2a 20 72 65  if so it.  ** re
334e0 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
334f0 72 65 6c 61 76 61 6e 74 20 70 61 72 74 73 20 6f  relavant parts o
33500 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f  f the sqlite3_co
33510 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  ntext object */.
33520 20 20 69 66 28 20 70 43 74 78 2d 3e 70 4d 65 6d    if( pCtx->pMem
33530 20 21 3d 20 70 4d 65 6d 20 29 7b 0a 20 20 20 20   != pMem ){.    
33540 70 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 70 4d 65  pCtx->pMem = pMe
33550 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 74  m;.    for(i=pCt
33560 78 2d 3e 61 72 67 63 2d 31 3b 20 69 3e 3d 30 3b  x->argc-1; i>=0;
33570 20 69 2d 2d 29 20 70 43 74 78 2d 3e 61 72 67 76   i--) pCtx->argv
33580 5b 69 5d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  [i] = &aMem[pOp-
33590 3e 70 32 2b 69 5d 3b 0a 20 20 7d 0a 0a 23 69 66  >p2+i];.  }..#if
335a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
335b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
335c0 74 78 2d 3e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  tx->argc; i++){.
335d0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
335e0 73 56 61 6c 69 64 28 70 43 74 78 2d 3e 61 72 67  sValid(pCtx->arg
335f0 76 5b 69 5d 29 20 29 3b 0a 20 20 20 20 52 45 47  v[i]) );.    REG
33600 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
33610 3e 70 32 2b 69 2c 20 70 43 74 78 2d 3e 61 72 67  >p2+i, pCtx->arg
33620 76 5b 69 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  v[i]);.  }.#endi
33630 66 0a 0a 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b 0a  f..  pMem->n++;.
33640 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
33650 49 6e 69 74 28 26 74 2c 20 64 62 2c 20 4d 45 4d  Init(&t, db, MEM
33660 5f 4e 75 6c 6c 29 3b 0a 20 20 70 43 74 78 2d 3e  _Null);.  pCtx->
33670 70 4f 75 74 20 3d 20 26 74 3b 0a 20 20 70 43 74  pOut = &t;.  pCt
33680 78 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78 20 3d  x->fErrorOrAux =
33690 20 30 3b 0a 20 20 70 43 74 78 2d 3e 73 6b 69 70   0;.  pCtx->skip
336a0 46 6c 61 67 20 3d 20 30 3b 0a 20 20 28 70 43 74  Flag = 0;.  (pCt
336b0 78 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  x->pFunc->xSFunc
336c0 29 28 70 43 74 78 2c 70 43 74 78 2d 3e 61 72 67  )(pCtx,pCtx->arg
336d0 63 2c 70 43 74 78 2d 3e 61 72 67 76 29 3b 20 2f  c,pCtx->argv); /
336e0 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32  * IMP: R-24505-2
336f0 33 32 33 30 20 2a 2f 0a 20 20 69 66 28 20 70 43  3230 */.  if( pC
33700 74 78 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78 20  tx->fErrorOrAux 
33710 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  ){.    if( pCtx-
33720 3e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >isError ){.    
33730 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
33740 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69  or(p, "%s", sqli
33750 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26  te3_value_text(&
33760 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t));.      rc = 
33770 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 3b 0a 20  pCtx->isError;. 
33780 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
33790 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
337a0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
337b0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
337c0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 65 6c 73  to_error;.  }els
337d0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74  e{.    assert( t
337e0 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c  .flags==MEM_Null
337f0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   );.  }.  if( pC
33800 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20 29 7b 0a  tx->skipFlag ){.
33810 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
33820 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  -1].opcode==OP_C
33830 6f 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20 69 20  ollSeq );.    i 
33840 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20  = pOp[-1].p1;.  
33850 20 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65    if( i ) sqlite
33860 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34  3VdbeMemSetInt64
33870 28 26 61 4d 65 6d 5b 69 5d 2c 20 31 29 3b 0a 20  (&aMem[i], 1);. 
33880 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
33890 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 46 69 6e  * Opcode: AggFin
338a0 61 6c 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  al P1 P2 * P4 *.
338b0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63  ** Synopsis: acc
338c0 75 6d 3d 72 5b 50 31 5d 20 4e 3d 50 32 0a 2a 2a  um=r[P1] N=P2.**
338d0 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
338e0 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74 69  finalizer functi
338f0 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  on for an aggreg
33900 61 74 65 2e 20 20 50 31 20 69 73 0a 2a 2a 20 74  ate.  P1 is.** t
33910 68 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  he memory locati
33920 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 61  on that is the a
33930 63 63 75 6d 75 6c 61 74 6f 72 20 66 6f 72 20 74  ccumulator for t
33940 68 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  he aggregate..**
33950 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75  .** P2 is the nu
33960 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
33970 73 20 74 68 61 74 20 74 68 65 20 73 74 65 70 20  s that the step 
33980 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61  function takes a
33990 6e 64 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  nd.** P4 is a po
339a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e  inter to the Fun
339b0 63 44 65 66 20 66 6f 72 20 74 68 69 73 20 66 75  cDef for this fu
339c0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a  nction.  The P2.
339d0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ** argument is n
339e0 6f 74 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ot used by this 
339f0 6f 70 63 6f 64 65 2e 20 20 49 74 20 69 73 20 6f  opcode.  It is o
33a00 6e 6c 79 20 74 68 65 72 65 20 74 6f 20 64 69 73  nly there to dis
33a10 61 6d 62 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e  ambiguate.** fun
33a20 63 74 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20  ctions that can 
33a30 74 61 6b 65 20 76 61 72 79 69 6e 67 20 6e 75 6d  take varying num
33a40 62 65 72 73 20 6f 66 20 61 72 67 75 6d 65 6e 74  bers of argument
33a50 73 2e 20 20 54 68 65 0a 2a 2a 20 50 34 20 61 72  s.  The.** P4 ar
33a60 67 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e  gument is only n
33a70 65 65 64 65 64 20 66 6f 72 20 74 68 65 20 64 65  eeded for the de
33a80 67 65 6e 65 72 61 74 65 20 63 61 73 65 20 77 68  generate case wh
33a90 65 72 65 0a 2a 2a 20 74 68 65 20 73 74 65 70 20  ere.** the step 
33aa0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  function was not
33ab0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
33ac0 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  ed..*/.case OP_A
33ad0 67 67 46 69 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d  ggFinal: {.  Mem
33ae0 20 2a 70 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74   *pMem;.  assert
33af0 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70  ( pOp->p1>0 && p
33b00 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p1<=(p->nMem
33b10 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
33b20 20 29 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d   );.  pMem = &aM
33b30 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
33b40 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
33b50 61 67 73 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c  ags & ~(MEM_Null
33b60 7c 4d 45 4d 5f 41 67 67 29 29 3d 3d 30 20 29 3b  |MEM_Agg))==0 );
33b70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
33b80 64 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70  dbeMemFinalize(p
33b90 4d 65 6d 2c 20 70 4f 70 2d 3e 70 34 2e 70 46 75  Mem, pOp->p4.pFu
33ba0 6e 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  nc);.  if( rc ){
33bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
33bc0 45 72 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 73  Error(p, "%s", s
33bd0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
33be0 74 28 70 4d 65 6d 29 29 3b 0a 20 20 20 20 67 6f  t(pMem));.    go
33bf0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
33c00 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c  error;.  }.  sql
33c10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
33c20 63 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63  coding(pMem, enc
33c30 6f 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45  oding);.  UPDATE
33c40 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4d  _MAX_BLOBSIZE(pM
33c50 65 6d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  em);.  if( sqlit
33c60 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28  e3VdbeMemTooBig(
33c70 70 4d 65 6d 29 20 29 7b 0a 20 20 20 20 67 6f 74  pMem) ){.    got
33c80 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
33c90 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
33ca0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
33cb0 41 4c 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 68  AL./* Opcode: Ch
33cc0 65 63 6b 70 6f 69 6e 74 20 50 31 20 50 32 20 50  eckpoint P1 P2 P
33cd0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  3 * *.**.** Chec
33ce0 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
33cf0 50 31 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  P1. This is a no
33d00 2d 6f 70 20 69 66 20 50 31 20 69 73 20 6e 6f 74  -op if P1 is not
33d10 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a   currently in.**
33d20 20 57 41 4c 20 6d 6f 64 65 2e 20 50 61 72 61 6d   WAL mode. Param
33d30 65 74 65 72 20 50 32 20 69 73 20 6f 6e 65 20 6f  eter P2 is one o
33d40 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
33d50 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
33d60 4c 2c 0a 2a 2a 20 52 45 53 54 41 52 54 2c 20 6f  L,.** RESTART, o
33d70 72 20 54 52 55 4e 43 41 54 45 2e 20 20 57 72 69  r TRUNCATE.  Wri
33d80 74 65 20 31 20 6f 72 20 30 20 69 6e 74 6f 20 6d  te 1 or 0 into m
33d90 65 6d 5b 50 33 5d 20 69 66 20 74 68 65 20 63 68  em[P3] if the ch
33da0 65 63 6b 70 6f 69 6e 74 20 72 65 74 75 72 6e 73  eckpoint returns
33db0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
33dc0 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69  or not, respecti
33dd0 76 65 6c 79 2e 20 20 57 72 69 74 65 20 74 68 65  vely.  Write the
33de0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
33df0 20 69 6e 20 74 68 65 0a 2a 2a 20 57 41 4c 20 61   in the.** WAL a
33e00 66 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f  fter the checkpo
33e10 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b  int into mem[P3+
33e20 31 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  1] and the numbe
33e30 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
33e40 20 74 68 65 20 57 41 4c 20 74 68 61 74 20 68 61   the WAL that ha
33e50 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69  ve been checkpoi
33e60 6e 74 65 64 20 61 66 74 65 72 20 74 68 65 20 63  nted after the c
33e70 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d  heckpoint.** com
33e80 70 6c 65 74 65 73 20 69 6e 74 6f 20 6d 65 6d 5b  pletes into mem[
33e90 50 33 2b 32 5d 2e 20 20 48 6f 77 65 76 65 72 20  P3+2].  However 
33ea0 6f 6e 20 61 6e 20 65 72 72 6f 72 2c 20 6d 65 6d  on an error, mem
33eb0 5b 50 33 2b 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65  [P3+1] and.** me
33ec0 6d 5b 50 33 2b 32 5d 20 61 72 65 20 69 6e 69 74  m[P3+2] are init
33ed0 69 61 6c 69 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a  ialized to -1..*
33ee0 2f 0a 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70  /.case OP_Checkp
33ef0 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b  oint: {.  int i;
33f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
33f20 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
33f30 6e 74 20 61 52 65 73 5b 33 5d 3b 20 20 20 20 20  nt aRes[3];     
33f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33f50 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 4d  * Results */.  M
33f60 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20  em *pMem;       
33f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33f80 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20  * Write results 
33f90 68 65 72 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  here */..  asser
33fa0 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  t( p->readOnly==
33fb0 30 20 29 3b 0a 20 20 61 52 65 73 5b 30 5d 20 3d  0 );.  aRes[0] =
33fc0 20 30 3b 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20   0;.  aRes[1] = 
33fd0 61 52 65 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  aRes[2] = -1;.  
33fe0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d  assert( pOp->p2=
33ff0 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
34000 4e 54 5f 50 41 53 53 49 56 45 0a 20 20 20 20 20  NT_PASSIVE.     
34010 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51    || pOp->p2==SQ
34020 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
34030 46 55 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70  FULL.       || p
34040 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43  Op->p2==SQLITE_C
34050 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
34060 54 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d  T.       || pOp-
34070 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43  >p2==SQLITE_CHEC
34080 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 0a  KPOINT_TRUNCATE.
34090 20 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69    );.  rc = sqli
340a0 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  te3Checkpoint(db
340b0 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
340c0 70 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20 26 61  p2, &aRes[1], &a
340d0 52 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72  Res[2]);.  if( r
340e0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21  c ){.    if( rc!
340f0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 20 67  =SQLITE_BUSY ) g
34100 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
34110 5f 65 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d  _error;.    rc =
34120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
34130 61 52 65 73 5b 30 5d 20 3d 20 31 3b 0a 20 20 7d  aRes[0] = 1;.  }
34140 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d  .  for(i=0, pMem
34150 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
34160 5d 3b 20 69 3c 33 3b 20 69 2b 2b 2c 20 70 4d 65  ]; i<3; i++, pMe
34170 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
34180 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34  3VdbeMemSetInt64
34190 28 70 4d 65 6d 2c 20 28 69 36 34 29 61 52 65 73  (pMem, (i64)aRes
341a0 5b 69 5d 29 3b 0a 20 20 7d 20 20 20 20 0a 20 20  [i]);.  }    .  
341b0 62 72 65 61 6b 3b 0a 7d 3b 20 20 0a 23 65 6e 64  break;.};  .#end
341c0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
341d0 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 2f  TE_OMIT_PRAGMA./
341e0 2a 20 4f 70 63 6f 64 65 3a 20 4a 6f 75 72 6e 61  * Opcode: Journa
341f0 6c 4d 6f 64 65 20 50 31 20 50 32 20 50 33 20 2a  lMode P1 P2 P3 *
34200 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20   *.**.** Change 
34210 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  the journal mode
34220 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 20   of database P1 
34230 74 6f 20 50 33 2e 20 50 33 20 6d 75 73 74 20 62  to P3. P3 must b
34240 65 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  e one of the.** 
34250 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34260 45 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49 66  E_XXX values. If
34270 20 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65   changing betwee
34280 6e 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  n the various ro
34290 6c 6c 62 61 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20  llback.** modes 
342a0 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
342b0 65 2c 20 70 65 72 73 69 73 74 2c 20 6f 66 66 20  e, persist, off 
342c0 61 6e 64 20 6d 65 6d 6f 72 79 29 2c 20 74 68 69  and memory), thi
342d0 73 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  s is a simple.**
342e0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4e 6f 20 49   operation. No I
342f0 4f 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  O is required..*
34300 2a 0a 2a 2a 20 49 66 20 63 68 61 6e 67 69 6e 67  *.** If changing
34310 20 69 6e 74 6f 20 6f 72 20 6f 75 74 20 6f 66 20   into or out of 
34320 57 41 4c 20 6d 6f 64 65 20 74 68 65 20 70 72 6f  WAL mode the pro
34330 63 65 64 75 72 65 20 69 73 20 6d 6f 72 65 20 63  cedure is more c
34340 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a  omplicated..**.*
34350 2a 20 57 72 69 74 65 20 61 20 73 74 72 69 6e 67  * Write a string
34360 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
34370 66 69 6e 61 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  final journal-mo
34380 64 65 20 74 6f 20 72 65 67 69 73 74 65 72 20 50  de to register P
34390 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f  2..*/.case OP_Jo
343a0 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 20 20 20 20  urnalMode: {    
343b0 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 42 74 72  /* out2 */.  Btr
343c0 65 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ee *pBt;        
343d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
343e0 42 74 72 65 65 20 74 6f 20 63 68 61 6e 67 65 20  Btree to change 
343f0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20  journal mode of 
34400 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  */.  Pager *pPag
34410 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
34420 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73       /* Pager as
34430 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42  sociated with pB
34440 74 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65 77 3b  t */.  int eNew;
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34460 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6a 6f         /* New jo
34470 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20  urnal mode */.  
34480 69 6e 74 20 65 4f 6c 64 3b 20 20 20 20 20 20 20  int eOld;       
34490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
344a0 2f 2a 20 54 68 65 20 6f 6c 64 20 6a 6f 75 72 6e  /* The old journ
344b0 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64  al mode */.#ifnd
344c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
344d0 41 4c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  AL.  const char 
344e0 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
344f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
34500 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
34510 72 20 70 50 61 67 65 72 20 2a 2f 0a 23 65 6e 64  r pPager */.#end
34520 69 66 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  if..  pOut = out
34530 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
34540 4f 70 29 3b 0a 20 20 65 4e 65 77 20 3d 20 70 4f  Op);.  eNew = pO
34550 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28  p->p3;.  assert(
34560 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
34570 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
34580 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d  .       || eNew=
34590 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
345a0 44 45 5f 54 52 55 4e 43 41 54 45 20 0a 20 20 20  DE_TRUNCATE .   
345b0 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47      || eNew==PAG
345c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
345d0 45 52 53 49 53 54 20 0a 20 20 20 20 20 20 20 7c  ERSIST .       |
345e0 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
345f0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20  URNALMODE_OFF.  
34600 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
34610 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
34620 4d 45 4d 4f 52 59 0a 20 20 20 20 20 20 20 7c 7c  MEMORY.       ||
34630 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
34640 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20  RNALMODE_WAL.   
34650 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47      || eNew==PAG
34660 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
34670 55 45 52 59 0a 20 20 29 3b 0a 20 20 61 73 73 65  UERY.  );.  asse
34680 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
34690 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
346a0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
346b0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
346c0 0a 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44  ..  pBt = db->aD
346d0 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a  b[pOp->p1].pBt;.
346e0 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
346f0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
34700 29 3b 0a 20 20 65 4f 6c 64 20 3d 20 73 71 6c 69  );.  eOld = sqli
34710 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e  te3PagerGetJourn
34720 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  alMode(pPager);.
34730 20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47 45    if( eNew==PAGE
34740 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
34750 45 52 59 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c  ERY ) eNew = eOl
34760 64 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  d;.  if( !sqlite
34770 33 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e 67 65  3PagerOkToChange
34780 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
34790 65 72 29 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c  er) ) eNew = eOl
347a0 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d;..#ifndef SQLI
347b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 7a 46  TE_OMIT_WAL.  zF
347c0 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
347d0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
347e0 50 61 67 65 72 2c 20 31 29 3b 0a 0a 20 20 2f 2a  Pager, 1);..  /*
347f0 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   Do not allow a 
34800 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 6a 6f  transition to jo
34810 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 20 66  urnal_mode=WAL f
34820 6f 72 20 61 20 64 61 74 61 62 61 73 65 0a 20 20  or a database.  
34830 2a 2a 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ** in temporary 
34840 73 74 6f 72 61 67 65 20 6f 72 20 69 66 20 74 68  storage or if th
34850 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74 20 73  e VFS does not s
34860 75 70 70 6f 72 74 20 73 68 61 72 65 64 20 6d 65  upport shared me
34870 6d 6f 72 79 20 0a 20 20 2a 2f 0a 20 20 69 66 28  mory .  */.  if(
34880 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
34890 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20  RNALMODE_WAL.   
348a0 26 26 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  && (sqlite3Strle
348b0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d  n30(zFilename)==
348c0 30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0           /* T
348d0 65 6d 70 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  emp file */.    
348e0 20 20 20 7c 7c 20 21 73 71 6c 69 74 65 33 50 61     || !sqlite3Pa
348f0 67 65 72 57 61 6c 53 75 70 70 6f 72 74 65 64 28  gerWalSupported(
34900 70 50 61 67 65 72 29 29 20 20 20 2f 2a 20 4e 6f  pPager))   /* No
34910 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
34920 75 70 70 6f 72 74 20 2a 2f 0a 20 20 29 7b 0a 20  upport */.  ){. 
34930 20 20 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a     eNew = eOld;.
34940 20 20 7d 0a 0a 20 20 69 66 28 20 28 65 4e 65 77    }..  if( (eNew
34950 21 3d 65 4f 6c 64 29 0a 20 20 20 26 26 20 28 65  !=eOld).   && (e
34960 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  Old==PAGER_JOURN
34970 41 4c 4d 4f 44 45 5f 57 41 4c 20 7c 7c 20 65 4e  ALMODE_WAL || eN
34980 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
34990 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 29 7b 0a  LMODE_WAL).  ){.
349a0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74      if( !db->aut
349b0 6f 43 6f 6d 6d 69 74 20 7c 7c 20 64 62 2d 3e 6e  oCommit || db->n
349c0 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
349d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
349e0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
349f0 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
34a00 0a 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e  .          "cann
34a10 6f 74 20 63 68 61 6e 67 65 20 25 73 20 77 61 6c  ot change %s wal
34a20 20 6d 6f 64 65 20 66 72 6f 6d 20 77 69 74 68 69   mode from withi
34a30 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22  n a transaction"
34a40 2c 0a 20 20 20 20 20 20 20 20 20 20 28 65 4e 65  ,.          (eNe
34a50 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
34a60 4d 4f 44 45 5f 57 41 4c 20 3f 20 22 69 6e 74 6f  MODE_WAL ? "into
34a70 22 20 3a 20 22 6f 75 74 20 6f 66 22 29 0a 20 20  " : "out of").  
34a80 20 20 20 20 29 3b 0a 20 20 20 20 20 20 67 6f 74      );.      got
34a90 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
34aa0 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rror;.    }else{
34ab0 0a 20 0a 20 20 20 20 20 20 69 66 28 20 65 4f 6c  . .      if( eOl
34ac0 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  d==PAGER_JOURNAL
34ad0 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20  MODE_WAL ){.    
34ae0 20 20 20 20 2f 2a 20 49 66 20 6c 65 61 76 69 6e      /* If leavin
34af0 67 20 57 41 4c 20 6d 6f 64 65 2c 20 63 6c 6f 73  g WAL mode, clos
34b00 65 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  e the log file. 
34b10 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
34b20 68 65 20 63 61 6c 6c 0a 20 20 20 20 20 20 20 20  he call.        
34b30 2a 2a 20 74 6f 20 50 61 67 65 72 43 6c 6f 73 65  ** to PagerClose
34b40 57 61 6c 28 29 20 63 68 65 63 6b 70 6f 69 6e 74  Wal() checkpoint
34b50 73 20 61 6e 64 20 64 65 6c 65 74 65 73 20 74 68  s and deletes th
34b60 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f  e write-ahead-lo
34b70 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  g .        ** fi
34b80 6c 65 2e 20 41 6e 20 45 58 43 4c 55 53 49 56 45  le. An EXCLUSIVE
34b90 20 6c 6f 63 6b 20 6d 61 79 20 73 74 69 6c 6c 20   lock may still 
34ba0 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
34bb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 20 20  atabase file .  
34bc0 20 20 20 20 20 20 2a 2a 20 61 66 74 65 72 20 61        ** after a
34bd0 20 73 75 63 63 65 73 73 66 75 6c 20 72 65 74 75   successful retu
34be0 72 6e 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rn. .        */.
34bf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34c00 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 57 61  ite3PagerCloseWa
34c10 6c 28 70 50 61 67 65 72 2c 20 64 62 29 3b 0a 20  l(pPager, db);. 
34c20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
34c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
34c50 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erSetJournalMode
34c60 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a  (pPager, eNew);.
34c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34c80 7d 65 6c 73 65 20 69 66 28 20 65 4f 6c 64 3d 3d  }else if( eOld==
34c90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34ca0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
34cb0 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 72      /* Cannot tr
34cc0 61 6e 73 69 74 69 6f 6e 20 64 69 72 65 63 74 6c  ansition directl
34cd0 79 20 66 72 6f 6d 20 4d 45 4d 4f 52 59 20 74 6f  y from MEMORY to
34ce0 20 57 41 4c 2e 20 20 55 73 65 20 6d 6f 64 65 20   WAL.  Use mode 
34cf0 4f 46 46 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  OFF.        ** a
34d00 73 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  s an intermediat
34d10 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
34d20 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72  ite3PagerSetJour
34d30 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20  nalMode(pPager, 
34d40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34d50 45 5f 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a  E_OFF);.      }.
34d60 20 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e    .      /* Open
34d70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
34d80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34d90 69 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ile. Regardless 
34da0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
34db0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
34dc0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  is transaction a
34dd0 6c 77 61 79 73 20 75 73 65 73 20 61 20 72 6f 6c  lways uses a rol
34de0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
34df0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
34e00 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
34e10 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
34e20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
34e30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34e40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
34e50 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 56 65  qlite3BtreeSetVe
34e60 72 73 69 6f 6e 28 70 42 74 2c 20 28 65 4e 65 77  rsion(pBt, (eNew
34e70 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
34e80 4f 44 45 5f 57 41 4c 20 3f 20 32 20 3a 20 31 29  ODE_WAL ? 2 : 1)
34e90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34ea0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  .  }.#endif /* i
34eb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34ec0 54 5f 57 41 4c 20 2a 2f 0a 0a 20 20 69 66 28 20  T_WAL */..  if( 
34ed0 72 63 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64  rc ) eNew = eOld
34ee0 3b 0a 20 20 65 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  eNew = sqlit
34ef0 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61  e3PagerSetJourna
34f00 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4e  lMode(pPager, eN
34f10 65 77 29 3b 0a 0a 20 20 70 4f 75 74 2d 3e 66 6c  ew);..  pOut->fl
34f20 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
34f30 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72  M_Static|MEM_Ter
34f40 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 28  m;.  pOut->z = (
34f50 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4a 6f  char *)sqlite3Jo
34f60 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4e  urnalModename(eN
34f70 65 77 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  ew);.  pOut->n =
34f80 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
34f90 28 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 70 4f 75  (pOut->z);.  pOu
34fa0 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  t->enc = SQLITE_
34fb0 55 54 46 38 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTF8;.  sqlite3V
34fc0 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e  dbeChangeEncodin
34fd0 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67  g(pOut, encoding
34fe0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
34ff0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
35000 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
35010 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  };.#endif /* SQL
35020 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20  ITE_OMIT_PRAGMA 
35030 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
35040 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
35050 55 55 4d 29 20 26 26 20 21 64 65 66 69 6e 65 64  UUM) && !defined
35060 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54  (SQLITE_OMIT_ATT
35070 41 43 48 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ACH)./* Opcode: 
35080 56 61 63 75 75 6d 20 50 31 20 2a 20 2a 20 2a 20  Vacuum P1 * * * 
35090 2a 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d 20 74  *.**.** Vacuum t
350a0 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 62 61  he entire databa
350b0 73 65 20 50 31 2e 20 20 50 31 20 69 73 20 30 20  se P1.  P1 is 0 
350c0 66 6f 72 20 22 6d 61 69 6e 22 2c 20 61 6e 64 20  for "main", and 
350d0 32 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 66 6f 72  2 or more.** for
350e0 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
350f0 61 62 61 73 65 2e 20 20 54 68 65 20 22 74 65 6d  abase.  The "tem
35100 70 22 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  p" database may 
35110 6e 6f 74 20 62 65 20 76 61 63 75 75 6d 65 64 2e  not be vacuumed.
35120 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 63 75  .*/.case OP_Vacu
35130 75 6d 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  um: {.  assert( 
35140 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
35150 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
35160 52 75 6e 56 61 63 75 75 6d 28 26 70 2d 3e 7a 45  RunVacuum(&p->zE
35170 72 72 4d 73 67 2c 20 64 62 2c 20 70 4f 70 2d 3e  rrMsg, db, pOp->
35180 70 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  p1);.  if( rc ) 
35190 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
351a0 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
351b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
351c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
351d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29  OMIT_AUTOVACUUM)
351e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 63 72  ./* Opcode: Incr
351f0 56 61 63 75 75 6d 20 50 31 20 50 32 20 2a 20 2a  Vacuum P1 P2 * *
35200 20 2a 0a 2a 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d   *.**.** Perform
35210 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
35220 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
35230 6c 20 76 61 63 75 75 6d 20 70 72 6f 63 65 64 75  l vacuum procedu
35240 72 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 50 31 20  re on.** the P1 
35250 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
35260 20 76 61 63 75 75 6d 20 68 61 73 20 66 69 6e 69   vacuum has fini
35270 73 68 65 64 2c 20 6a 75 6d 70 20 74 6f 20 69 6e  shed, jump to in
35280 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e  struction.** P2.
35290 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
352a0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
352b0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
352c0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 63  ..*/.case OP_Inc
352d0 72 56 61 63 75 75 6d 3a 20 7b 20 20 20 20 20 20  rVacuum: {      
352e0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 42    /* jump */.  B
352f0 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73  tree *pBt;..  as
35300 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
35310 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e   && pOp->p1<db->
35320 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
35330 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
35340 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70  treeMask, pOp->p
35350 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
35360 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
35370 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44  ;.  pBt = db->aD
35380 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a  b[pOp->p1].pBt;.
35390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
353a0 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 70 42  reeIncrVacuum(pB
353b0 74 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68  t);.  VdbeBranch
353c0 54 61 6b 65 6e 28 72 63 3d 3d 53 51 4c 49 54 45  Taken(rc==SQLITE
353d0 5f 44 4f 4e 45 2c 32 29 3b 0a 20 20 69 66 28 20  _DONE,2);.  if( 
353e0 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  rc ){.    if( rc
353f0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  !=SQLITE_DONE ) 
35400 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
35410 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 72 63 20  o_error;.    rc 
35420 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
35430 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
35440 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
35450 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f  .#endif../* Opco
35460 64 65 3a 20 45 78 70 69 72 65 20 50 31 20 2a 20  de: Expire P1 * 
35470 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73  * * *.**.** Caus
35480 65 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74  e precompiled st
35490 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 78 70 69  atements to expi
354a0 72 65 2e 20 20 57 68 65 6e 20 61 6e 20 65 78 70  re.  When an exp
354b0 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a  ired statement.*
354c0 2a 20 69 73 20 65 78 65 63 75 74 65 64 20 75 73  * is executed us
354d0 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ing sqlite3_step
354e0 28 29 20 69 74 20 77 69 6c 6c 20 65 69 74 68 65  () it will eithe
354f0 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  r automatically.
35500 2a 2a 20 72 65 70 72 65 70 61 72 65 20 69 74 73  ** reprepare its
35510 65 6c 66 20 28 69 66 20 69 74 20 77 61 73 20 6f  elf (if it was o
35520 72 69 67 69 6e 61 6c 6c 79 20 63 72 65 61 74 65  riginally create
35530 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
35540 70 72 65 70 61 72 65 5f 76 32 28 29 29 0a 2a 2a  prepare_v2()).**
35550 20 6f 72 20 69 74 20 77 69 6c 6c 20 66 61 69 6c   or it will fail
35560 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 43 48   with SQLITE_SCH
35570 45 4d 41 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 50  EMA..** .** If P
35580 31 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6c 6c  1 is 0, then all
35590 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
355a0 62 65 63 6f 6d 65 20 65 78 70 69 72 65 64 2e 20  become expired. 
355b0 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P1 is non-zer
355c0 6f 2c 0a 2a 2a 20 74 68 65 6e 20 6f 6e 6c 79 20  o,.** then only 
355d0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  the currently ex
355e0 65 63 75 74 69 6e 67 20 73 74 61 74 65 6d 65 6e  ecuting statemen
355f0 74 20 69 73 20 65 78 70 69 72 65 64 2e 0a 2a 2f  t is expired..*/
35600 0a 63 61 73 65 20 4f 50 5f 45 78 70 69 72 65 3a  .case OP_Expire:
35610 20 7b 0a 20 20 69 66 28 20 21 70 4f 70 2d 3e 70   {.  if( !pOp->p
35620 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
35630 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
35640 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
35650 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 78  }else{.    p->ex
35660 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  pired = 1;.  }. 
35670 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
35680 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
35690 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 20 4f  HARED_CACHE./* O
356a0 70 63 6f 64 65 3a 20 54 61 62 6c 65 4c 6f 63 6b  pcode: TableLock
356b0 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
356c0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 44 62 3d  * Synopsis: iDb=
356d0 50 31 20 72 6f 6f 74 3d 50 32 20 77 72 69 74 65  P1 root=P2 write
356e0 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e  =P3.**.** Obtain
356f0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 70 61 72   a lock on a par
35700 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 54  ticular table. T
35710 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
35720 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
35730 6e 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d  n.** the shared-
35740 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73  cache feature is
35750 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a   enabled. .**.**
35760 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78   P1 is the index
35770 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
35780 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62 5b   in sqlite3.aDb[
35790 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  ] of the databas
357a0 65 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68  e.** on which th
357b0 65 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72  e lock is acquir
357c0 65 64 2e 20 20 41 20 72 65 61 64 6c 6f 63 6b 20  ed.  A readlock 
357d0 69 73 20 6f 62 74 61 69 6e 65 64 20 69 66 20 50  is obtained if P
357e0 33 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77 72 69  3==0 or.** a wri
357f0 74 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d 3d 31  te lock if P3==1
35800 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74 61  ..**.** P2 conta
35810 69 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  ins the root-pag
35820 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
35830 6f 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34  o lock..**.** P4
35840 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
35850 74 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ter to the name 
35860 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  of the table bei
35870 6e 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69 73 20  ng locked. This 
35880 69 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64 20  is only.** used 
35890 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
358a0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
358b0 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
358c0 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a  be obtained..*/.
358d0 63 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  case OP_TableLoc
358e0 6b 3a 20 7b 0a 20 20 75 38 20 69 73 57 72 69 74  k: {.  u8 isWrit
358f0 65 4c 6f 63 6b 20 3d 20 28 75 38 29 70 4f 70 2d  eLock = (u8)pOp-
35900 3e 70 33 3b 0a 20 20 69 66 28 20 69 73 57 72 69  >p3;.  if( isWri
35910 74 65 4c 6f 63 6b 20 7c 7c 20 30 3d 3d 28 64 62  teLock || 0==(db
35920 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
35930 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20 29 7b 0a  eadUncommit) ){.
35940 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 4f 70      int p1 = pOp
35950 2d 3e 70 31 3b 20 0a 20 20 20 20 61 73 73 65 72  ->p1; .    asser
35960 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 64  t( p1>=0 && p1<d
35970 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
35980 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
35990 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70  (p->btreeMask, p
359a0 31 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  1) );.    assert
359b0 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30  ( isWriteLock==0
359c0 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d   || isWriteLock=
359d0 3d 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =1 );.    rc = s
359e0 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54  qlite3BtreeLockT
359f0 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d  able(db->aDb[p1]
35a00 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69  .pBt, pOp->p2, i
35a10 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20  sWriteLock);.   
35a20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
35a30 20 69 66 28 20 28 72 63 26 30 78 46 46 29 3d 3d   if( (rc&0xFF)==
35a40 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
35a50 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
35a60 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34  har *z = pOp->p4
35a70 2e 7a 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  .z;.        sqli
35a80 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
35a90 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
35aa0 69 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20  is locked: %s", 
35ab0 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
35ac0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
35ad0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
35ae0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
35af0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
35b00 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
35b10 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
35b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
35b30 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
35b40 65 3a 20 56 42 65 67 69 6e 20 2a 20 2a 20 2a 20  e: VBegin * * * 
35b50 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61  P4 *.**.** P4 ma
35b60 79 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  y be a pointer t
35b70 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  o an sqlite3_vta
35b80 62 20 73 74 72 75 63 74 75 72 65 2e 20 49 66 20  b structure. If 
35b90 73 6f 2c 20 63 61 6c 6c 20 74 68 65 20 0a 2a 2a  so, call the .**
35ba0 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20 66   xBegin method f
35bb0 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  or that table..*
35bc0 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68 65 74 68  *.** Also, wheth
35bd0 65 72 20 6f 72 20 6e 6f 74 20 50 34 20 69 73 20  er or not P4 is 
35be0 73 65 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20  set, check that 
35bf0 74 68 69 73 20 69 73 20 6e 6f 74 20 62 65 69 6e  this is not bein
35c00 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a  g called from.**
35c10 20 77 69 74 68 69 6e 20 61 20 63 61 6c 6c 62 61   within a callba
35c20 63 6b 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20  ck to a virtual 
35c30 74 61 62 6c 65 20 78 53 79 6e 63 28 29 20 6d 65  table xSync() me
35c40 74 68 6f 64 2e 20 49 66 20 69 74 20 69 73 2c 20  thod. If it is, 
35c50 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
35c60 65 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  e will be set to
35c70 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
35c80 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 42 65 67 69  */.case OP_VBegi
35c90 6e 3a 20 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70  n: {.  VTable *p
35ca0 56 54 61 62 3b 0a 20 20 70 56 54 61 62 20 3d 20  VTab;.  pVTab = 
35cb0 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
35cc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
35cd0 62 42 65 67 69 6e 28 64 62 2c 20 70 56 54 61 62  bBegin(db, pVTab
35ce0 29 3b 0a 20 20 69 66 28 20 70 56 54 61 62 20 29  );.  if( pVTab )
35cf0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
35d00 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 54 61  rtErrmsg(p, pVTa
35d10 62 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28  b->pVtab);.  if(
35d20 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
35d30 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
35d40 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
35d50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
35d60 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
35d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35d80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
35d90 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 72  E./* Opcode: VCr
35da0 65 61 74 65 20 50 31 20 50 32 20 2a 20 2a 20 2a  eate P1 P2 * * *
35db0 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 61 20 72  .**.** P2 is a r
35dc0 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
35dd0 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ds the name of a
35de0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
35df0 6e 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 50  n database .** P
35e00 31 2e 20 43 61 6c 6c 20 74 68 65 20 78 43 72 65  1. Call the xCre
35e10 61 74 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  ate method for t
35e20 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  hat table..*/.ca
35e30 73 65 20 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b  se OP_VCreate: {
35e40 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20  .  Mem sMem;    
35e50 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f        /* For sto
35e60 72 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ring the record 
35e70 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f  being decoded */
35e80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
35e90 54 61 62 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  Tab;  /* Name of
35ea0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
35eb0 6c 65 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28  le */..  memset(
35ec0 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sMem, 0, sizeof
35ed0 28 73 4d 65 6d 29 29 3b 0a 20 20 73 4d 65 6d 2e  (sMem));.  sMem.
35ee0 64 62 20 3d 20 64 62 3b 0a 20 20 2f 2a 20 42 65  db = db;.  /* Be
35ef0 63 61 75 73 65 20 50 32 20 69 73 20 61 6c 77 61  cause P2 is alwa
35f00 79 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  ys a static stri
35f10 6e 67 2c 20 69 74 20 69 73 20 69 6d 70 6f 73 73  ng, it is imposs
35f20 69 62 6c 65 20 66 6f 72 20 74 68 65 0a 20 20 2a  ible for the.  *
35f30 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  * sqlite3VdbeMem
35f40 43 6f 70 79 28 29 20 74 6f 20 66 61 69 6c 20 2a  Copy() to fail *
35f50 2f 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d 65  /.  assert( (aMe
35f60 6d 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73  m[pOp->p2].flags
35f70 20 26 20 4d 45 4d 5f 53 74 72 29 21 3d 30 20 29   & MEM_Str)!=0 )
35f80 3b 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d 65  ;.  assert( (aMe
35f90 6d 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73  m[pOp->p2].flags
35fa0 20 26 20 4d 45 4d 5f 53 74 61 74 69 63 29 21 3d   & MEM_Static)!=
35fb0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
35fc0 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 26  te3VdbeMemCopy(&
35fd0 73 4d 65 6d 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  sMem, &aMem[pOp-
35fe0 3e 70 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  >p2]);.  assert(
35ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36000 3b 0a 20 20 7a 54 61 62 20 3d 20 28 63 6f 6e 73  ;.  zTab = (cons
36010 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
36020 76 61 6c 75 65 5f 74 65 78 74 28 26 73 4d 65 6d  value_text(&sMem
36030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
36040 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
36050 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a  ailed );.  if( z
36060 54 61 62 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Tab ){.    rc = 
36070 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
36080 72 65 61 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70  reate(db, pOp->p
36090 31 2c 20 7a 54 61 62 2c 20 26 70 2d 3e 7a 45 72  1, zTab, &p->zEr
360a0 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rMsg);.  }.  sql
360b0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
360c0 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 69 66 28  se(&sMem);.  if(
360d0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
360e0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
360f0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
36100 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
36110 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
36120 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36130 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
36140 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65  E./* Opcode: VDe
36150 73 74 72 6f 79 20 50 31 20 2a 20 2a 20 50 34 20  stroy P1 * * P4 
36160 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68  *.**.** P4 is th
36170 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74  e name of a virt
36180 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74  ual table in dat
36190 61 62 61 73 65 20 50 31 2e 20 20 43 61 6c 6c 20  abase P1.  Call 
361a0 74 68 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74  the xDestroy met
361b0 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74  hod.** of that t
361c0 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  able..*/.case OP
361d0 5f 56 44 65 73 74 72 6f 79 3a 20 7b 0a 20 20 64  _VDestroy: {.  d
361e0 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 2b 3b 0a  b->nVDestroy++;.
361f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
36200 61 62 43 61 6c 6c 44 65 73 74 72 6f 79 28 64 62  abCallDestroy(db
36210 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
36220 70 34 2e 7a 29 3b 0a 20 20 64 62 2d 3e 6e 56 44  p4.z);.  db->nVD
36230 65 73 74 72 6f 79 2d 2d 3b 0a 20 20 69 66 28 20  estroy--;.  if( 
36240 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
36250 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
36260 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
36270 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
36280 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
36290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
362a0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
362b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65  ./* Opcode: VOpe
362c0 6e 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  n P1 * * P4 *.**
362d0 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
362e0 74 65 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c  ter to a virtual
362f0 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61   table object, a
36300 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
36310 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20  tructure..** P1 
36320 69 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  is a cursor numb
36330 65 72 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  er.  This opcode
36340 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20   opens a cursor 
36350 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a  to the virtual.*
36360 2a 20 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72  * table and stor
36370 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 69  es that cursor i
36380 6e 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  n P1..*/.case OP
36390 5f 56 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65  _VOpen: {.  Vdbe
363a0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
363b0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
363c0 73 6f 72 20 2a 70 56 43 75 72 3b 0a 20 20 73 71  sor *pVCur;.  sq
363d0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
363e0 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  b;.  const sqlit
363f0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
36400 6c 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  le;..  assert( p
36410 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20  ->bIsReader );. 
36420 20 70 43 75 72 20 3d 20 30 3b 0a 20 20 70 56 43   pCur = 0;.  pVC
36430 75 72 20 3d 20 30 3b 0a 20 20 70 56 74 61 62 20  ur = 0;.  pVtab 
36440 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
36450 3e 70 56 74 61 62 3b 0a 20 20 69 66 28 20 70 56  >pVtab;.  if( pV
36460 74 61 62 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  tab==0 || NEVER(
36470 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3d 3d  pVtab->pModule==
36480 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  0) ){.    rc = S
36490 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
364a0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
364b0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
364c0 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62   pModule = pVtab
364d0 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 72 63 20  ->pModule;.  rc 
364e0 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e  = pModule->xOpen
364f0 28 70 56 74 61 62 2c 20 26 70 56 43 75 72 29 3b  (pVtab, &pVCur);
36500 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d  .  sqlite3VtabIm
36510 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56  portErrmsg(p, pV
36520 74 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29  tab);.  if( rc )
36530 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
36540 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  to_error;..  /* 
36550 49 6e 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74  Initialize sqlit
36560 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
36570 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 70  ase class */.  p
36580 56 43 75 72 2d 3e 70 56 74 61 62 20 3d 20 70 56  VCur->pVtab = pV
36590 74 61 62 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  tab;..  /* Initi
365a0 61 6c 69 7a 65 20 76 64 62 65 20 63 75 72 73 6f  alize vdbe curso
365b0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 43  r object */.  pC
365c0 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  ur = allocateCur
365d0 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
365e0 30 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 56  0, -1, CURTYPE_V
365f0 54 41 42 29 3b 0a 20 20 69 66 28 20 70 43 75 72  TAB);.  if( pCur
36600 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 75 63   ){.    pCur->uc
36610 2e 70 56 43 75 72 20 3d 20 70 56 43 75 72 3b 0a  .pVCur = pVCur;.
36620 20 20 20 20 70 56 74 61 62 2d 3e 6e 52 65 66 2b      pVtab->nRef+
36630 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
36640 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
36650 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
36660 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
36670 70 56 43 75 72 29 3b 0a 20 20 20 20 67 6f 74 6f  pVCur);.    goto
36680 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 62   no_mem;.  }.  b
36690 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
366a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
366b0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
366c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
366d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
366e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 46 69 6c 74  /* Opcode: VFilt
366f0 65 72 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  er P1 P2 P3 P4 *
36700 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 70  .** Synopsis: ip
36710 6c 61 6e 3d 72 5b 50 33 5d 20 7a 70 6c 61 6e 3d  lan=r[P3] zplan=
36720 27 50 34 27 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  'P4'.**.** P1 is
36730 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
36740 20 75 73 69 6e 67 20 56 4f 70 65 6e 2e 20 20 50   using VOpen.  P
36750 32 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20  2 is an address 
36760 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 0a 2a 2a  to jump to if.**
36770 20 74 68 65 20 66 69 6c 74 65 72 65 64 20 72 65   the filtered re
36780 73 75 6c 74 20 73 65 74 20 69 73 20 65 6d 70 74  sult set is empt
36790 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 65  y..**.** P4 is e
367a0 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20  ither NULL or a 
367b0 73 74 72 69 6e 67 20 74 68 61 74 20 77 61 73 20  string that was 
367c0 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
367d0 20 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20 6d   xBestIndex.** m
367e0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64  ethod of the mod
367f0 75 6c 65 2e 20 20 54 68 65 20 69 6e 74 65 72 70  ule.  The interp
36800 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  retation of the 
36810 50 34 20 73 74 72 69 6e 67 20 69 73 20 6c 65 66  P4 string is lef
36820 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6d 6f 64 75  t.** to the modu
36830 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
36840 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  n..**.** This op
36850 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
36860 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20   xFilter method 
36870 6f 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  on the virtual t
36880 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 0a 2a  able specified.*
36890 2a 20 62 79 20 50 31 2e 20 20 54 68 65 20 69 6e  * by P1.  The in
368a0 74 65 67 65 72 20 71 75 65 72 79 20 70 6c 61 6e  teger query plan
368b0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78 46   parameter to xF
368c0 69 6c 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  ilter is stored 
368d0 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 50  in register.** P
368e0 33 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 31  3. Register P3+1
368f0 20 73 74 6f 72 65 73 20 74 68 65 20 61 72 67 63   stores the argc
36900 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 62 65   parameter to be
36910 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 2a   passed to the.*
36920 2a 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  * xFilter method
36930 2e 20 52 65 67 69 73 74 65 72 73 20 50 33 2b 32  . Registers P3+2
36940 2e 2e 50 33 2b 31 2b 61 72 67 63 20 61 72 65 20  ..P3+1+argc are 
36950 74 68 65 20 61 72 67 63 0a 2a 2a 20 61 64 64 69  the argc.** addi
36960 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72  tional parameter
36970 73 20 77 68 69 63 68 20 61 72 65 20 70 61 73 73  s which are pass
36980 65 64 20 74 6f 0a 2a 2a 20 78 46 69 6c 74 65 72  ed to.** xFilter
36990 20 61 73 20 61 72 67 76 2e 20 52 65 67 69 73 74   as argv. Regist
369a0 65 72 20 50 33 2b 32 20 62 65 63 6f 6d 65 73 20  er P3+2 becomes 
369b0 61 72 67 76 5b 30 5d 20 77 68 65 6e 20 70 61 73  argv[0] when pas
369c0 73 65 64 20 74 6f 20 78 46 69 6c 74 65 72 2e 0a  sed to xFilter..
369d0 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 69 73 20  **.** A jump is 
369e0 6d 61 64 65 20 74 6f 20 50 32 20 69 66 20 74 68  made to P2 if th
369f0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 66 74  e result set aft
36a00 65 72 20 66 69 6c 74 65 72 69 6e 67 20 77 6f 75  er filtering wou
36a10 6c 64 20 62 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a  ld be empty..*/.
36a20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
36a30 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a   {   /* jump */.
36a40 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e    int nArg;.  in
36a50 74 20 69 51 75 65 72 79 3b 0a 20 20 63 6f 6e 73  t iQuery;.  cons
36a60 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
36a70 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d   *pModule;.  Mem
36a80 20 2a 70 51 75 65 72 79 3b 0a 20 20 4d 65 6d 20   *pQuery;.  Mem 
36a90 2a 70 41 72 67 63 3b 0a 20 20 73 71 6c 69 74 65  *pArgc;.  sqlite
36aa0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
36ab0 56 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  VCur;.  sqlite3_
36ac0 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 56  vtab *pVtab;.  V
36ad0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
36ae0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e  .  int res;.  in
36af0 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41  t i;.  Mem **apA
36b00 72 67 3b 0a 0a 20 20 70 51 75 65 72 79 20 3d 20  rg;..  pQuery = 
36b10 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
36b20 20 20 70 41 72 67 63 20 3d 20 26 70 51 75 65 72    pArgc = &pQuer
36b30 79 5b 31 5d 3b 0a 20 20 70 43 75 72 20 3d 20 70  y[1];.  pCur = p
36b40 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
36b50 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49  ;.  assert( memI
36b60 73 56 61 6c 69 64 28 70 51 75 65 72 79 29 20 29  sValid(pQuery) )
36b70 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
36b80 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 51 75 65  CE(pOp->p3, pQue
36b90 72 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ry);.  assert( p
36ba0 43 75 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  Cur->eCurType==C
36bb0 55 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20  URTYPE_VTAB );. 
36bc0 20 70 56 43 75 72 20 3d 20 70 43 75 72 2d 3e 75   pVCur = pCur->u
36bd0 63 2e 70 56 43 75 72 3b 0a 20 20 70 56 74 61 62  c.pVCur;.  pVtab
36be0 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 3b   = pVCur->pVtab;
36bf0 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74  .  pModule = pVt
36c00 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20  ab->pModule;..  
36c10 2f 2a 20 47 72 61 62 20 74 68 65 20 69 6e 64 65  /* Grab the inde
36c20 78 20 6e 75 6d 62 65 72 20 61 6e 64 20 61 72 67  x number and arg
36c30 63 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  c parameters */.
36c40 20 20 61 73 73 65 72 74 28 20 28 70 51 75 65 72    assert( (pQuer
36c50 79 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  y->flags&MEM_Int
36c60 29 21 3d 30 20 26 26 20 70 41 72 67 63 2d 3e 66  )!=0 && pArgc->f
36c70 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b  lags==MEM_Int );
36c80 0a 20 20 6e 41 72 67 20 3d 20 28 69 6e 74 29 70  .  nArg = (int)p
36c90 41 72 67 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75  Argc->u.i;.  iQu
36ca0 65 72 79 20 3d 20 28 69 6e 74 29 70 51 75 65 72  ery = (int)pQuer
36cb0 79 2d 3e 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e  y->u.i;..  /* In
36cc0 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 74 65 72  voke the xFilter
36cd0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 65 73   method */.  res
36ce0 20 3d 20 30 3b 0a 20 20 61 70 41 72 67 20 3d 20   = 0;.  apArg = 
36cf0 70 2d 3e 61 70 41 72 67 3b 0a 20 20 66 6f 72 28  p->apArg;.  for(
36d00 69 20 3d 20 30 3b 20 69 3c 6e 41 72 67 3b 20 69  i = 0; i<nArg; i
36d10 2b 2b 29 7b 0a 20 20 20 20 61 70 41 72 67 5b 69  ++){.    apArg[i
36d20 5d 20 3d 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b  ] = &pArgc[i+1];
36d30 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 4d 6f 64  .  }.  rc = pMod
36d40 75 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70 56 43  ule->xFilter(pVC
36d50 75 72 2c 20 69 51 75 65 72 79 2c 20 70 4f 70 2d  ur, iQuery, pOp-
36d60 3e 70 34 2e 7a 2c 20 6e 41 72 67 2c 20 61 70 41  >p4.z, nArg, apA
36d70 72 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  rg);.  sqlite3Vt
36d80 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70  abImportErrmsg(p
36d90 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20  , pVtab);.  if( 
36da0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
36db0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
36dc0 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78  res = pModule->x
36dd0 45 6f 66 28 70 56 43 75 72 29 3b 0a 20 20 70 43  Eof(pVCur);.  pC
36de0 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  ur->nullRow = 0;
36df0 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
36e00 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20  en(res!=0,2);.  
36e10 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a  if( res ) goto j
36e20 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
36e30 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
36e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
36e50 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
36e60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36e70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
36e80 20 4f 70 63 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e   Opcode: VColumn
36e90 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
36ea0 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
36eb0 3d 76 63 6f 6c 75 6d 6e 28 50 32 29 0a 2a 2a 0a  =vcolumn(P2).**.
36ec0 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  ** Store the val
36ed0 75 65 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20  ue of the P2-th 
36ee0 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
36ef0 20 72 6f 77 20 6f 66 20 74 68 65 20 76 69 72 74   row of the virt
36f00 75 61 6c 2d 74 61 62 6c 65 20 74 68 61 74 20 74  ual-table that t
36f10 68 65 20 0a 2a 2a 20 50 31 20 63 75 72 73 6f 72  he .** P1 cursor
36f20 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
36f30 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33  into register P3
36f40 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 6f  ..*/.case OP_VCo
36f50 6c 75 6d 6e 3a 20 7b 0a 20 20 73 71 6c 69 74 65  lumn: {.  sqlite
36f60 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20  3_vtab *pVtab;. 
36f70 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
36f80 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a  odule *pModule;.
36f90 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b 0a 20 20    Mem *pDest;.  
36fa0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
36fb0 73 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 56 64 62  sContext;..  Vdb
36fc0 65 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  eCursor *pCur = 
36fd0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
36fe0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
36ff0 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  r->eCurType==CUR
37000 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 61  TYPE_VTAB );.  a
37010 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
37020 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d   && pOp->p3<=(p-
37030 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
37040 72 73 6f 72 29 20 29 3b 0a 20 20 70 44 65 73 74  rsor) );.  pDest
37050 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
37060 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
37070 68 61 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b  hange(p, pDest);
37080 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c  .  if( pCur->nul
37090 6c 52 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69  lRow ){.    sqli
370a0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
370b0 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72  l(pDest);.    br
370c0 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62  eak;.  }.  pVtab
370d0 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75   = pCur->uc.pVCu
370e0 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64  r->pVtab;.  pMod
370f0 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
37100 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  dule;.  assert( 
37110 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e  pModule->xColumn
37120 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 43   );.  memset(&sC
37130 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f  ontext, 0, sizeo
37140 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  f(sContext));.  
37150 73 43 6f 6e 74 65 78 74 2e 70 4f 75 74 20 3d 20  sContext.pOut = 
37160 70 44 65 73 74 3b 0a 20 20 4d 65 6d 53 65 74 54  pDest;.  MemSetT
37170 79 70 65 46 6c 61 67 28 70 44 65 73 74 2c 20 4d  ypeFlag(pDest, M
37180 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 72 63 20 3d  EM_Null);.  rc =
37190 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d   pModule->xColum
371a0 6e 28 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72  n(pCur->uc.pVCur
371b0 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 4f 70  , &sContext, pOp
371c0 2d 3e 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->p2);.  sqlite3
371d0 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
371e0 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66  (p, pVtab);.  if
371f0 28 20 73 43 6f 6e 74 65 78 74 2e 69 73 45 72 72  ( sContext.isErr
37200 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  or ){.    rc = s
37210 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 3b  Context.isError;
37220 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
37230 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
37240 28 70 44 65 73 74 2c 20 65 6e 63 6f 64 69 6e 67  (pDest, encoding
37250 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
37260 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65  ACE(pOp->p3, pDe
37270 73 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  st);.  UPDATE_MA
37280 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74  X_BLOBSIZE(pDest
37290 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
372a0 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
372b0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74  Dest) ){.    got
372c0 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
372d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
372e0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
372f0 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  r;.  break;.}.#e
37300 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
37310 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
37320 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
37330 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
37340 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
37350 20 56 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a   VNext P1 P2 * *
37360 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65   *.**.** Advance
37370 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 50   virtual table P
37380 31 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  1 to the next ro
37390 77 20 69 6e 20 69 74 73 20 72 65 73 75 6c 74 20  w in its result 
373a0 73 65 74 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20  set and.** jump 
373b0 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50  to instruction P
373c0 32 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 76  2.  Or, if the v
373d0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 73  irtual table has
373e0 20 72 65 61 63 68 65 64 0a 2a 2a 20 74 68 65 20   reached.** the 
373f0 65 6e 64 20 6f 66 20 69 74 73 20 72 65 73 75 6c  end of its resul
37400 74 20 73 65 74 2c 20 74 68 65 6e 20 66 61 6c 6c  t set, then fall
37410 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
37420 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
37430 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4e 65  ..*/.case OP_VNe
37440 78 74 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20  xt: {   /* jump 
37450 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  */.  sqlite3_vta
37460 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73  b *pVtab;.  cons
37470 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
37480 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74   *pModule;.  int
37490 20 72 65 73 3b 0a 20 20 56 64 62 65 43 75 72 73   res;.  VdbeCurs
374a0 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 72 65 73  or *pCur;..  res
374b0 20 3d 20 30 3b 0a 20 20 70 43 75 72 20 3d 20 70   = 0;.  pCur = p
374c0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
374d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
374e0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
374f0 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 69 66  YPE_VTAB );.  if
37500 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20  ( pCur->nullRow 
37510 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ){.    break;.  
37520 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72  }.  pVtab = pCur
37530 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61  ->uc.pVCur->pVta
37540 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70  b;.  pModule = p
37550 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
37560 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
37570 2d 3e 78 4e 65 78 74 20 29 3b 0a 0a 20 20 2f 2a  ->xNext );..  /*
37580 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 4e 65 78   Invoke the xNex
37590 74 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  t() method of th
375a0 65 20 6d 6f 64 75 6c 65 2e 20 54 68 65 72 65 20  e module. There 
375b0 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 74 68  is no way for th
375c0 65 0a 20 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  e.  ** underlyin
375d0 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
375e0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
375f0 72 6f 72 20 69 66 20 6f 6e 65 20 6f 63 63 75 72  ror if one occur
37600 73 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 78 4e  s during.  ** xN
37610 65 78 74 28 29 2e 20 49 6e 73 74 65 61 64 2c 20  ext(). Instead, 
37620 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
37630 72 73 2c 20 74 72 75 65 20 69 73 20 72 65 74 75  rs, true is retu
37640 72 6e 65 64 20 28 69 6e 64 69 63 61 74 69 6e 67  rned (indicating
37650 20 74 68 61 74 20 0a 20 20 2a 2a 20 64 61 74 61   that .  ** data
37660 20 69 73 20 61 76 61 69 6c 61 62 6c 65 29 20 61   is available) a
37670 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
37680 65 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  e returned when 
37690 78 43 6f 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a 20  xColumn or.  ** 
376a0 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 74 68 6f  some other metho
376b0 64 20 69 73 20 6e 65 78 74 20 69 6e 76 6f 6b 65  d is next invoke
376c0 64 20 6f 6e 20 74 68 65 20 73 61 76 65 20 76 69  d on the save vi
376d0 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
376e0 6f 72 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  or..  */.  rc = 
376f0 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70  pModule->xNext(p
37700 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a  Cur->uc.pVCur);.
37710 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
37720 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
37730 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ab);.  if( rc ) 
37740 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
37750 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d  o_error;.  res =
37760 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70   pModule->xEof(p
37770 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a  Cur->uc.pVCur);.
37780 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
37790 6e 28 21 72 65 73 2c 32 29 3b 0a 20 20 69 66 28  n(!res,2);.  if(
377a0 20 21 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20   !res ){.    /* 
377b0 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61  If there is data
377c0 2c 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a  , jump to P2 */.
377d0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
377e0 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f  _p2_and_check_fo
377f0 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d  r_interrupt;.  }
37800 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f  .  goto check_fo
37810 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 23  r_interrupt;.}.#
37820 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
37830 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
37840 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
37850 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
37860 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
37870 3a 20 56 52 65 6e 61 6d 65 20 50 31 20 2a 20 2a  : VRename P1 * *
37880 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69   P4 *.**.** P4 i
37890 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
378a0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
378b0 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65  bject, an sqlite
378c0 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
378d0 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  ..** This opcode
378e0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 72   invokes the cor
378f0 72 65 73 70 6f 6e 64 69 6e 67 20 78 52 65 6e 61  responding xRena
37900 6d 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 76  me method. The v
37910 61 6c 75 65 0a 2a 2a 20 69 6e 20 72 65 67 69 73  alue.** in regis
37920 74 65 72 20 50 31 20 69 73 20 70 61 73 73 65 64  ter P1 is passed
37930 20 61 73 20 74 68 65 20 7a 4e 61 6d 65 20 61 72   as the zName ar
37940 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 78 52  gument to the xR
37950 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f  ename method..*/
37960 0a 63 61 73 65 20 4f 50 5f 56 52 65 6e 61 6d 65  .case OP_VRename
37970 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  : {.  sqlite3_vt
37980 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 4d 65 6d  ab *pVtab;.  Mem
37990 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 70 56 74 61   *pName;..  pVta
379a0 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
379b0 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4e 61 6d  b->pVtab;.  pNam
379c0 65 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  e = &aMem[pOp->p
379d0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56  1];.  assert( pV
379e0 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52  tab->pModule->xR
379f0 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  ename );.  asser
37a00 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4e  t( memIsValid(pN
37a10 61 6d 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ame) );.  assert
37a20 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
37a30 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54   );.  REGISTER_T
37a40 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 4e  RACE(pOp->p1, pN
37a50 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ame);.  assert( 
37a60 70 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26 20 4d  pName->flags & M
37a70 45 4d 5f 53 74 72 20 29 3b 0a 20 20 74 65 73 74  EM_Str );.  test
37a80 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63  case( pName->enc
37a90 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b  ==SQLITE_UTF8 );
37aa0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 61  .  testcase( pNa
37ab0 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  me->enc==SQLITE_
37ac0 55 54 46 31 36 42 45 20 29 3b 0a 20 20 74 65 73  UTF16BE );.  tes
37ad0 74 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e  tcase( pName->en
37ae0 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
37af0 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  E );.  rc = sqli
37b00 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
37b10 6f 64 69 6e 67 28 70 4e 61 6d 65 2c 20 53 51 4c  oding(pName, SQL
37b20 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
37b30 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
37b40 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
37b50 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
37b60 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 28 70 56  dule->xRename(pV
37b70 74 61 62 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  tab, pName->z);.
37b80 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
37b90 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
37ba0 61 62 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  ab);.  p->expire
37bb0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 20  d = 0;.  if( rc 
37bc0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
37bd0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
37be0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ak;.}.#endif..#i
37bf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37c00 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
37c10 2a 20 4f 70 63 6f 64 65 3a 20 56 55 70 64 61 74  * Opcode: VUpdat
37c20 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
37c30 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 64 61  .** Synopsis: da
37c40 74 61 3d 72 5b 50 33 40 50 32 5d 0a 2a 2a 0a 2a  ta=r[P3@P2].**.*
37c50 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
37c60 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74  r to a virtual t
37c70 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20  able object, an 
37c80 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
37c90 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20  ucture..** This 
37ca0 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74  opcode invokes t
37cb0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
37cc0 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e   xUpdate method.
37cd0 20 50 32 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72   P2 values.** ar
37ce0 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d  e contiguous mem
37cf0 6f 72 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69  ory cells starti
37d00 6e 67 20 61 74 20 50 33 20 74 6f 20 70 61 73 73  ng at P3 to pass
37d10 20 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 20   to the xUpdate 
37d20 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  .** invocation. 
37d30 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
37d40 69 73 74 65 72 20 28 50 33 2b 50 32 2d 31 29 20  ister (P3+P2-1) 
37d50 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
37d60 68 65 20 0a 2a 2a 20 70 32 74 68 20 65 6c 65 6d  he .** p2th elem
37d70 65 6e 74 20 6f 66 20 74 68 65 20 61 72 67 76 20  ent of the argv 
37d80 61 72 72 61 79 20 70 61 73 73 65 64 20 74 6f 20  array passed to 
37d90 78 55 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  xUpdate..**.** T
37da0 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f  he xUpdate metho
37db0 64 20 77 69 6c 6c 20 64 6f 20 61 20 44 45 4c 45  d will do a DELE
37dc0 54 45 20 6f 72 20 61 6e 20 49 4e 53 45 52 54 20  TE or an INSERT 
37dd0 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20 54 68 65 20  or both..** The 
37de0 61 72 67 76 5b 30 5d 20 65 6c 65 6d 65 6e 74 20  argv[0] element 
37df0 28 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e  (which correspon
37e00 64 73 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  ds to memory cel
37e10 6c 20 50 33 29 0a 2a 2a 20 69 73 20 74 68 65 20  l P3).** is the 
37e20 72 6f 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74  rowid of a row t
37e30 6f 20 64 65 6c 65 74 65 2e 20 20 49 66 20 61 72  o delete.  If ar
37e40 67 76 5b 30 5d 20 69 73 20 4e 55 4c 4c 20 74 68  gv[0] is NULL th
37e50 65 6e 20 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74 69  en no .** deleti
37e60 6f 6e 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20  on occurs.  The 
37e70 61 72 67 76 5b 31 5d 20 65 6c 65 6d 65 6e 74 20  argv[1] element 
37e80 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  is the rowid of 
37e90 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 2e  the new .** row.
37ea0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 4e 55    This can be NU
37eb0 4c 4c 20 74 6f 20 68 61 76 65 20 74 68 65 20 76  LL to have the v
37ec0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 65 6c  irtual table sel
37ed0 65 63 74 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20  ect the new .** 
37ee0 72 6f 77 69 64 20 66 6f 72 20 69 74 73 65 6c 66  rowid for itself
37ef0 2e 20 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  .  The subsequen
37f00 74 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  t elements in th
37f10 65 20 61 72 72 61 79 20 61 72 65 20 0a 2a 2a 20  e array are .** 
37f20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 63 6f  the values of co
37f30 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6e 65 77  lumns in the new
37f40 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50   row..**.** If P
37f50 32 3d 3d 31 20 74 68 65 6e 20 6e 6f 20 69 6e 73  2==1 then no ins
37f60 65 72 74 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ert is performed
37f70 2e 20 20 61 72 67 76 5b 30 5d 20 69 73 20 74 68  .  argv[0] is th
37f80 65 20 72 6f 77 69 64 20 6f 66 0a 2a 2a 20 61 20  e rowid of.** a 
37f90 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 0a 2a  row to delete..*
37fa0 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 62 6f 6f  *.** P1 is a boo
37fb0 6c 65 61 6e 20 66 6c 61 67 2e 20 49 66 20 69 74  lean flag. If it
37fc0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
37fd0 61 6e 64 20 74 68 65 20 78 55 70 64 61 74 65 20  and the xUpdate 
37fe0 63 61 6c 6c 0a 2a 2a 20 69 73 20 73 75 63 63 65  call.** is succe
37ff0 73 73 66 75 6c 2c 20 74 68 65 6e 20 74 68 65 20  ssful, then the 
38000 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
38010 79 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  y sqlite3_last_i
38020 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 0a 2a  nsert_rowid() .*
38030 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
38040 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77  value of the row
38050 69 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 6a  id for the row j
38060 75 73 74 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a  ust inserted..**
38070 0a 2a 2a 20 50 35 20 69 73 20 74 68 65 20 65 72  .** P5 is the er
38080 72 6f 72 20 61 63 74 69 6f 6e 73 20 28 4f 45 5f  ror actions (OE_
38090 52 65 70 6c 61 63 65 2c 20 4f 45 5f 46 61 69 6c  Replace, OE_Fail
380a0 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63  , OE_Ignore, etc
380b0 29 20 74 6f 0a 2a 2a 20 61 70 70 6c 79 20 69 6e  ) to.** apply in
380c0 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 63   the case of a c
380d0 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 75 72  onstraint failur
380e0 65 20 6f 6e 20 61 6e 20 69 6e 73 65 72 74 20 6f  e on an insert o
380f0 72 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 63 61 73  r update..*/.cas
38100 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
38110 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
38120 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73  pVtab;.  const s
38130 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
38140 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 6e 41  Module;.  int nA
38150 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  rg;.  int i;.  s
38160 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69  qlite_int64 rowi
38170 64 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67  d;.  Mem **apArg
38180 3b 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a 0a 20 20  ;.  Mem *pX;..  
38190 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d  assert( pOp->p2=
381a0 3d 31 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  =1        || pOp
381b0 2d 3e 70 35 3d 3d 4f 45 5f 46 61 69 6c 20 20 20  ->p5==OE_Fail   
381c0 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52  || pOp->p5==OE_R
381d0 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
381e0 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 41  || pOp->p5==OE_A
381f0 62 6f 72 74 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d  bort || pOp->p5=
38200 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 70 4f  =OE_Ignore || pO
38210 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63  p->p5==OE_Replac
38220 65 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e.  );.  assert(
38230 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
38240 29 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70  );.  pVtab = pOp
38250 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
38260 62 3b 0a 20 20 69 66 28 20 70 56 74 61 62 3d 3d  b;.  if( pVtab==
38270 30 20 7c 7c 20 4e 45 56 45 52 28 70 56 74 61 62  0 || NEVER(pVtab
38280 2d 3e 70 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b  ->pModule==0) ){
38290 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
382a0 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74  _LOCKED;.    got
382b0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
382c0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64  rror;.  }.  pMod
382d0 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
382e0 64 75 6c 65 3b 0a 20 20 6e 41 72 67 20