/ Hex Artifact Content
Login

Artifact e7b1e860140f1d1803c6f4176b1e8f3801f3a290:


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 53 51 4c 49  pMem->enc)==SQLI
32b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
32c0: 75 72 6e 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d  urn MEM_Int;.  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 5f 52 65  .  return MEM_Re
32e0: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
32f0: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
3300: 74 79 70 65 20 66 6f 72 20 70 4d 65 6d 2c 20 65  type for pMem, e
3310: 69 74 68 65 72 20 4d 45 4d 5f 49 6e 74 20 6f 72  ither MEM_Int or
3320: 20 4d 45 4d 5f 52 65 61 6c 20 6f 72 20 62 6f 74   MEM_Real or bot
3330: 68 20 6f 72 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a  h or.** none.  .
3340: 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20 61 70 70  **.** Unlike app
3350: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
3360: 79 28 29 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  y(), this routin
3370: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66  e does not modif
3380: 79 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a  y pMem->flags..*
3390: 2a 20 42 75 74 20 69 74 20 64 6f 65 73 20 73 65  * But it does se
33a0: 74 20 70 4d 65 6d 2d 3e 75 2e 72 20 61 6e 64 20  t pMem->u.r and 
33b0: 70 4d 65 6d 2d 3e 75 2e 69 20 61 70 70 72 6f 70  pMem->u.i approp
33c0: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
33d0: 69 63 20 75 31 36 20 6e 75 6d 65 72 69 63 54 79  ic u16 numericTy
33e0: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  pe(Mem *pMem){. 
33f0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
3400: 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
3410: 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  Real) ){.    ret
3420: 75 72 6e 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  urn pMem->flags 
3430: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
3440: 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eal);.  }.  if( 
3450: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3460: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
3470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63   ){.    return c
3480: 6f 6d 70 75 74 65 4e 75 6d 65 72 69 63 54 79 70  omputeNumericTyp
3490: 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72  e(pMem);.  }.  r
34a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
34b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
34c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 6e 69  /*.** Write a ni
34d0: 63 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ce string repres
34e0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
34f0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c  contents of cell
3500: 20 70 4d 65 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75   pMem.** into bu
3510: 66 66 65 72 20 7a 42 75 66 2c 20 6c 65 6e 67 74  ffer zBuf, lengt
3520: 68 20 6e 42 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20  h nBuf..*/.void 
3530: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72  sqlite3VdbeMemPr
3540: 65 74 74 79 50 72 69 6e 74 28 4d 65 6d 20 2a 70  ettyPrint(Mem *p
3550: 4d 65 6d 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Mem, char *zBuf)
3560: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d  {.  char *zCsr =
3570: 20 7a 42 75 66 3b 0a 20 20 69 6e 74 20 66 20 3d   zBuf;.  int f =
3580: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20   pMem->flags;.. 
3590: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
35a0: 61 72 20 2a 63 6f 6e 73 74 20 65 6e 63 6e 61 6d  ar *const encnam
35b0: 65 73 5b 5d 20 3d 20 7b 22 28 58 29 22 2c 20 22  es[] = {"(X)", "
35c0: 28 38 29 22 2c 20 22 28 31 36 4c 45 29 22 2c 20  (8)", "(16LE)", 
35d0: 22 28 31 36 42 45 29 22 7d 3b 0a 0a 20 20 69 66  "(16BE)"};..  if
35e0: 28 20 66 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ( f&MEM_Blob ){.
35f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
3600: 68 61 72 20 63 3b 0a 20 20 20 20 69 66 28 20 66  har c;.    if( f
3610: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
3620: 20 20 20 20 63 20 3d 20 27 7a 27 3b 0a 20 20 20      c = 'z';.   
3630: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3640: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3650: 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20  Ephem))==0 );.  
3660: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20    }else if( f & 
3670: 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20 20  MEM_Static ){.  
3680: 20 20 20 20 63 20 3d 20 27 74 27 3b 0a 20 20 20      c = 't';.   
3690: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
36a0: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
36b0: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
36c0: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
36d0: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
36e0: 63 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 61  c = 'e';.      a
36f0: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3700: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29  _Static|MEM_Dyn)
3710: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3720: 65 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 73 27  e{.      c = 's'
3730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
3740: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3750: 30 2c 20 7a 43 73 72 2c 20 22 25 63 22 2c 20 63  0, zCsr, "%c", c
3760: 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73  );.    zCsr += s
3770: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3780: 43 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Csr);.    sqlite
3790: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
37a0: 7a 43 73 72 2c 20 22 25 64 5b 22 2c 20 70 4d 65  zCsr, "%d[", pMe
37b0: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a 43 73 72 20  m->n);.    zCsr 
37c0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
37d0: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 66 6f  30(zCsr);.    fo
37e0: 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20 69  r(i=0; i<16 && i
37f0: 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  <pMem->n; i++){.
3800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
3810: 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72  printf(100, zCsr
3820: 2c 20 22 25 30 32 58 22 2c 20 28 28 69 6e 74 29  , "%02X", ((int)
3830: 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78 46  pMem->z[i] & 0xF
3840: 46 29 29 3b 0a 20 20 20 20 20 20 7a 43 73 72 20  F));.      zCsr 
3850: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
3860: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a  30(zCsr);.    }.
3870: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
3880: 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20  6 && i<pMem->n; 
3890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
38a0: 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b   z = pMem->z[i];
38b0: 0a 20 20 20 20 20 20 69 66 28 20 7a 3c 33 32 20  .      if( z<32 
38c0: 7c 7c 20 7a 3e 31 32 36 20 29 20 2a 7a 43 73 72  || z>126 ) *zCsr
38d0: 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20  ++ = '.';.      
38e0: 65 6c 73 65 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a  else *zCsr++ = z
38f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
3900: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3910: 30 2c 20 7a 43 73 72 2c 20 22 5d 25 73 22 2c 20  0, zCsr, "]%s", 
3920: 65 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65  encnames[pMem->e
3930: 6e 63 5d 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b  nc]);.    zCsr +
3940: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
3950: 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 69 66 28  0(zCsr);.    if(
3960: 20 66 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b   f & MEM_Zero ){
3970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
3980: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
3990: 72 2c 22 2b 25 64 7a 22 2c 70 4d 65 6d 2d 3e 75  r,"+%dz",pMem->u
39a0: 2e 6e 5a 65 72 6f 29 3b 0a 20 20 20 20 20 20 7a  .nZero);.      z
39b0: 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  Csr += sqlite3St
39c0: 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20  rlen30(zCsr);.  
39d0: 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20    }.    *zCsr = 
39e0: 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66  '\0';.  }else if
39f0: 28 20 66 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ( f & MEM_Str ){
3a00: 0a 20 20 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20  .    int j, k;. 
3a10: 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27 20 27     zBuf[0] = ' '
3a20: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
3a30: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 7a  M_Dyn ){.      z
3a40: 42 75 66 5b 31 5d 20 3d 20 27 7a 27 3b 0a 20 20  Buf[1] = 'z';.  
3a50: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26      assert( (f &
3a60: 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d   (MEM_Static|MEM
3a70: 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20  _Ephem))==0 );. 
3a80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26     }else if( f &
3a90: 20 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20   MEM_Static ){. 
3aa0: 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27       zBuf[1] = '
3ab0: 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t';.      assert
3ac0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c  ( (f & (MEM_Dyn|
3ad0: 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29  MEM_Ephem))==0 )
3ae0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3af0: 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b  f & MEM_Ephem ){
3b00: 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d  .      zBuf[1] =
3b10: 20 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65   'e';.      asse
3b20: 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74  rt( (f & (MEM_St
3b30: 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d  atic|MEM_Dyn))==
3b40: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
3b50: 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
3b60: 27 73 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6b  's';.    }.    k
3b70: 20 3d 20 32 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 2;.    sqlite
3b80: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
3b90: 26 7a 42 75 66 5b 6b 5d 2c 20 22 25 64 22 2c 20  &zBuf[k], "%d", 
3ba0: 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 6b 20  pMem->n);.    k 
3bb0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
3bc0: 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20  30(&zBuf[k]);.  
3bd0: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5b    zBuf[k++] = '[
3be0: 27 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ';.    for(j=0; 
3bf0: 6a 3c 31 35 20 26 26 20 6a 3c 70 4d 65 6d 2d 3e  j<15 && j<pMem->
3c00: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 75  n; j++){.      u
3c10: 38 20 63 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 6a 5d  8 c = pMem->z[j]
3c20: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30  ;.      if( c>=0
3c30: 78 32 30 20 26 26 20 63 3c 30 78 37 66 20 29 7b  x20 && c<0x7f ){
3c40: 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b  .        zBuf[k+
3c50: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 65  +] = c;.      }e
3c60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 42 75  lse{.        zBu
3c70: 66 5b 6b 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20  f[k++] = '.';.  
3c80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3c90: 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5d 27 3b  zBuf[k++] = ']';
3ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3cb0: 72 69 6e 74 66 28 31 30 30 2c 26 7a 42 75 66 5b  rintf(100,&zBuf[
3cc0: 6b 5d 2c 20 65 6e 63 6e 61 6d 65 73 5b 70 4d 65  k], encnames[pMe
3cd0: 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20 20 6b 20  m->enc]);.    k 
3ce0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
3cf0: 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20  30(&zBuf[k]);.  
3d00: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 30 3b    zBuf[k++] = 0;
3d10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
3d20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3d30: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
3d40: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 72 65  he value of a re
3d50: 67 69 73 74 65 72 20 66 6f 72 20 74 72 61 63 69  gister for traci
3d60: 6e 67 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2f 0a  ng purposes:.*/.
3d70: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 54  static void memT
3d80: 72 61 63 65 50 72 69 6e 74 28 4d 65 6d 20 2a 70  racePrint(Mem *p
3d90: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  ){.  if( p->flag
3da0: 73 20 26 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s & MEM_Undefine
3db0: 64 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  d ){.    printf(
3dc0: 22 20 75 6e 64 65 66 69 6e 65 64 22 29 3b 0a 20  " undefined");. 
3dd0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c   }else if( p->fl
3de0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
3df0: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 4e  {.    printf(" N
3e00: 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ULL");.  }else i
3e10: 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28  f( (p->flags & (
3e20: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3e30: 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  )==(MEM_Int|MEM_
3e40: 53 74 72 29 20 29 7b 0a 20 20 20 20 70 72 69 6e  Str) ){.    prin
3e50: 74 66 28 22 20 73 69 3a 25 6c 6c 64 22 2c 20 70  tf(" si:%lld", p
3e60: 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73 65 20  ->u.i);.  }else 
3e70: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3e80: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 70 72  EM_Int ){.    pr
3e90: 69 6e 74 66 28 22 20 69 3a 25 6c 6c 64 22 2c 20  intf(" i:%lld", 
3ea0: 70 2d 3e 75 2e 69 29 3b 0a 23 69 66 6e 64 65 66  p->u.i);.#ifndef
3eb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
3ec0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 7d 65  ATING_POINT.  }e
3ed0: 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  lse if( p->flags
3ee0: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
3ef0: 20 20 20 70 72 69 6e 74 66 28 22 20 72 3a 25 67     printf(" r:%g
3f00: 22 2c 20 70 2d 3e 75 2e 72 29 3b 0a 23 65 6e 64  ", p->u.r);.#end
3f10: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  if.  }else if( p
3f20: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
3f30: 77 53 65 74 20 29 7b 0a 20 20 20 20 70 72 69 6e  wSet ){.    prin
3f40: 74 66 28 22 20 28 72 6f 77 73 65 74 29 22 29 3b  tf(" (rowset)");
3f50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
3f60: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
3f70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
3f80: 50 72 65 74 74 79 50 72 69 6e 74 28 70 2c 20 7a  PrettyPrint(p, z
3f90: 42 75 66 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  Buf);.    printf
3fa0: 28 22 20 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  (" %s", zBuf);. 
3fb0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67   }.  if( p->flag
3fc0: 73 20 26 20 4d 45 4d 5f 53 75 62 74 79 70 65 20  s & MEM_Subtype 
3fd0: 29 20 70 72 69 6e 74 66 28 22 20 73 75 62 74 79  ) printf(" subty
3fe0: 70 65 3d 30 78 25 30 32 78 22 2c 20 70 2d 3e 65  pe=0x%02x", p->e
3ff0: 53 75 62 74 79 70 65 29 3b 0a 7d 0a 73 74 61 74  Subtype);.}.stat
4000: 69 63 20 76 6f 69 64 20 72 65 67 69 73 74 65 72  ic void register
4010: 54 72 61 63 65 28 69 6e 74 20 69 52 65 67 2c 20  Trace(int iReg, 
4020: 4d 65 6d 20 2a 70 29 7b 0a 20 20 70 72 69 6e 74  Mem *p){.  print
4030: 66 28 22 52 45 47 5b 25 64 5d 20 3d 20 22 2c 20  f("REG[%d] = ", 
4040: 69 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72 61 63  iReg);.  memTrac
4050: 65 50 72 69 6e 74 28 70 29 3b 0a 20 20 70 72 69  ePrint(p);.  pri
4060: 6e 74 66 28 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e  ntf("\n");.}.#en
4070: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4080: 54 45 5f 44 45 42 55 47 0a 23 20 20 64 65 66 69  TE_DEBUG.#  defi
4090: 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  ne REGISTER_TRAC
40a0: 45 28 52 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c  E(R,M) if(db->fl
40b0: 61 67 73 26 53 51 4c 49 54 45 5f 56 64 62 65 54  ags&SQLITE_VdbeT
40c0: 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72 61  race)registerTra
40d0: 63 65 28 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20  ce(R,M).#else.# 
40e0: 20 64 65 66 69 6e 65 20 52 45 47 49 53 54 45 52   define REGISTER
40f0: 5f 54 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64  _TRACE(R,M).#end
4100: 69 66 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45  if...#ifdef VDBE
4110: 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a  _PROFILE../* .**
4120: 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69   hwtime.h contai
4130: 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62  ns inline assemb
4140: 6c 65 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70  ler code for imp
4150: 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69  lementing .** hi
4160: 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74  gh-performance t
4170: 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a  iming routines..
4180: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74  */.#include "hwt
4190: 69 6d 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a  ime.h"..#endif..
41a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
41b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
41c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
41d0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
41e0: 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
41f0: 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63  sion. It.** chec
4200: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
4210: 74 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  te3.nTransaction
4220: 20 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72   variable is cor
4230: 72 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a  rectly set to.**
4240: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
4250: 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
4260: 61 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e  avepoints curren
4270: 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  tly in the .** l
4280: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
4290: 69 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70  ing at sqlite3.p
42a0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a  Savepoint..** .*
42b0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
42c0: 20 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b     assert( check
42d0: 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
42e0: 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  b) );.*/.static 
42f0: 69 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69  int checkSavepoi
4300: 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20  ntCount(sqlite3 
4310: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  *db){.  int n = 
4320: 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  0;.  Savepoint *
4330: 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70  p;.  for(p=db->p
4340: 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d  Savepoint; p; p=
4350: 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20  p->pNext) n++;. 
4360: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d   assert( n==(db-
4370: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62  >nSavepoint + db
4380: 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
4390: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72  avepoint) );.  r
43a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
43b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
43c0: 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
43d0: 70 4f 70 2d 3e 70 32 20 61 66 74 65 72 20 66 69  pOp->p2 after fi
43e0: 72 73 74 20 70 72 65 70 61 72 69 6e 67 20 69 74  rst preparing it
43f0: 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
4400: 69 74 74 65 6e 20 77 69 74 68 20 61 6e 20 69 6e  itten with an in
4410: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a  teger value..*/.
4420: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
4430: 49 4e 4c 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32  INLINE Mem *out2
4440: 50 72 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c  PrereleaseWithCl
4450: 65 61 72 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a  ear(Mem *pOut){.
4460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4470: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
4480: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
4490: 45 4d 5f 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e  EM_Int;.  return
44a0: 20 70 4f 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20   pOut;.}.static 
44b0: 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c 65  Mem *out2Prerele
44c0: 61 73 65 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ase(Vdbe *p, Vdb
44d0: 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d  eOp *pOp){.  Mem
44e0: 20 2a 70 4f 75 74 3b 0a 20 20 61 73 73 65 72 74   *pOut;.  assert
44f0: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
4500: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
4510: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
4520: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
4530: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
4540: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41  pOp->p2];.  memA
4550: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
4560: 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 56 64 62  pOut);.  if( Vdb
4570: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
4580: 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  ) ){ /*OPTIMIZAT
4590: 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20  ION-IF-FALSE*/. 
45a0: 20 20 20 72 65 74 75 72 6e 20 6f 75 74 32 50 72     return out2Pr
45b0: 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61  ereleaseWithClea
45c0: 72 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  r(pOut);.  }else
45d0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
45e0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
45f0: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
4600: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  }.}.../*.** Exec
4610: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
4620: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
4630: 20 77 65 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73   we can..** This
4640: 20 69 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20   is the core of 
4650: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
4660: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
4670: 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65  VdbeExec(.  Vdbe
4680: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
46a0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61  BE */.){.  Op *a
46b0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20  Op = p->aOp;    
46c0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
46d0: 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20   p->aOp */.  Op 
46e0: 2a 70 4f 70 20 3d 20 61 4f 70 3b 20 20 20 20 20  *pOp = aOp;     
46f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4700: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
4710: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4720: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
4730: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4740: 45 29 0a 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70  E).  Op *pOrigOp
4750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4760: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 4f 70 20  /* Value of pOp 
4770: 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
4780: 65 20 6c 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66  e loop */.#endif
4790: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
47a0: 45 42 55 47 0a 20 20 69 6e 74 20 6e 45 78 74 72  EBUG.  int nExtr
47b0: 61 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  aDelete = 0;    
47c0: 20 20 2f 2a 20 56 65 72 69 66 69 65 73 20 46 4f    /* Verifies FO
47d0: 52 44 45 4c 45 54 45 20 61 6e 64 20 41 55 58 44  RDELETE and AUXD
47e0: 45 4c 45 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23  ELETE flags */.#
47f0: 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 20 3d  endif.  int rc =
4800: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
4810: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
4820: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
4830: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
4840: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4850: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 72 65  abase */.  u8 re
4860: 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
4870: 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74 20 73   = 0; /* Reset s
4880: 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e 20 65  chema after an e
4890: 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69 76 65  rror if positive
48a0: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e   */.  u8 encodin
48b0: 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  g = ENC(db);    
48c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
48d0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
48e0: 6e 74 20 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b  nt iCompare = 0;
48f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
4900: 75 6c 74 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70  ult of last comp
4910: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  arison */.  unsi
4920: 67 6e 65 64 20 6e 56 6d 53 74 65 70 20 3d 20 30  gned nVmStep = 0
4930: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
4940: 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 61 63 68   of virtual mach
4950: 69 6e 65 20 73 74 65 70 73 20 2a 2f 0a 23 69 66  ine steps */.#if
4960: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4970: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
4980: 43 4b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 50  CK.  unsigned nP
4990: 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 30  rogressLimit = 0
49a0: 3b 2f 2a 20 49 6e 76 6f 6b 65 20 78 50 72 6f 67  ;/* Invoke xProg
49b0: 72 65 73 73 28 29 20 77 68 65 6e 20 6e 56 6d 53  ress() when nVmS
49c0: 74 65 70 20 72 65 61 63 68 65 73 20 74 68 69 73  tep reaches this
49d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d 65 6d   */.#endif.  Mem
49e0: 20 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *aMem = p->aMem
49f0: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
4a00: 6f 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20  of p->aMem */.  
4a10: 4d 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b 20 20  Mem *pIn1 = 0;  
4a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73             /* 1s
4a30: 74 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20  t input operand 
4a40: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32 20 3d  */.  Mem *pIn2 =
4a50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
4a60: 2f 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f 70 65  /* 2nd input ope
4a70: 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  rand */.  Mem *p
4a80: 49 6e 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20  In3 = 0;        
4a90: 20 20 20 20 20 2f 2a 20 33 72 64 20 69 6e 70 75       /* 3rd inpu
4aa0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d  t operand */.  M
4ab0: 65 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20 20 20  em *pOut = 0;   
4ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
4ad0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 23  put operand */.#
4ae0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
4af0: 4c 45 0a 20 20 75 36 34 20 73 74 61 72 74 3b 20  LE.  u64 start; 
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 2f 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75  /* CPU clock cou
4b20: 6e 74 20 61 74 20 73 74 61 72 74 20 6f 66 20 6f  nt at start of o
4b30: 70 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  pcode */.#endif.
4b40: 20 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20 53 54    /*** INSERT ST
4b50: 41 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45 20 2a  ACK UNION HERE *
4b60: 2a 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70  **/..  assert( p
4b70: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4b80: 47 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a 20 73  GIC_RUN );  /* s
4b90: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 76 65  qlite3_step() ve
4ba0: 72 69 66 69 65 73 20 74 68 69 73 20 2a 2f 0a 20  rifies this */. 
4bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
4bc0: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  r(p);.  if( p->r
4bd0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
4be0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
4bf0: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
4c00: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
4c10: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
4c20: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
4c30: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
4c40: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
4c50: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 67 6f  iled.  */.    go
4c60: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20  to no_mem;.  }. 
4c70: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
4c80: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
4c90: 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
4ca0: 45 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65  E_BUSY );.  asse
4cb0: 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
4cc0: 20 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 21   || p->readOnly!
4cd0: 3d 30 20 29 3b 0a 20 20 70 2d 3e 69 43 75 72 72  =0 );.  p->iCurr
4ce0: 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 61  entTime = 0;.  a
4cf0: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
4d00: 6e 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 52 65  n==0 );.  p->pRe
4d10: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 64  sultSet = 0;.  d
4d20: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
4d30: 42 75 73 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  Busy = 0;.  if( 
4d40: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
4d50: 70 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72  pted ) goto abor
4d60: 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75  t_due_to_interru
4d70: 70 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  pt;.  sqlite3Vdb
4d80: 65 49 4f 54 72 61 63 65 53 71 6c 28 70 29 3b 0a  eIOTraceSql(p);.
4d90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4da0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
4db0: 4c 42 41 43 4b 0a 20 20 69 66 28 20 64 62 2d 3e  LBACK.  if( db->
4dc0: 78 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  xProgress ){.   
4dd0: 20 75 33 32 20 69 50 72 69 6f 72 20 3d 20 70 2d   u32 iPrior = p-
4de0: 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45  >aCounter[SQLITE
4df0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53  _STMTSTATUS_VM_S
4e00: 54 45 50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  TEP];.    assert
4e10: 28 20 30 20 3c 20 64 62 2d 3e 6e 50 72 6f 67 72  ( 0 < db->nProgr
4e20: 65 73 73 4f 70 73 20 29 3b 0a 20 20 20 20 6e 50  essOps );.    nP
4e30: 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 64  rogressLimit = d
4e40: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
4e50: 2d 20 28 69 50 72 69 6f 72 20 25 20 64 62 2d 3e  - (iPrior % db->
4e60: 6e 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a 20  nProgressOps);. 
4e70: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
4e80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4e90: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
4ea0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66  gnMalloc();.  if
4eb0: 28 20 70 2d 3e 70 63 3d 3d 30 0a 20 20 20 26 26  ( p->pc==0.   &&
4ec0: 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26   (p->db->flags &
4ed0: 20 28 53 51 4c 49 54 45 5f 56 64 62 65 4c 69 73   (SQLITE_VdbeLis
4ee0: 74 69 6e 67 7c 53 51 4c 49 54 45 5f 56 64 62 65  ting|SQLITE_Vdbe
4ef0: 45 51 50 7c 53 51 4c 49 54 45 5f 56 64 62 65 54  EQP|SQLITE_VdbeT
4f00: 72 61 63 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20  race))!=0.  ){. 
4f10: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
4f20: 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
4f30: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4f40: 53 71 6c 28 70 29 3b 0a 20 20 20 20 69 66 28 20  Sql(p);.    if( 
4f50: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
4f60: 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e  QLITE_VdbeListin
4f70: 67 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  g ){.      print
4f80: 66 28 22 56 44 42 45 20 50 72 6f 67 72 61 6d 20  f("VDBE Program 
4f90: 4c 69 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20  Listing:\n");.  
4fa0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4fb0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
4fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4fd0: 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20  PrintOp(stdout, 
4fe0: 69 2c 20 26 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  i, &aOp[i]);.   
4ff0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5000: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
5010: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 45 51 50  & SQLITE_VdbeEQP
5020: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
5030: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
5040: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
5050: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  Op[i].opcode==OP
5060: 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
5070: 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29        if( once )
5080: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 51 75   printf("VDBE Qu
5090: 65 72 79 20 50 6c 61 6e 3a 5c 6e 22 29 3b 0a 20  ery Plan:\n");. 
50a0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
50b0: 22 25 73 5c 6e 22 2c 20 61 4f 70 5b 69 5d 2e 70  "%s\n", aOp[i].p
50c0: 34 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  4.z);.          
50d0: 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
50e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
50f0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  }.    if( p->db-
5100: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
5110: 56 64 62 65 54 72 61 63 65 20 29 20 20 70 72 69  VdbeTrace )  pri
5120: 6e 74 66 28 22 56 44 42 45 20 54 72 61 63 65 3a  ntf("VDBE Trace:
5130: 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  \n");.  }.  sqli
5140: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
5150: 6f 63 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66  oc();.#endif.  f
5160: 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 70 2d 3e 70  or(pOp=&aOp[p->p
5170: 63 5d 3b 20 31 3b 20 70 4f 70 2b 2b 29 7b 0a 20  c]; 1; pOp++){. 
5180: 20 20 20 2f 2a 20 45 72 72 6f 72 73 20 61 72 65     /* Errors are
5190: 20 64 65 74 65 63 74 65 64 20 62 79 20 69 6e 64   detected by ind
51a0: 69 76 69 64 75 61 6c 20 6f 70 63 6f 64 65 73 2c  ividual opcodes,
51b0: 20 77 69 74 68 20 61 6e 20 69 6d 6d 65 64 69 61   with an immedia
51c0: 74 65 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 73 20  te.    ** jumps 
51d0: 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
51e0: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 61 73  error. */.    as
51f0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
5200: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 61 73 73 65  _OK );..    asse
5210: 72 74 28 20 70 4f 70 3e 3d 61 4f 70 20 26 26 20  rt( pOp>=aOp && 
5220: 70 4f 70 3c 26 61 4f 70 5b 70 2d 3e 6e 4f 70 5d  pOp<&aOp[p->nOp]
5230: 29 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  );.#ifdef VDBE_P
5240: 52 4f 46 49 4c 45 0a 20 20 20 20 73 74 61 72 74  ROFILE.    start
5250: 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65   = sqlite3Hwtime
5260: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e  ();.#endif.    n
5270: 56 6d 53 74 65 70 2b 2b 3b 0a 23 69 66 64 65 66  VmStep++;.#ifdef
5280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5290: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
52a0: 20 20 20 69 66 28 20 70 2d 3e 61 6e 45 78 65 63     if( p->anExec
52b0: 20 29 20 70 2d 3e 61 6e 45 78 65 63 5b 28 69 6e   ) p->anExec[(in
52c0: 74 29 28 70 4f 70 2d 61 4f 70 29 5d 2b 2b 3b 0a  t)(pOp-aOp)]++;.
52d0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 4f  #endif..    /* O
52e0: 6e 6c 79 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e  nly allow tracin
52f0: 67 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  g if SQLITE_DEBU
5300: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20  G is defined..  
5310: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
5320: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28  TE_DEBUG.    if(
5330: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
5340: 49 54 45 5f 56 64 62 65 54 72 61 63 65 20 29 7b  ITE_VdbeTrace ){
5350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5360: 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74  bePrintOp(stdout
5370: 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  , (int)(pOp - aO
5380: 70 29 2c 20 70 4f 70 29 3b 0a 20 20 20 20 7d 0a  p), pOp);.    }.
5390: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 0a 20  #endif.      .. 
53a0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
53b0: 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
53c0: 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74   simulate an int
53d0: 65 72 72 75 70 74 2e 20 20 54 68 69 73 20 6f 6e  errupt.  This on
53e0: 6c 79 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a  ly happens.    *
53f0: 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20 73  * if we have a s
5400: 70 65 63 69 61 6c 20 74 65 73 74 20 62 75 69 6c  pecial test buil
5410: 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  d..    */.#ifdef
5420: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
5430: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74   if( sqlite3_int
5440: 65 72 72 75 70 74 5f 63 6f 75 6e 74 3e 30 20 29  errupt_count>0 )
5450: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
5460: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2d  interrupt_count-
5470: 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  -;.      if( sql
5480: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
5490: 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ount==0 ){.     
54a0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72     sqlite3_inter
54b0: 72 75 70 74 28 64 62 29 3b 0a 20 20 20 20 20 20  rupt(db);.      
54c0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
54d0: 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68      /* Sanity ch
54e0: 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68 65 72 20  ecking on other 
54f0: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23 69 66 64  operands */.#ifd
5500: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5510: 20 20 20 20 7b 0a 20 20 20 20 20 20 75 38 20 6f      {.      u8 o
5520: 70 50 72 6f 70 65 72 74 79 20 3d 20 73 71 6c 69  pProperty = sqli
5530: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
5540: 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 3b 0a  y[pOp->opcode];.
5550: 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f        if( (opPro
5560: 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e  perty & OPFLG_IN
5570: 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)!=0 ){.       
5580: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
5590: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
55a0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3c 3d 28  sert( pOp->p1<=(
55b0: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
55c0: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
55d0: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
55e0: 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d  Valid(&aMem[pOp-
55f0: 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  >p1]) );.       
5600: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5610: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
5620: 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70  riants(&aMem[pOp
5630: 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20 20 20  ->p1]) );.      
5640: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
5650: 28 70 4f 70 2d 3e 70 31 2c 20 26 61 4d 65 6d 5b  (pOp->p1, &aMem[
5660: 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 20 20 20  pOp->p1]);.     
5670: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70   }.      if( (op
5680: 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47  Property & OPFLG
5690: 5f 49 4e 32 29 21 3d 30 20 29 7b 0a 20 20 20 20  _IN2)!=0 ){.    
56a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
56b0: 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p2>0 );.       
56c0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
56d0: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
56e0: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
56f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
5700: 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
5710: 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20 20  Op->p2]) );.    
5720: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
5730: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49  te3VdbeCheckMemI
5740: 6e 76 61 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b  nvariants(&aMem[
5750: 70 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a 20 20 20  pOp->p2]) );.   
5760: 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
5770: 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 26 61 4d  ACE(pOp->p2, &aM
5780: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20  em[pOp->p2]);.  
5790: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
57a0: 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50  (opProperty & OP
57b0: 46 4c 47 5f 49 4e 33 29 21 3d 30 20 29 7b 0a 20  FLG_IN3)!=0 ){. 
57c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
57d0: 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20  Op->p3>0 );.    
57e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
57f0: 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
5800: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
5810: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5820: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65   memIsValid(&aMe
5830: 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a 20  m[pOp->p3]) );. 
5840: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
5850: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
5860: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d  emInvariants(&aM
5870: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a  em[pOp->p3]) );.
5880: 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
5890: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
58a0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b  &aMem[pOp->p3]);
58b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
58c0: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
58d0: 20 4f 50 46 4c 47 5f 4f 55 54 32 29 21 3d 30 20   OPFLG_OUT2)!=0 
58e0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
58f0: 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
5900: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5910: 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p2<=(p->nMe
5920: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
5930: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ) );.        mem
5940: 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
5950: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29   &aMem[pOp->p2])
5960: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5970: 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20  if( (opProperty 
5980: 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29 21 3d 30  & OPFLG_OUT3)!=0
5990: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
59a0: 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b  rt( pOp->p3>0 );
59b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
59c0: 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
59d0: 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
59e0: 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  r) );.        me
59f0: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
5a00: 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  , &aMem[pOp->p3]
5a10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5a20: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
5a30: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
5a40: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
5a50: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 20 20 70  E_PROFILE).    p
5a60: 4f 72 69 67 4f 70 20 3d 20 70 4f 70 3b 0a 23 65  OrigOp = pOp;.#e
5a70: 6e 64 69 66 0a 20 20 0a 20 20 20 20 73 77 69 74  ndif.  .    swit
5a80: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
5a90: 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ){../***********
5aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ae0: 2a 2a 0a 2a 2a 20 57 68 61 74 20 66 6f 6c 6c 6f  **.** What follo
5af0: 77 73 20 69 73 20 61 20 6d 61 73 73 69 76 65 20  ws is a massive 
5b00: 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74  switch statement
5b10: 20 77 68 65 72 65 20 65 61 63 68 20 63 61 73 65   where each case
5b20: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a   implements a.**
5b30: 20 73 65 70 61 72 61 74 65 20 69 6e 73 74 72 75   separate instru
5b40: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 69 72  ction in the vir
5b50: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49  tual machine.  I
5b60: 66 20 77 65 20 66 6f 6c 6c 6f 77 20 74 68 65 20  f we follow the 
5b70: 75 73 75 61 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61  usual.** indenta
5b80: 74 69 6f 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  tion conventions
5b90: 2c 20 65 61 63 68 20 63 61 73 65 20 73 68 6f 75  , each case shou
5ba0: 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62  ld be indented b
5bb0: 79 20 36 20 73 70 61 63 65 73 2e 20 20 42 75 74  y 6 spaces.  But
5bc0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 20 6c 6f  .** that is a lo
5bd0: 74 20 6f 66 20 77 61 73 74 65 64 20 73 70 61 63  t of wasted spac
5be0: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 6d 61  e on the left ma
5bf0: 72 67 69 6e 2e 20 20 53 6f 20 74 68 65 20 63 6f  rgin.  So the co
5c00: 64 65 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  de within.** the
5c10: 20 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e   switch statemen
5c20: 74 20 77 69 6c 6c 20 62 72 65 61 6b 20 77 69 74  t will break wit
5c30: 68 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 61 6e 64  h convention and
5c40: 20 62 65 20 66 6c 75 73 68 2d 6c 65 66 74 2e 20   be flush-left. 
5c50: 41 6e 6f 74 68 65 72 0a 2a 2a 20 62 69 67 20 63  Another.** big c
5c60: 6f 6d 6d 65 6e 74 20 28 73 69 6d 69 6c 61 72 20  omment (similar 
5c70: 74 6f 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c  to this one) wil
5c80: 6c 20 6d 61 72 6b 20 74 68 65 20 70 6f 69 6e 74  l mark the point
5c90: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 77 68 65   in the code whe
5ca0: 72 65 0a 2a 2a 20 77 65 20 74 72 61 6e 73 69 74  re.** we transit
5cb0: 69 6f 6e 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d  ion back to norm
5cc0: 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a  al indentation..
5cd0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5ce0: 74 69 6e 67 20 6f 66 20 65 61 63 68 20 63 61 73  ting of each cas
5cf0: 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  e is important. 
5d00: 20 54 68 65 20 6d 61 6b 65 66 69 6c 65 20 66 6f   The makefile fo
5d10: 72 20 53 51 4c 69 74 65 0a 2a 2a 20 67 65 6e 65  r SQLite.** gene
5d20: 72 61 74 65 73 20 74 77 6f 20 43 20 66 69 6c 65  rates two C file
5d30: 73 20 22 6f 70 63 6f 64 65 73 2e 68 22 20 61 6e  s "opcodes.h" an
5d40: 64 20 22 6f 70 63 6f 64 65 73 2e 63 22 20 62 79  d "opcodes.c" by
5d50: 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 0a 2a   scanning this.*
5d60: 2a 20 66 69 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66  * file looking f
5d70: 6f 72 20 6c 69 6e 65 73 20 74 68 61 74 20 62 65  or lines that be
5d80: 67 69 6e 20 77 69 74 68 20 22 63 61 73 65 20 4f  gin with "case O
5d90: 50 5f 22 2e 20 20 54 68 65 20 6f 70 63 6f 64 65  P_".  The opcode
5da0: 73 2e 68 20 66 69 6c 65 73 0a 2a 2a 20 77 69 6c  s.h files.** wil
5db0: 6c 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  l be filled with
5dc0: 20 23 64 65 66 69 6e 65 73 20 74 68 61 74 20 67   #defines that g
5dd0: 69 76 65 20 75 6e 69 71 75 65 20 69 6e 74 65 67  ive unique integ
5de0: 65 72 20 76 61 6c 75 65 73 20 74 6f 20 65 61 63  er values to eac
5df0: 68 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20  h.** opcode and 
5e00: 74 68 65 20 6f 70 63 6f 64 65 73 2e 63 20 66 69  the opcodes.c fi
5e10: 6c 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  le is filled wit
5e20: 68 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74  h an array of st
5e30: 72 69 6e 67 73 20 77 68 65 72 65 0a 2a 2a 20 65  rings where.** e
5e40: 61 63 68 20 73 74 72 69 6e 67 20 69 73 20 74 68  ach string is th
5e50: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  e symbolic name 
5e60: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
5e70: 6e 64 69 6e 67 20 6f 70 63 6f 64 65 2e 20 20 49  nding opcode.  I
5e80: 66 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 73 74  f the.** case st
5e90: 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 6c 6c 6f  atement is follo
5ea0: 77 65 64 20 62 79 20 61 20 63 6f 6d 6d 65 6e 74  wed by a comment
5eb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2f 23   of the form "/#
5ec0: 20 73 61 6d 65 20 61 73 20 2e 2e 2e 20 23 2f 22   same as ... #/"
5ed0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6d 6d 65 6e 74  .** that comment
5ee0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
5ef0: 72 6d 69 6e 65 20 74 68 65 20 70 61 72 74 69 63  rmine the partic
5f00: 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
5f10: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  e opcode..**.** 
5f20: 4f 74 68 65 72 20 6b 65 79 77 6f 72 64 73 20 69  Other keywords i
5f30: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 68  n the comment th
5f40: 61 74 20 66 6f 6c 6c 6f 77 73 20 65 61 63 68 20  at follows each 
5f50: 63 61 73 65 20 61 72 65 20 75 73 65 64 20 74 6f  case are used to
5f60: 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 74 68  .** construct th
5f70: 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49  e OPFLG_INITIALI
5f80: 5a 45 52 20 76 61 6c 75 65 20 74 68 61 74 20 69  ZER value that i
5f90: 6e 69 74 69 61 6c 69 7a 65 73 20 6f 70 63 6f 64  nitializes opcod
5fa0: 65 50 72 6f 70 65 72 74 79 5b 5d 2e 0a 2a 2a 20  eProperty[]..** 
5fb0: 4b 65 79 77 6f 72 64 73 20 69 6e 63 6c 75 64 65  Keywords include
5fc0: 3a 20 69 6e 31 2c 20 69 6e 32 2c 20 69 6e 33 2c  : in1, in2, in3,
5fd0: 20 6f 75 74 32 2c 20 6f 75 74 33 2e 20 20 53 65   out2, out3.  Se
5fe0: 65 0a 2a 2a 20 74 68 65 20 6d 6b 6f 70 63 6f 64  e.** the mkopcod
5ff0: 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 66 6f  eh.awk script fo
6000: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
6010: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
6020: 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61 62  Documentation ab
6030: 6f 75 74 20 56 44 42 45 20 6f 70 63 6f 64 65 73  out VDBE opcodes
6040: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6050: 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 20 66   scanning this f
6060: 69 6c 65 0a 2a 2a 20 66 6f 72 20 6c 69 6e 65 73  ile.** for lines
6070: 20 6f 66 20 74 68 61 74 20 63 6f 6e 74 61 69 6e   of that contain
6080: 20 22 4f 70 63 6f 64 65 3a 22 2e 20 20 54 68 61   "Opcode:".  Tha
6090: 74 20 6c 69 6e 65 20 61 6e 64 20 61 6c 6c 20 73  t line and all s
60a0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 6f 6d  ubsequent.** com
60b0: 6d 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 75  ment lines are u
60c0: 73 65 64 20 69 6e 20 74 68 65 20 67 65 6e 65 72  sed in the gener
60d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 63  ation of the opc
60e0: 6f 64 65 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e  ode.html documen
60f0: 74 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2e 0a  tation.** file..
6100: 2a 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59 3a 0a 2a  **.** SUMMARY:.*
6110: 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 6d 61 74 74  *.**     Formatt
6120: 69 6e 67 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  ing is important
6130: 20 74 6f 20 73 63 72 69 70 74 73 20 74 68 61 74   to scripts that
6140: 20 73 63 61 6e 20 74 68 69 73 20 66 69 6c 65 2e   scan this file.
6150: 0a 2a 2a 20 20 20 20 20 44 6f 20 6e 6f 74 20 64  .**     Do not d
6160: 65 76 69 61 74 65 20 66 72 6f 6d 20 74 68 65 20  eviate from the 
6170: 66 6f 72 6d 61 74 74 69 6e 67 20 73 74 79 6c 65  formatting style
6180: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
6190: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
61a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61e0: 2a 2a 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ***/../* Opcode:
61f0: 20 20 47 6f 74 6f 20 2a 20 50 32 20 2a 20 2a 20    Goto * P2 * * 
6200: 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e 63 6f 6e  *.**.** An uncon
6210: 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f  ditional jump to
6220: 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 20   address P2..** 
6230: 54 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  The next instruc
6240: 74 69 6f 6e 20 65 78 65 63 75 74 65 64 20 77 69  tion executed wi
6250: 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65 20 6f 6e  ll be .** the on
6260: 65 20 61 74 20 69 6e 64 65 78 20 50 32 20 66 72  e at index P2 fr
6270: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
6280: 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72 6f 67 72   of.** the progr
6290: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31  am..**.** The P1
62a0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
62b0: 74 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20  t actually used 
62c0: 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20  by this opcode. 
62d0: 20 48 6f 77 65 76 65 72 2c 20 69 74 0a 2a 2a 20   However, it.** 
62e0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 73 65 74  is sometimes set
62f0: 20 74 6f 20 31 20 69 6e 73 74 65 61 64 20 6f 66   to 1 instead of
6300: 20 30 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20   0 as a hint to 
6310: 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
6320: 20 73 68 65 6c 6c 0a 2a 2a 20 74 68 61 74 20 74   shell.** that t
6330: 68 69 73 20 47 6f 74 6f 20 69 73 20 74 68 65 20  his Goto is the 
6340: 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f 70  bottom of a loop
6350: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6c 69   and that the li
6360: 6e 65 73 20 66 72 6f 6d 20 50 32 20 64 6f 77 6e  nes from P2 down
6370: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65  .** to the curre
6380: 6e 74 20 6c 69 6e 65 20 73 68 6f 75 6c 64 20 62  nt line should b
6390: 65 20 69 6e 64 65 6e 74 65 64 20 66 6f 72 20 45  e indented for E
63a0: 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a  XPLAIN output..*
63b0: 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 74 6f 3a 20  /.case OP_Goto: 
63c0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
63d0: 20 6a 75 6d 70 20 2a 2f 0a 6a 75 6d 70 5f 74 6f   jump */.jump_to
63e0: 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f  _p2_and_check_fo
63f0: 72 5f 69 6e 74 65 72 72 75 70 74 3a 0a 20 20 70  r_interrupt:.  p
6400: 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70  Op = &aOp[pOp->p
6410: 32 20 2d 20 31 5d 3b 0a 0a 20 20 2f 2a 20 4f 70  2 - 1];..  /* Op
6420: 63 6f 64 65 73 20 74 68 61 74 20 61 72 65 20 75  codes that are u
6430: 73 65 64 20 61 73 20 74 68 65 20 62 6f 74 74 6f  sed as the botto
6440: 6d 20 6f 66 20 61 20 6c 6f 6f 70 20 28 4f 50 5f  m of a loop (OP_
6450: 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 2c 0a 20  Next, OP_Prev,. 
6460: 20 2a 2a 20 4f 50 5f 56 4e 65 78 74 2c 20 4f 50   ** OP_VNext, OP
6470: 5f 52 6f 77 53 65 74 4e 65 78 74 2c 20 6f 72 20  _RowSetNext, or 
6480: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 29 20 61  OP_SorterNext) a
6490: 6c 6c 20 6a 75 6d 70 20 68 65 72 65 20 75 70 6f  ll jump here upo
64a0: 6e 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f  n.  ** completio
64b0: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
64c0: 20 69 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 65   if sqlite3_inte
64d0: 72 72 75 70 74 28 29 20 68 61 73 20 62 65 65 6e  rrupt() has been
64e0: 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 72 20   called.  ** or 
64f0: 69 66 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  if the progress 
6500: 63 61 6c 6c 62 61 63 6b 20 6e 65 65 64 73 20 74  callback needs t
6510: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 20 0a 20  o be invoked. . 
6520: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
6530: 64 65 20 75 73 65 73 20 75 6e 73 74 72 75 63 74  de uses unstruct
6540: 75 72 65 64 20 22 67 6f 74 6f 22 20 73 74 61 74  ured "goto" stat
6550: 65 6d 65 6e 74 73 20 61 6e 64 20 64 6f 65 73 20  ements and does 
6560: 6e 6f 74 20 6c 6f 6f 6b 20 63 6c 65 61 6e 2e 0a  not look clean..
6570: 20 20 2a 2a 20 42 75 74 20 74 68 61 74 20 69 73    ** But that is
6580: 20 6e 6f 74 20 64 75 65 20 74 6f 20 73 6c 6f 70   not due to slop
6590: 70 79 20 63 6f 64 69 6e 67 20 68 61 62 69 74 73  py coding habits
65a0: 2e 20 54 68 65 20 63 6f 64 65 20 69 73 20 77 72  . The code is wr
65b0: 69 74 74 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20  itten this.  ** 
65c0: 77 61 79 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  way for performa
65d0: 6e 63 65 2c 20 74 6f 20 61 76 6f 69 64 20 68 61  nce, to avoid ha
65e0: 76 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 20  ving to run the 
65f0: 69 6e 74 65 72 72 75 70 74 20 61 6e 64 20 70 72  interrupt and pr
6600: 6f 67 72 65 73 73 0a 20 20 2a 2a 20 63 68 65 63  ogress.  ** chec
6610: 6b 73 20 6f 6e 20 65 76 65 72 79 20 6f 70 63 6f  ks on every opco
6620: 64 65 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  de.  This helps 
6630: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
6640: 6f 20 72 75 6e 20 61 62 6f 75 74 20 31 2e 35 25  o run about 1.5%
6650: 0a 20 20 2a 2a 20 66 61 73 74 65 72 20 61 63 63  .  ** faster acc
6660: 6f 72 64 69 6e 67 20 74 6f 20 22 76 61 6c 67 72  ording to "valgr
6670: 69 6e 64 20 2d 2d 74 6f 6f 6c 3d 63 61 63 68 65  ind --tool=cache
6680: 67 72 69 6e 64 22 20 2a 2f 0a 63 68 65 63 6b 5f  grind" */.check_
6690: 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3a 0a 20  for_interrupt:. 
66a0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
66b0: 74 65 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f  terrupted ) goto
66c0: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e   abort_due_to_in
66d0: 74 65 72 72 75 70 74 3b 0a 23 69 66 6e 64 65 66  terrupt;.#ifndef
66e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
66f0: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
6700: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 70 72 6f   /* Call the pro
6710: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 69  gress callback i
6720: 66 20 69 74 20 69 73 20 63 6f 6e 66 69 67 75 72  f it is configur
6730: 65 64 20 61 6e 64 20 74 68 65 20 72 65 71 75 69  ed and the requi
6740: 72 65 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  red number.  ** 
6750: 6f 66 20 56 44 42 45 20 6f 70 73 20 68 61 76 65  of VDBE ops have
6760: 20 62 65 65 6e 20 65 78 65 63 75 74 65 64 20 28   been executed (
6770: 65 69 74 68 65 72 20 73 69 6e 63 65 20 74 68 69  either since thi
6780: 73 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a  s invocation of.
6790: 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
67a0: 45 78 65 63 28 29 20 6f 72 20 73 69 6e 63 65 20  Exec() or since 
67b0: 6c 61 73 74 20 74 69 6d 65 20 74 68 65 20 70 72  last time the pr
67c0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
67d0: 77 61 73 20 63 61 6c 6c 65 64 29 2e 0a 20 20 2a  was called)..  *
67e0: 2a 20 49 66 20 74 68 65 20 70 72 6f 67 72 65 73  * If the progres
67f0: 73 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  s callback retur
6800: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 65 78 69  ns non-zero, exi
6810: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  t the virtual ma
6820: 63 68 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  chine with.  ** 
6830: 61 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53 51  a return code SQ
6840: 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 20 20 2a 2f  LITE_ABORT..  */
6850: 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67  .  if( db->xProg
6860: 72 65 73 73 21 3d 30 20 26 26 20 6e 56 6d 53 74  ress!=0 && nVmSt
6870: 65 70 3e 3d 6e 50 72 6f 67 72 65 73 73 4c 69 6d  ep>=nProgressLim
6880: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
6890: 28 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f  ( db->nProgressO
68a0: 70 73 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50 72  ps!=0 );.    nPr
68b0: 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 6e 56  ogressLimit = nV
68c0: 6d 53 74 65 70 20 2b 20 64 62 2d 3e 6e 50 72 6f  mStep + db->nPro
68d0: 67 72 65 73 73 4f 70 73 20 2d 20 28 6e 56 6d 53  gressOps - (nVmS
68e0: 74 65 70 25 64 62 2d 3e 6e 50 72 6f 67 72 65 73  tep%db->nProgres
68f0: 73 4f 70 73 29 3b 0a 20 20 20 20 69 66 28 20 64  sOps);.    if( d
6900: 62 2d 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d  b->xProgress(db-
6910: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 29 20 29  >pProgressArg) )
6920: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6930: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
6940: 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
6950: 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
6960: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
6970: 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a   .  break;.}../*
6980: 20 4f 70 63 6f 64 65 3a 20 20 47 6f 73 75 62 20   Opcode:  Gosub 
6990: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
69a0: 2a 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72  * Write the curr
69b0: 65 6e 74 20 61 64 64 72 65 73 73 20 6f 6e 74 6f  ent address onto
69c0: 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20   register P1.** 
69d0: 61 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  and then jump to
69e0: 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2f 0a   address P2..*/.
69f0: 63 61 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b  case OP_Gosub: {
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
6a10: 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ump */.  assert(
6a20: 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f   pOp->p1>0 && pO
6a30: 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p1<=(p->nMem+
6a40: 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
6a50: 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  );.  pIn1 = &aMe
6a60: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
6a70: 73 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e  sert( VdbeMemDyn
6a80: 61 6d 69 63 28 70 49 6e 31 29 3d 3d 30 20 29 3b  amic(pIn1)==0 );
6a90: 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
6aa0: 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20  nge(p, pIn1);.  
6ab0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pIn1->flags = ME
6ac0: 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e 31 2d 3e 75  M_Int;.  pIn1->u
6ad0: 2e 69 20 3d 20 28 69 6e 74 29 28 70 4f 70 2d 61  .i = (int)(pOp-a
6ae0: 4f 70 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  Op);.  REGISTER_
6af0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70  TRACE(pOp->p1, p
6b00: 49 6e 31 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 73 74  In1);..  /* Most
6b10: 20 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 73   jump operations
6b20: 20 64 6f 20 61 20 67 6f 74 6f 20 74 6f 20 74 68   do a goto to th
6b30: 69 73 20 73 70 6f 74 20 69 6e 20 6f 72 64 65 72  is spot in order
6b40: 20 74 6f 20 75 70 64 61 74 65 0a 20 20 2a 2a 20   to update.  ** 
6b50: 74 68 65 20 70 4f 70 20 70 6f 69 6e 74 65 72 2e  the pOp pointer.
6b60: 20 2a 2f 0a 6a 75 6d 70 5f 74 6f 5f 70 32 3a 0a   */.jump_to_p2:.
6b70: 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70    pOp = &aOp[pOp
6b80: 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20 62 72 65  ->p2 - 1];.  bre
6b90: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
6ba0: 3a 20 20 52 65 74 75 72 6e 20 50 31 20 2a 20 2a  :  Return P1 * *
6bb0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20   * *.**.** Jump 
6bc0: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
6bd0: 72 75 63 74 69 6f 6e 20 61 66 74 65 72 20 74 68  ruction after th
6be0: 65 20 61 64 64 72 65 73 73 20 69 6e 20 72 65 67  e address in reg
6bf0: 69 73 74 65 72 20 50 31 2e 20 20 41 66 74 65 72  ister P1.  After
6c00: 0a 2a 2a 20 74 68 65 20 6a 75 6d 70 2c 20 72 65  .** the jump, re
6c10: 67 69 73 74 65 72 20 50 31 20 62 65 63 6f 6d 65  gister P1 become
6c20: 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
6c30: 63 61 73 65 20 4f 50 5f 52 65 74 75 72 6e 3a 20  case OP_Return: 
6c40: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  {           /* i
6c50: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
6c60: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
6c70: 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
6c80: 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b  lags==MEM_Int );
6c90: 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 49  .  pOp = &aOp[pI
6ca0: 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20 70 49 6e 31  n1->u.i];.  pIn1
6cb0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e  ->flags = MEM_Un
6cc0: 64 65 66 69 6e 65 64 3b 0a 20 20 62 72 65 61 6b  defined;.  break
6cd0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
6ce0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 50 31  InitCoroutine P1
6cf0: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
6d00: 20 53 65 74 20 75 70 20 72 65 67 69 73 74 65 72   Set up register
6d10: 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 77   P1 so that it w
6d20: 69 6c 6c 20 59 69 65 6c 64 20 74 6f 20 74 68 65  ill Yield to the
6d30: 20 63 6f 72 6f 75 74 69 6e 65 0a 2a 2a 20 6c 6f   coroutine.** lo
6d40: 63 61 74 65 64 20 61 74 20 61 64 64 72 65 73 73  cated at address
6d50: 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32   P3..**.** If P2
6d60: 21 3d 30 20 74 68 65 6e 20 74 68 65 20 63 6f 72  !=0 then the cor
6d70: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
6d80: 61 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c  ation immediatel
6d90: 79 20 66 6f 6c 6c 6f 77 73 0a 2a 2a 20 74 68 69  y follows.** thi
6da0: 73 20 6f 70 63 6f 64 65 2e 20 20 53 6f 20 6a 75  s opcode.  So ju
6db0: 6d 70 20 6f 76 65 72 20 74 68 65 20 63 6f 72 6f  mp over the coro
6dc0: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
6dd0: 74 69 6f 6e 20 74 6f 0a 2a 2a 20 61 64 64 72 65  tion to.** addre
6de0: 73 73 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ss P2..**.** See
6df0: 20 61 6c 73 6f 3a 20 45 6e 64 43 6f 72 6f 75 74   also: EndCorout
6e00: 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ine.*/.case OP_I
6e10: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 20  nitCoroutine: { 
6e20: 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
6e30: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
6e40: 3e 30 20 26 26 20 20 70 4f 70 2d 3e 70 31 3c 3d  >0 &&  pOp->p1<=
6e50: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
6e60: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 61 73  nCursor) );.  as
6e70: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30  sert( pOp->p2>=0
6e80: 20 26 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   && pOp->p2<p->n
6e90: 4f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Op );.  assert( 
6ea0: 70 4f 70 2d 3e 70 33 3e 3d 30 20 26 26 20 70 4f  pOp->p3>=0 && pO
6eb0: 70 2d 3e 70 33 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  p->p3<p->nOp );.
6ec0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
6ed0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
6ee0: 74 28 20 21 56 64 62 65 4d 65 6d 44 79 6e 61 6d  t( !VdbeMemDynam
6ef0: 69 63 28 70 4f 75 74 29 20 29 3b 0a 20 20 70 4f  ic(pOut) );.  pO
6f00: 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  ut->u.i = pOp->p
6f10: 33 20 2d 20 31 3b 0a 20 20 70 4f 75 74 2d 3e 66  3 - 1;.  pOut->f
6f20: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
6f30: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 29 20    if( pOp->p2 ) 
6f40: 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
6f50: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
6f60: 4f 70 63 6f 64 65 3a 20 20 45 6e 64 43 6f 72 6f  Opcode:  EndCoro
6f70: 75 74 69 6e 65 20 50 31 20 2a 20 2a 20 2a 20 2a  utine P1 * * * *
6f80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 73 74 72  .**.** The instr
6f90: 75 63 74 69 6f 6e 20 61 74 20 74 68 65 20 61 64  uction at the ad
6fa0: 64 72 65 73 73 20 69 6e 20 72 65 67 69 73 74 65  dress in registe
6fb0: 72 20 50 31 20 69 73 20 61 20 59 69 65 6c 64 2e  r P1 is a Yield.
6fc0: 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20  .** Jump to the 
6fd0: 50 32 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20  P2 parameter of 
6fe0: 74 68 61 74 20 59 69 65 6c 64 2e 0a 2a 2a 20 41  that Yield..** A
6ff0: 66 74 65 72 20 74 68 65 20 6a 75 6d 70 2c 20 72  fter the jump, r
7000: 65 67 69 73 74 65 72 20 50 31 20 62 65 63 6f 6d  egister P1 becom
7010: 65 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a  es undefined..**
7020: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 49 6e  .** See also: In
7030: 69 74 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63  itCoroutine.*/.c
7040: 61 73 65 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  ase OP_EndCorout
7050: 69 6e 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ine: {          
7060: 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 56 64 62   /* in1 */.  Vdb
7070: 65 4f 70 20 2a 70 43 61 6c 6c 65 72 3b 0a 20 20  eOp *pCaller;.  
7080: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
7090: 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
70a0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45   pIn1->flags==ME
70b0: 4d 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  M_Int );.  asser
70c0: 74 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 3d 30 20  t( pIn1->u.i>=0 
70d0: 26 26 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 2d 3e  && pIn1->u.i<p->
70e0: 6e 4f 70 20 29 3b 0a 20 20 70 43 61 6c 6c 65 72  nOp );.  pCaller
70f0: 20 3d 20 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 2e   = &aOp[pIn1->u.
7100: 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  i];.  assert( pC
7110: 61 6c 6c 65 72 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  aller->opcode==O
7120: 50 5f 59 69 65 6c 64 20 29 3b 0a 20 20 61 73 73  P_Yield );.  ass
7130: 65 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e 70 32  ert( pCaller->p2
7140: 3e 3d 30 20 26 26 20 70 43 61 6c 6c 65 72 2d 3e  >=0 && pCaller->
7150: 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70  p2<p->nOp );.  p
7160: 4f 70 20 3d 20 26 61 4f 70 5b 70 43 61 6c 6c 65  Op = &aOp[pCalle
7170: 72 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20 20 70 49  r->p2 - 1];.  pI
7180: 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  n1->flags = MEM_
7190: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 62 72 65  Undefined;.  bre
71a0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
71b0: 3a 20 20 59 69 65 6c 64 20 50 31 20 50 32 20 2a  :  Yield P1 P2 *
71c0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70 20   * *.**.** Swap 
71d0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
71e0: 74 65 72 20 77 69 74 68 20 74 68 65 20 76 61 6c  ter with the val
71f0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
7200: 31 2e 20 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  1.  This.** has 
7210: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 79 69  the effect of yi
7220: 65 6c 64 69 6e 67 20 74 6f 20 61 20 63 6f 72 6f  elding to a coro
7230: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  utine..**.** If 
7240: 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 74 68  the coroutine th
7250: 61 74 20 69 73 20 6c 61 75 6e 63 68 65 64 20 62  at is launched b
7260: 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  y this instructi
7270: 6f 6e 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a 20  on ends with.** 
7280: 59 69 65 6c 64 20 6f 72 20 52 65 74 75 72 6e 20  Yield or Return 
7290: 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 74 6f  then continue to
72a0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
72b0: 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ction.  But if.*
72c0: 2a 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20  * the coroutine 
72d0: 6c 61 75 6e 63 68 65 64 20 62 79 20 74 68 69 73  launched by this
72e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
72f0: 73 20 77 69 74 68 0a 2a 2a 20 45 6e 64 43 6f 72  s with.** EndCor
7300: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 6a 75 6d  outine, then jum
7310: 70 20 74 6f 20 50 32 20 72 61 74 68 65 72 20 74  p to P2 rather t
7320: 68 61 6e 20 63 6f 6e 74 69 6e 75 69 6e 67 20 77  han continuing w
7330: 69 74 68 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20  ith the.** next 
7340: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
7350: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 49 6e 69  ** See also: Ini
7360: 74 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61  tCoroutine.*/.ca
7370: 73 65 20 4f 50 5f 59 69 65 6c 64 3a 20 7b 20 20  se OP_Yield: {  
7380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
7390: 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20  , jump */.  int 
73a0: 70 63 44 65 73 74 3b 0a 20 20 70 49 6e 31 20 3d  pcDest;.  pIn1 =
73b0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
73c0: 0a 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d  .  assert( VdbeM
73d0: 65 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31 29 3d  emDynamic(pIn1)=
73e0: 3d 30 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c  =0 );.  pIn1->fl
73f0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
7400: 20 70 63 44 65 73 74 20 3d 20 28 69 6e 74 29 70   pcDest = (int)p
7410: 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 70 49 6e 31  In1->u.i;.  pIn1
7420: 2d 3e 75 2e 69 20 3d 20 28 69 6e 74 29 28 70 4f  ->u.i = (int)(pO
7430: 70 20 2d 20 61 4f 70 29 3b 0a 20 20 52 45 47 49  p - aOp);.  REGI
7440: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
7450: 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 4f 70  p1, pIn1);.  pOp
7460: 20 3d 20 26 61 4f 70 5b 70 63 44 65 73 74 5d 3b   = &aOp[pcDest];
7470: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
7480: 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 49 66 4e  Opcode:  HaltIfN
7490: 75 6c 6c 20 20 50 31 20 50 32 20 50 33 20 50 34  ull  P1 P2 P3 P4
74a0: 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
74b0: 20 69 66 20 72 5b 50 33 5d 3d 6e 75 6c 6c 20 68   if r[P3]=null h
74c0: 61 6c 74 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20  alt.**.** Check 
74d0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
74e0: 69 73 74 65 72 20 50 33 2e 20 20 49 66 20 69 74  ister P3.  If it
74f0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 48 61   is NULL then Ha
7500: 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 70 61 72 61  lt using.** para
7510: 6d 65 74 65 72 20 50 31 2c 20 50 32 2c 20 61 6e  meter P1, P2, an
7520: 64 20 50 34 20 61 73 20 69 66 20 74 68 69 73 20  d P4 as if this 
7530: 77 65 72 65 20 61 20 48 61 6c 74 20 69 6e 73 74  were a Halt inst
7540: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  ruction.  If the
7550: 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 72 65 67  .** value in reg
7560: 69 73 74 65 72 20 50 33 20 69 73 20 6e 6f 74 20  ister P3 is not 
7570: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
7580: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
7590: 6f 70 2e 0a 2a 2a 20 54 68 65 20 50 35 20 70 61  op..** The P5 pa
75a0: 72 61 6d 65 74 65 72 20 73 68 6f 75 6c 64 20 62  rameter should b
75b0: 65 20 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  e 1..*/.case OP_
75c0: 48 61 6c 74 49 66 4e 75 6c 6c 3a 20 7b 20 20 20  HaltIfNull: {   
75d0: 20 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20 70     /* in3 */.  p
75e0: 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
75f0: 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e  >p3];.  if( (pIn
7600: 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  3->flags & MEM_N
7610: 75 6c 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ull)==0 ) break;
7620: 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
7630: 67 68 20 69 6e 74 6f 20 4f 50 5f 48 61 6c 74 20  gh into OP_Halt 
7640: 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  */.}../* Opcode:
7650: 20 20 48 61 6c 74 20 50 31 20 50 32 20 2a 20 50    Halt P1 P2 * P
7660: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 69 74 20  4 P5.**.** Exit 
7670: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 41 6c  immediately.  Al
7680: 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c 20  l open cursors, 
7690: 65 74 63 20 61 72 65 20 63 6c 6f 73 65 64 0a 2a  etc are closed.*
76a0: 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  * automatically.
76b0: 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65  .**.** P1 is the
76c0: 20 72 65 73 75 6c 74 20 63 6f 64 65 20 72 65 74   result code ret
76d0: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
76e0: 5f 65 78 65 63 28 29 2c 20 73 71 6c 69 74 65 33  _exec(), sqlite3
76f0: 5f 72 65 73 65 74 28 29 2c 0a 2a 2a 20 6f 72 20  _reset(),.** or 
7700: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
7710: 28 29 2e 20 20 46 6f 72 20 61 20 6e 6f 72 6d 61  ().  For a norma
7720: 6c 20 68 61 6c 74 2c 20 74 68 69 73 20 73 68 6f  l halt, this sho
7730: 75 6c 64 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b  uld be SQLITE_OK
7740: 20 28 30 29 2e 0a 2a 2a 20 46 6f 72 20 65 72 72   (0)..** For err
7750: 6f 72 73 2c 20 69 74 20 63 61 6e 20 62 65 20 73  ors, it can be s
7760: 6f 6d 65 20 6f 74 68 65 72 20 76 61 6c 75 65 2e  ome other value.
7770: 20 20 49 66 20 50 31 21 3d 30 20 74 68 65 6e 20    If P1!=0 then 
7780: 50 32 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e  P2 will determin
7790: 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  e.** whether or 
77a0: 6e 6f 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  not to rollback 
77b0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
77c0: 73 61 63 74 69 6f 6e 2e 20 20 44 6f 20 6e 6f 74  saction.  Do not
77d0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20   rollback.** if 
77e0: 50 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44 6f 20  P2==OE_Fail. Do 
77f0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  the rollback if 
7800: 50 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e  P2==OE_Rollback.
7810: 20 20 49 66 20 50 32 3d 3d 4f 45 5f 41 62 6f 72    If P2==OE_Abor
7820: 74 2c 0a 2a 2a 20 74 68 65 6e 20 62 61 63 6b 20  t,.** then back 
7830: 6f 75 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  out all changes 
7840: 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 72  that have occurr
7850: 65 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 65  ed during this e
7860: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 0a  xecution of the.
7870: 2a 2a 20 56 44 42 45 2c 20 62 75 74 20 64 6f 20  ** VDBE, but do 
7880: 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  not rollback the
7890: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a   transaction. .*
78a0: 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f  *.** If P4 is no
78b0: 74 20 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20 69  t null then it i
78c0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
78d0: 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ge string..**.**
78e0: 20 50 35 20 69 73 20 61 20 76 61 6c 75 65 20 62   P5 is a value b
78f0: 65 74 77 65 65 6e 20 30 20 61 6e 64 20 34 2c 20  etween 0 and 4, 
7900: 69 6e 63 6c 75 73 69 76 65 2c 20 74 68 61 74 20  inclusive, that 
7910: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 50 34 20  modifies the P4 
7920: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  string..**.**   
7930: 20 30 3a 20 20 28 6e 6f 20 63 68 61 6e 67 65 29   0:  (no change)
7940: 0a 2a 2a 20 20 20 20 31 3a 20 20 4e 4f 54 20 4e  .**    1:  NOT N
7950: 55 4c 4c 20 63 6f 6e 74 72 61 69 6e 74 20 66 61  ULL contraint fa
7960: 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 32  iled: P4.**    2
7970: 3a 20 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  :  UNIQUE constr
7980: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a  aint failed: P4.
7990: 2a 2a 20 20 20 20 33 3a 20 20 43 48 45 43 4b 20  **    3:  CHECK 
79a0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
79b0: 64 3a 20 50 34 0a 2a 2a 20 20 20 20 34 3a 20 20  d: P4.**    4:  
79c0: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
79d0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50  traint failed: P
79e0: 34 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73  4.**.** If P5 is
79f0: 20 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20 50 34   not zero and P4
7a00: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 65   is NULL, then e
7a10: 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
7a20: 74 68 65 20 22 3a 22 20 69 73 0a 2a 2a 20 6f 6d  the ":" is.** om
7a30: 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
7a40: 72 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  re is an implied
7a50: 20 22 48 61 6c 74 20 30 20 30 20 30 22 20 69 6e   "Halt 0 0 0" in
7a60: 73 74 72 75 63 74 69 6f 6e 20 69 6e 73 65 72 74  struction insert
7a70: 65 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65  ed at the very e
7a80: 6e 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79 20 70  nd of.** every p
7a90: 72 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20 6a 75  rogram.  So a ju
7aa0: 6d 70 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  mp past the last
7ab0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20   instruction of 
7ac0: 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69  the program.** i
7ad0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  s the same as ex
7ae0: 65 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a 2a 2f  ecuting Halt..*/
7af0: 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a 20 7b  .case OP_Halt: {
7b00: 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
7b10: 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70 63 78 3b  rame;.  int pcx;
7b20: 0a 0a 20 20 70 63 78 20 3d 20 28 69 6e 74 29 28  ..  pcx = (int)(
7b30: 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 69 66  pOp - aOp);.  if
7b40: 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54  ( pOp->p1==SQLIT
7b50: 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 46 72 61 6d  E_OK && p->pFram
7b60: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 48 61 6c 74  e ){.    /* Halt
7b70: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
7b80: 2e 20 52 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c  . Return control
7b90: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 66   to the parent f
7ba0: 72 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 46 72  rame. */.    pFr
7bb0: 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b  ame = p->pFrame;
7bc0: 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d  .    p->pFrame =
7bd0: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
7be0: 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 2d  ;.    p->nFrame-
7bf0: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  -;.    sqlite3Vd
7c00: 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
7c10: 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
7c20: 20 20 70 63 78 20 3d 20 73 71 6c 69 74 65 33 56    pcx = sqlite3V
7c30: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
7c40: 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  pFrame);.    if(
7c50: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e   pOp->p2==OE_Ign
7c60: 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ore ){.      /* 
7c70: 49 6e 73 74 72 75 63 74 69 6f 6e 20 70 63 78 20  Instruction pcx 
7c80: 69 73 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  is the OP_Progra
7c90: 6d 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  m that invoked t
7ca0: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a  he sub-program .
7cb0: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
7cc0: 6c 79 20 62 65 69 6e 67 20 68 61 6c 74 65 64 2e  ly being halted.
7cd0: 20 49 66 20 74 68 65 20 70 32 20 69 6e 73 74 72   If the p2 instr
7ce0: 75 63 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 4f  uction of this O
7cf0: 50 5f 48 61 6c 74 0a 20 20 20 20 20 20 2a 2a 20  P_Halt.      ** 
7d00: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 73  instruction is s
7d10: 65 74 20 74 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c  et to OE_Ignore,
7d20: 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d 70 72   then the sub-pr
7d30: 6f 67 72 61 6d 20 69 73 20 74 68 72 6f 77 69 6e  ogram is throwin
7d40: 67 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 49 47  g.      ** an IG
7d50: 4e 4f 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 20  NORE exception. 
7d60: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 6d  In this case jum
7d70: 70 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  p to the address
7d80: 20 73 70 65 63 69 66 69 65 64 0a 20 20 20 20 20   specified.     
7d90: 20 2a 2a 20 61 73 20 74 68 65 20 70 32 20 6f 66   ** as the p2 of
7da0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 4f 50 5f   the calling OP_
7db0: 50 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20  Program.  */.   
7dc0: 20 20 20 70 63 78 20 3d 20 70 2d 3e 61 4f 70 5b     pcx = p->aOp[
7dd0: 70 63 78 5d 2e 70 32 2d 31 3b 0a 20 20 20 20 7d  pcx].p2-1;.    }
7de0: 0a 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 4f  .    aOp = p->aO
7df0: 70 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20 70 2d  p;.    aMem = p-
7e00: 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 4f 70 20 3d  >aMem;.    pOp =
7e10: 20 26 61 4f 70 5b 70 63 78 5d 3b 0a 20 20 20 20   &aOp[pcx];.    
7e20: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  break;.  }.  p->
7e30: 72 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  rc = pOp->p1;.  
7e40: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
7e50: 20 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a 20 20   (u8)pOp->p2;.  
7e60: 70 2d 3e 70 63 20 3d 20 70 63 78 3b 0a 20 20 61  p->pc = pcx;.  a
7e70: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 3d  ssert( pOp->p5<=
7e80: 34 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  4 );.  if( p->rc
7e90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   ){.    if( pOp-
7ea0: 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 73 74 61  >p5 ){.      sta
7eb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7ec0: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
7ed0: 3d 20 7b 20 22 4e 4f 54 20 4e 55 4c 4c 22 2c 20  = { "NOT NULL", 
7ee0: 22 55 4e 49 51 55 45 22 2c 20 22 43 48 45 43 4b  "UNIQUE", "CHECK
7ef0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 22 46 4f 52 45 49 47 4e 20 4b 45 59 22 20 7d 3b  "FOREIGN KEY" };
7f30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7f40: 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20   pOp->p5==1 );. 
7f50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
7f60: 4f 70 2d 3e 70 35 3d 3d 32 20 29 3b 0a 20 20 20  Op->p5==2 );.   
7f70: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70     testcase( pOp
7f80: 2d 3e 70 35 3d 3d 33 20 29 3b 0a 20 20 20 20 20  ->p5==3 );.     
7f90: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
7fa0: 70 35 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73  p5==4 );.      s
7fb0: 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
7fc0: 70 2c 20 22 25 73 20 63 6f 6e 73 74 72 61 69 6e  p, "%s constrain
7fd0: 74 20 66 61 69 6c 65 64 22 2c 20 61 7a 54 79 70  t failed", azTyp
7fe0: 65 5b 70 4f 70 2d 3e 70 35 2d 31 5d 29 3b 0a 20  e[pOp->p5-1]);. 
7ff0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34       if( pOp->p4
8000: 2e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  .z ){.        p-
8010: 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
8020: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
8030: 7a 3a 20 25 73 22 2c 20 70 2d 3e 7a 45 72 72 4d  z: %s", p->zErrM
8040: 73 67 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  sg, pOp->p4.z);.
8050: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8060: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
8070: 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73  VdbeError(p, "%s
8080: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
8090: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
80a0: 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20 22 61  _log(pOp->p1, "a
80b0: 62 6f 72 74 20 61 74 20 25 64 20 69 6e 20 5b 25  bort at %d in [%
80c0: 73 5d 3a 20 25 73 22 2c 20 70 63 78 2c 20 70 2d  s]: %s", pcx, p-
80d0: 3e 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72 72 4d 73  >zSql, p->zErrMs
80e0: 67 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  g);.  }.  rc = s
80f0: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
8100: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
8110: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
8120: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
8130: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f   rc==SQLITE_ERRO
8140: 52 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  R );.  if( rc==S
8150: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
8160: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8170: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
8180: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
8190: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
81a0: 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
81b0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
81c0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
81d0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d  SQLITE_OK || db-
81e0: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30  >nDeferredCons>0
81f0: 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65   || db->nDeferre
8200: 64 49 6d 6d 43 6f 6e 73 3e 30 20 29 3b 0a 20 20  dImmCons>0 );.  
8210: 20 20 72 63 20 3d 20 70 2d 3e 72 63 20 3f 20 53    rc = p->rc ? S
8220: 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51  QLITE_ERROR : SQ
8230: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
8240: 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
8250: 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  n;.}../* Opcode:
8260: 20 49 6e 74 65 67 65 72 20 50 31 20 50 32 20 2a   Integer P1 P2 *
8270: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
8280: 3a 20 72 5b 50 32 5d 3d 50 31 0a 2a 2a 0a 2a 2a  : r[P2]=P1.**.**
8290: 20 54 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65   The 32-bit inte
82a0: 67 65 72 20 76 61 6c 75 65 20 50 31 20 69 73 20  ger value P1 is 
82b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 72 65 67  written into reg
82c0: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
82d0: 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b 20  e OP_Integer: { 
82e0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
82f0: 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  */.  pOut = out2
8300: 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
8310: 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  p);.  pOut->u.i 
8320: 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65  = pOp->p1;.  bre
8330: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
8340: 3a 20 49 6e 74 36 34 20 2a 20 50 32 20 2a 20 50  : Int64 * P2 * P
8350: 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
8360: 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20   r[P2]=P4.**.** 
8370: 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
8380: 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  to a 64-bit inte
8390: 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 72  ger value..** Wr
83a0: 69 74 65 20 74 68 61 74 20 76 61 6c 75 65 20 69  ite that value i
83b0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
83c0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 36  .*/.case OP_Int6
83d0: 34 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  4: {           /
83e0: 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74  * out2 */.  pOut
83f0: 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
8400: 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73  e(p, pOp);.  ass
8410: 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70 49 36  ert( pOp->p4.pI6
8420: 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e  4!=0 );.  pOut->
8430: 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70  u.i = *pOp->p4.p
8440: 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  I64;.  break;.}.
8450: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8460: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
8470: 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  INT./* Opcode: R
8480: 65 61 6c 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a  eal * P2 * P4 *.
8490: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
84a0: 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69  2]=P4.**.** P4 i
84b0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
84c0: 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
84d0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a   point value..**
84e0: 20 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75   Write that valu
84f0: 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
8500: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  P2..*/.case OP_R
8510: 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20  eal: {          
8520: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
8530: 46 4c 4f 41 54 2c 20 6f 75 74 32 20 2a 2f 0a 20  FLOAT, out2 */. 
8540: 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
8550: 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
8560: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
8570: 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73 73 65  MEM_Real;.  asse
8580: 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61  rt( !sqlite3IsNa
8590: 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  N(*pOp->p4.pReal
85a0: 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 72  ) );.  pOut->u.r
85b0: 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61   = *pOp->p4.pRea
85c0: 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  l;.  break;.}.#e
85d0: 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ndif../* Opcode:
85e0: 20 53 74 72 69 6e 67 38 20 2a 20 50 32 20 2a 20   String8 * P2 * 
85f0: 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  P4 *.** Synopsis
8600: 3a 20 72 5b 50 32 5d 3d 27 50 34 27 0a 2a 2a 0a  : r[P2]='P4'.**.
8610: 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20  ** P4 points to 
8620: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
8630: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 54   UTF-8 string. T
8640: 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 74 72  his opcode is tr
8650: 61 6e 73 66 6f 72 6d 65 64 20 0a 2a 2a 20 69 6e  ansformed .** in
8660: 74 6f 20 61 20 53 74 72 69 6e 67 20 6f 70 63 6f  to a String opco
8670: 64 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  de before it is 
8680: 65 78 65 63 75 74 65 64 20 66 6f 72 20 74 68 65  executed for the
8690: 20 66 69 72 73 74 20 74 69 6d 65 2e 20 20 44 75   first time.  Du
86a0: 72 69 6e 67 0a 2a 2a 20 74 68 69 73 20 74 72 61  ring.** this tra
86b0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65  nsformation, the
86c0: 20 6c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   length of strin
86d0: 67 20 50 34 20 69 73 20 63 6f 6d 70 75 74 65 64  g P4 is computed
86e0: 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 61   and stored.** a
86f0: 73 20 74 68 65 20 50 31 20 70 61 72 61 6d 65 74  s the P1 paramet
8700: 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  er..*/.case OP_S
8710: 74 72 69 6e 67 38 3a 20 7b 20 20 20 20 20 20 20  tring8: {       
8720: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
8730: 53 54 52 49 4e 47 2c 20 6f 75 74 32 20 2a 2f 0a  STRING, out2 */.
8740: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
8750: 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  4.z!=0 );.  pOut
8760: 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
8770: 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 70  e(p, pOp);.  pOp
8780: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 74  ->opcode = OP_St
8790: 72 69 6e 67 3b 0a 20 20 70 4f 70 2d 3e 70 31 20  ring;.  pOp->p1 
87a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
87b0: 30 28 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 0a 23  0(pOp->p4.z);..#
87c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
87d0: 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28 20 65  IT_UTF16.  if( e
87e0: 6e 63 6f 64 69 6e 67 21 3d 53 51 4c 49 54 45 5f  ncoding!=SQLITE_
87f0: 55 54 46 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  UTF8 ){.    rc =
8800: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
8810: 65 74 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d  etStr(pOut, pOp-
8820: 3e 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c 49 54  >p4.z, -1, SQLIT
8830: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
8840: 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65  TATIC);.    asse
8850: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
8860: 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
8870: 54 4f 4f 42 49 47 20 29 3b 0a 20 20 20 20 69 66  TOOBIG );.    if
8880: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
8890: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
88a0: 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63  coding(pOut, enc
88b0: 6f 64 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f  oding) ) goto no
88c0: 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  _mem;.    assert
88d0: 28 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c 6f 63  ( pOut->szMalloc
88e0: 3e 30 20 26 26 20 70 4f 75 74 2d 3e 7a 4d 61 6c  >0 && pOut->zMal
88f0: 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29 3b 0a  loc==pOut->z );.
8900: 20 20 20 20 61 73 73 65 72 74 28 20 56 64 62 65      assert( Vdbe
8910: 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29  MemDynamic(pOut)
8920: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d  ==0 );.    pOut-
8930: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
8940: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c     pOut->flags |
8950: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20  = MEM_Static;.  
8960: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
8970: 65 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 29 7b  e==P4_DYNAMIC ){
8980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8990: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 70 34  Free(db, pOp->p4
89a0: 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  .z);.    }.    p
89b0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
89c0: 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20 70 4f 70  DYNAMIC;.    pOp
89d0: 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75 74 2d 3e 7a  ->p4.z = pOut->z
89e0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20  ;.    pOp->p1 = 
89f0: 70 4f 75 74 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 74  pOut->n;.  }.  t
8a00: 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
8a10: 49 54 45 5f 54 4f 4f 42 49 47 20 29 3b 0a 23 65  ITE_TOOBIG );.#e
8a20: 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 70 2d 3e  ndif.  if( pOp->
8a30: 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  p1>db->aLimit[SQ
8a40: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
8a50: 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
8a60: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 61 73  oo_big;.  }.  as
8a70: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
8a80: 5f 4f 4b 20 29 3b 0a 20 20 2f 2a 20 46 61 6c 6c  _OK );.  /* Fall
8a90: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
8aa0: 6e 65 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74  next case, OP_St
8ab0: 72 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20  ring */.}.  ./* 
8ac0: 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50  Opcode: String P
8ad0: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
8ae0: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
8af0: 3d 27 50 34 27 20 28 6c 65 6e 3d 50 31 29 0a 2a  ='P4' (len=P1).*
8b00: 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20  *.** The string 
8b10: 76 61 6c 75 65 20 50 34 20 6f 66 20 6c 65 6e 67  value P4 of leng
8b20: 74 68 20 50 31 20 28 62 79 74 65 73 29 20 69 73  th P1 (bytes) is
8b30: 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
8b40: 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P2..**.** If
8b50: 20 50 33 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20   P3 is not zero 
8b60: 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  and the content 
8b70: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
8b80: 73 20 65 71 75 61 6c 20 74 6f 20 50 35 2c 20 74  s equal to P5, t
8b90: 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 74  hen.** the datat
8ba0: 79 70 65 20 6f 66 20 74 68 65 20 72 65 67 69 73  ype of the regis
8bb0: 74 65 72 20 50 32 20 69 73 20 63 6f 6e 76 65 72  ter P2 is conver
8bc0: 74 65 64 20 74 6f 20 42 4c 4f 42 2e 20 20 54 68  ted to BLOB.  Th
8bd0: 65 20 63 6f 6e 74 65 6e 74 20 69 73 0a 2a 2a 20  e content is.** 
8be0: 74 68 65 20 73 61 6d 65 20 73 65 71 75 65 6e 63  the same sequenc
8bf0: 65 20 6f 66 20 62 79 74 65 73 2c 20 69 74 20 69  e of bytes, it i
8c00: 73 20 6d 65 72 65 6c 79 20 69 6e 74 65 72 70 72  s merely interpr
8c10: 65 74 65 64 20 61 73 20 61 20 42 4c 4f 42 20 69  eted as a BLOB i
8c20: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61 20 73  nstead.** of a s
8c30: 74 72 69 6e 67 2c 20 61 73 20 69 66 20 69 74 20  tring, as if it 
8c40: 68 61 64 20 62 65 65 6e 20 43 41 53 54 2e 20 20  had been CAST.  
8c50: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a  In other words:.
8c60: 2a 2a 0a 2a 2a 20 69 66 28 20 50 33 21 3d 30 20  **.** if( P3!=0 
8c70: 61 6e 64 20 72 65 67 5b 50 33 5d 3d 3d 50 35 20  and reg[P3]==P5 
8c80: 29 20 72 65 67 5b 50 32 5d 20 3a 3d 20 43 41 53  ) reg[P2] := CAS
8c90: 54 28 72 65 67 5b 50 32 5d 20 61 73 20 42 4c 4f  T(reg[P2] as BLO
8ca0: 42 29 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74  B).*/.case OP_St
8cb0: 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20 20 20  ring: {         
8cc0: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73   /* out2 */.  as
8cd0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21  sert( pOp->p4.z!
8ce0: 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f  =0 );.  pOut = o
8cf0: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
8d00: 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66   pOp);.  pOut->f
8d10: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
8d20: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65  EM_Static|MEM_Te
8d30: 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20 3d 20  rm;.  pOut->z = 
8d40: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 70 4f 75  pOp->p4.z;.  pOu
8d50: 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  t->n = pOp->p1;.
8d60: 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e    pOut->enc = en
8d70: 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45  coding;.  UPDATE
8d80: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
8d90: 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ut);.#ifndef SQL
8da0: 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
8db0: 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 69 66  MATCH_BLOBS.  if
8dc0: 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20  ( pOp->p3>0 ){. 
8dd0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
8de0: 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
8df0: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
8e00: 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d      pIn3 = &aMem
8e10: 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 61  [pOp->p3];.    a
8e20: 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61  ssert( pIn3->fla
8e30: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
8e40: 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e      if( pIn3->u.
8e50: 69 3d 3d 70 4f 70 2d 3e 70 35 20 29 20 70 4f 75  i==pOp->p5 ) pOu
8e60: 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  t->flags = MEM_B
8e70: 6c 6f 62 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  lob|MEM_Static|M
8e80: 45 4d 5f 54 65 72 6d 3b 0a 20 20 7d 0a 23 65 6e  EM_Term;.  }.#en
8e90: 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  dif.  break;.}..
8ea0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 20  /* Opcode: Null 
8eb0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
8ec0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 2e 2e  Synopsis: r[P2..
8ed0: 50 33 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 57  P3]=NULL.**.** W
8ee0: 72 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f  rite a NULL into
8ef0: 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 20 20   registers P2.  
8f00: 49 66 20 50 33 20 67 72 65 61 74 65 72 20 74 68  If P3 greater th
8f10: 61 6e 20 50 32 2c 20 74 68 65 6e 20 61 6c 73 6f  an P2, then also
8f20: 20 77 72 69 74 65 0a 2a 2a 20 4e 55 4c 4c 20 69   write.** NULL i
8f30: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 20  nto register P3 
8f40: 61 6e 64 20 65 76 65 72 79 20 72 65 67 69 73 74  and every regist
8f50: 65 72 20 69 6e 20 62 65 74 77 65 65 6e 20 50 32  er in between P2
8f60: 20 61 6e 64 20 50 33 2e 20 20 49 66 20 50 33 0a   and P3.  If P3.
8f70: 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
8f80: 50 32 20 28 74 79 70 69 63 61 6c 6c 79 20 50 33  P2 (typically P3
8f90: 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 20 6f   is zero) then o
8fa0: 6e 6c 79 20 72 65 67 69 73 74 65 72 20 50 32 20  nly register P2 
8fb0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 4e 55 4c  is.** set to NUL
8fc0: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
8fd0: 50 31 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  P1 value is non-
8fe0: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6c 73 6f 20  zero, then also 
8ff0: 73 65 74 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  set the MEM_Clea
9000: 72 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74  red flag so that
9010: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  .** NULL values 
9020: 77 69 6c 6c 20 6e 6f 74 20 63 6f 6d 70 61 72 65  will not compare
9030: 20 65 71 75 61 6c 20 65 76 65 6e 20 69 66 20 53   equal even if S
9040: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20  QLITE_NULLEQ is 
9050: 73 65 74 20 6f 6e 0a 2a 2a 20 4f 50 5f 4e 65 20  set on.** OP_Ne 
9060: 6f 72 20 4f 50 5f 45 71 2e 0a 2a 2f 0a 63 61 73  or OP_Eq..*/.cas
9070: 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20  e OP_Null: {    
9080: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
9090: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 75  /.  int cnt;.  u
90a0: 31 36 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20 20 70  16 nullFlag;.  p
90b0: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
90c0: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
90d0: 63 6e 74 20 3d 20 70 4f 70 2d 3e 70 33 2d 70 4f  cnt = pOp->p3-pO
90e0: 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28  p->p2;.  assert(
90f0: 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
9100: 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
9110: 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  r) );.  pOut->fl
9120: 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 20 3d  ags = nullFlag =
9130: 20 70 4f 70 2d 3e 70 31 20 3f 20 28 4d 45 4d 5f   pOp->p1 ? (MEM_
9140: 4e 75 6c 6c 7c 4d 45 4d 5f 43 6c 65 61 72 65 64  Null|MEM_Cleared
9150: 29 20 3a 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  ) : MEM_Null;.  
9160: 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 77  pOut->n = 0;.  w
9170: 68 69 6c 65 28 20 63 6e 74 3e 30 20 29 7b 0a 20  hile( cnt>0 ){. 
9180: 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20 6d     pOut++;.    m
9190: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
91a0: 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 73 71  p, pOut);.    sq
91b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
91c0: 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 70  ull(pOut);.    p
91d0: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e 75 6c  Out->flags = nul
91e0: 6c 46 6c 61 67 3b 0a 20 20 20 20 70 4f 75 74 2d  lFlag;.    pOut-
91f0: 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 63 6e 74 2d  >n = 0;.    cnt-
9200: 2d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  -;.  }.  break;.
9210: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f  }../* Opcode: So
9220: 66 74 4e 75 6c 6c 20 50 31 20 2a 20 2a 20 2a 20  ftNull P1 * * * 
9230: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
9240: 5b 50 31 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20  [P1]=NULL.**.** 
9250: 53 65 74 20 72 65 67 69 73 74 65 72 20 50 31 20  Set register P1 
9260: 74 6f 20 68 61 76 65 20 74 68 65 20 76 61 6c 75  to have the valu
9270: 65 20 4e 55 4c 4c 20 61 73 20 73 65 65 6e 20 62  e NULL as seen b
9280: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
9290: 6f 72 64 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69  ord.** instructi
92a0: 6f 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 66  on, but do not f
92b0: 72 65 65 20 61 6e 79 20 73 74 72 69 6e 67 20 6f  ree any string o
92c0: 72 20 62 6c 6f 62 20 6d 65 6d 6f 72 79 20 61 73  r blob memory as
92d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
92e0: 20 74 68 65 20 72 65 67 69 73 74 65 72 2c 20 73   the register, s
92f0: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61  o that if the va
9300: 6c 75 65 20 77 61 73 20 61 20 73 74 72 69 6e 67  lue was a string
9310: 20 6f 72 20 62 6c 6f 62 20 74 68 61 74 20 77 61   or blob that wa
9320: 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
9330: 63 6f 70 69 65 64 20 75 73 69 6e 67 20 4f 50 5f  copied using OP_
9340: 53 43 6f 70 79 2c 20 74 68 65 20 63 6f 70 69 65  SCopy, the copie
9350: 73 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  s will continue 
9360: 74 6f 20 62 65 20 76 61 6c 69 64 2e 0a 2a 2f 0a  to be valid..*/.
9370: 63 61 73 65 20 4f 50 5f 53 6f 66 74 4e 75 6c 6c  case OP_SoftNull
9380: 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  : {.  assert( pO
9390: 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p1>0 && pOp->
93a0: 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p1<=(p->nMem+1 -
93b0: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
93c0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
93d0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 2d  Op->p1];.  pOut-
93e0: 3e 66 6c 61 67 73 20 3d 20 28 70 4f 75 74 2d 3e  >flags = (pOut->
93f0: 66 6c 61 67 73 7c 4d 45 4d 5f 4e 75 6c 6c 29 26  flags|MEM_Null)&
9400: 7e 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a  ~MEM_Undefined;.
9410: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
9420: 70 63 6f 64 65 3a 20 42 6c 6f 62 20 50 31 20 50  pcode: Blob P1 P
9430: 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f  2 * P4 *.** Syno
9440: 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34 20 28  psis: r[P2]=P4 (
9450: 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 50 34  len=P1).**.** P4
9460: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 6c 6f   points to a blo
9470: 62 20 6f 66 20 64 61 74 61 20 50 31 20 62 79 74  b of data P1 byt
9480: 65 73 20 6c 6f 6e 67 2e 20 20 53 74 6f 72 65 20  es long.  Store 
9490: 74 68 69 73 0a 2a 2a 20 62 6c 6f 62 20 69 6e 20  this.** blob in 
94a0: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
94b0: 63 61 73 65 20 4f 50 5f 42 6c 6f 62 3a 20 7b 20  case OP_Blob: { 
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
94d0: 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65  * out2 */.  asse
94e0: 72 74 28 20 70 4f 70 2d 3e 70 31 20 3c 3d 20 53  rt( pOp->p1 <= S
94f0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
9500: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74   );.  pOut = out
9510: 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
9520: 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Op);.  sqlite3Vd
9530: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74  beMemSetStr(pOut
9540: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70  , pOp->p4.z, pOp
9550: 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70  ->p1, 0, 0);.  p
9560: 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  Out->enc = encod
9570: 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ing;.  UPDATE_MA
9580: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
9590: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
95a0: 20 4f 70 63 6f 64 65 3a 20 56 61 72 69 61 62 6c   Opcode: Variabl
95b0: 65 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  e P1 P2 * P4 *.*
95c0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
95d0: 5d 3d 70 61 72 61 6d 65 74 65 72 28 50 31 2c 50  ]=parameter(P1,P
95e0: 34 29 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  4).**.** Transfe
95f0: 72 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  r the values of 
9600: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
9610: 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  P1 into register
9620: 20 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   P2.**.** If the
9630: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 61   parameter is na
9640: 6d 65 64 2c 20 74 68 65 6e 20 69 74 73 20 6e 61  med, then its na
9650: 6d 65 20 61 70 70 65 61 72 73 20 69 6e 20 50 34  me appears in P4
9660: 2e 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75  ..** The P4 valu
9670: 65 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c  e is used by sql
9680: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
9690: 74 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63  ter_name()..*/.c
96a0: 61 73 65 20 4f 50 5f 56 61 72 69 61 62 6c 65 3a  ase OP_Variable:
96b0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
96c0: 20 6f 75 74 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a   out2 */.  Mem *
96d0: 70 56 61 72 3b 20 20 20 20 20 20 20 2f 2a 20 56  pVar;       /* V
96e0: 61 6c 75 65 20 62 65 69 6e 67 20 74 72 61 6e 73  alue being trans
96f0: 66 65 72 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73  ferred */..  ass
9700: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
9710: 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 56  & pOp->p1<=p->nV
9720: 61 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ar );.  assert( 
9730: 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20  pOp->p4.z==0 || 
9740: 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 73 71 6c 69 74  pOp->p4.z==sqlit
9750: 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
9760: 28 70 2d 3e 70 56 4c 69 73 74 2c 70 4f 70 2d 3e  (p->pVList,pOp->
9770: 70 31 29 20 29 3b 0a 20 20 70 56 61 72 20 3d 20  p1) );.  pVar = 
9780: 26 70 2d 3e 61 56 61 72 5b 70 4f 70 2d 3e 70 31  &p->aVar[pOp->p1
9790: 20 2d 20 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c   - 1];.  if( sql
97a0: 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69  ite3VdbeMemTooBi
97b0: 67 28 70 56 61 72 29 20 29 7b 0a 20 20 20 20 67  g(pVar) ){.    g
97c0: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
97d0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
97e0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69  pOp->p2];.  sqli
97f0: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
9800: 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61 72  wCopy(pOut, pVar
9810: 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  , MEM_Static);. 
9820: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
9830: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72  SIZE(pOut);.  br
9840: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
9850: 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20 50 33  e: Move P1 P2 P3
9860: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
9870: 3a 20 72 5b 50 32 40 50 33 5d 3d 72 5b 50 31 40  : r[P2@P3]=r[P1@
9880: 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74  P3].**.** Move t
9890: 68 65 20 50 33 20 76 61 6c 75 65 73 20 69 6e 20  he P3 values in 
98a0: 72 65 67 69 73 74 65 72 20 50 31 2e 2e 50 31 2b  register P1..P1+
98b0: 50 33 2d 31 20 6f 76 65 72 20 69 6e 74 6f 0a 2a  P3-1 over into.*
98c0: 2a 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e  * registers P2..
98d0: 50 32 2b 50 33 2d 31 2e 20 20 52 65 67 69 73 74  P2+P3-1.  Regist
98e0: 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20  ers P1..P1+P3-1 
98f0: 61 72 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c 64  are.** left hold
9900: 69 6e 67 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  ing a NULL.  It 
9910: 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  is an error for 
9920: 72 65 67 69 73 74 65 72 20 72 61 6e 67 65 73 0a  register ranges.
9930: 2a 2a 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61  ** P1..P1+P3-1 a
9940: 6e 64 20 50 32 2e 2e 50 32 2b 50 33 2d 31 20 74  nd P2..P2+P3-1 t
9950: 6f 20 6f 76 65 72 6c 61 70 2e 20 20 49 74 20 69  o overlap.  It i
9960: 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 66 6f  s an error.** fo
9970: 72 20 50 33 20 74 6f 20 62 65 20 6c 65 73 73 20  r P3 to be less 
9980: 74 68 61 6e 20 31 2e 0a 2a 2f 0a 63 61 73 65 20  than 1..*/.case 
9990: 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20 69 6e 74  OP_Move: {.  int
99a0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   n;           /*
99b0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
99c0: 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63 6f 70  ters left to cop
99d0: 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20  y */.  int p1;  
99e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
99f0: 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d  ter to copy from
9a00: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20   */.  int p2;   
9a10: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
9a20: 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20 2a 2f  er to copy to */
9a30: 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b  ..  n = pOp->p3;
9a40: 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b  .  p1 = pOp->p1;
9a50: 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
9a60: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 26  .  assert( n>0 &
9a70: 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30 20 29  & p1>0 && p2>0 )
9a80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 2b 6e  ;.  assert( p1+n
9a90: 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31  <=p2 || p2+n<=p1
9aa0: 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61   );..  pIn1 = &a
9ab0: 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Mem[p1];.  pOut 
9ac0: 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 64  = &aMem[p2];.  d
9ad0: 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o{.    assert( p
9ae0: 4f 75 74 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e  Out<=&aMem[(p->n
9af0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
9b00: 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  or)] );.    asse
9b10: 72 74 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b  rt( pIn1<=&aMem[
9b20: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
9b30: 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20  nCursor)] );.   
9b40: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
9b50: 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20  lid(pIn1) );.   
9b60: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
9b70: 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  e(p, pOut);.    
9b80: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
9b90: 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29 3b 0a  ve(pOut, pIn1);.
9ba0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9bb0: 42 55 47 0a 20 20 20 20 69 66 28 20 70 4f 75 74  BUG.    if( pOut
9bc0: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3e 3d 26 61  ->pScopyFrom>=&a
9bd0: 4d 65 6d 5b 70 31 5d 20 26 26 20 70 4f 75 74 2d  Mem[p1] && pOut-
9be0: 3e 70 53 63 6f 70 79 46 72 6f 6d 3c 70 4f 75 74  >pScopyFrom<pOut
9bf0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
9c00: 70 53 63 6f 70 79 46 72 6f 6d 20 2b 3d 20 70 4f  pScopyFrom += pO
9c10: 70 2d 3e 70 32 20 2d 20 70 31 3b 0a 20 20 20 20  p->p2 - p1;.    
9c20: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 65 65  }.#endif.    Dee
9c30: 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74  phemeralize(pOut
9c40: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
9c50: 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f 75 74  TRACE(p2++, pOut
9c60: 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  );.    pIn1++;. 
9c70: 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d 77 68     pOut++;.  }wh
9c80: 69 6c 65 28 20 2d 2d 6e 20 29 3b 0a 20 20 62 72  ile( --n );.  br
9c90: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
9ca0: 65 3a 20 43 6f 70 79 20 50 31 20 50 32 20 50 33  e: Copy P1 P2 P3
9cb0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
9cc0: 3a 20 72 5b 50 32 40 50 33 2b 31 5d 3d 72 5b 50  : r[P2@P3+1]=r[P
9cd0: 31 40 50 33 2b 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61  1@P3+1].**.** Ma
9ce0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72 65 67  ke a copy of reg
9cf0: 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50 33  isters P1..P1+P3
9d00: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20   into registers 
9d10: 50 32 2e 2e 50 32 2b 50 33 2e 0a 2a 2a 0a 2a 2a  P2..P2+P3..**.**
9d20: 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
9d30: 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70 20 63  n makes a deep c
9d40: 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65  opy of the value
9d50: 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65 0a 2a  .  A duplicate.*
9d60: 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61 6e 79  * is made of any
9d70: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
9d80: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 61  constant.  See a
9d90: 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f  lso OP_SCopy..*/
9da0: 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20 7b  .case OP_Copy: {
9db0: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d  .  int n;..  n =
9dc0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 49 6e 31   pOp->p3;.  pIn1
9dd0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
9de0: 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
9df0: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73  m[pOp->p2];.  as
9e00: 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49 6e 31  sert( pOut!=pIn1
9e10: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29   );.  while( 1 )
9e20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9e30: 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
9e40: 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f  pOut, pIn1, MEM_
9e50: 45 70 68 65 6d 29 3b 0a 20 20 20 20 44 65 65 70  Ephem);.    Deep
9e60: 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29  hemeralize(pOut)
9e70: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9e80: 44 45 42 55 47 0a 20 20 20 20 70 4f 75 74 2d 3e  DEBUG.    pOut->
9e90: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
9ea0: 23 65 6e 64 69 66 0a 20 20 20 20 52 45 47 49 53  #endif.    REGIS
9eb0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
9ec0: 32 2b 70 4f 70 2d 3e 70 33 2d 6e 2c 20 70 4f 75  2+pOp->p3-n, pOu
9ed0: 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e 2d 2d  t);.    if( (n--
9ee0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
9ef0: 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20 70 49    pOut++;.    pI
9f00: 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61  n1++;.  }.  brea
9f10: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
9f20: 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a   SCopy P1 P2 * *
9f30: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
9f40: 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  r[P2]=r[P1].**.*
9f50: 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77  * Make a shallow
9f60: 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65   copy of registe
9f70: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
9f80: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
9f90: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61  s instruction ma
9fa0: 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  kes a shallow co
9fb0: 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e  py of the value.
9fc0: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
9fd0: 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f 72  * is a string or
9fe0: 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74 68 65 20   blob, then the 
9ff0: 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20 61 20 70  copy is only a p
a000: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
a010: 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64 20 68 65   original and he
a020: 6e 63 65 20 69 66 20 74 68 65 20 6f 72 69 67 69  nce if the origi
a030: 6e 61 6c 20 63 68 61 6e 67 65 73 20 73 6f 20 77  nal changes so w
a040: 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e 0a 2a 2a  ill the copy..**
a050: 20 57 6f 72 73 65 2c 20 69 66 20 74 68 65 20 6f   Worse, if the o
a060: 72 69 67 69 6e 61 6c 20 69 73 20 64 65 61 6c 6c  riginal is deall
a070: 6f 63 61 74 65 64 2c 20 74 68 65 20 63 6f 70 79  ocated, the copy
a080: 20 62 65 63 6f 6d 65 73 20 69 6e 76 61 6c 69 64   becomes invalid
a090: 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65 20 70 72  ..** Thus the pr
a0a0: 6f 67 72 61 6d 20 6d 75 73 74 20 67 75 61 72 61  ogram must guara
a0b0: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 6f 72  ntee that the or
a0c0: 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  iginal will not 
a0d0: 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72 69 6e 67  change.** during
a0e0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
a0f0: 20 74 68 65 20 63 6f 70 79 2e 20 20 55 73 65 20   the copy.  Use 
a100: 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61 6b 65 20  OP_Copy to make 
a110: 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f  a complete.** co
a120: 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  py..*/.case OP_S
a130: 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20  Copy: {         
a140: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
a150: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
a160: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
a170: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
a180: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d    assert( pOut!=
a190: 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  pIn1 );.  sqlite
a1a0: 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
a1b0: 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20  opy(pOut, pIn1, 
a1c0: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 23 69 66 64  MEM_Ephem);.#ifd
a1d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a1e0: 20 20 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f    if( pOut->pSco
a1f0: 70 79 46 72 6f 6d 3d 3d 30 20 29 20 70 4f 75 74  pyFrom==0 ) pOut
a200: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 70  ->pScopyFrom = p
a210: 49 6e 31 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72  In1;.#endif.  br
a220: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
a230: 65 3a 20 49 6e 74 43 6f 70 79 20 50 31 20 50 32  e: IntCopy P1 P2
a240: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
a250: 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a  is: r[P2]=r[P1].
a260: 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 74  **.** Transfer t
a270: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
a280: 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65   held in registe
a290: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
a2a0: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
a2b0: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  s is an optimize
a2c0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 43 6f  d version of SCo
a2d0: 70 79 20 74 68 61 74 20 77 6f 72 6b 73 20 6f 6e  py that works on
a2e0: 6c 79 20 66 6f 72 20 69 6e 74 65 67 65 72 0a 2a  ly for integer.*
a2f0: 2a 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 63 61 73  * values..*/.cas
a300: 65 20 4f 50 5f 49 6e 74 43 6f 70 79 3a 20 7b 20  e OP_IntCopy: { 
a310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
a320: 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
a330: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
a340: 20 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e   assert( (pIn1->
a350: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
a360: 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  !=0 );.  pOut = 
a370: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
a380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a390: 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 70  SetInt64(pOut, p
a3a0: 49 6e 31 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65  In1->u.i);.  bre
a3b0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
a3c0: 3a 20 52 65 73 75 6c 74 52 6f 77 20 50 31 20 50  : ResultRow P1 P
a3d0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
a3e0: 73 69 73 3a 20 6f 75 74 70 75 74 3d 72 5b 50 31  sis: output=r[P1
a3f0: 40 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  @P2].**.** The r
a400: 65 67 69 73 74 65 72 73 20 50 31 20 74 68 72 6f  egisters P1 thro
a410: 75 67 68 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74  ugh P1+P2-1 cont
a420: 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ain a single row
a430: 20 6f 66 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20   of.** results. 
a440: 54 68 69 73 20 6f 70 63 6f 64 65 20 63 61 75 73  This opcode caus
a450: 65 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73  es the sqlite3_s
a460: 74 65 70 28 29 20 63 61 6c 6c 20 74 6f 20 74 65  tep() call to te
a470: 72 6d 69 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20  rminate.** with 
a480: 61 6e 20 53 51 4c 49 54 45 5f 52 4f 57 20 72 65  an SQLITE_ROW re
a490: 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 69 74  turn code and it
a4a0: 20 73 65 74 73 20 75 70 20 74 68 65 20 73 71 6c   sets up the sql
a4b0: 69 74 65 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72  ite3_stmt.** str
a4c0: 75 63 74 75 72 65 20 74 6f 20 70 72 6f 76 69 64  ucture to provid
a4d0: 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  e access to the 
a4e0: 72 28 50 31 29 2e 2e 72 28 50 31 2b 50 32 2d 31  r(P1)..r(P1+P2-1
a4f0: 29 20 76 61 6c 75 65 73 20 61 73 0a 2a 2a 20 74  ) values as.** t
a500: 68 65 20 72 65 73 75 6c 74 20 72 6f 77 2e 0a 2a  he result row..*
a510: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75 6c 74  /.case OP_Result
a520: 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d  Row: {.  Mem *pM
a530: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  em;.  int i;.  a
a540: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73 43 6f  ssert( p->nResCo
a550: 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29 3b  lumn==pOp->p2 );
a560: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a570: 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p1>0 );.  assert
a580: 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  ( pOp->p1+pOp->p
a590: 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  2<=(p->nMem+1 - 
a5a0: 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
a5b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a5c0: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
a5d0: 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 52 75 6e  ALLBACK.  /* Run
a5e0: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 6f   the progress co
a5f0: 75 6e 74 65 72 20 6a 75 73 74 20 62 65 66 6f 72  unter just befor
a600: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
a610: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f  /.  if( db->xPro
a620: 67 72 65 73 73 21 3d 30 0a 20 20 20 26 26 20 6e  gress!=0.   && n
a630: 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72 65 73  VmStep>=nProgres
a640: 73 4c 69 6d 69 74 0a 20 20 20 26 26 20 64 62 2d  sLimit.   && db-
a650: 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70  >xProgress(db->p
a660: 50 72 6f 67 72 65 73 73 41 72 67 29 21 3d 30 0a  ProgressArg)!=0.
a670: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
a680: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
a690: 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
a6a0: 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
a6b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
a6c0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
a6d0: 68 61 73 20 76 69 6f 6c 61 74 65 64 20 69 6d 6d  has violated imm
a6e0: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
a6f0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ey constraints, 
a700: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 74 75  do.  ** not retu
a710: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
a720: 20 72 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e 20   rows modified. 
a730: 41 6e 64 20 64 6f 20 6e 6f 74 20 52 45 4c 45 41  And do not RELEA
a740: 53 45 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  SE the statement
a750: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
a760: 6e 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  n. It needs to b
a770: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
a780: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
a790: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
a7a0: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
a7b0: 30 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  0)) ){.    asser
a7c0: 74 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  t( db->flags&SQL
a7d0: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b  ITE_CountRows );
a7e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a7f0: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
a800: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  );.    goto abor
a810: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
a820: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
a830: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
a840: 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  s flag is set in
a850: 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 6d   sqlite3.flags m
a860: 61 73 6b 2c 20 74 68 65 6e 20 0a 20 20 2a 2a 20  ask, then .  ** 
a870: 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  DML statements i
a880: 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64  nvoke this opcod
a890: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  e to return the 
a8a0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a  number of rows .
a8b0: 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f    ** modified to
a8c0: 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73 20   the user. This 
a8d0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
a8e0: 74 68 61 74 20 61 20 56 4d 20 74 68 61 74 0a 20  that a VM that. 
a8f0: 20 2a 2a 20 6f 70 65 6e 73 20 61 20 73 74 61 74   ** opens a stat
a900: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
a910: 6e 20 6d 61 79 20 69 6e 76 6f 6b 65 20 74 68 69  n may invoke thi
a920: 73 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20  s opcode..  **. 
a930: 20 2a 2a 20 49 6e 20 63 61 73 65 20 74 68 69 73   ** In case this
a940: 20 69 73 20 73 75 63 68 20 61 20 73 74 61 74 65   is such a state
a950: 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 79 20  ment, close any 
a960: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
a970: 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 65  ction.  ** opene
a980: 64 20 62 79 20 74 68 69 73 20 56 4d 20 62 65 66  d by this VM bef
a990: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 63 6f  ore returning co
a9a0: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 73 65  ntrol to the use
a9b0: 72 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20  r. This is to.  
a9c0: 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 73  ** ensure that s
a9d0: 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
a9e0: 74 69 6f 6e 73 20 61 72 65 20 61 6c 77 61 79 73  tions are always
a9f0: 20 6e 65 73 74 65 64 2c 20 6e 6f 74 20 6f 76 65   nested, not ove
aa00: 72 6c 61 70 70 69 6e 67 2e 0a 20 20 2a 2a 20 49  rlapping..  ** I
aa10: 66 20 74 68 65 20 6f 70 65 6e 20 73 74 61 74 65  f the open state
aa20: 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
aa30: 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 20 68   is not closed h
aa40: 65 72 65 2c 20 74 68 65 6e 20 74 68 65 20 75 73  ere, then the us
aa50: 65 72 0a 20 20 2a 2a 20 6d 61 79 20 73 74 65 70  er.  ** may step
aa60: 20 61 6e 6f 74 68 65 72 20 56 4d 20 74 68 61 74   another VM that
aa70: 20 6f 70 65 6e 73 20 69 74 73 20 6f 77 6e 20 73   opens its own s
aa80: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
aa90: 74 69 6f 6e 2e 20 54 68 69 73 0a 20 20 2a 2a 20  tion. This.  ** 
aaa0: 6d 61 79 20 6c 65 61 64 20 74 6f 20 6f 76 65 72  may lead to over
aab0: 6c 61 70 70 69 6e 67 20 73 74 61 74 65 6d 65 6e  lapping statemen
aac0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  t transactions..
aad0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74    **.  ** The st
aae0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
aaf0: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 61 20 74  ion is never a t
ab00: 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63  op-level transac
ab10: 74 69 6f 6e 2e 20 20 48 65 6e 63 65 0a 20 20 2a  tion.  Hence.  *
ab20: 2a 20 74 68 65 20 52 45 4c 45 41 53 45 20 63 61  * the RELEASE ca
ab30: 6c 6c 20 62 65 6c 6f 77 20 63 61 6e 20 6e 65 76  ll below can nev
ab40: 65 72 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20  er fail..  */.  
ab50: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
ab60: 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ement==0 || db->
ab70: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75  flags&SQLITE_Cou
ab80: 6e 74 52 6f 77 73 20 29 3b 0a 20 20 72 63 20 3d  ntRows );.  rc =
ab90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
aba0: 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 53 41  eStatement(p, SA
abb0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
abc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
abd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
abe0: 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c  /* Invalidate al
abf0: 6c 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  l ephemeral curs
ac00: 6f 72 20 72 6f 77 20 63 61 63 68 65 73 20 2a 2f  or row caches */
ac10: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
ac20: 20 28 70 2d 3e 63 61 63 68 65 43 74 72 20 2b 20   (p->cacheCtr + 
ac30: 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  2)|1;..  /* Make
ac40: 20 73 75 72 65 20 74 68 65 20 72 65 73 75 6c 74   sure the result
ac50: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
ac60: 20 72 6f 77 20 61 72 65 20 5c 30 30 30 20 74 65   row are \000 te
ac70: 72 6d 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61 6e  rminated.  ** an
ac80: 64 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e  d have an assign
ac90: 65 64 20 74 79 70 65 2e 20 20 54 68 65 20 72 65  ed type.  The re
aca0: 73 75 6c 74 73 20 61 72 65 20 64 65 2d 65 70 68  sults are de-eph
acb0: 65 6d 65 72 61 6c 69 7a 65 64 20 61 73 0a 20 20  emeralized as.  
acc0: 2a 2a 20 61 20 73 69 64 65 20 65 66 66 65 63 74  ** a side effect
acd0: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d 20  ..  */.  pMem = 
ace0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
acf0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
ad00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70    for(i=0; i<pOp
ad10: 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ->p2; i++){.    
ad20: 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
ad30: 69 64 28 26 70 4d 65 6d 5b 69 5d 29 20 29 3b 0a  id(&pMem[i]) );.
ad40: 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69      Deephemerali
ad50: 7a 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20  ze(&pMem[i]);.  
ad60: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 5b    assert( (pMem[
ad70: 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 45  i].flags & MEM_E
ad80: 70 68 65 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20  phem)==0.       
ad90: 20 20 20 20 20 7c 7c 20 28 70 4d 65 6d 5b 69 5d       || (pMem[i]
ada0: 2e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74  .flags & (MEM_St
adb0: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  r|MEM_Blob))==0 
adc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
add0: 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74  beMemNulTerminat
ade0: 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20  e(&pMem[i]);.   
adf0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
ae00: 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65 6d  pOp->p1+i, &pMem
ae10: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
ae20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ae30: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
ae40: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54 72 61 63  .  if( db->mTrac
ae50: 65 20 26 20 53 51 4c 49 54 45 5f 54 52 41 43 45  e & SQLITE_TRACE
ae60: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 64 62 2d 3e  _ROW ){.    db->
ae70: 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52  xTrace(SQLITE_TR
ae80: 41 43 45 5f 52 4f 57 2c 20 64 62 2d 3e 70 54 72  ACE_ROW, db->pTr
ae90: 61 63 65 41 72 67 2c 20 70 2c 20 30 29 3b 0a 20  aceArg, p, 0);. 
aea0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
aeb0: 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a  SQLITE_ROW.  */.
aec0: 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28    p->pc = (int)(
aed0: 70 4f 70 20 2d 20 61 4f 70 29 20 2b 20 31 3b 0a  pOp - aOp) + 1;.
aee0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
aef0: 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72  W;.  goto vdbe_r
af00: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  eturn;.}../* Opc
af10: 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50  ode: Concat P1 P
af20: 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
af30: 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32  psis: r[P3]=r[P2
af40: 5d 2b 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 41 64  ]+r[P1].**.** Ad
af50: 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72 65  d the text in re
af60: 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20 74  gister P1 onto t
af70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65  he end of the te
af80: 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65  xt in.** registe
af90: 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74  r P2 and store t
afa0: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
afb0: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
afc0: 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f 72  either the P1 or
afd0: 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55 4c   P2 text are NUL
afe0: 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55 4c  L then store NUL
aff0: 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 20  L in P3..**.**  
b000: 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a 2a   P3 = P2 || P1.*
b010: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
b020: 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50 33  al for P1 and P3
b030: 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20   to be the same 
b040: 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74 69  register. Someti
b050: 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69 73  mes,.** if P3 is
b060: 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
b070: 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69 6d  er as P2, the im
b080: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
b090: 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69 64  able.** to avoid
b0a0: 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f 0a   a memcpy()..*/.
b0b0: 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a 20  case OP_Concat: 
b0c0: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {           /* s
b0d0: 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41 54  ame as TK_CONCAT
b0e0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
b0f0: 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b   */.  i64 nByte;
b100: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
b110: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
b120: 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
b130: 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  2];.  pOut = &aM
b140: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
b150: 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f 75  ssert( pIn1!=pOu
b160: 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  t );.  if( (pIn1
b170: 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e  ->flags | pIn2->
b180: 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c  flags) & MEM_Nul
b190: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
b1a0: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
b1b0: 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  Out);.    break;
b1c0: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61 6e  .  }.  if( Expan
b1d0: 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20 45  dBlob(pIn1) || E
b1e0: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 20  xpandBlob(pIn2) 
b1f0: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
b200: 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c   Stringify(pIn1,
b210: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53 74   encoding);.  St
b220: 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65 6e  ringify(pIn2, en
b230: 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74 65  coding);.  nByte
b240: 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49 6e   = pIn1->n + pIn
b250: 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79 74  2->n;.  if( nByt
b260: 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  e>db->aLimit[SQL
b270: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
b280: 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ] ){.    goto to
b290: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 69 66 28  o_big;.  }.  if(
b2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
b2b0: 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e  row(pOut, (int)n
b2c0: 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d 70 49  Byte+2, pOut==pI
b2d0: 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  n2) ){.    goto 
b2e0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 4d 65  no_mem;.  }.  Me
b2f0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
b300: 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69  t, MEM_Str);.  i
b310: 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29 7b  f( pOut!=pIn2 ){
b320: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74  .    memcpy(pOut
b330: 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70 49  ->z, pIn2->z, pI
b340: 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d 65  n2->n);.  }.  me
b350: 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70 49  mcpy(&pOut->z[pI
b360: 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a 2c  n2->n], pIn1->z,
b370: 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f 75   pIn1->n);.  pOu
b380: 74 2d 3e 7a 5b 6e 42 79 74 65 5d 3d 30 3b 0a 20  t->z[nByte]=0;. 
b390: 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b 31   pOut->z[nByte+1
b3a0: 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 66  ] = 0;.  pOut->f
b3b0: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d  lags |= MEM_Term
b3c0: 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69  ;.  pOut->n = (i
b3d0: 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74  nt)nByte;.  pOut
b3e0: 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
b3f0: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
b400: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
b410: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
b420: 63 6f 64 65 3a 20 41 64 64 20 50 31 20 50 32 20  code: Add P1 P2 
b430: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
b440: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2b  is: r[P3]=r[P1]+
b450: 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 41 64 64 20  r[P2].**.** Add 
b460: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
b470: 69 73 74 65 72 20 50 31 20 74 6f 20 74 68 65 20  ister P1 to the 
b480: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
b490: 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  r P2.** and stor
b4a0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
b4b0: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
b4c0: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
b4d0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
b4e0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
b4f0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74 69  /* Opcode: Multi
b500: 70 6c 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ply P1 P2 P3 * *
b510: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
b520: 50 33 5d 3d 72 5b 50 31 5d 2a 72 5b 50 32 5d 0a  P3]=r[P1]*r[P2].
b530: 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 69 70 6c  **.**.** Multipl
b540: 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  y the value in r
b550: 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74 68  egister P1 by th
b560: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
b570: 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74  ter P2.** and st
b580: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
b590: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
b5a0: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
b5b0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
b5c0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
b5d0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 75 62  /./* Opcode: Sub
b5e0: 74 72 61 63 74 20 50 31 20 50 32 20 50 33 20 2a  tract P1 P2 P3 *
b5f0: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
b600: 72 5b 50 33 5d 3d 72 5b 50 32 5d 2d 72 5b 50 31  r[P3]=r[P2]-r[P1
b610: 5d 0a 2a 2a 0a 2a 2a 20 53 75 62 74 72 61 63 74  ].**.** Subtract
b620: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
b630: 67 69 73 74 65 72 20 50 31 20 66 72 6f 6d 20 74  gister P1 from t
b640: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
b650: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73  ster P2.** and s
b660: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
b670: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
b680: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
b690: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
b6a0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b6b0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 69  */./* Opcode: Di
b6c0: 76 69 64 65 20 50 31 20 50 32 20 50 33 20 2a 20  vide P1 P2 P3 * 
b6d0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
b6e0: 5b 50 33 5d 3d 72 5b 50 32 5d 2f 72 5b 50 31 5d  [P3]=r[P2]/r[P1]
b6f0: 0a 2a 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74 68  .**.** Divide th
b700: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
b710: 74 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61  ter P1 by the va
b720: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
b730: 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  P2.** and store 
b740: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
b750: 67 69 73 74 65 72 20 50 33 20 28 50 33 3d 50 32  gister P3 (P3=P2
b760: 2f 50 31 29 2e 20 49 66 20 74 68 65 20 76 61 6c  /P1). If the val
b770: 75 65 20 69 6e 20 0a 2a 2a 20 72 65 67 69 73 74  ue in .** regist
b780: 65 72 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74  er P1 is zero, t
b790: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
b7a0: 73 20 4e 55 4c 4c 2e 20 49 66 20 65 69 74 68 65  s NULL. If eithe
b7b0: 72 20 69 6e 70 75 74 20 69 73 20 0a 2a 2a 20 4e  r input is .** N
b7c0: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
b7d0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
b7e0: 70 63 6f 64 65 3a 20 52 65 6d 61 69 6e 64 65 72  pcode: Remainder
b7f0: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
b800: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
b810: 3d 72 5b 50 32 5d 25 72 5b 50 31 5d 0a 2a 2a 0a  =r[P2]%r[P1].**.
b820: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  ** Compute the r
b830: 65 6d 61 69 6e 64 65 72 20 61 66 74 65 72 20 69  emainder after i
b840: 6e 74 65 67 65 72 20 72 65 67 69 73 74 65 72 20  nteger register 
b850: 50 32 20 69 73 20 64 69 76 69 64 65 64 20 62 79  P2 is divided by
b860: 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31   .** register P1
b870: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
b880: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
b890: 72 20 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68 65  r P3. .** If the
b8a0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
b8b0: 65 72 20 50 31 20 69 73 20 7a 65 72 6f 20 74 68  er P1 is zero th
b8c0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b8d0: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  ..** If either o
b8e0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20  perand is NULL, 
b8f0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
b900: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  LL..*/.case OP_A
b910: 64 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  dd:             
b920: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
b930: 20 54 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20 69   TK_PLUS, in1, i
b940: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
b950: 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20   OP_Subtract:   
b960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
b970: 6d 65 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c 20  me as TK_MINUS, 
b980: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
b990: 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70  /.case OP_Multip
b9a0: 6c 79 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ly:             
b9b0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53   /* same as TK_S
b9c0: 54 41 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  TAR, in1, in2, o
b9d0: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  ut3 */.case OP_D
b9e0: 69 76 69 64 65 3a 20 20 20 20 20 20 20 20 20 20  ivide:          
b9f0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
ba00: 20 54 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c 20   TK_SLASH, in1, 
ba10: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
ba20: 65 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a 20  e OP_Remainder: 
ba30: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {           /* s
ba40: 61 6d 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20 69  ame as TK_REM, i
ba50: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
ba60: 0a 20 20 63 68 61 72 20 62 49 6e 74 69 6e 74 3b  .  char bIntint;
ba70: 20 20 20 2f 2a 20 53 74 61 72 74 65 64 20 6f 75     /* Started ou
ba80: 74 20 61 73 20 74 77 6f 20 69 6e 74 65 67 65 72  t as two integer
ba90: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 75   operands */.  u
baa0: 31 36 20 66 6c 61 67 73 3b 20 20 20 20 20 20 2f  16 flags;      /
bab0: 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45 4d 5f 2a  * Combined MEM_*
bac0: 20 66 6c 61 67 73 20 66 72 6f 6d 20 62 6f 74 68   flags from both
bad0: 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20 75 31 36   inputs */.  u16
bae0: 20 74 79 70 65 31 3b 20 20 20 20 20 20 2f 2a 20   type1;      /* 
baf0: 4e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20  Numeric type of 
bb00: 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  left operand */.
bb10: 20 20 75 31 36 20 74 79 70 65 32 3b 20 20 20 20    u16 type2;    
bb20: 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79 70    /* Numeric typ
bb30: 65 20 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61  e of right opera
bb40: 6e 64 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 20  nd */.  i64 iA; 
bb50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
bb60: 65 72 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74  er value of left
bb70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36   operand */.  i6
bb80: 34 20 69 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  4 iB;         /*
bb90: 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f   Integer value o
bba0: 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  f right operand 
bbb0: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 41 3b 20  */.  double rA; 
bbc0: 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76 61 6c       /* Real val
bbd0: 75 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61  ue of left opera
bbe0: 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  nd */.  double r
bbf0: 42 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20  B;      /* Real 
bc00: 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f  value of right o
bc10: 70 65 72 61 6e 64 20 2a 2f 0a 0a 20 20 70 49 6e  perand */..  pIn
bc20: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
bc30: 31 5d 3b 0a 20 20 74 79 70 65 31 20 3d 20 6e 75  1];.  type1 = nu
bc40: 6d 65 72 69 63 54 79 70 65 28 70 49 6e 31 29 3b  mericType(pIn1);
bc50: 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
bc60: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 74 79 70 65  pOp->p2];.  type
bc70: 32 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65 28  2 = numericType(
bc80: 70 49 6e 32 29 3b 0a 20 20 70 4f 75 74 20 3d 20  pIn2);.  pOut = 
bc90: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
bca0: 20 20 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d 3e    flags = pIn1->
bcb0: 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c  flags | pIn2->fl
bcc0: 61 67 73 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  ags;.  if( (flag
bcd0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30  s & MEM_Null)!=0
bce0: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
bcf0: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
bd00: 6c 3b 0a 20 20 69 66 28 20 28 74 79 70 65 31 20  l;.  if( (type1 
bd10: 26 20 74 79 70 65 32 20 26 20 4d 45 4d 5f 49 6e  & type2 & MEM_In
bd20: 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 41 20  t)!=0 ){.    iA 
bd30: 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 20  = pIn1->u.i;.   
bd40: 20 69 42 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b   iB = pIn2->u.i;
bd50: 0a 20 20 20 20 62 49 6e 74 69 6e 74 20 3d 20 31  .    bIntint = 1
bd60: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f  ;.    switch( pO
bd70: 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  p->opcode ){.   
bd80: 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20     case OP_Add: 
bd90: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
bda0: 33 41 64 64 49 6e 74 36 34 28 26 69 42 2c 69 41  3AddInt64(&iB,iA
bdb0: 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68  ) ) goto fp_math
bdc0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
bdd0: 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74  case OP_Subtract
bde0: 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 75  :  if( sqlite3Su
bdf0: 62 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29  bInt64(&iB,iA) )
be00: 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20   goto fp_math;  
be10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
be20: 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20  e OP_Multiply:  
be30: 69 66 28 20 73 71 6c 69 74 65 33 4d 75 6c 49 6e  if( sqlite3MulIn
be40: 74 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f  t64(&iB,iA) ) go
be50: 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65  to fp_math;  bre
be60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
be70: 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20  P_Divide: {.    
be80: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
be90: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
bea0: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
beb0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
bec0: 2d 31 20 26 26 20 69 42 3d 3d 53 4d 41 4c 4c 45  -1 && iB==SMALLE
bed0: 53 54 5f 49 4e 54 36 34 20 29 20 67 6f 74 6f 20  ST_INT64 ) goto 
bee0: 66 70 5f 6d 61 74 68 3b 0a 20 20 20 20 20 20 20  fp_math;.       
bef0: 20 69 42 20 2f 3d 20 69 41 3b 0a 20 20 20 20 20   iB /= iA;.     
bf00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bf10: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
bf20: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   {.        if( i
bf30: 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  A==0 ) goto arit
bf40: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
bf50: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  _null;.        i
bf60: 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d  f( iA==-1 ) iA =
bf70: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 42 20 25   1;.        iB %
bf80: 3d 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72  = iA;.        br
bf90: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
bfa0: 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69   }.    pOut->u.i
bfb0: 20 3d 20 69 42 3b 0a 20 20 20 20 4d 65 6d 53 65   = iB;.    MemSe
bfc0: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
bfd0: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c 73  MEM_Int);.  }els
bfe0: 65 7b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20 3d  e{.    bIntint =
bff0: 20 30 3b 0a 66 70 5f 6d 61 74 68 3a 0a 20 20 20   0;.fp_math:.   
c000: 20 72 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rA = sqlite3Vdb
c010: 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31 29  eRealValue(pIn1)
c020: 3b 0a 20 20 20 20 72 42 20 3d 20 73 71 6c 69 74  ;.    rB = sqlit
c030: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
c040: 70 49 6e 32 29 3b 0a 20 20 20 20 73 77 69 74 63  pIn2);.    switc
c050: 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
c060: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
c070: 41 64 64 3a 20 20 20 20 20 20 20 20 20 72 42 20  Add:         rB 
c080: 2b 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72 65  += rA;       bre
c090: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
c0a0: 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20 72  P_Subtract:    r
c0b0: 42 20 2d 3d 20 72 41 3b 20 20 20 20 20 20 20 62  B -= rA;       b
c0c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c0d0: 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20   OP_Multiply:   
c0e0: 20 72 42 20 2a 3d 20 72 41 3b 20 20 20 20 20 20   rB *= rA;      
c0f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c100: 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a  se OP_Divide: {.
c110: 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62          /* (doub
c120: 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
c130: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
c140: 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
c150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 41 3d  .        if( rA=
c160: 3d 28 64 6f 75 62 6c 65 29 30 20 29 20 67 6f 74  =(double)0 ) got
c170: 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  o arithmetic_res
c180: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20  ult_is_null;.   
c190: 20 20 20 20 20 72 42 20 2f 3d 20 72 41 3b 0a 20       rB /= rA;. 
c1a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c1b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
c1c0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ult: {.        i
c1d0: 41 20 3d 20 28 69 36 34 29 72 41 3b 0a 20 20 20  A = (i64)rA;.   
c1e0: 20 20 20 20 20 69 42 20 3d 20 28 69 36 34 29 72       iB = (i64)r
c1f0: 42 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  B;.        if( i
c200: 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  A==0 ) goto arit
c210: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
c220: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  _null;.        i
c230: 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d  f( iA==-1 ) iA =
c240: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 42 20 3d   1;.        rB =
c250: 20 28 64 6f 75 62 6c 65 29 28 69 42 20 25 20 69   (double)(iB % i
c260: 41 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  A);.        brea
c270: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c280: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
c290: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
c2a0: 4e 54 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  NT.    pOut->u.i
c2b0: 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65   = rB;.    MemSe
c2c0: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
c2d0: 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65 6c 73 65 0a  MEM_Int);.#else.
c2e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
c2f0: 73 4e 61 4e 28 72 42 29 20 29 7b 0a 20 20 20 20  sNaN(rB) ){.    
c300: 20 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69    goto arithmeti
c310: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
c320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  ;.    }.    pOut
c330: 2d 3e 75 2e 72 20 3d 20 72 42 3b 0a 20 20 20 20  ->u.r = rB;.    
c340: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
c350: 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a  Out, MEM_Real);.
c360: 20 20 20 20 69 66 28 20 28 28 74 79 70 65 31 7c      if( ((type1|
c370: 74 79 70 65 32 29 26 4d 45 4d 5f 52 65 61 6c 29  type2)&MEM_Real)
c380: 3d 3d 30 20 26 26 20 21 62 49 6e 74 69 6e 74 20  ==0 && !bIntint 
c390: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c3a0: 56 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e  VdbeIntegerAffin
c3b0: 69 74 79 28 70 4f 75 74 29 3b 0a 20 20 20 20 7d  ity(pOut);.    }
c3c0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72  .#endif.  }.  br
c3d0: 65 61 6b 3b 0a 0a 61 72 69 74 68 6d 65 74 69 63  eak;..arithmetic
c3e0: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a  _result_is_null:
c3f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
c400: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
c410: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
c420: 70 63 6f 64 65 3a 20 43 6f 6c 6c 53 65 71 20 50  pcode: CollSeq P
c430: 31 20 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50  1 * * P4.**.** P
c440: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
c450: 6f 20 61 20 43 6f 6c 6c 53 65 71 20 73 74 72 75  o a CollSeq stru
c460: 63 74 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  ct. If the next 
c470: 63 61 6c 6c 20 74 6f 20 61 20 75 73 65 72 20 66  call to a user f
c480: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67  unction.** or ag
c490: 67 72 65 67 61 74 65 20 63 61 6c 6c 73 20 73 71  gregate calls sq
c4a0: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
c4b0: 53 65 71 28 29 2c 20 74 68 69 73 20 63 6f 6c 6c  Seq(), this coll
c4c0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
c4d0: 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e  ill.** be return
c4e0: 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ed. This is used
c4f0: 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   by the built-in
c500: 20 6d 69 6e 28 29 2c 20 6d 61 78 28 29 20 61 6e   min(), max() an
c510: 64 20 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20 66 75  d nullif().** fu
c520: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  nctions..**.** I
c530: 66 20 50 31 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f P1 is not zero
c540: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72  , then it is a r
c550: 65 67 69 73 74 65 72 20 74 68 61 74 20 61 20 73  egister that a s
c560: 75 62 73 65 71 75 65 6e 74 20 6d 69 6e 28 29 20  ubsequent min() 
c570: 6f 72 0a 2a 2a 20 6d 61 78 28 29 20 61 67 67 72  or.** max() aggr
c580: 65 67 61 74 65 20 77 69 6c 6c 20 73 65 74 20 74  egate will set t
c590: 6f 20 31 20 69 66 20 74 68 65 20 63 75 72 72 65  o 1 if the curre
c5a0: 6e 74 20 72 6f 77 20 69 73 20 6e 6f 74 20 74 68  nt row is not th
c5b0: 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 0a 2a 2a 20  e minimum or.** 
c5c0: 6d 61 78 69 6d 75 6d 2e 20 20 54 68 65 20 50 31  maximum.  The P1
c5d0: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
c5e0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 20 62 79  tialized to 0 by
c5f0: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
c600: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  n..**.** The int
c610: 65 72 66 61 63 65 20 75 73 65 64 20 62 79 20 74  erface used by t
c620: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
c630: 6e 20 6f 66 20 74 68 65 20 61 66 6f 72 65 6d 65  n of the aforeme
c640: 6e 74 69 6f 6e 65 64 20 66 75 6e 63 74 69 6f 6e  ntioned function
c650: 73 0a 2a 2a 20 74 6f 20 72 65 74 72 69 65 76 65  s.** to retrieve
c660: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
c670: 65 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74  equence set by t
c680: 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f  his opcode is no
c690: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 70  t available.** p
c6a0: 75 62 6c 69 63 6c 79 2e 20 20 4f 6e 6c 79 20 62  ublicly.  Only b
c6b0: 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
c6c0: 73 20 68 61 76 65 20 61 63 63 65 73 73 20 74 6f  s have access to
c6d0: 20 74 68 69 73 20 66 65 61 74 75 72 65 2e 0a 2a   this feature..*
c6e0: 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 6c 53 65  /.case OP_CollSe
c6f0: 71 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  q: {.  assert( p
c700: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43  Op->p4type==P4_C
c710: 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 69 66 28 20  OLLSEQ );.  if( 
c720: 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73  pOp->p1 ){.    s
c730: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
c740: 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d  Int64(&aMem[pOp-
c750: 3e 70 31 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  >p1], 0);.  }.  
c760: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
c770: 6f 64 65 3a 20 46 75 6e 63 74 69 6f 6e 30 20 50  ode: Function0 P
c780: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
c790: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
c7a0: 3d 66 75 6e 63 28 72 5b 50 32 40 50 35 5d 29 0a  =func(r[P2@P5]).
c7b0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75  **.** Invoke a u
c7c0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50 34  ser function (P4
c7d0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c7e0: 20 61 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63   a FuncDef objec
c7f0: 74 20 74 68 61 74 0a 2a 2a 20 64 65 66 69 6e 65  t that.** define
c800: 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 29 20  s the function) 
c810: 77 69 74 68 20 50 35 20 61 72 67 75 6d 65 6e 74  with P5 argument
c820: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67  s taken from reg
c830: 69 73 74 65 72 20 50 32 20 61 6e 64 0a 2a 2a 20  ister P2 and.** 
c840: 73 75 63 63 65 73 73 6f 72 73 2e 20 20 54 68 65  successors.  The
c850: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66   result of the f
c860: 75 6e 63 74 69 6f 6e 20 69 73 20 73 74 6f 72 65  unction is store
c870: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
c880: 2e 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33  ..** Register P3
c890: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 6e 65   must not be one
c8a0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
c8b0: 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50   inputs..**.** P
c8c0: 31 20 69 73 20 61 20 33 32 2d 62 69 74 20 62 69  1 is a 32-bit bi
c8d0: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
c8e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
c8f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 74 6f  each argument to
c900: 20 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   the .** functio
c910: 6e 20 77 61 73 20 64 65 74 65 72 6d 69 6e 65 64  n was determined
c920: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
c930: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e  at compile time.
c940: 20 49 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   If the first.**
c950: 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 63 6f   argument was co
c960: 6e 73 74 61 6e 74 20 74 68 65 6e 20 62 69 74 20  nstant then bit 
c970: 30 20 6f 66 20 50 31 20 69 73 20 73 65 74 2e 20  0 of P1 is set. 
c980: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
c990: 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65  determine.** whe
c9a0: 74 68 65 72 20 6d 65 74 61 20 64 61 74 61 20 61  ther meta data a
c9b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
c9c0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 61   user function a
c9d0: 72 67 75 6d 65 6e 74 20 75 73 69 6e 67 20 74 68  rgument using th
c9e0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65 74  e.** sqlite3_set
c9f0: 5f 61 75 78 64 61 74 61 28 29 20 41 50 49 20 6d  _auxdata() API m
ca00: 61 79 20 62 65 20 73 61 66 65 6c 79 20 72 65 74  ay be safely ret
ca10: 61 69 6e 65 64 20 75 6e 74 69 6c 20 74 68 65 20  ained until the 
ca20: 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  next.** invocati
ca30: 6f 6e 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64  on of this opcod
ca40: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
ca50: 6f 3a 20 46 75 6e 63 74 69 6f 6e 2c 20 41 67 67  o: Function, Agg
ca60: 53 74 65 70 2c 20 41 67 67 46 69 6e 61 6c 0a 2a  Step, AggFinal.*
ca70: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6e  /./* Opcode: Fun
ca80: 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20 50  ction P1 P2 P3 P
ca90: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
caa0: 3a 20 72 5b 50 33 5d 3d 66 75 6e 63 28 72 5b 50  : r[P3]=func(r[P
cab0: 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 49 6e 76  2@P5]).**.** Inv
cac0: 6f 6b 65 20 61 20 75 73 65 72 20 66 75 6e 63 74  oke a user funct
cad0: 69 6f 6e 20 28 50 34 20 69 73 20 61 20 70 6f 69  ion (P4 is a poi
cae0: 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
caf0: 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63  e3_context objec
cb00: 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69  t that.** contai
cb10: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
cb20: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  the function to 
cb30: 62 65 20 72 75 6e 29 20 77 69 74 68 20 50 35 20  be run) with P5 
cb40: 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e 0a  arguments taken.
cb50: 2a 2a 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  ** from register
cb60: 20 50 32 20 61 6e 64 20 73 75 63 63 65 73 73 6f   P2 and successo
cb70: 72 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  rs.  The result 
cb80: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
cb90: 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
cba0: 72 65 67 69 73 74 65 72 20 50 33 2e 20 20 52 65  register P3.  Re
cbb0: 67 69 73 74 65 72 20 50 33 20 6d 75 73 74 20 6e  gister P3 must n
cbc0: 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ot be one of the
cbd0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73   function inputs
cbe0: 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  ..**.** P1 is a 
cbf0: 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69  32-bit bitmask i
cc00: 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65  ndicating whethe
cc10: 72 20 6f 72 20 6e 6f 74 20 65 61 63 68 20 61 72  r or not each ar
cc20: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a  gument to the .*
cc30: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 64  * function was d
cc40: 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20  etermined to be 
cc50: 63 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70  constant at comp
cc60: 69 6c 65 20 74 69 6d 65 2e 20 49 66 20 74 68 65  ile time. If the
cc70: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
cc80: 6e 74 20 77 61 73 20 63 6f 6e 73 74 61 6e 74 20  nt was constant 
cc90: 74 68 65 6e 20 62 69 74 20 30 20 6f 66 20 50 31  then bit 0 of P1
cca0: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73   is set. This is
ccb0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
ccc0: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d 65  ne.** whether me
ccd0: 74 61 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta data associat
cce0: 65 64 20 77 69 74 68 20 61 20 75 73 65 72 20 66  ed with a user f
ccf0: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
cd00: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
cd10: 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74  lite3_set_auxdat
cd20: 61 28 29 20 41 50 49 20 6d 61 79 20 62 65 20 73  a() API may be s
cd30: 61 66 65 6c 79 20 72 65 74 61 69 6e 65 64 20 75  afely retained u
cd40: 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a  ntil the next.**
cd50: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
cd60: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  his opcode..**.*
cd70: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  * SQL functions 
cd80: 61 72 65 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f  are initially co
cd90: 64 65 64 20 61 73 20 4f 50 5f 46 75 6e 63 74 69  ded as OP_Functi
cda0: 6f 6e 30 20 77 69 74 68 20 50 34 20 70 6f 69 6e  on0 with P4 poin
cdb0: 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 46 75 6e  ting.** to a Fun
cdc0: 63 44 65 66 20 6f 62 6a 65 63 74 2e 20 20 42 75  cDef object.  Bu
cdd0: 74 20 6f 6e 20 66 69 72 73 74 20 65 76 61 6c 75  t on first evalu
cde0: 61 74 69 6f 6e 2c 20 74 68 65 20 50 34 20 6f 70  ation, the P4 op
cdf0: 65 72 61 6e 64 20 69 73 0a 2a 2a 20 61 75 74 6f  erand is.** auto
ce00: 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 76 65 72  matically conver
ce10: 74 65 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69  ted into an sqli
ce20: 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65  te3_context obje
ce30: 63 74 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61  ct and the opera
ce40: 74 69 6f 6e 0a 2a 2a 20 63 68 61 6e 67 65 64 20  tion.** changed 
ce50: 74 6f 20 74 68 69 73 20 4f 50 5f 46 75 6e 63 74  to this OP_Funct
ce60: 69 6f 6e 20 6f 70 63 6f 64 65 2e 20 20 49 6e 20  ion opcode.  In 
ce70: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 69 6e  this way, the in
ce80: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 0a  itialization of.
ce90: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ** the sqlite3_c
cea0: 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 6f 63  ontext object oc
ceb0: 63 75 72 73 20 6f 6e 6c 79 20 6f 6e 63 65 2c 20  curs only once, 
cec0: 72 61 74 68 65 72 20 74 68 61 6e 20 6f 6e 63 65  rather than once
ced0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 65 76 61   for each.** eva
cee0: 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  luation of the f
cef0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
cf00: 65 65 20 61 6c 73 6f 3a 20 46 75 6e 63 74 69 6f  ee also: Functio
cf10: 6e 30 2c 20 41 67 67 53 74 65 70 2c 20 41 67 67  n0, AggStep, Agg
cf20: 46 69 6e 61 6c 0a 2a 2f 0a 63 61 73 65 20 4f 50  Final.*/.case OP
cf30: 5f 46 75 6e 63 74 69 6f 6e 30 3a 20 7b 0a 20 20  _Function0: {.  
cf40: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
cf50: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  _context *pCtx;.
cf60: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
cf70: 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44  p4type==P4_FUNCD
cf80: 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f 70 2d  EF );.  n = pOp-
cf90: 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p5;.  assert( p
cfa0: 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
cfb0: 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
cfc0: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
cfd0: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30 20  .  assert( n==0 
cfe0: 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26  || (pOp->p2>0 &&
cff0: 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d 3e   pOp->p2+n<=(p->
d000: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
d010: 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61 73 73  sor)+1) );.  ass
d020: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70  ert( pOp->p3<pOp
d030: 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e  ->p2 || pOp->p3>
d040: 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20  =pOp->p2+n );.  
d050: 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44 62  pCtx = sqlite3Db
d060: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
d070: 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 2b 20  sizeof(*pCtx) + 
d080: 28 6e 2d 31 29 2a 73 69 7a 65 6f 66 28 73 71 6c  (n-1)*sizeof(sql
d090: 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 3b 0a 20  ite3_value*));. 
d0a0: 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 20 67   if( pCtx==0 ) g
d0b0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
d0c0: 74 78 2d 3e 70 4f 75 74 20 3d 20 30 3b 0a 20 20  tx->pOut = 0;.  
d0d0: 70 43 74 78 2d 3e 70 46 75 6e 63 20 3d 20 70 4f  pCtx->pFunc = pO
d0e0: 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 70  p->p4.pFunc;.  p
d0f0: 43 74 78 2d 3e 69 4f 70 20 3d 20 28 69 6e 74 29  Ctx->iOp = (int)
d100: 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 70  (pOp - aOp);.  p
d110: 43 74 78 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a  Ctx->pVdbe = p;.
d120: 20 20 70 43 74 78 2d 3e 61 72 67 63 20 3d 20 6e    pCtx->argc = n
d130: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
d140: 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b 0a 20 20  = P4_FUNCCTX;.  
d150: 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20 3d 20 70  pOp->p4.pCtx = p
d160: 43 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  Ctx;.  pOp->opco
d170: 64 65 20 3d 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  de = OP_Function
d180: 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f  ;.  /* Fall thro
d190: 75 67 68 20 69 6e 74 6f 20 4f 50 5f 46 75 6e 63  ugh into OP_Func
d1a0: 74 69 6f 6e 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f  tion */.}.case O
d1b0: 50 5f 46 75 6e 63 74 69 6f 6e 3a 20 7b 0a 20 20  P_Function: {.  
d1c0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
d1d0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  _context *pCtx;.
d1e0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
d1f0: 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 43  p4type==P4_FUNCC
d200: 54 58 20 29 3b 0a 20 20 70 43 74 78 20 3d 20 70  TX );.  pCtx = p
d210: 4f 70 2d 3e 70 34 2e 70 43 74 78 3b 0a 0a 20 20  Op->p4.pCtx;..  
d220: 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  /* If this funct
d230: 69 6f 6e 20 69 73 20 69 6e 73 69 64 65 20 6f 66  ion is inside of
d240: 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 20   a trigger, the 
d250: 72 65 67 69 73 74 65 72 20 61 72 72 61 79 20 69  register array i
d260: 6e 20 61 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69  n aMem[].  ** mi
d270: 67 68 74 20 63 68 61 6e 67 65 20 66 72 6f 6d 20  ght change from 
d280: 6f 6e 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 74  one evaluation t
d290: 6f 20 74 68 65 20 6e 65 78 74 2e 20 20 54 68 65  o the next.  The
d2a0: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63   next block of c
d2b0: 6f 64 65 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20  ode.  ** checks 
d2c0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
d2d0: 67 69 73 74 65 72 20 61 72 72 61 79 20 68 61 73  gister array has
d2e0: 20 63 68 61 6e 67 65 64 2c 20 61 6e 64 20 69 66   changed, and if
d2f0: 20 73 6f 20 69 74 0a 20 20 2a 2a 20 72 65 69 6e   so it.  ** rein
d300: 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 72 65  itializes the re
d310: 6c 61 76 61 6e 74 20 70 61 72 74 73 20 6f 66 20  lavant parts of 
d320: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  the sqlite3_cont
d330: 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ext object */.  
d340: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
d350: 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 70 43 74  ->p3];.  if( pCt
d360: 78 2d 3e 70 4f 75 74 20 21 3d 20 70 4f 75 74 20  x->pOut != pOut 
d370: 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 75  ){.    pCtx->pOu
d380: 74 20 3d 20 70 4f 75 74 3b 0a 20 20 20 20 66 6f  t = pOut;.    fo
d390: 72 28 69 3d 70 43 74 78 2d 3e 61 72 67 63 2d 31  r(i=pCtx->argc-1
d3a0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 70 43 74  ; i>=0; i--) pCt
d3b0: 78 2d 3e 61 72 67 76 5b 69 5d 20 3d 20 26 61 4d  x->argv[i] = &aM
d3c0: 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69 5d 3b 0a 20  em[pOp->p2+i];. 
d3d0: 20 7d 0a 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f   }..  memAboutTo
d3e0: 43 68 61 6e 67 65 28 70 2c 20 70 43 74 78 2d 3e  Change(p, pCtx->
d3f0: 70 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51  pOut);.#ifdef SQ
d400: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
d410: 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d 3e 61 72  (i=0; i<pCtx->ar
d420: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  gc; i++){.    as
d430: 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
d440: 28 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 20  (pCtx->argv[i]) 
d450: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
d460: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 69 2c  TRACE(pOp->p2+i,
d470: 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 3b   pCtx->argv[i]);
d480: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4d 65  .  }.#endif.  Me
d490: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 43 74  mSetTypeFlag(pCt
d4a0: 78 2d 3e 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c  x->pOut, MEM_Nul
d4b0: 6c 29 3b 0a 20 20 70 43 74 78 2d 3e 66 45 72 72  l);.  pCtx->fErr
d4c0: 6f 72 4f 72 41 75 78 20 3d 20 30 3b 0a 20 20 28  orOrAux = 0;.  (
d4d0: 2a 70 43 74 78 2d 3e 70 46 75 6e 63 2d 3e 78 53  *pCtx->pFunc->xS
d4e0: 46 75 6e 63 29 28 70 43 74 78 2c 20 70 43 74 78  Func)(pCtx, pCtx
d4f0: 2d 3e 61 72 67 63 2c 20 70 43 74 78 2d 3e 61 72  ->argc, pCtx->ar
d500: 67 76 29 3b 2f 2a 20 49 4d 50 3a 20 52 2d 32 34  gv);/* IMP: R-24
d510: 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a 0a 20 20  505-23230 */..  
d520: 2f 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  /* If the functi
d530: 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
d540: 72 72 6f 72 2c 20 74 68 72 6f 77 20 61 6e 20 65  rror, throw an e
d550: 78 63 65 70 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  xception */.  if
d560: 28 20 70 43 74 78 2d 3e 66 45 72 72 6f 72 4f 72  ( pCtx->fErrorOr
d570: 41 75 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Aux ){.    if( p
d580: 43 74 78 2d 3e 69 73 45 72 72 6f 72 20 29 7b 0a  Ctx->isError ){.
d590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d5a0: 65 45 72 72 6f 72 28 70 2c 20 22 25 73 22 2c 20  eError(p, "%s", 
d5b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
d5c0: 78 74 28 70 43 74 78 2d 3e 70 4f 75 74 29 29 3b  xt(pCtx->pOut));
d5d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78  .      rc = pCtx
d5e0: 2d 3e 69 73 45 72 72 6f 72 3b 0a 20 20 20 20 7d  ->isError;.    }
d5f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d600: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 64 62  DeleteAuxData(db
d610: 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &p->pAuxData, 
d620: 70 43 74 78 2d 3e 69 4f 70 2c 20 70 4f 70 2d 3e  pCtx->iOp, pOp->
d630: 70 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  p1);.    if( rc 
d640: 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
d650: 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a  _to_error;.  }..
d660: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 65    /* Copy the re
d670: 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63  sult of the func
d680: 74 69 6f 6e 20 69 6e 74 6f 20 72 65 67 69 73 74  tion into regist
d690: 65 72 20 50 33 20 2a 2f 0a 20 20 69 66 28 20 70  er P3 */.  if( p
d6a0: 4f 75 74 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  Out->flags & (ME
d6b0: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
d6c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
d6d0: 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
d6e0: 28 70 43 74 78 2d 3e 70 4f 75 74 2c 20 65 6e 63  (pCtx->pOut, enc
d6f0: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  oding);.    if( 
d700: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f  sqlite3VdbeMemTo
d710: 6f 42 69 67 28 70 43 74 78 2d 3e 70 4f 75 74 29  oBig(pCtx->pOut)
d720: 20 29 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b   ) goto too_big;
d730: 0a 20 20 7d 0a 0a 20 20 52 45 47 49 53 54 45 52  .  }..  REGISTER
d740: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
d750: 70 43 74 78 2d 3e 70 4f 75 74 29 3b 0a 20 20 55  pCtx->pOut);.  U
d760: 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
d770: 5a 45 28 70 43 74 78 2d 3e 70 4f 75 74 29 3b 0a  ZE(pCtx->pOut);.
d780: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
d790: 70 63 6f 64 65 3a 20 42 69 74 41 6e 64 20 50 31  pcode: BitAnd P1
d7a0: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
d7b0: 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b  nopsis: r[P3]=r[
d7c0: 50 31 5d 26 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20  P1]&r[P2].**.** 
d7d0: 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73  Take the bit-wis
d7e0: 65 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c  e AND of the val
d7f0: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
d800: 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a  P1 and P2 and.**
d810: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
d820: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
d830: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
d840: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
d850: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
d860: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
d870: 42 69 74 4f 72 20 50 31 20 50 32 20 50 33 20 2a  BitOr P1 P2 P3 *
d880: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
d890: 72 5b 50 33 5d 3d 72 5b 50 31 5d 7c 72 5b 50 32  r[P3]=r[P1]|r[P2
d8a0: 5d 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65  ].**.** Take the
d8b0: 20 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66 20   bit-wise OR of 
d8c0: 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65  the values in re
d8d0: 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32  gister P1 and P2
d8e0: 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68   and.** store th
d8f0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
d900: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
d910: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
d920: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
d930: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
d940: 70 63 6f 64 65 3a 20 53 68 69 66 74 4c 65 66 74  pcode: ShiftLeft
d950: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
d960: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
d970: 3d 72 5b 50 32 5d 3c 3c 72 5b 50 31 5d 0a 2a 2a  =r[P2]<<r[P1].**
d980: 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e  .** Shift the in
d990: 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72  teger value in r
d9a0: 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 74 68  egister P2 to th
d9b0: 65 20 6c 65 66 74 20 62 79 20 74 68 65 0a 2a 2a  e left by the.**
d9c0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
d9d0: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
d9e0: 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69   integer in regi
d9f0: 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72  ster P1..** Stor
da00: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
da10: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
da20: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
da30: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
da40: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
da50: 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74  /* Opcode: Shift
da60: 52 69 67 68 74 20 50 31 20 50 32 20 50 33 20 2a  Right P1 P2 P3 *
da70: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
da80: 72 5b 50 33 5d 3d 72 5b 50 32 5d 3e 3e 72 5b 50  r[P3]=r[P2]>>r[P
da90: 31 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74  1].**.** Shift t
daa0: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
dab0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20   in register P2 
dac0: 74 6f 20 74 68 65 20 72 69 67 68 74 20 62 79 20  to the right by 
dad0: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
dae0: 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64 20   bits specified 
daf0: 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 69  by the integer i
db00: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
db10: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
db20: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
db30: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
db40: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
db50: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
db60: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69  L..*/.case OP_Bi
db70: 74 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20  tAnd:           
db80: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
db90: 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e 31 2c   TK_BITAND, in1,
dba0: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
dbb0: 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20 20  se OP_BitOr:    
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbd0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4f   same as TK_BITO
dbe0: 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  R, in1, in2, out
dbf0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69  3 */.case OP_Shi
dc00: 66 74 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20  ftLeft:         
dc10: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
dc20: 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31 2c 20  TK_LSHIFT, in1, 
dc30: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
dc40: 65 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3a  e OP_ShiftRight:
dc50: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
dc60: 73 61 6d 65 20 61 73 20 54 4b 5f 52 53 48 49 46  same as TK_RSHIF
dc70: 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  T, in1, in2, out
dc80: 33 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 0a 20  3 */.  i64 iA;. 
dc90: 20 75 36 34 20 75 41 3b 0a 20 20 69 36 34 20 69   u64 uA;.  i64 i
dca0: 42 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20 20 70  B;.  u8 op;..  p
dcb0: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
dcc0: 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26  >p1];.  pIn2 = &
dcd0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
dce0: 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
dcf0: 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28 70  p->p3];.  if( (p
dd00: 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e  In1->flags | pIn
dd10: 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f  2->flags) & MEM_
dd20: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  Null ){.    sqli
dd30: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
dd40: 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65  l(pOut);.    bre
dd50: 61 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d 20 73  ak;.  }.  iA = s
dd60: 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
dd70: 75 65 28 70 49 6e 32 29 3b 0a 20 20 69 42 20 3d  ue(pIn2);.  iB =
dd80: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
dd90: 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 6f 70  alue(pIn1);.  op
dda0: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
ddb0: 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 74    if( op==OP_Bit
ddc0: 41 6e 64 20 29 7b 0a 20 20 20 20 69 41 20 26 3d  And ){.    iA &=
ddd0: 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   iB;.  }else if(
dde0: 20 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 7b   op==OP_BitOr ){
ddf0: 0a 20 20 20 20 69 41 20 7c 3d 20 69 42 3b 0a 20  .    iA |= iB;. 
de00: 20 7d 65 6c 73 65 20 69 66 28 20 69 42 21 3d 30   }else if( iB!=0
de10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
de20: 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  op==OP_ShiftRigh
de30: 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66  t || op==OP_Shif
de40: 74 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  tLeft );..    /*
de50: 20 49 66 20 73 68 69 66 74 69 6e 67 20 62 79 20   If shifting by 
de60: 61 20 6e 65 67 61 74 69 76 65 20 61 6d 6f 75 6e  a negative amoun
de70: 74 2c 20 73 68 69 66 74 20 69 6e 20 74 68 65 20  t, shift in the 
de80: 6f 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 20  other direction 
de90: 2a 2f 0a 20 20 20 20 69 66 28 20 69 42 3c 30 20  */.    if( iB<0 
dea0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
deb0: 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3d 3d   OP_ShiftRight==
dec0: 4f 50 5f 53 68 69 66 74 4c 65 66 74 2b 31 20 29  OP_ShiftLeft+1 )
ded0: 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 32 2a 4f  ;.      op = 2*O
dee0: 50 5f 53 68 69 66 74 4c 65 66 74 20 2b 20 31 20  P_ShiftLeft + 1 
def0: 2d 20 6f 70 3b 0a 20 20 20 20 20 20 69 42 20 3d  - op;.      iB =
df00: 20 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69 42 20   iB>(-64) ? -iB 
df10: 3a 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  : 64;.    }..   
df20: 20 69 66 28 20 69 42 3e 3d 36 34 20 29 7b 0a 20   if( iB>=64 ){. 
df30: 20 20 20 20 20 69 41 20 3d 20 28 69 41 3e 3d 30       iA = (iA>=0
df40: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74   || op==OP_Shift
df50: 4c 65 66 74 29 20 3f 20 30 20 3a 20 2d 31 3b 0a  Left) ? 0 : -1;.
df60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
df70: 20 6d 65 6d 63 70 79 28 26 75 41 2c 20 26 69 41   memcpy(&uA, &iA
df80: 2c 20 73 69 7a 65 6f 66 28 75 41 29 29 3b 0a 20  , sizeof(uA));. 
df90: 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f       if( op==OP_
dfa0: 53 68 69 66 74 4c 65 66 74 20 29 7b 0a 20 20 20  ShiftLeft ){.   
dfb0: 20 20 20 20 20 75 41 20 3c 3c 3d 20 69 42 3b 0a       uA <<= iB;.
dfc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dfd0: 20 20 20 20 20 75 41 20 3e 3e 3d 20 69 42 3b 0a       uA >>= iB;.
dfe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 67 6e 2d          /* Sign-
dff0: 65 78 74 65 6e 64 20 6f 6e 20 61 20 72 69 67 68  extend on a righ
e000: 74 20 73 68 69 66 74 20 6f 66 20 61 20 6e 65 67  t shift of a neg
e010: 61 74 69 76 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  ative number */.
e020: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3c 30          if( iA<0
e030: 20 29 20 75 41 20 7c 3d 20 28 28 28 28 75 36 34   ) uA |= ((((u64
e040: 29 30 78 66 66 66 66 66 66 66 66 29 3c 3c 33 32  )0xffffffff)<<32
e050: 29 7c 30 78 66 66 66 66 66 66 66 66 29 20 3c 3c  )|0xffffffff) <<
e060: 20 28 36 34 2d 69 42 29 3b 0a 20 20 20 20 20 20   (64-iB);.      
e070: 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  }.      memcpy(&
e080: 69 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f 66 28  iA, &uA, sizeof(
e090: 69 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iA));.    }.  }.
e0a0: 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 41    pOut->u.i = iA
e0b0: 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
e0c0: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
e0d0: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
e0e0: 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 49 6d 6d  * Opcode: AddImm
e0f0: 20 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a    P1 P2 * * *.**
e100: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d   Synopsis: r[P1]
e110: 3d 72 5b 50 31 5d 2b 50 32 0a 2a 2a 20 0a 2a 2a  =r[P1]+P2.** .**
e120: 20 41 64 64 20 74 68 65 20 63 6f 6e 73 74 61 6e   Add the constan
e130: 74 20 50 32 20 74 6f 20 74 68 65 20 76 61 6c 75  t P2 to the valu
e140: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
e150: 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  ..** The result 
e160: 69 73 20 61 6c 77 61 79 73 20 61 6e 20 69 6e 74  is always an int
e170: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66  eger..**.** To f
e180: 6f 72 63 65 20 61 6e 79 20 72 65 67 69 73 74 65  orce any registe
e190: 72 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67  r to be an integ
e1a0: 65 72 2c 20 6a 75 73 74 20 61 64 64 20 30 2e 0a  er, just add 0..
e1b0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64 49 6d  */.case OP_AddIm
e1c0: 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  m: {            
e1d0: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  /* in1 */.  pIn1
e1e0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
e1f0: 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
e200: 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a  hange(p, pIn1);.
e210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
e220: 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29  Integerify(pIn1)
e230: 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d  ;.  pIn1->u.i +=
e240: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72 65 61   pOp->p2;.  brea
e250: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
e260: 20 4d 75 73 74 42 65 49 6e 74 20 50 31 20 50 32   MustBeInt P1 P2
e270: 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f   * * *.** .** Fo
e280: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
e290: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
e2a0: 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  be an integer.  
e2b0: 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  If the value.** 
e2c0: 69 6e 20 50 31 20 69 73 20 6e 6f 74 20 61 6e 20  in P1 is not an 
e2d0: 69 6e 74 65 67 65 72 20 61 6e 64 20 63 61 6e 6e  integer and cann
e2e0: 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ot be converted 
e2f0: 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 0a  into an integer.
e300: 2a 2a 20 77 69 74 68 6f 75 74 20 64 61 74 61 20  ** without data 
e310: 6c 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d 70 20  loss, then jump 
e320: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
e330: 32 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30 0a 2a  2, or if P2==0.*
e340: 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54  * raise an SQLIT
e350: 45 5f 4d 49 53 4d 41 54 43 48 20 65 78 63 65 70  E_MISMATCH excep
e360: 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
e370: 5f 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20 20 20  _MustBeInt: {   
e380: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
e390: 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
e3a0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
e3b0: 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
e3c0: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d  lags & MEM_Int)=
e3d0: 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 41  =0 ){.    applyA
e3e0: 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51  ffinity(pIn1, SQ
e3f0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
e400: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  , encoding);.   
e410: 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
e420: 28 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45  ((pIn1->flags&ME
e430: 4d 5f 49 6e 74 29 3d 3d 30 2c 20 32 29 3b 0a 20  M_Int)==0, 2);. 
e440: 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c     if( (pIn1->fl
e450: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
e460: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
e470: 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20  Op->p2==0 ){.   
e480: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e490: 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20  _MISMATCH;.     
e4a0: 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
e4b0: 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
e4c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e4d0: 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
e4e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e4f0: 20 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65    }.  MemSetType
e500: 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 49  Flag(pIn1, MEM_I
e510: 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  nt);.  break;.}.
e520: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e530: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
e540: 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  INT./* Opcode: R
e550: 65 61 6c 41 66 66 69 6e 69 74 79 20 50 31 20 2a  ealAffinity P1 *
e560: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20   * * *.**.** If 
e570: 72 65 67 69 73 74 65 72 20 50 31 20 68 6f 6c 64  register P1 hold
e580: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
e590: 76 65 72 74 20 69 74 20 74 6f 20 61 20 72 65 61  vert it to a rea
e5a0: 6c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  l value..**.** T
e5b0: 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73  his opcode is us
e5c0: 65 64 20 77 68 65 6e 20 65 78 74 72 61 63 74 69  ed when extracti
e5d0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
e5e0: 72 6f 6d 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61  rom a column tha
e5f0: 74 0a 2a 2a 20 68 61 73 20 52 45 41 4c 20 61 66  t.** has REAL af
e600: 66 69 6e 69 74 79 2e 20 20 53 75 63 68 20 63 6f  finity.  Such co
e610: 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6d 61 79 20  lumn values may 
e620: 73 74 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20  still be stored 
e630: 61 73 0a 2a 2a 20 69 6e 74 65 67 65 72 73 2c 20  as.** integers, 
e640: 66 6f 72 20 73 70 61 63 65 20 65 66 66 69 63 69  for space effici
e650: 65 6e 63 79 2c 20 62 75 74 20 61 66 74 65 72 20  ency, but after 
e660: 65 78 74 72 61 63 74 69 6f 6e 20 77 65 20 77 61  extraction we wa
e670: 6e 74 20 74 68 65 6d 0a 2a 2a 20 74 6f 20 68 61  nt them.** to ha
e680: 76 65 20 6f 6e 6c 79 20 61 20 72 65 61 6c 20 76  ve only a real v
e690: 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  alue..*/.case OP
e6a0: 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 3a 20 7b  _RealAffinity: {
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49    /* in1 */.  pI
e6d0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
e6e0: 70 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d  p1];.  if( pIn1-
e6f0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
e700: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
e710: 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49  dbeMemRealify(pI
e720: 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  n1);.  }.  break
e730: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
e740: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e750: 43 41 53 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  CAST./* Opcode: 
e760: 43 61 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Cast P1 P2 * * *
e770: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66  .** Synopsis: af
e780: 66 69 6e 69 74 79 28 72 5b 50 31 5d 29 0a 2a 2a  finity(r[P1]).**
e790: 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61  .** Force the va
e7a0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
e7b0: 50 31 20 74 6f 20 62 65 20 74 68 65 20 74 79 70  P1 to be the typ
e7c0: 65 20 64 65 66 69 6e 65 64 20 62 79 20 50 32 2e  e defined by P2.
e7d0: 0a 2a 2a 20 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20  .** .** <ul>.** 
e7e0: 3c 6c 69 20 76 61 6c 75 65 3d 22 39 37 22 3e 20  <li value="97"> 
e7f0: 54 45 58 54 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75  TEXT.** <li valu
e800: 65 3d 22 39 38 22 3e 20 42 4c 4f 42 0a 2a 2a 20  e="98"> BLOB.** 
e810: 3c 6c 69 20 76 61 6c 75 65 3d 22 39 39 22 3e 20  <li value="99"> 
e820: 4e 55 4d 45 52 49 43 0a 2a 2a 20 3c 6c 69 20 76  NUMERIC.** <li v
e830: 61 6c 75 65 3d 22 31 30 30 22 3e 20 49 4e 54 45  alue="100"> INTE
e840: 47 45 52 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65  GER.** <li value
e850: 3d 22 31 30 31 22 3e 20 52 45 41 4c 0a 2a 2a 20  ="101"> REAL.** 
e860: 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  </ul>.**.** A NU
e870: 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  LL value is not 
e880: 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
e890: 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d  routine.  It rem
e8a0: 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  ains NULL..*/.ca
e8b0: 73 65 20 4f 50 5f 43 61 73 74 3a 20 7b 20 20 20  se OP_Cast: {   
e8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e8d0: 2a 20 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72  * in1 */.  asser
e8e0: 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 53 51 4c 49  t( pOp->p2>=SQLI
e8f0: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 26 26 20 70  TE_AFF_BLOB && p
e900: 4f 70 2d 3e 70 32 3c 3d 53 51 4c 49 54 45 5f 41  Op->p2<=SQLITE_A
e910: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 74 65 73  FF_REAL );.  tes
e920: 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d  tcase( pOp->p2==
e930: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
e940: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
e950: 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41  Op->p2==SQLITE_A
e960: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 74 65 73  FF_BLOB );.  tes
e970: 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d  tcase( pOp->p2==
e980: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
e990: 49 43 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  IC );.  testcase
e9a0: 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  ( pOp->p2==SQLIT
e9b0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
e9c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70  .  testcase( pOp
e9d0: 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46  ->p2==SQLITE_AFF
e9e0: 5f 52 45 41 4c 20 29 3b 0a 20 20 70 49 6e 31 20  _REAL );.  pIn1 
e9f0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
ea00: 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
ea10: 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20  ange(p, pIn1);. 
ea20: 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62   rc = ExpandBlob
ea30: 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65  (pIn1);.  sqlite
ea40: 33 56 64 62 65 4d 65 6d 43 61 73 74 28 70 49 6e  3VdbeMemCast(pIn
ea50: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 65 6e 63 6f  1, pOp->p2, enco
ea60: 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f  ding);.  UPDATE_
ea70: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e  MAX_BLOBSIZE(pIn
ea80: 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  1);.  if( rc ) g
ea90: 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
eaa0: 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
eab0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
eac0: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
ead0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71 20  ../* Opcode: Eq 
eae0: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
eaf0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
eb00: 5b 50 33 5d 3d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  [P3]==r[P1].**.*
eb10: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
eb20: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
eb30: 20 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66 20   P1 and P3.  If 
eb40: 72 65 67 28 50 33 29 3d 3d 72 65 67 28 50 31 29  reg(P3)==reg(P1)
eb50: 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f   then.** jump to
eb60: 20 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72   address P2.  Or
eb70: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   if the SQLITE_S
eb80: 54 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20 73  TOREP2 flag is s
eb90: 65 74 20 69 6e 20 50 35 2c 20 74 68 65 6e 0a 2a  et in P5, then.*
eba0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
ebb0: 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
ebc0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
ebd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
ebe0: 45 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69  E_AFF_MASK porti
ebf0: 6f 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65  on of P5 must be
ec00: 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
ec10: 72 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49  racter -.** SQLI
ec20: 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c  TE_AFF_TEXT, SQL
ec30: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c  ITE_AFF_INTEGER,
ec40: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41   and so forth. A
ec50: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
ec60: 65 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20  e .** to coerce 
ec70: 62 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f  both inputs acco
ec80: 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66  rding to this af
ec90: 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68  finity before th
eca0: 65 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e.** comparison 
ecb0: 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20  is made. If the 
ecc0: 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20  SQLITE_AFF_MASK 
ecd0: 69 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75  is 0x00, then nu
ece0: 6d 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74  meric.** affinit
ecf0: 79 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20  y is used. Note 
ed00: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
ed10: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72  y conversions ar
ed20: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b  e stored.** back
ed30: 20 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20   into the input 
ed40: 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64  registers P1 and
ed50: 20 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70   P3.  So this op
ed60: 63 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a  code can cause.*
ed70: 2a 20 70 65 72 73 69 73 74 65 6e 74 20 63 68 61  * persistent cha
ed80: 6e 67 65 73 20 74 6f 20 72 65 67 69 73 74 65 72  nges to register
ed90: 73 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a  s P1 and P3..**.
eda0: 2a 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76  ** Once any conv
edb0: 65 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b  ersions have tak
edc0: 65 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65  en place, and ne
edd0: 69 74 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e  ither value is N
ede0: 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c  ULL, .** the val
edf0: 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  ues are compared
ee00: 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
ee10: 20 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20   are blobs then 
ee20: 6d 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75  memcmp() is.** u
ee30: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
ee40: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
ee50: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
ee60: 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
ee70: 2a 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68 65  ** are text, the
ee80: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
ee90: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
eea0: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
eeb0: 6e 0a 2a 2a 20 50 34 20 69 73 20 75 73 65 64 20  n.** P4 is used 
eec0: 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72  to do the compar
eed0: 69 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20  ison.  If P4 is 
eee0: 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 68  not specified th
eef0: 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69  en.** memcmp() i
ef00: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
ef10: 65 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20  e text string.  
ef20: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61  If both values a
ef30: 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74  re.** numeric, t
ef40: 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f  hen a numeric co
ef50: 6d 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64  mparison is used
ef60: 2e 20 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c  . If the two val
ef70: 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69  ues.** are of di
ef80: 66 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74  fferent types, t
ef90: 68 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20  hen numbers are 
efa0: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
efb0: 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20  than.** strings 
efc0: 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
efd0: 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20  considered less 
efe0: 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a  than blobs..**.*
eff0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  * If SQLITE_NULL
f000: 45 51 20 69 73 20 73 65 74 20 69 6e 20 50 35 20  EQ is set in P5 
f010: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
f020: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  of comparison is
f030: 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 0a 2a   always either.*
f040: 2a 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20  * true or false 
f050: 61 6e 64 20 69 73 20 6e 65 76 65 72 20 4e 55 4c  and is never NUL
f060: 4c 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65 72  L.  If both oper
f070: 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 74 68  ands are NULL th
f080: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  en the result.**
f090: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
f0a0: 73 20 74 72 75 65 2e 20 20 49 66 20 65 69 74 68  s true.  If eith
f0b0: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
f0c0: 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  LL then the resu
f0d0: 6c 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20  lt is false..** 
f0e0: 49 66 20 6e 65 69 74 68 65 72 20 6f 70 65 72 61  If neither opera
f0f0: 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 20 72  nd is NULL the r
f100: 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d  esult is the sam
f110: 65 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65  e as it would be
f120: 20 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54   if.** the SQLIT
f130: 45 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65  E_NULLEQ flag we
f140: 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  re omitted from 
f150: 50 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74  P5..**.** If bot
f160: 68 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  h SQLITE_STOREP2
f170: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4b 45 45 50   and SQLITE_KEEP
f180: 4e 55 4c 4c 20 66 6c 61 67 73 20 61 72 65 20 73  NULL flags are s
f190: 65 74 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63  et then the.** c
f1a0: 6f 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20  ontent of r[P2] 
f1b0: 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20  is only changed 
f1c0: 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  if the new value
f1d0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 30 20 28 66   is NULL or 0 (f
f1e0: 61 6c 73 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68  alse)..** In oth
f1f0: 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 69 6f  er words, a prio
f200: 72 20 72 5b 50 32 5d 20 76 61 6c 75 65 20 77 69  r r[P2] value wi
f210: 6c 6c 20 6e 6f 74 20 62 65 20 6f 76 65 72 77 72  ll not be overwr
f220: 69 74 74 65 6e 20 62 79 20 31 20 28 74 72 75 65  itten by 1 (true
f230: 29 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  )..*/./* Opcode:
f240: 20 4e 65 20 50 31 20 50 32 20 50 33 20 50 34 20   Ne P1 P2 P3 P4 
f250: 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
f260: 49 46 20 72 5b 50 33 5d 21 3d 72 5b 50 31 5d 0a  IF r[P3]!=r[P1].
f270: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
f280: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 45   just like the E
f290: 71 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  q opcode except 
f2a0: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
f2b0: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
f2c0: 20 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65 67   operands in reg
f2d0: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33  isters P1 and P3
f2e0: 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2e 20   are not equal. 
f2f0: 20 53 65 65 20 74 68 65 20 45 71 20 6f 70 63 6f   See the Eq opco
f300: 64 65 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69  de for.** additi
f310: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
f320: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20  ..**.** If both 
f330: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 61  SQLITE_STOREP2 a
f340: 6e 64 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  nd SQLITE_KEEPNU
f350: 4c 4c 20 66 6c 61 67 73 20 61 72 65 20 73 65 74  LL flags are set
f360: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e   then the.** con
f370: 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69 73  tent of r[P2] is
f380: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66   only changed if
f390: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69   the new value i
f3a0: 73 20 4e 55 4c 4c 20 6f 72 20 31 20 28 74 72 75  s NULL or 1 (tru
f3b0: 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  e)..** In other 
f3c0: 77 6f 72 64 73 2c 20 61 20 70 72 69 6f 72 20 72  words, a prior r
f3d0: 5b 50 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c 20  [P2] value will 
f3e0: 6e 6f 74 20 62 65 20 6f 76 65 72 77 72 69 74 74  not be overwritt
f3f0: 65 6e 20 62 79 20 30 20 28 66 61 6c 73 65 29 2e  en by 0 (false).
f400: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  .*/./* Opcode: L
f410: 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
f420: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46  .** Synopsis: IF
f430: 20 72 5b 50 33 5d 3c 72 5b 50 31 5d 0a 2a 2a 0a   r[P3]<r[P1].**.
f440: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
f450: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
f460: 72 20 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66  r P1 and P3.  If
f470: 20 72 65 67 28 50 33 29 3c 72 65 67 28 50 31 29   reg(P3)<reg(P1)
f480: 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f   then.** jump to
f490: 20 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72   address P2.  Or
f4a0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   if the SQLITE_S
f4b0: 54 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20 73  TOREP2 flag is s
f4c0: 65 74 20 69 6e 20 50 35 20 73 74 6f 72 65 0a 2a  et in P5 store.*
f4d0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
f4e0: 63 6f 6d 70 61 72 69 73 6f 6e 20 28 30 20 6f 72  comparison (0 or
f4f0: 20 31 20 6f 72 20 4e 55 4c 4c 29 20 69 6e 74 6f   1 or NULL) into
f500: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
f510: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
f520: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74  E_JUMPIFNULL bit
f530: 20 6f 66 20 50 35 20 69 73 20 73 65 74 20 61 6e   of P5 is set an
f540: 64 20 65 69 74 68 65 72 20 72 65 67 28 50 31 29  d either reg(P1)
f550: 20 6f 72 0a 2a 2a 20 72 65 67 28 50 33 29 20 69   or.** reg(P3) i
f560: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  s NULL then the 
f570: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 20  take the jump.  
f580: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  If the SQLITE_JU
f590: 4d 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74  MPIFNULL .** bit
f5a0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 66   is clear then f
f5b0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 65  all through if e
f5c0: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
f5d0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
f5e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
f5f0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20 6d   portion of P5 m
f600: 75 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e 69  ust be an affini
f610: 74 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a 2a  ty character -.*
f620: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  * SQLITE_AFF_TEX
f630: 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  T, SQLITE_AFF_IN
f640: 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66 6f  TEGER, and so fo
f650: 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  rth. An attempt 
f660: 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 63  is made .** to c
f670: 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75 74  oerce both input
f680: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
f690: 68 69 73 20 61 66 66 69 6e 69 74 79 20 62 65 66  his affinity bef
f6a0: 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 61  ore the.** compa
f6b0: 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20 49  rison is made. I
f6c0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
f6d0: 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20 74  _MASK is 0x00, t
f6e0: 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 61  hen numeric.** a
f6f0: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 2e  ffinity is used.
f700: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
f710: 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73 69  ffinity conversi
f720: 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  ons are stored.*
f730: 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  * back into the 
f740: 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20  input registers 
f750: 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20 74  P1 and P3.  So t
f760: 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20 63  his opcode can c
f770: 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74 65  ause.** persiste
f780: 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72 65  nt changes to re
f790: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
f7a0: 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  3..**.** Once an
f7b0: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68 61  y conversions ha
f7c0: 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c 20  ve taken place, 
f7d0: 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c 75  and neither valu
f7e0: 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74  e is NULL, .** t
f7f0: 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  he values are co
f800: 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68 20  mpared. If both 
f810: 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62 73  values are blobs
f820: 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20 69   then memcmp() i
f830: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74  s.** used to det
f840: 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75 6c  ermine the resul
f850: 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  ts of the compar
f860: 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 76  ison.  If both v
f870: 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65 78  alues.** are tex
f880: 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70 72  t, then the appr
f890: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
f8a0: 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69  g function speci
f8b0: 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69 73  fied in.** P4 is
f8c0: 20 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65    used to do the
f8d0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
f8e0: 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63 69   P4 is not speci
f8f0: 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d  fied then.** mem
f900: 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74 6f  cmp() is used to
f910: 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73 74   compare text st
f920: 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 76  ring.  If both v
f930: 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d  alues are.** num
f940: 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d  eric, then a num
f950: 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20  eric comparison 
f960: 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65 20  is used. If the 
f970: 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  two values.** ar
f980: 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 74  e of different t
f990: 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65  ypes, then numbe
f9a0: 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
f9b0: 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73  d less than.** s
f9c0: 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69 6e  trings and strin
f9d0: 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  gs are considere
f9e0: 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62  d less than blob
f9f0: 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  s..*/./* Opcode:
fa00: 20 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20   Le P1 P2 P3 P4 
fa10: 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
fa20: 49 46 20 72 5b 50 33 5d 3c 3d 72 5b 50 31 5d 0a  IF r[P3]<=r[P1].
fa30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
fa40: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c   just like the L
fa50: 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  t opcode except 
fa60: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
fa70: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
fa80: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
fa90: 73 74 65 72 20 50 33 20 69 73 20 6c 65 73 73 20  ster P3 is less 
faa0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
fab0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
fac0: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  ** register P1. 
fad0: 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f   See the Lt opco
fae0: 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
faf0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
fb00: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74 20  /./* Opcode: Gt 
fb10: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
fb20: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
fb30: 5b 50 33 5d 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  [P3]>r[P1].**.**
fb40: 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74   This works just
fb50: 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63   like the Lt opc
fb60: 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ode except that 
fb70: 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
fb80: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  n if.** the cont
fb90: 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
fba0: 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68  P3 is greater th
fbb0: 61 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  an the content o
fbc0: 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31  f.** register P1
fbd0: 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70  .  See the Lt op
fbe0: 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f  code for additio
fbf0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
fc00: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47  .*/./* Opcode: G
fc10: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
fc20: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46  .** Synopsis: IF
fc30: 20 72 5b 50 33 5d 3e 3d 72 5b 50 31 5d 0a 2a 2a   r[P3]>=r[P1].**
fc40: 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
fc50: 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20  ust like the Lt 
fc60: 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68  opcode except th
fc70: 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  at the jump is t
fc80: 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63  aken if.** the c
fc90: 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
fca0: 65 72 20 50 33 20 69 73 20 67 72 65 61 74 65 72  er P3 is greater
fcb0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fcc0: 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  o the content of
fcd0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e  .** register P1.
fce0: 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63    See the Lt opc
fcf0: 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
fd00: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
fd10: 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 71 3a 20 20  */.case OP_Eq:  
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd30: 73 61 6d 65 20 61 73 20 54 4b 5f 45 51 2c 20 6a  same as TK_EQ, j
fd40: 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f  ump, in1, in3 */
fd50: 0a 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20  .case OP_Ne:    
fd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
fd70: 6d 65 20 61 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d  me as TK_NE, jum
fd80: 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63  p, in1, in3 */.c
fd90: 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 20 20  ase OP_Lt:      
fda0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
fdb0: 20 61 73 20 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c   as TK_LT, jump,
fdc0: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
fdd0: 65 20 4f 50 5f 4c 65 3a 20 20 20 20 20 20 20 20  e OP_Le:        
fde0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
fdf0: 73 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69  s TK_LE, jump, i
fe00: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
fe10: 4f 50 5f 47 74 3a 20 20 20 20 20 20 20 20 20 20  OP_Gt:          
fe20: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
fe30: 54 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_GT, jump, in1
fe40: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
fe50: 5f 47 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  _Ge: {          
fe60: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
fe70: 5f 47 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _GE, jump, in1, 
fe80: 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  in3 */.  int res
fe90: 2c 20 72 65 73 32 3b 20 20 20 20 20 20 2f 2a 20  , res2;      /* 
fea0: 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  Result of the co
feb0: 6d 70 61 72 69 73 6f 6e 20 6f 66 20 70 49 6e 31  mparison of pIn1
fec0: 20 61 67 61 69 6e 73 74 20 70 49 6e 33 20 2a 2f   against pIn3 */
fed0: 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79  .  char affinity
fee0: 3b 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69  ;      /* Affini
fef0: 74 79 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f  ty to use for co
ff00: 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 31  mparison */.  u1
ff10: 36 20 66 6c 61 67 73 31 3b 20 20 20 20 20 20 20  6 flags1;       
ff20: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69    /* Copy of ini
ff30: 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49  tial value of pI
ff40: 6e 31 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20 20 75  n1->flags */.  u
ff50: 31 36 20 66 6c 61 67 73 33 3b 20 20 20 20 20 20  16 flags3;      
ff60: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e     /* Copy of in
ff70: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
ff80: 49 6e 33 2d 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20  In3->flags */.. 
ff90: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
ffa0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d  p->p1];.  pIn3 =
ffb0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
ffc0: 0a 20 20 66 6c 61 67 73 31 20 3d 20 70 49 6e 31  .  flags1 = pIn1
ffd0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 6c 61 67 73  ->flags;.  flags
ffe0: 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b  3 = pIn3->flags;
fff0: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c  .  if( (flags1 |
10000 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 4e 75 6c   flags3)&MEM_Nul
10010 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  l ){.    /* One 
10020 6f 72 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  or both operands
10030 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   are NULL */.   
10040 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53   if( pOp->p5 & S
10050 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a  QLITE_NULLEQ ){.
10060 20 20 20 20 20 20 2f 2a 20 49 66 20 53 51 4c 49        /* If SQLI
10070 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74  TE_NULLEQ is set
10080 20 28 77 68 69 63 68 20 77 69 6c 6c 20 6f 6e 6c   (which will onl
10090 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
100a0 6f 70 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  operator is.    
100b0 20 20 2a 2a 20 4f 50 5f 45 71 20 6f 72 20 4f 50    ** OP_Eq or OP
100c0 5f 4e 65 29 20 74 68 65 6e 20 74 61 6b 65 20 74  _Ne) then take t
100d0 68 65 20 6a 75 6d 70 20 6f 72 20 6e 6f 74 20 64  he jump or not d
100e0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
100f0 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  her.      ** or 
10100 6e 6f 74 20 62 6f 74 68 20 6f 70 65 72 61 6e 64  not both operand
10110 73 20 61 72 65 20 6e 75 6c 6c 2e 0a 20 20 20 20  s are null..    
10120 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
10130 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
10140 4f 50 5f 45 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70  OP_Eq || pOp->op
10150 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  code==OP_Ne );. 
10160 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c       assert( (fl
10170 61 67 73 31 20 26 20 4d 45 4d 5f 43 6c 65 61 72  ags1 & MEM_Clear
10180 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
10190 61 73 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35  assert( (pOp->p5
101a0 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   & SQLITE_JUMPIF
101b0 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
101c0 20 20 69 66 28 20 28 66 6c 61 67 73 31 26 66 6c    if( (flags1&fl
101d0 61 67 73 33 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d  ags3&MEM_Null)!=
101e0 30 0a 20 20 20 20 20 20 20 26 26 20 28 66 6c 61  0.       && (fla
101f0 67 73 33 26 4d 45 4d 5f 43 6c 65 61 72 65 64 29  gs3&MEM_Cleared)
10200 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
10210 20 20 20 20 20 72 65 73 20 3d 20 30 3b 20 20 2f       res = 0;  /
10220 2a 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20 65  * Operands are e
10230 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 65  qual */.      }e
10240 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
10250 20 3d 20 31 3b 20 20 2f 2a 20 4f 70 65 72 61 6e   = 1;  /* Operan
10260 64 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c  ds are not equal
10270 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
10280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
10290 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73  SQLITE_NULLEQ is
102a0 20 63 6c 65 61 72 20 61 6e 64 20 61 74 20 6c 65   clear and at le
102b0 61 73 74 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20  ast one operand 
102c0 69 73 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 2a  is NULL,.      *
102d0 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  * then the resul
102e0 74 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c  t is always NULL
102f0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  ..      ** The j
10300 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20  ump is taken if 
10310 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  the SQLITE_JUMPI
10320 46 4e 55 4c 4c 20 62 69 74 20 69 73 20 73 65 74  FNULL bit is set
10330 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10340 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53   if( pOp->p5 & S
10350 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b  QLITE_STOREP2 ){
10360 0a 20 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20  .        pOut = 
10370 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
10380 20 20 20 20 20 20 20 20 69 43 6f 6d 70 61 72 65          iCompare
10390 20 3d 20 31 3b 20 20 20 20 2f 2a 20 4f 70 65 72   = 1;    /* Oper
103a0 61 6e 64 73 20 61 72 65 20 6e 6f 74 20 65 71 75  ands are not equ
103b0 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  al */.        me
103c0 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
103d0 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  , pOut);.       
103e0 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
103f0 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  pOut, MEM_Null);
10400 0a 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45  .        REGISTE
10410 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
10420 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65   pOut);.      }e
10430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62  lse{.        Vdb
10440 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33  eBranchTaken(2,3
10450 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
10460 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f  Op->p5 & SQLITE_
10470 4a 55 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20  JUMPIFNULL ){.  
10480 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d          goto jum
10490 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20  p_to_p2;.       
104a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
104b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
104c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65  }else{.    /* Ne
104d0 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
104e0 20 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f 6d   NULL.  Do a com
104f0 70 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20  parison. */.    
10500 61 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e  affinity = pOp->
10510 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f  p5 & SQLITE_AFF_
10520 4d 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61 66  MASK;.    if( af
10530 66 69 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41  finity>=SQLITE_A
10540 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
10550 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20      if( (flags1 
10560 7c 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 53 74  | flags3)&MEM_St
10570 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  r ){.        if(
10580 20 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f   (flags1 & (MEM_
10590 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d  Int|MEM_Real|MEM
105a0 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20  _Str))==MEM_Str 
105b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  ){.          app
105c0 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
105d0 79 28 70 49 6e 31 2c 30 29 3b 0a 20 20 20 20 20  y(pIn1,0);.     
105e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66       testcase( f
105f0 6c 61 67 73 33 21 3d 70 49 6e 33 2d 3e 66 6c 61  lags3!=pIn3->fla
10600 67 73 20 29 3b 20 2f 2a 20 50 6f 73 73 69 62 6c  gs ); /* Possibl
10610 65 20 69 66 20 70 49 6e 31 3d 3d 70 49 6e 33 20  e if pIn1==pIn3 
10620 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  */.          fla
10630 67 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67  gs3 = pIn3->flag
10640 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  s;.        }.   
10650 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 33       if( (flags3
10660 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
10670 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d  Real|MEM_Str))==
10680 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
10690 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69       applyNumeri
106a0 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 30  cAffinity(pIn3,0
106b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
106c0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 48 61     }.      /* Ha
106d0 6e 64 6c 65 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ndle the common 
106e0 63 61 73 65 20 6f 66 20 69 6e 74 65 67 65 72 20  case of integer 
106f0 63 6f 6d 70 61 72 69 73 6f 6e 20 68 65 72 65 2c  comparison here,
10700 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
10710 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
10720 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f   avoid a call to
10730 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
10740 72 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 66  re() */.      if
10750 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
10760 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn3->flags & M
10770 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
10780 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e        if( pIn3->
10790 75 2e 69 20 3e 20 70 49 6e 31 2d 3e 75 2e 69 20  u.i > pIn1->u.i 
107a0 29 7b 20 72 65 73 20 3d 20 2b 31 3b 20 67 6f 74  ){ res = +1; got
107b0 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a  o compare_op; }.
107c0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 33          if( pIn3
107d0 2d 3e 75 2e 69 20 3c 20 70 49 6e 31 2d 3e 75 2e  ->u.i < pIn1->u.
107e0 69 20 29 7b 20 72 65 73 20 3d 20 2d 31 3b 20 67  i ){ res = -1; g
107f0 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 20  oto compare_op; 
10800 7d 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  }.        res = 
10810 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
10820 63 6f 6d 70 61 72 65 5f 6f 70 3b 0a 20 20 20 20  compare_op;.    
10830 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
10840 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ( affinity==SQLI
10850 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20  TE_AFF_TEXT ){. 
10860 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 31       if( (flags1
10870 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26   & MEM_Str)==0 &
10880 26 20 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d  & (flags1 & (MEM
10890 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21  _Int|MEM_Real))!
108a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
108b0 73 74 63 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c  stcase( pIn1->fl
108c0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b  ags & MEM_Int );
108d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
108e0 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  e( pIn1->flags &
108f0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
10900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10910 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49 6e  MemStringify(pIn
10920 31 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b  1, encoding, 1);
10930 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
10940 65 28 20 28 66 6c 61 67 73 31 26 4d 45 4d 5f 44  e( (flags1&MEM_D
10950 79 6e 29 20 21 3d 20 28 70 49 6e 31 2d 3e 66 6c  yn) != (pIn1->fl
10960 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a  ags&MEM_Dyn) );.
10970 20 20 20 20 20 20 20 20 66 6c 61 67 73 31 20 3d          flags1 =
10980 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
10990 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c  ~MEM_TypeMask) |
109a0 20 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 54   (flags1 & MEM_T
109b0 79 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  ypeMask);.      
109c0 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d    assert( pIn1!=
109d0 70 49 6e 33 20 29 3b 0a 20 20 20 20 20 20 7d 0a  pIn3 );.      }.
109e0 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
109f0 33 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  3 & MEM_Str)==0 
10a00 26 26 20 28 66 6c 61 67 73 33 20 26 20 28 4d 45  && (flags3 & (ME
10a10 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29  M_Int|MEM_Real))
10a20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74  !=0 ){.        t
10a30 65 73 74 63 61 73 65 28 20 70 49 6e 33 2d 3e 66  estcase( pIn3->f
10a40 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
10a50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
10a60 73 65 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20  se( pIn3->flags 
10a70 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
10a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a90 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49  eMemStringify(pI
10aa0 6e 33 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29  n3, encoding, 1)
10ab0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
10ac0 73 65 28 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f  se( (flags3&MEM_
10ad0 44 79 6e 29 20 21 3d 20 28 70 49 6e 33 2d 3e 66  Dyn) != (pIn3->f
10ae0 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b  lags&MEM_Dyn) );
10af0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 33 20  .        flags3 
10b00 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  = (pIn3->flags &
10b10 20 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20   ~MEM_TypeMask) 
10b20 7c 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f  | (flags3 & MEM_
10b30 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20  TypeMask);.     
10b40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
10b50 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
10b60 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20  ==P4_COLLSEQ || 
10b70 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30  pOp->p4.pColl==0
10b80 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71   );.    res = sq
10b90 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
10ba0 70 49 6e 33 2c 20 70 49 6e 31 2c 20 70 4f 70 2d  pIn3, pIn1, pOp-
10bb0 3e 70 34 2e 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  >p4.pColl);.  }.
10bc0 63 6f 6d 70 61 72 65 5f 6f 70 3a 0a 20 20 73 77  compare_op:.  sw
10bd0 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
10be0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 50  e ){.    case OP
10bf0 5f 45 71 3a 20 20 20 20 72 65 73 32 20 3d 20 72  _Eq:    res2 = r
10c00 65 73 3d 3d 30 3b 20 20 20 20 20 62 72 65 61 6b  es==0;     break
10c10 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65  ;.    case OP_Ne
10c20 3a 20 20 20 20 72 65 73 32 20 3d 20 72 65 73 3b  :    res2 = res;
10c30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10c40 20 20 20 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20     case OP_Lt:  
10c50 20 20 72 65 73 32 20 3d 20 72 65 73 3c 30 3b 20    res2 = res<0; 
10c60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10c70 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 72  case OP_Le:    r
10c80 65 73 32 20 3d 20 72 65 73 3c 3d 30 3b 20 20 20  es2 = res<=0;   
10c90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10ca0 65 20 4f 50 5f 47 74 3a 20 20 20 20 72 65 73 32  e OP_Gt:    res2
10cb0 20 3d 20 72 65 73 3e 30 3b 20 20 20 20 20 20 62   = res>0;      b
10cc0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
10cd0 74 3a 20 20 20 20 20 20 20 72 65 73 32 20 3d 20  t:       res2 = 
10ce0 72 65 73 3e 3d 30 3b 20 20 20 20 20 62 72 65 61  res>=0;     brea
10cf0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64  k;.  }..  /* Und
10d00 6f 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  o any changes ma
10d10 64 65 20 62 79 20 61 70 70 6c 79 41 66 66 69 6e  de by applyAffin
10d20 69 74 79 28 29 20 74 6f 20 74 68 65 20 69 6e 70  ity() to the inp
10d30 75 74 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f  ut registers. */
10d40 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31  .  assert( (pIn1
10d50 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
10d60 6e 29 20 3d 3d 20 28 66 6c 61 67 73 31 20 26 20  n) == (flags1 & 
10d70 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 70 49  MEM_Dyn) );.  pI
10d80 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  n1->flags = flag
10d90 73 31 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  s1;.  assert( (p
10da0 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
10db0 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73 33  _Dyn) == (flags3
10dc0 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20   & MEM_Dyn) );. 
10dd0 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 66   pIn3->flags = f
10de0 6c 61 67 73 33 3b 0a 0a 20 20 69 66 28 20 70 4f  lags3;..  if( pO
10df0 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53  p->p5 & SQLITE_S
10e00 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 70 4f  TOREP2 ){.    pO
10e10 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
10e20 70 32 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72  p2];.    iCompar
10e30 65 20 3d 20 72 65 73 3b 0a 20 20 20 20 72 65 73  e = res;.    res
10e40 32 20 3d 20 72 65 73 32 21 3d 30 3b 20 20 2f 2a  2 = res2!=0;  /*
10e50 20 46 6f 72 20 74 68 69 73 20 70 61 74 68 20 72   For this path r
10e60 65 73 32 20 6d 75 73 74 20 62 65 20 65 78 61 63  es2 must be exac
10e70 74 6c 79 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  tly 0 or 1 */.  
10e80 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26    if( (pOp->p5 &
10e90 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
10ea0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
10eb0 20 54 68 65 20 4b 45 45 50 4e 55 4c 4c 20 66 6c   The KEEPNULL fl
10ec0 61 67 20 70 72 65 76 65 6e 74 73 20 4f 50 5f 45  ag prevents OP_E
10ed0 71 20 66 72 6f 6d 20 6f 76 65 72 77 72 69 74 69  q from overwriti
10ee0 6e 67 20 61 20 4e 55 4c 4c 20 77 69 74 68 20 31  ng a NULL with 1
10ef0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 72  .      ** and pr
10f00 65 76 65 6e 74 73 20 4f 50 5f 4e 65 20 66 72 6f  events OP_Ne fro
10f10 6d 20 6f 76 65 72 77 72 69 74 69 6e 67 20 4e 55  m overwriting NU
10f20 4c 4c 20 77 69 74 68 20 30 2e 20 20 54 68 69 73  LL with 0.  This
10f30 20 66 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69   flag.      ** i
10f40 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 63  s only used in c
10f50 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 65 69  ontexts where ei
10f60 74 68 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20 20  ther:.      **  
10f70 20 28 31 29 20 6f 70 3d 3d 4f 50 5f 45 71 20 26   (1) op==OP_Eq &
10f80 26 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c  & (r[P2]==NULL |
10f90 7c 20 72 5b 50 32 5d 3d 3d 30 29 0a 20 20 20 20  | r[P2]==0).    
10fa0 20 20 2a 2a 20 20 20 28 32 29 20 6f 70 3d 3d 4f    **   (2) op==O
10fb0 50 5f 4e 65 20 26 26 20 28 72 5b 50 32 5d 3d 3d  P_Ne && (r[P2]==
10fc0 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d 31  NULL || r[P2]==1
10fd0 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  ).      ** There
10fe0 66 6f 72 65 20 69 74 20 69 73 20 6e 6f 74 20 6e  fore it is not n
10ff0 65 63 65 73 73 61 72 79 20 74 6f 20 63 68 65 63  ecessary to chec
11000 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  k the content of
11010 20 72 5b 50 32 5d 20 66 6f 72 0a 20 20 20 20 20   r[P2] for.     
11020 20 2a 2a 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20   ** NULL. */.   
11030 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
11040 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 7c 7c  opcode==OP_Ne ||
11050 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
11060 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
11070 65 72 74 28 20 72 65 73 32 3d 3d 30 20 7c 7c 20  ert( res2==0 || 
11080 72 65 73 32 3d 3d 31 20 29 3b 0a 20 20 20 20 20  res2==1 );.     
11090 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32 3d   testcase( res2=
110a0 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  =0 && pOp->opcod
110b0 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  e==OP_Eq );.    
110c0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32    testcase( res2
110d0 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f  ==1 && pOp->opco
110e0 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  de==OP_Eq );.   
110f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73     testcase( res
11100 32 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63  2==0 && pOp->opc
11110 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  ode==OP_Ne );.  
11120 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
11130 73 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70  s2==1 && pOp->op
11140 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  code==OP_Ne );. 
11150 20 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f       if( (pOp->o
11160 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 29 3d 3d 72  pcode==OP_Eq)==r
11170 65 73 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  es2 ) break;.   
11180 20 7d 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54   }.    memAboutT
11190 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
111a0 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
111b0 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
111c0 6e 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  nt);.    pOut->u
111d0 2e 69 20 3d 20 72 65 73 32 3b 0a 20 20 20 20 52  .i = res2;.    R
111e0 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
111f0 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20  p->p2, pOut);.  
11200 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42  }else{.    VdbeB
11210 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
11220 30 2c 20 28 70 4f 70 2d 3e 70 35 20 26 20 53 51  0, (pOp->p5 & SQ
11230 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3f 32 3a 33  LITE_NULLEQ)?2:3
11240 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 32 20  );.    if( res2 
11250 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75  ){.      goto ju
11260 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a  mp_to_p2;.    }.
11270 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
11280 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 6c 73 65 4e  /* Opcode: ElseN
11290 6f 74 45 71 20 2a 20 50 32 20 2a 20 2a 20 2a 0a  otEq * P2 * * *.
112a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
112b0 65 20 6d 75 73 74 20 69 6d 6d 65 64 69 61 74 65  e must immediate
112c0 6c 79 20 66 6f 6c 6c 6f 77 20 61 6e 20 4f 50 5f  ly follow an OP_
112d0 4c 74 20 6f 72 20 4f 50 5f 47 74 20 63 6f 6d 70  Lt or OP_Gt comp
112e0 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
112f0 0a 2a 2a 20 49 66 20 72 65 73 75 6c 74 20 6f 66  .** If result of
11300 20 61 6e 20 4f 50 5f 45 71 20 63 6f 6d 70 61 72   an OP_Eq compar
11310 69 73 6f 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  ison on the same
11320 20 74 77 6f 20 6f 70 65 72 61 6e 64 73 0a 2a 2a   two operands.**
11330 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 20 4e   would have be N
11340 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 28 30 29  ULL or false (0)
11350 2c 20 74 68 65 6e 20 74 68 65 6e 20 6a 75 6d 70  , then then jump
11360 20 74 6f 20 50 32 2e 20 0a 2a 2a 20 49 66 20 74   to P2. .** If t
11370 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20  he result of an 
11380 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f 6e  OP_Eq comparison
11390 20 6f 6e 20 74 68 65 20 74 77 6f 20 70 72 65 76   on the two prev
113a0 69 6f 75 73 20 6f 70 65 72 61 6e 64 73 0a 2a 2a  ious operands.**
113b0 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
113c0 20 74 72 75 65 20 28 31 29 2c 20 74 68 65 6e 20   true (1), then 
113d0 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  fall through..*/
113e0 0a 63 61 73 65 20 4f 50 5f 45 6c 73 65 4e 6f 74  .case OP_ElseNot
113f0 45 71 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 73  Eq: {       /* s
11400 61 6d 65 20 61 73 20 54 4b 5f 45 53 43 41 50 45  ame as TK_ESCAPE
11410 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65  , jump */.  asse
11420 72 74 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20  rt( pOp>aOp );. 
11430 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
11440 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4c 74 20 7c  .opcode==OP_Lt |
11450 7c 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  | pOp[-1].opcode
11460 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
11470 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 35 20  ert( pOp[-1].p5 
11480 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  & SQLITE_STOREP2
11490 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68   );.  VdbeBranch
114a0 54 61 6b 65 6e 28 69 43 6f 6d 70 61 72 65 21 3d  Taken(iCompare!=
114b0 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 69 43 6f  0, 2);.  if( iCo
114c0 6d 70 61 72 65 21 3d 30 20 29 20 67 6f 74 6f 20  mpare!=0 ) goto 
114d0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72  jump_to_p2;.  br
114e0 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f  eak;.}.../* Opco
114f0 64 65 3a 20 50 65 72 6d 75 74 61 74 69 6f 6e 20  de: Permutation 
11500 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  * * * P4 *.**.**
11510 20 53 65 74 20 74 68 65 20 70 65 72 6d 75 74 61   Set the permuta
11520 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
11530 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72   OP_Compare oper
11540 61 74 6f 72 20 69 6e 20 74 68 65 20 6e 65 78 74  ator in the next
11550 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
11560 20 20 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f    The permutatio
11570 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  n is stored in t
11580 68 65 20 50 34 20 6f 70 65 72 61 6e 64 2e 0a 2a  he P4 operand..*
11590 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74 61  *.** The permuta
115a0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61 6c  tion is only val
115b0 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78  id until the nex
115c0 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 74 68 61  t OP_Compare tha
115d0 74 20 68 61 73 0a 2a 2a 20 74 68 65 20 4f 50 46  t has.** the OPF
115e0 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20  LAG_PERMUTE bit 
115f0 73 65 74 20 69 6e 20 50 35 2e 20 54 79 70 69 63  set in P5. Typic
11600 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65 72 6d  ally the OP_Perm
11610 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 0a  utation should .
11620 2a 2a 20 6f 63 63 75 72 20 69 6d 6d 65 64 69 61  ** occur immedia
11630 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74 68  tely prior to th
11640 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a 2a  e OP_Compare..**
11650 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 69 6e  .** The first in
11660 74 65 67 65 72 20 69 6e 20 74 68 65 20 50 34 20  teger in the P4 
11670 69 6e 74 65 67 65 72 20 61 72 72 61 79 20 69 73  integer array is
11680 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
11690 68 65 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64 20  he array.** and 
116a0 64 6f 65 73 20 6e 6f 74 20 62 65 63 6f 6d 65 20  does not become 
116b0 70 61 72 74 20 6f 66 20 74 68 65 20 70 65 72 6d  part of the perm
116c0 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  utation..*/.case
116d0 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 3a   OP_Permutation:
116e0 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
116f0 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
11700 41 52 52 41 59 20 29 3b 0a 20 20 61 73 73 65 72  ARRAY );.  asser
11710 74 28 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29 3b  t( pOp->p4.ai );
11720 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31  .  assert( pOp[1
11730 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6d  ].opcode==OP_Com
11740 70 61 72 65 20 29 3b 0a 20 20 61 73 73 65 72 74  pare );.  assert
11750 28 20 70 4f 70 5b 31 5d 2e 70 35 20 26 20 4f 50  ( pOp[1].p5 & OP
11760 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 29 3b 0a  FLAG_PERMUTE );.
11770 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
11780 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20 50  pcode: Compare P
11790 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
117a0 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 40   Synopsis: r[P1@
117b0 50 33 5d 20 3c 2d 3e 20 72 5b 50 32 40 50 33 5d  P3] <-> r[P2@P3]
117c0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  .**.** Compare t
117d0 77 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72 65  wo vectors of re
117e0 67 69 73 74 65 72 73 20 69 6e 20 72 65 67 28 50  gisters in reg(P
117f0 31 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31 29  1)..reg(P1+P3-1)
11800 20 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 76   (call this.** v
11810 65 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20 69  ector "A") and i
11820 6e 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28 50  n reg(P2)..reg(P
11830 32 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20 20  2+P3-1) ("B").  
11840 53 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20  Save the result 
11850 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  of.** the compar
11860 69 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79 20  ison for use by 
11870 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d 70  the next OP_Jump
11880 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a   instruct..**.**
11890 20 49 66 20 50 35 20 68 61 73 20 74 68 65 20 4f   If P5 has the O
118a0 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69  PFLAG_PERMUTE bi
118b0 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  t set, then the 
118c0 6f 72 64 65 72 20 6f 66 20 63 6f 6d 70 61 72 69  order of compari
118d0 73 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 72 6d  son is.** determ
118e0 69 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74  ined by the most
118f0 20 72 65 63 65 6e 74 20 4f 50 5f 50 65 72 6d 75   recent OP_Permu
11900 74 61 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  tation operator.
11910 20 20 49 66 20 74 68 65 0a 2a 2a 20 4f 50 46 4c    If the.** OPFL
11920 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20 69  AG_PERMUTE bit i
11930 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72 65  s clear, then re
11940 67 69 73 74 65 72 20 61 72 65 20 63 6f 6d 70 61  gister are compa
11950 72 65 64 20 69 6e 20 73 65 71 75 65 6e 74 69 61  red in sequentia
11960 6c 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a  l.** order..**.*
11970 2a 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e 66  * P4 is a KeyInf
11980 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
11990 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74 69   defines collati
119a0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64  ng sequences and
119b0 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73 20   sort.** orders 
119c0 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
119d0 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61  on.  The permuta
119e0 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f 20  tion applies to 
119f0 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c  registers.** onl
11a00 79 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  y.  The KeyInfo 
11a10 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73 65  elements are use
11a20 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e 0a  d sequentially..
11a30 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72  **.** The compar
11a40 69 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20 63  ison is a sort c
11a50 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e 55  omparison, so NU
11a60 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61  LLs compare equa
11a70 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20  l,.** NULLs are 
11a80 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65 72  less than number
11a90 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6c  s, numbers are l
11aa0 65 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73  ess than strings
11ab0 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67 73  ,.** and strings
11ac0 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 62   are less than b
11ad0 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  lobs..*/.case OP
11ae0 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69 6e  _Compare: {.  in
11af0 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t n;.  int i;.  
11b00 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70 32  int p1;.  int p2
11b10 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66  ;.  const KeyInf
11b20 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
11b30 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53 65  nt idx;.  CollSe
11b40 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20  q *pColl;    /* 
11b50 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
11b60 63 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69  ce to use on thi
11b70 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
11b80 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  bRev;          /
11b90 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53 43 45  * True for DESCE
11ba0 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65 72  NDING sort order
11bb0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
11bc0 75 74 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ute;     /* The 
11bd0 70 65 72 6d 75 74 61 74 69 6f 6e 20 2a 2f 0a 0a  permutation */..
11be0 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26    if( (pOp->p5 &
11bf0 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
11c00 3d 3d 30 20 29 7b 0a 20 20 20 20 61 50 65 72 6d  ==0 ){.    aPerm
11c10 75 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ute = 0;.  }else
11c20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
11c30 70 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73 73  p>aOp );.    ass
11c40 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
11c50 6f 64 65 3d 3d 4f 50 5f 50 65 72 6d 75 74 61 74  ode==OP_Permutat
11c60 69 6f 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ion );.    asser
11c70 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79 70  t( pOp[-1].p4typ
11c80 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29  e==P4_INTARRAY )
11c90 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 20 3d  ;.    aPermute =
11ca0 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 61 69 20 2b   pOp[-1].p4.ai +
11cb0 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   1;.    assert( 
11cc0 61 50 65 72 6d 75 74 65 21 3d 30 20 29 3b 0a 20  aPermute!=0 );. 
11cd0 20 7d 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33   }.  n = pOp->p3
11ce0 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ;.  pKeyInfo = p
11cf0 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
11d00 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29  .  assert( n>0 )
11d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
11d20 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20  Info!=0 );.  p1 
11d30 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20  = pOp->p1;.  p2 
11d40 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 20 53  = pOp->p2;.#if S
11d50 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
11d60 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
11d70 20 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20 30 3b    int k, mx = 0;
11d80 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
11d90 6e 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50 65 72  n; k++) if( aPer
11da0 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d 78 20  mute[k]>mx ) mx 
11db0 3d 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b 0a 20  = aPermute[k];. 
11dc0 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 30 20     assert( p1>0 
11dd0 26 26 20 70 31 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d  && p1+mx<=(p->nM
11de0 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
11df0 72 29 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r)+1 );.    asse
11e00 72 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6d  rt( p2>0 && p2+m
11e10 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  x<=(p->nMem+1 - 
11e20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
11e30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
11e40 73 65 72 74 28 20 70 31 3e 30 20 26 26 20 70 31  sert( p1>0 && p1
11e50 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  +n<=(p->nMem+1 -
11e60 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29   p->nCursor)+1 )
11e70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32  ;.    assert( p2
11e80 3e 30 20 26 26 20 70 32 2b 6e 3c 3d 28 70 2d 3e  >0 && p2+n<=(p->
11e90 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
11ea0 73 6f 72 29 2b 31 20 29 3b 0a 20 20 7d 0a 23 65  sor)+1 );.  }.#e
11eb0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
11ec0 45 42 55 47 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  EBUG */.  for(i=
11ed0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
11ee0 20 20 69 64 78 20 3d 20 61 50 65 72 6d 75 74 65    idx = aPermute
11ef0 20 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3a   ? aPermute[i] :
11f00 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
11f10 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d  memIsValid(&aMem
11f20 5b 70 31 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20  [p1+idx]) );.   
11f30 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
11f40 6c 69 64 28 26 61 4d 65 6d 5b 70 32 2b 69 64 78  lid(&aMem[p2+idx
11f50 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54  ]) );.    REGIST
11f60 45 52 5f 54 52 41 43 45 28 70 31 2b 69 64 78 2c  ER_TRACE(p1+idx,
11f70 20 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 3b   &aMem[p1+idx]);
11f80 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52  .    REGISTER_TR
11f90 41 43 45 28 70 32 2b 69 64 78 2c 20 26 61 4d 65  ACE(p2+idx, &aMe
11fa0 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a 20 20 20 20  m[p2+idx]);.    
11fb0 61 73 73 65 72 74 28 20 69 3c 70 4b 65 79 49 6e  assert( i<pKeyIn
11fc0 66 6f 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20  fo->nField );.  
11fd0 20 20 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e    pColl = pKeyIn
11fe0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  fo->aColl[i];.  
11ff0 20 20 62 52 65 76 20 3d 20 70 4b 65 79 49 6e 66    bRev = pKeyInf
12000 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
12010 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d  ;.    iCompare =
12020 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
12030 72 65 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d  re(&aMem[p1+idx]
12040 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 2c  , &aMem[p2+idx],
12050 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pColl);.    if(
12060 20 69 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20 20   iCompare ){.   
12070 20 20 20 69 66 28 20 62 52 65 76 20 29 20 69 43     if( bRev ) iC
12080 6f 6d 70 61 72 65 20 3d 20 2d 69 43 6f 6d 70 61  ompare = -iCompa
12090 72 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  re;.      break;
120a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
120b0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
120c0 3a 20 4a 75 6d 70 20 50 31 20 50 32 20 50 33 20  : Jump P1 P2 P3 
120d0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74  * *.**.** Jump t
120e0 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
120f0 6e 20 61 74 20 61 64 64 72 65 73 73 20 50 31 2c  n at address P1,
12100 20 50 32 2c 20 6f 72 20 50 33 20 64 65 70 65 6e   P2, or P3 depen
12110 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a  ding on whether.
12120 2a 2a 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** in the most r
12130 65 63 65 6e 74 20 4f 50 5f 43 6f 6d 70 61 72 65  ecent OP_Compare
12140 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65   instruction the
12150 20 50 31 20 76 65 63 74 6f 72 20 77 61 73 20 6c   P1 vector was l
12160 65 73 73 20 74 68 61 6e 0a 2a 2a 20 65 71 75 61  ess than.** equa
12170 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
12180 20 74 68 61 6e 20 74 68 65 20 50 32 20 76 65 63   than the P2 vec
12190 74 6f 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c  tor, respectivel
121a0 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 75  y..*/.case OP_Ju
121b0 6d 70 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  mp: {           
121c0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
121d0 66 28 20 69 43 6f 6d 70 61 72 65 3c 30 20 29 7b  f( iCompare<0 ){
121e0 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
121f0 61 6b 65 6e 28 30 2c 33 29 3b 20 70 4f 70 20 3d  aken(0,3); pOp =
12200 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 31 20 2d 20   &aOp[pOp->p1 - 
12210 31 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  1];.  }else if( 
12220 69 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  iCompare==0 ){. 
12230 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
12240 65 6e 28 31 2c 33 29 3b 20 70 4f 70 20 3d 20 26  en(1,3); pOp = &
12250 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d  aOp[pOp->p2 - 1]
12260 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
12270 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 32  dbeBranchTaken(2
12280 2c 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b  ,3); pOp = &aOp[
12290 70 4f 70 2d 3e 70 33 20 2d 20 31 5d 3b 0a 20 20  pOp->p3 - 1];.  
122a0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
122b0 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50 31 20   Opcode: And P1 
122c0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
122d0 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28 72 5b  opsis: r[P3]=(r[
122e0 50 31 5d 20 26 26 20 72 5b 50 32 5d 29 0a 2a 2a  P1] && r[P2]).**
122f0 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67  .** Take the log
12300 69 63 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20  ical AND of the 
12310 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
12320 65 72 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e  ers P1 and P2 an
12330 64 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72  d.** write the r
12340 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73  esult into regis
12350 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P3..**.** If
12360 20 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32   either P1 or P2
12370 20 69 73 20 30 20 28 66 61 6c 73 65 29 20 74 68   is 0 (false) th
12380 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
12390 20 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68   0 even if.** th
123a0 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73  e other input is
123b0 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61   NULL.  A NULL a
123c0 6e 64 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e  nd true or two N
123d0 55 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e  ULLs give.** a N
123e0 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f  ULL output..*/./
123f0 2a 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20  * Opcode: Or P1 
12400 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
12410 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28 72 5b  opsis: r[P3]=(r[
12420 50 31 5d 20 7c 7c 20 72 5b 50 32 5d 29 0a 2a 2a  P1] || r[P2]).**
12430 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67  .** Take the log
12440 69 63 61 6c 20 4f 52 20 6f 66 20 74 68 65 20 76  ical OR of the v
12450 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
12460 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a  r P1 and P2 and.
12470 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 61 6e 73  ** store the ans
12480 77 65 72 20 69 6e 20 72 65 67 69 73 74 65 72 20  wer in register 
12490 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  P3..**.** If eit
124a0 68 65 72 20 50 31 20 6f 72 20 50 32 20 69 73 20  her P1 or P2 is 
124b0 6e 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29 20 74  nonzero (true) t
124c0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
124d0 73 20 31 20 28 74 72 75 65 29 0a 2a 2a 20 65 76  s 1 (true).** ev
124e0 65 6e 20 69 66 20 74 68 65 20 6f 74 68 65 72 20  en if the other 
124f0 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20  input is NULL.  
12500 41 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c 73 65  A NULL and false
12510 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a 2a 2a   or two NULLs.**
12520 20 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f 75 74   give a NULL out
12530 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  put..*/.case OP_
12540 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  And:            
12550 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
12560 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  AND, in1, in2, o
12570 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  ut3 */.case OP_O
12580 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  r: {            
12590 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4f   /* same as TK_O
125a0 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  R, in1, in2, out
125b0 33 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b 20 20  3 */.  int v1;  
125c0 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
125d0 64 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20 31 3d  d:  0==FALSE, 1=
125e0 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57  =TRUE, 2==UNKNOW
125f0 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  N or NULL */.  i
12600 6e 74 20 76 32 3b 20 20 20 20 2f 2a 20 52 69 67  nt v2;    /* Rig
12610 68 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d 3d 46  ht operand: 0==F
12620 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20 32  ALSE, 1==TRUE, 2
12630 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c  ==UNKNOWN or NUL
12640 4c 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26  L */..  pIn1 = &
12650 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
12660 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
12670 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
12680 20 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d 65 6c     v1 = 2;.  }el
12690 73 65 7b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c  se{.    v1 = sql
126a0 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
126b0 28 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d 0a 20  (pIn1)!=0;.  }. 
126c0 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
126d0 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70 49  p->p2];.  if( pI
126e0 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n2->flags & MEM_
126f0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 32 20 3d  Null ){.    v2 =
12700 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   2;.  }else{.   
12710 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   v2 = sqlite3Vdb
12720 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 21  eIntValue(pIn2)!
12730 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f  =0;.  }.  if( pO
12740 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e  p->opcode==OP_An
12750 64 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  d ){.    static 
12760 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
12770 68 61 72 20 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20  har and_logic[] 
12780 3d 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  = { 0, 0, 0, 0, 
12790 31 2c 20 32 2c 20 30 2c 20 32 2c 20 32 20 7d 3b  1, 2, 0, 2, 2 };
127a0 0a 20 20 20 20 76 31 20 3d 20 61 6e 64 5f 6c 6f  .    v1 = and_lo
127b0 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20  gic[v1*3+v2];.  
127c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
127d0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
127e0 20 63 68 61 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d   char or_logic[]
127f0 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 31 2c   = { 0, 1, 2, 1,
12800 20 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32 20 7d   1, 1, 2, 1, 2 }
12810 3b 0a 20 20 20 20 76 31 20 3d 20 6f 72 5f 6c 6f  ;.    v1 = or_lo
12820 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20  gic[v1*3+v2];.  
12830 7d 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  }.  pOut = &aMem
12840 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28  [pOp->p3];.  if(
12850 20 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20 4d 65   v1==2 ){.    Me
12860 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
12870 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  t, MEM_Null);.  
12880 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d  }else{.    pOut-
12890 3e 75 2e 69 20 3d 20 76 31 3b 0a 20 20 20 20 4d  >u.i = v1;.    M
128a0 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
128b0 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  ut, MEM_Int);.  
128c0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
128d0 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20   Opcode: Not P1 
128e0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
128f0 70 73 69 73 3a 20 72 5b 50 32 5d 3d 20 21 72 5b  psis: r[P2]= !r[
12900 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  P1].**.** Interp
12910 72 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ret the value in
12920 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20   register P1 as 
12930 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
12940 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62    Store the.** b
12950 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e  oolean complemen
12960 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  t in register P2
12970 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
12980 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
12990 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  s .** NULL, then
129a0 20 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65   a NULL is store
129b0 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  d in P2..*/.case
129c0 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20   OP_Not: {      
129d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
129e0 65 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31  e as TK_NOT, in1
129f0 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31  , out2 */.  pIn1
12a00 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
12a10 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
12a20 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71  m[pOp->p2];.  sq
12a30 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
12a40 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 69 66 28  ull(pOut);.  if(
12a50 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
12a60 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  MEM_Null)==0 ){.
12a70 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20      pOut->flags 
12a80 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
12a90 4f 75 74 2d 3e 75 2e 69 20 3d 20 21 73 71 6c 69  Out->u.i = !sqli
12aa0 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
12ab0 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65  pIn1);.  }.  bre
12ac0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
12ad0 3a 20 42 69 74 4e 6f 74 20 50 31 20 50 32 20 2a  : BitNot P1 P2 *
12ae0 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
12af0 3a 20 72 5b 50 31 5d 3d 20 7e 72 5b 50 31 5d 0a  : r[P1]= ~r[P1].
12b00 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  **.** Interpret 
12b10 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
12b20 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61 6e  egister P1 as an
12b30 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f 72 65   integer.  Store
12b40 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63 6f 6d   the.** ones-com
12b50 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 50  plement of the P
12b60 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  1 value into reg
12b70 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 50 31  ister P2.  If P1
12b80 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55 4c 4c   holds.** a NULL
12b90 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20 4e 55   then store a NU
12ba0 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73  LL in P2..*/.cas
12bb0 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 20 20  e OP_BitNot: {  
12bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
12bd0 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f 54 2c  me as TK_BITNOT,
12be0 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20   in1, out2 */.  
12bf0 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
12c00 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
12c10 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
12c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
12c30 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
12c40 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
12c50 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
12c60 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c   ){.    pOut->fl
12c70 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
12c80 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 7e     pOut->u.i = ~
12c90 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
12ca0 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20  lue(pIn1);.  }. 
12cb0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
12cc0 63 6f 64 65 3a 20 4f 6e 63 65 20 50 31 20 50 32  code: Once P1 P2
12cd0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20   * * *.**.** If 
12ce0 74 68 65 20 50 31 20 76 61 6c 75 65 20 69 73 20  the P1 value is 
12cf0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 50 31 20  equal to the P1 
12d00 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 4f 50 5f  value on the OP_
12d10 49 6e 69 74 20 6f 70 63 6f 64 65 20 61 74 0a 2a  Init opcode at.*
12d20 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 30 2c  * instruction 0,
12d30 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
12d40 2e 20 20 49 66 20 74 68 65 20 74 77 6f 20 50 31  .  If the two P1
12d50 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 2c 20   values differ, 
12d60 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 68 65 20  then.** set the 
12d70 50 31 20 76 61 6c 75 65 20 6f 6e 20 74 68 69 73  P1 value on this
12d80 20 6f 70 63 6f 64 65 20 74 6f 20 65 71 75 61 6c   opcode to equal
12d90 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 6f 6e   the P1 value on
12da0 20 74 68 65 20 4f 50 5f 49 6e 69 74 0a 2a 2a 20   the OP_Init.** 
12db0 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  and fall through
12dc0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 6e 63  ..*/.case OP_Onc
12dd0 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  e: {            
12de0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73   /* jump */.  as
12df0 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b 30 5d 2e  sert( p->aOp[0].
12e00 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
12e10 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
12e20 61 6b 65 6e 28 70 2d 3e 61 4f 70 5b 30 5d 2e 70  aken(p->aOp[0].p
12e30 31 3d 3d 70 4f 70 2d 3e 70 31 2c 20 32 29 3b 0a  1==pOp->p1, 2);.
12e40 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 30 5d 2e    if( p->aOp[0].
12e50 70 31 3d 3d 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  p1==pOp->p1 ){. 
12e60 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
12e70 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p2;.  }else{.   
12e80 20 70 4f 70 2d 3e 70 31 20 3d 20 70 2d 3e 61 4f   pOp->p1 = p->aO
12e90 70 5b 30 5d 2e 70 31 3b 0a 20 20 7d 0a 20 20 62  p[0].p1;.  }.  b
12ea0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
12eb0 64 65 3a 20 49 66 20 50 31 20 50 32 20 50 33 20  de: If P1 P2 P3 
12ec0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74  * *.**.** Jump t
12ed0 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75  o P2 if the valu
12ee0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
12ef0 20 69 73 20 74 72 75 65 2e 20 20 54 68 65 20 76   is true.  The v
12f00 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  alue.** is consi
12f10 64 65 72 65 64 20 74 72 75 65 20 69 66 20 69 74  dered true if it
12f20 20 69 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20   is numeric and 
12f30 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68  non-zero.  If th
12f40 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31  e value.** in P1
12f50 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
12f60 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61  ke the jump if a
12f70 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33 20 69 73  nd only if P3 is
12f80 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 2f 2a   non-zero..*/./*
12f90 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74 20 50   Opcode: IfNot P
12fa0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
12fb0 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
12fc0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
12fd0 69 73 74 65 72 20 50 31 20 69 73 20 46 61 6c 73  ister P1 is Fals
12fe0 65 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a  e.  The value.**
12ff0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 66   is considered f
13000 61 6c 73 65 20 69 66 20 69 74 20 68 61 73 20 61  alse if it has a
13010 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20 6f   numeric value o
13020 66 20 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20  f zero.  If the 
13030 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69  value.** in P1 i
13040 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65  s NULL then take
13050 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61 6e 64   the jump if and
13060 20 6f 6e 6c 79 20 69 66 20 50 33 20 69 73 20 6e   only if P3 is n
13070 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65  on-zero..*/.case
13080 20 4f 50 5f 49 66 3a 20 20 20 20 20 20 20 20 20   OP_If:         
13090 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
130a0 20 69 6e 31 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in1 */.case OP_
130b0 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20  IfNot: {        
130c0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
130d0 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a 20 20 70   */.  int c;.  p
130e0 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
130f0 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31  >p1];.  if( pIn1
13100 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
13110 6c 6c 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 4f  ll ){.    c = pO
13120 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p->p3;.  }else{.
13130 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
13140 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
13150 54 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  T.    c = sqlite
13160 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49  3VdbeIntValue(pI
13170 6e 31 29 21 3d 30 3b 0a 23 65 6c 73 65 0a 20 20  n1)!=0;.#else.  
13180 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
13190 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31 29  eRealValue(pIn1)
131a0 21 3d 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 20 20  !=0.0;.#endif.  
131b0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
131c0 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20 29 20 63 20  e==OP_IfNot ) c 
131d0 3d 20 21 63 3b 0a 20 20 7d 0a 20 20 56 64 62 65  = !c;.  }.  Vdbe
131e0 42 72 61 6e 63 68 54 61 6b 65 6e 28 63 21 3d 30  BranchTaken(c!=0
131f0 2c 20 32 29 3b 0a 20 20 69 66 28 20 63 20 29 7b  , 2);.  if( c ){
13200 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
13210 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61  o_p2;.  }.  brea
13220 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
13230 20 49 73 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20   IsNull P1 P2 * 
13240 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
13250 20 69 66 20 72 5b 50 31 5d 3d 3d 4e 55 4c 4c 20   if r[P1]==NULL 
13260 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75  goto P2.**.** Ju
13270 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
13280 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
13290 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  r P1 is NULL..*/
132a0 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c 6c 3a  .case OP_IsNull:
132b0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
132c0 20 73 61 6d 65 20 61 73 20 54 4b 5f 49 53 4e 55   same as TK_ISNU
132d0 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f  LL, jump, in1 */
132e0 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
132f0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65  pOp->p1];.  Vdbe
13300 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 28 70 49  BranchTaken( (pI
13310 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
13320 4e 75 6c 6c 29 21 3d 30 2c 20 32 29 3b 0a 20 20  Null)!=0, 2);.  
13330 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
13340 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20   & MEM_Null)!=0 
13350 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
13360 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
13370 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
13380 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50 32  e: NotNull P1 P2
13390 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
133a0 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d 4e 55  is: if r[P1]!=NU
133b0 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a  LL goto P2.**.**
133c0 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
133d0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
133e0 73 74 65 72 20 50 31 20 69 73 20 6e 6f 74 20 4e  ster P1 is not N
133f0 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f  ULL.  .*/.case O
13400 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20 20 20  P_NotNull: {    
13410 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
13420 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a  as TK_NOTNULL, j
13430 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  ump, in1 */.  pI
13440 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
13450 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  p1];.  VdbeBranc
13460 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d 3e 66  hTaken( (pIn1->f
13470 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
13480 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 28  ==0, 2);.  if( (
13490 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
134a0 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Null)==0 ){.  
134b0 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
134c0 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
134d0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
134e0 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20 50 34  lumn P1 P2 P3 P4
134f0 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
13500 20 72 5b 50 33 5d 3d 50 58 0a 2a 2a 0a 2a 2a 20   r[P3]=PX.**.** 
13510 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 64 61  Interpret the da
13520 74 61 20 74 68 61 74 20 63 75 72 73 6f 72 20 50  ta that cursor P
13530 31 20 70 6f 69 6e 74 73 20 74 6f 20 61 73 20 61  1 points to as a
13540 20 73 74 72 75 63 74 75 72 65 20 62 75 69 6c 74   structure built
13550 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 4d 61   using.** the Ma
13560 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
13570 74 69 6f 6e 2e 20 20 28 53 65 65 20 74 68 65 20  tion.  (See the 
13580 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
13590 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
135a0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
135b0 61 62 6f 75 74 20 74 68 65 20 66 6f 72 6d 61 74  about the format
135c0 20 6f 66 20 74 68 65 20 64 61 74 61 2e 29 20 20   of the data.)  
135d0 45 78 74 72 61 63 74 20 74 68 65 20 50 32 2d 74  Extract the P2-t
135e0 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66 72 6f 6d  h column.** from
135f0 20 74 68 69 73 20 72 65 63 6f 72 64 2e 20 20 49   this record.  I
13600 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73  f there are less
13610 20 74 68 61 74 20 28 50 32 2b 31 29 20 0a 2a 2a   that (P2+1) .**
13620 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 72   values in the r
13630 65 63 6f 72 64 2c 20 65 78 74 72 61 63 74 20 61  ecord, extract a
13640 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
13650 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   value extracted
13660 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
13670 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a  gister P3..**.**
13680 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
13690 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
136a0 61 6e 20 50 32 20 66 69 65 6c 64 73 2c 20 74 68  an P2 fields, th
136b0 65 6e 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c  en extract a NUL
136c0 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68  L.  Or,.** if th
136d0 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69 73  e P4 argument is
136e0 20 61 20 50 34 5f 4d 45 4d 20 75 73 65 20 74 68   a P4_MEM use th
136f0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
13700 34 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a  4 argument as.**
13710 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
13720 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
13730 5f 43 4c 45 41 52 43 41 43 48 45 20 62 69 74 20  _CLEARCACHE bit 
13740 69 73 20 73 65 74 20 6f 6e 20 50 35 20 61 6e 64  is set on P5 and
13750 20 50 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d   P1 is a pseudo-
13760 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 0a 2a 2a  table cursor,.**
13770 20 74 68 65 6e 20 74 68 65 20 63 61 63 68 65 20   then the cache 
13780 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  of the cursor is
13790 20 72 65 73 65 74 20 70 72 69 6f 72 20 74 6f 20   reset prior to 
137a0 65 78 74 72 61 63 74 69 6e 67 20 74 68 65 20 63  extracting the c
137b0 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 66 69  olumn..** The fi
137c0 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 67  rst OP_Column ag
137d0 61 69 6e 73 74 20 61 20 70 73 65 75 64 6f 2d 74  ainst a pseudo-t
137e0 61 62 6c 65 20 61 66 74 65 72 20 74 68 65 20 76  able after the v
137f0 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6e 74  alue of the cont
13800 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ent.** register 
13810 68 61 73 20 63 68 61 6e 67 65 64 20 73 68 6f 75  has changed shou
13820 6c 64 20 68 61 76 65 20 74 68 69 73 20 62 69 74  ld have this bit
13830 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   set..**.** If t
13840 68 65 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  he OPFLAG_LENGTH
13850 41 52 47 20 61 6e 64 20 4f 50 46 4c 41 47 5f 54  ARG and OPFLAG_T
13860 59 50 45 4f 46 41 52 47 20 62 69 74 73 20 61 72  YPEOFARG bits ar
13870 65 20 73 65 74 20 6f 6e 20 50 35 20 77 68 65 6e  e set on P5 when
13880 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
13890 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
138a0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61 73 20  only be used as 
138b0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  the argument of 
138c0 61 20 6c 65 6e 67 74 68 28 29 0a 2a 2a 20 6f 72  a length().** or
138d0 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69   typeof() functi
138e0 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  on, respectively
138f0 2e 20 20 54 68 65 20 6c 6f 61 64 69 6e 67 20 6f  .  The loading o
13900 66 20 6c 61 72 67 65 20 62 6c 6f 62 73 20 63 61  f large blobs ca
13910 6e 20 62 65 0a 2a 2a 20 73 6b 69 70 70 65 64 20  n be.** skipped 
13920 66 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64  for length() and
13930 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 6c 6f 61   all content loa
13940 64 69 6e 67 20 63 61 6e 20 62 65 20 73 6b 69 70  ding can be skip
13950 70 65 64 20 66 6f 72 20 74 79 70 65 6f 66 28 29  ped for typeof()
13960 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c  ..*/.case OP_Col
13970 75 6d 6e 3a 20 7b 0a 20 20 69 6e 74 20 70 32 3b  umn: {.  int p2;
13980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
13990 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74 6f 20  olumn number to 
139a0 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 56 64  retrieve */.  Vd
139b0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20  beCursor *pC;   
139c0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
139d0 73 6f 72 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  sor */.  BtCurso
139e0 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a 20 54  r *pCrsr;   /* T
139f0 68 65 20 42 54 72 65 65 20 63 75 72 73 6f 72 20  he BTree cursor 
13a00 2a 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66 73 65  */.  u32 *aOffse
13a10 74 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66 66 73  t;      /* aOffs
13a20 65 74 5b 69 5d 20 69 73 20 6f 66 66 73 65 74 20  et[i] is offset 
13a30 74 6f 20 73 74 61 72 74 20 6f 66 20 64 61 74 61  to start of data
13a40 20 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   for i-th column
13a50 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20   */.  int len;  
13a60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13a70 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65  length of the se
13a80 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 66 6f  rialized data fo
13a90 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  r the column */.
13aa0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
13ab0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
13ac0 6e 74 65 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  nter */.  Mem *p
13ad0 44 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  Dest;        /* 
13ae0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
13af0 68 65 20 65 78 74 72 61 63 74 65 64 20 76 61 6c  he extracted val
13b00 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 73 4d 65 6d  ue */.  Mem sMem
13b10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
13b20 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20 72 65  r storing the re
13b30 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64  cord being decod
13b40 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ed */.  const u8
13b50 20 2a 7a 44 61 74 61 3b 20 20 20 2f 2a 20 50 61   *zData;   /* Pa
13b60 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
13b70 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
13b80 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 48  /.  const u8 *zH
13b90 64 72 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  dr;    /* Next u
13ba0 6e 70 61 72 73 65 64 20 62 79 74 65 20 6f 66 20  nparsed byte of 
13bb0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
13bc0 63 6f 6e 73 74 20 75 38 20 2a 7a 45 6e 64 48 64  const u8 *zEndHd
13bd0 72 3b 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  r; /* Pointer to
13be0 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
13bf0 72 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  r the header */.
13c00 20 20 75 33 32 20 6f 66 66 73 65 74 3b 20 20 20    u32 offset;   
13c10 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
13c20 6e 74 6f 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  nto the data */.
13c30 20 20 75 36 34 20 6f 66 66 73 65 74 36 34 3b 20    u64 offset64; 
13c40 20 20 20 20 20 2f 2a 20 36 34 2d 62 69 74 20 6f       /* 64-bit o
13c50 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 61  ffset */.  u32 a
13c60 76 61 69 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  vail;         /*
13c70 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
13c80 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 64 61   of available da
13c90 74 61 20 2a 2f 0a 20 20 75 33 32 20 74 3b 20 20  ta */.  u32 t;  
13ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
13cb0 74 79 70 65 20 63 6f 64 65 20 66 72 6f 6d 20 74  type code from t
13cc0 68 65 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  he record header
13cd0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 67 3b   */.  Mem *pReg;
13ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 73 65 75           /* Pseu
13cf0 64 6f 54 61 62 6c 65 20 69 6e 70 75 74 20 72 65  doTable input re
13d00 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 70 43 20  gister */..  pC 
13d10 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
13d20 70 31 5d 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d  p1];.  p2 = pOp-
13d30 3e 70 32 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >p2;..  /* If th
13d40 65 20 63 75 72 73 6f 72 20 63 61 63 68 65 20 69  e cursor cache i
13d50 73 20 73 74 61 6c 65 2c 20 62 72 69 6e 67 20 69  s stale, bring i
13d60 74 20 75 70 2d 74 6f 2d 64 61 74 65 20 2a 2f 0a  t up-to-date */.
13d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
13d80 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 26  beCursorMoveto(&
13d90 70 43 2c 20 26 70 32 29 3b 0a 20 20 69 66 28 20  pC, &p2);.  if( 
13da0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
13db0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20  due_to_error;.. 
13dc0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
13dd0 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28  >0 && pOp->p3<=(
13de0 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
13df0 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 44 65  Cursor) );.  pDe
13e00 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  st = &aMem[pOp->
13e10 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p3];.  memAboutT
13e20 6f 43 68 61 6e 67 65 28 70 2c 20 70 44 65 73 74  oChange(p, pDest
13e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
13e40 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
13e50 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
13e60 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
13e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 32   );.  assert( p2
13e80 3c 70 43 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20  <pC->nField );. 
13e90 20 61 4f 66 66 73 65 74 20 3d 20 70 43 2d 3e 61   aOffset = pC->a
13ea0 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74  Offset;.  assert
13eb0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d  ( pC->eCurType!=
13ec0 43 55 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a  CURTYPE_VTAB );.
13ed0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
13ee0 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f  urType!=CURTYPE_
13ef0 50 53 45 55 44 4f 20 7c 7c 20 70 43 2d 3e 6e 75  PSEUDO || pC->nu
13f00 6c 6c 52 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  llRow );.  asser
13f10 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21  t( pC->eCurType!
13f20 3d 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 20  =CURTYPE_SORTER 
13f30 29 3b 0a 0a 20 20 69 66 28 20 70 43 2d 3e 63 61  );..  if( pC->ca
13f40 63 68 65 53 74 61 74 75 73 21 3d 70 2d 3e 63 61  cheStatus!=p->ca
13f50 63 68 65 43 74 72 20 29 7b 20 20 20 20 20 20 20  cheCtr ){       
13f60 20 20 20 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d           /*OPTIM
13f70 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45  IZATION-IF-FALSE
13f80 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e  */.    if( pC->n
13f90 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ullRow ){.      
13fa0 69 66 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  if( pC->eCurType
13fb0 3d 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f  ==CURTYPE_PSEUDO
13fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13fd0 72 74 28 20 70 43 2d 3e 75 63 2e 70 73 65 75 64  rt( pC->uc.pseud
13fe0 6f 54 61 62 6c 65 52 65 67 3e 30 20 29 3b 0a 20  oTableReg>0 );. 
13ff0 20 20 20 20 20 20 20 70 52 65 67 20 3d 20 26 61         pReg = &a
14000 4d 65 6d 5b 70 43 2d 3e 75 63 2e 70 73 65 75 64  Mem[pC->uc.pseud
14010 6f 54 61 62 6c 65 52 65 67 5d 3b 0a 20 20 20 20  oTableReg];.    
14020 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 67      assert( pReg
14030 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
14040 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ob );.        as
14050 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
14060 28 70 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  (pReg) );.      
14070 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a    pC->payloadSiz
14080 65 20 3d 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20  e = pC->szRow = 
14090 61 76 61 69 6c 20 3d 20 70 52 65 67 2d 3e 6e 3b  avail = pReg->n;
140a0 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 61 52 6f  .        pC->aRo
140b0 77 20 3d 20 28 75 38 2a 29 70 52 65 67 2d 3e 7a  w = (u8*)pReg->z
140c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
140d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
140e0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65  beMemSetNull(pDe
140f0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  st);.        got
14100 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b  o op_column_out;
14110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14120 73 65 7b 0a 20 20 20 20 20 20 70 43 72 73 72 20  se{.      pCrsr 
14130 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
14140 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14150 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
14160 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
14170 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 72       assert( pCr
14180 73 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sr );.      asse
14190 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
141a0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
141b0 72 73 72 29 20 29 3b 0a 20 20 20 20 20 20 70 43  rsr) );.      pC
141c0 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20  ->payloadSize = 
141d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
141e0 6f 61 64 53 69 7a 65 28 70 43 72 73 72 29 3b 0a  oadSize(pCrsr);.
141f0 20 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d        pC->aRow =
14200 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
14210 6c 6f 61 64 46 65 74 63 68 28 70 43 72 73 72 2c  loadFetch(pCrsr,
14220 20 26 61 76 61 69 6c 29 3b 0a 20 20 20 20 20 20   &avail);.      
14230 61 73 73 65 72 74 28 20 61 76 61 69 6c 3c 3d 36  assert( avail<=6
14240 35 35 33 36 20 29 3b 20 20 2f 2a 20 4d 61 78 69  5536 );  /* Maxi
14250 6d 75 6d 20 70 61 67 65 20 73 69 7a 65 20 69 73  mum page size is
14260 20 36 34 4b 69 42 20 2a 2f 0a 20 20 20 20 20 20   64KiB */.      
14270 69 66 28 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53  if( pC->payloadS
14280 69 7a 65 20 3c 3d 20 28 75 33 32 29 61 76 61 69  ize <= (u32)avai
14290 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 2d  l ){.        pC-
142a0 3e 73 7a 52 6f 77 20 3d 20 70 43 2d 3e 70 61 79  >szRow = pC->pay
142b0 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20 20 20  loadSize;.      
142c0 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 70 61  }else if( pC->pa
142d0 79 6c 6f 61 64 53 69 7a 65 20 3e 20 28 75 33 32  yloadSize > (u32
142e0 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  )db->aLimit[SQLI
142f0 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
14300 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
14310 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 20 20   too_big;.      
14320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
14330 43 2d 3e 73 7a 52 6f 77 20 3d 20 61 76 61 69 6c  C->szRow = avail
14340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14350 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61      pC->cacheSta
14360 74 75 73 20 3d 20 70 2d 3e 63 61 63 68 65 43 74  tus = p->cacheCt
14370 72 3b 0a 20 20 20 20 70 43 2d 3e 69 48 64 72 4f  r;.    pC->iHdrO
14380 66 66 73 65 74 20 3d 20 67 65 74 56 61 72 69 6e  ffset = getVarin
14390 74 33 32 28 70 43 2d 3e 61 52 6f 77 2c 20 6f 66  t32(pC->aRow, of
143a0 66 73 65 74 29 3b 0a 20 20 20 20 70 43 2d 3e 6e  fset);.    pC->n
143b0 48 64 72 50 61 72 73 65 64 20 3d 20 30 3b 0a 20  HdrParsed = 0;. 
143c0 20 20 20 61 4f 66 66 73 65 74 5b 30 5d 20 3d 20     aOffset[0] = 
143d0 6f 66 66 73 65 74 3b 0a 0a 0a 20 20 20 20 69 66  offset;...    if
143e0 28 20 61 76 61 69 6c 3c 6f 66 66 73 65 74 20 29  ( avail<offset )
143f0 7b 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a  {      /*OPTIMIZ
14400 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
14410 0a 20 20 20 20 20 20 2f 2a 20 70 43 2d 3e 61 52  .      /* pC->aR
14420 6f 77 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ow does not have
14430 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
14440 69 72 65 20 72 6f 77 2c 20 62 75 74 20 69 74 20  ire row, but it 
14450 64 6f 65 73 20 61 74 20 6c 65 61 73 74 0a 20 20  does at least.  
14460 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 63      ** need to c
14470 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20  over the header 
14480 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20  of the record.  
14490 49 66 20 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73  If pC->aRow does
144a0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 20 20 20   not contain.   
144b0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6c 65     ** the comple
144c0 74 65 20 68 65 61 64 65 72 2c 20 74 68 65 6e 20  te header, then 
144d0 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f 2c 20  set it to zero, 
144e0 66 6f 72 63 69 6e 67 20 74 68 65 20 68 65 61 64  forcing the head
144f0 65 72 20 74 6f 20 62 65 0a 20 20 20 20 20 20 2a  er to be.      *
14500 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
14510 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20  located. */.    
14520 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a    pC->aRow = 0;.
14530 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20        pC->szRow 
14540 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  = 0;..      /* M
14550 61 6b 65 20 73 75 72 65 20 61 20 63 6f 72 72 75  ake sure a corru
14560 70 74 20 64 61 74 61 62 61 73 65 20 68 61 73 20  pt database has 
14570 6e 6f 74 20 67 69 76 65 6e 20 75 73 20 61 6e 20  not given us an 
14580 6f 76 65 72 73 69 7a 65 20 68 65 61 64 65 72 2e  oversize header.
14590 0a 20 20 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  .      ** Do thi
145a0 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69 64 20 61  s now to avoid a
145b0 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65 6d 6f 72  n oversize memor
145c0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20  y allocation..  
145d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
145e0 54 79 70 65 20 65 6e 74 72 69 65 73 20 63 61 6e  Type entries can
145f0 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e   be between 1 an
14600 64 20 35 20 62 79 74 65 73 20 65 61 63 68 2e 20  d 5 bytes each. 
14610 20 42 75 74 20 34 20 61 6e 64 20 35 20 62 79 74   But 4 and 5 byt
14620 65 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 73  e.      ** types
14630 20 75 73 65 20 73 6f 20 6d 75 63 68 20 64 61 74   use so much dat
14640 61 20 73 70 61 63 65 20 74 68 61 74 20 74 68 65  a space that the
14650 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34  re can only be 4
14660 30 39 36 20 61 6e 64 20 33 32 20 6f 66 0a 20 20  096 and 32 of.  
14670 20 20 20 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73      ** them, res
14680 70 65 63 74 69 76 65 6c 79 2e 20 20 53 6f 20 74  pectively.  So t
14690 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 61 64 65  he maximum heade
146a0 72 20 6c 65 6e 67 74 68 20 72 65 73 75 6c 74 73  r length results
146b0 20 66 72 6f 6d 20 61 0a 20 20 20 20 20 20 2a 2a   from a.      **
146c0 20 33 2d 62 79 74 65 20 74 79 70 65 20 66 6f 72   3-byte type for
146d0 20 65 61 63 68 20 6f 66 20 74 68 65 20 6d 61 78   each of the max
146e0 69 6d 75 6d 20 6f 66 20 33 32 37 36 38 20 63 6f  imum of 32768 co
146f0 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68 72 65 65  lumns plus three
14700 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 20  .      ** extra 
14710 62 79 74 65 73 20 66 6f 72 20 74 68 65 20 68 65  bytes for the he
14720 61 64 65 72 20 6c 65 6e 67 74 68 20 69 74 73 65  ader length itse
14730 6c 66 2e 20 20 33 32 37 36 38 2a 33 20 2b 20 33  lf.  32768*3 + 3
14740 20 3d 20 39 38 33 30 37 2e 0a 20 20 20 20 20 20   = 98307..      
14750 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  */.      if( off
14760 73 65 74 20 3e 20 39 38 33 30 37 20 7c 7c 20 6f  set > 98307 || o
14770 66 66 73 65 74 20 3e 20 70 43 2d 3e 70 61 79 6c  ffset > pC->payl
14780 6f 61 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  oadSize ){.     
14790 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
147a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
147b0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
147c0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
147d0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
147e0 69 66 28 20 6f 66 66 73 65 74 3e 30 20 29 7b 20  if( offset>0 ){ 
147f0 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
14800 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 2f  F-TRUE*/.      /
14810 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
14820 67 6f 74 6f 20 69 73 20 61 6e 20 6f 70 74 69 6d  goto is an optim
14830 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 63 61 6e  ization.  It can
14840 20 62 65 20 6f 6d 69 74 74 65 64 20 61 6e 64 0a   be omitted and.
14850 20 20 20 20 20 20 2a 2a 20 65 76 65 72 79 74 68        ** everyth
14860 69 6e 67 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77  ing will still w
14870 6f 72 6b 2e 20 20 42 75 74 20 4f 50 5f 43 6f 6c  ork.  But OP_Col
14880 75 6d 6e 20 69 73 20 6d 65 61 73 75 72 61 62 6c  umn is measurabl
14890 79 20 66 61 73 74 65 72 0a 20 20 20 20 20 20 2a  y faster.      *
148a0 2a 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  * by skipping th
148b0 65 20 73 75 62 73 65 71 75 65 6e 74 20 63 6f 6e  e subsequent con
148c0 64 69 74 69 6f 6e 61 6c 2c 20 77 68 69 63 68 20  ditional, which 
148d0 69 73 20 61 6c 77 61 79 73 20 74 72 75 65 2e 0a  is always true..
148e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 7a        */.      z
148f0 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77 3b  Data = pC->aRow;
14900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14910 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d 70  C->nHdrParsed<=p
14920 32 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  2 );         /* 
14930 43 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 6b 69 70  Conditional skip
14940 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  ped */.      got
14950 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64  o op_column_read
14960 5f 68 65 61 64 65 72 3b 0a 20 20 20 20 7d 0a 20  _header;.    }. 
14970 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
14980 72 65 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  re at least the 
14990 66 69 72 73 74 20 70 32 2b 31 20 65 6e 74 72 69  first p2+1 entri
149a0 65 73 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  es of the header
149b0 20 68 61 76 65 20 62 65 65 6e 0a 20 20 2a 2a 20   have been.  ** 
149c0 70 61 72 73 65 64 20 61 6e 64 20 76 61 6c 69 64  parsed and valid
149d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
149e0 69 6e 20 61 4f 66 66 73 65 74 5b 5d 20 61 6e 64  in aOffset[] and
149f0 20 70 43 2d 3e 61 54 79 70 65 5b 5d 2e 0a 20 20   pC->aType[]..  
14a00 2a 2f 0a 20 20 69 66 28 20 70 43 2d 3e 6e 48 64  */.  if( pC->nHd
14a10 72 50 61 72 73 65 64 3c 3d 70 32 20 29 7b 0a 20  rParsed<=p2 ){. 
14a20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
14a30 73 20 6d 6f 72 65 20 68 65 61 64 65 72 20 61 76  s more header av
14a40 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 61 72 73  ailable for pars
14a50 69 6e 67 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ing in the recor
14a60 64 2c 20 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f  d, try.    ** to
14a70 20 65 78 74 72 61 63 74 20 61 64 64 69 74 69 6f   extract additio
14a80 6e 61 6c 20 66 69 65 6c 64 73 20 75 70 20 74 68  nal fields up th
14a90 72 6f 75 67 68 20 74 68 65 20 70 32 2b 31 2d 74  rough the p2+1-t
14aa0 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2f 0a  h field .    */.
14ab0 20 20 20 20 69 66 28 20 70 43 2d 3e 69 48 64 72      if( pC->iHdr
14ac0 4f 66 66 73 65 74 3c 61 4f 66 66 73 65 74 5b 30  Offset<aOffset[0
14ad0 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61  ] ){.      /* Ma
14ae0 6b 65 20 73 75 72 65 20 7a 44 61 74 61 20 70 6f  ke sure zData po
14af0 69 6e 74 73 20 74 6f 20 65 6e 6f 75 67 68 20 6f  ints to enough o
14b00 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  f the record to 
14b10 63 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72  cover the header
14b20 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
14b30 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 7b 0a 20 20  C->aRow==0 ){.  
14b40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4d        memset(&sM
14b50 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d  em, 0, sizeof(sM
14b60 65 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em));.        rc
14b70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
14b80 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 75  mFromBtree(pC->u
14b90 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 61 4f  c.pCursor, 0, aO
14ba0 66 66 73 65 74 5b 30 5d 2c 20 26 73 4d 65 6d 29  ffset[0], &sMem)
14bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14bc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
14bd0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
14be0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7a  error;.        z
14bf0 44 61 74 61 20 3d 20 28 75 38 2a 29 73 4d 65 6d  Data = (u8*)sMem
14c00 2e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  .z;.      }else{
14c10 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d  .        zData =
14c20 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20   pC->aRow;.     
14c30 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46   }.  .      /* F
14c40 69 6c 6c 20 69 6e 20 70 43 2d 3e 61 54 79 70 65  ill in pC->aType
14c50 5b 69 5d 20 61 6e 64 20 61 4f 66 66 73 65 74 5b  [i] and aOffset[
14c60 69 5d 20 76 61 6c 75 65 73 20 74 68 72 6f 75 67  i] values throug
14c70 68 20 74 68 65 20 70 32 2d 74 68 20 66 69 65 6c  h the p2-th fiel
14c80 64 2e 20 2a 2f 0a 20 20 20 20 6f 70 5f 63 6f 6c  d. */.    op_col
14c90 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65 72 3a  umn_read_header:
14ca0 0a 20 20 20 20 20 20 69 20 3d 20 70 43 2d 3e 6e  .      i = pC->n
14cb0 48 64 72 50 61 72 73 65 64 3b 0a 20 20 20 20 20  HdrParsed;.     
14cc0 20 6f 66 66 73 65 74 36 34 20 3d 20 61 4f 66 66   offset64 = aOff
14cd0 73 65 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 48  set[i];.      zH
14ce0 64 72 20 3d 20 7a 44 61 74 61 20 2b 20 70 43 2d  dr = zData + pC-
14cf0 3e 69 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  >iHdrOffset;.   
14d00 20 20 20 7a 45 6e 64 48 64 72 20 3d 20 7a 44 61     zEndHdr = zDa
14d10 74 61 20 2b 20 61 4f 66 66 73 65 74 5b 30 5d 3b  ta + aOffset[0];
14d20 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
14d30 20 20 20 69 66 28 20 28 74 20 3d 20 7a 48 64 72     if( (t = zHdr
14d40 5b 30 5d 29 3c 30 78 38 30 20 29 7b 0a 20 20 20  [0])<0x80 ){.   
14d50 20 20 20 20 20 20 20 7a 48 64 72 2b 2b 3b 0a 20         zHdr++;. 
14d60 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 36           offset6
14d70 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  4 += sqlite3Vdbe
14d80 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70  OneByteSerialTyp
14d90 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20 20  eLen(t);.       
14da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14db0 20 20 7a 48 64 72 20 2b 3d 20 73 71 6c 69 74 65    zHdr += sqlite
14dc0 33 47 65 74 56 61 72 69 6e 74 33 32 28 7a 48 64  3GetVarint32(zHd
14dd0 72 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 20 20  r, &t);.        
14de0 20 20 6f 66 66 73 65 74 36 34 20 2b 3d 20 73 71    offset64 += sq
14df0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
14e00 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20  ypeLen(t);.     
14e10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 2d     }.        pC-
14e20 3e 61 54 79 70 65 5b 69 2b 2b 5d 20 3d 20 74 3b  >aType[i++] = t;
14e30 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73 65 74  .        aOffset
14e40 5b 69 5d 20 3d 20 28 75 33 32 29 28 6f 66 66 73  [i] = (u32)(offs
14e50 65 74 36 34 20 26 20 30 78 66 66 66 66 66 66 66  et64 & 0xfffffff
14e60 66 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  f);.      }while
14e70 28 20 69 3c 3d 70 32 20 26 26 20 7a 48 64 72 3c  ( i<=p2 && zHdr<
14e80 7a 45 6e 64 48 64 72 20 29 3b 0a 0a 20 20 20 20  zEndHdr );..    
14e90 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
14ea0 69 73 20 63 6f 72 72 75 70 74 20 69 66 20 61 6e  is corrupt if an
14eb0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
14ec0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
14ed0 20 20 20 2a 2a 20 28 31 29 20 74 68 65 20 62 79     ** (1) the by
14ee0 74 65 73 20 6f 66 20 74 68 65 20 68 65 61 64 65  tes of the heade
14ef0 72 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  r extend past th
14f00 65 20 64 65 63 6c 61 72 65 64 20 68 65 61 64 65  e declared heade
14f10 72 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  r size.      ** 
14f20 28 32 29 20 74 68 65 20 65 6e 74 69 72 65 20 68  (2) the entire h
14f30 65 61 64 65 72 20 77 61 73 20 75 73 65 64 20 62  eader was used b
14f40 75 74 20 6e 6f 74 20 61 6c 6c 20 64 61 74 61 20  ut not all data 
14f50 77 61 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a  was used.      *
14f60 2a 20 28 33 29 20 74 68 65 20 65 6e 64 20 6f 66  * (3) the end of
14f70 20 74 68 65 20 64 61 74 61 20 65 78 74 65 6e 64   the data extend
14f80 73 20 62 65 79 6f 6e 64 20 74 68 65 20 65 6e 64  s beyond the end
14f90 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e 0a   of the record..
14fa0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
14fb0 66 28 20 28 7a 48 64 72 3e 3d 7a 45 6e 64 48 64  f( (zHdr>=zEndHd
14fc0 72 20 26 26 20 28 7a 48 64 72 3e 7a 45 6e 64 48  r && (zHdr>zEndH
14fd0 64 72 20 7c 7c 20 6f 66 66 73 65 74 36 34 21 3d  dr || offset64!=
14fe0 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 29  pC->payloadSize)
14ff0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 66 66  ).       || (off
15000 73 65 74 36 34 20 3e 20 70 43 2d 3e 70 61 79 6c  set64 > pC->payl
15010 6f 61 64 53 69 7a 65 29 0a 20 20 20 20 20 20 29  oadSize).      )
15020 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  {.        if( pC
15030 2d 3e 61 52 6f 77 3d 3d 30 20 29 20 73 71 6c 69  ->aRow==0 ) sqli
15040 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
15050 65 28 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20  e(&sMem);.      
15060 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
15070 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
15080 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
15090 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
150a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 43 2d 3e     }..      pC->
150b0 6e 48 64 72 50 61 72 73 65 64 20 3d 20 69 3b 0a  nHdrParsed = i;.
150c0 20 20 20 20 20 20 70 43 2d 3e 69 48 64 72 4f 66        pC->iHdrOf
150d0 66 73 65 74 20 3d 20 28 75 33 32 29 28 7a 48 64  fset = (u32)(zHd
150e0 72 20 2d 20 7a 44 61 74 61 29 3b 0a 20 20 20 20  r - zData);.    
150f0 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d    if( pC->aRow==
15100 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  0 ) sqlite3VdbeM
15110 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29  emRelease(&sMem)
15120 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15130 20 20 20 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     t = 0;.    }.
15140 0a 20 20 20 20 2f 2a 20 49 66 20 61 66 74 65 72  .    /* If after
15150 20 74 72 79 69 6e 67 20 74 6f 20 65 78 74 72 61   trying to extra
15160 63 74 20 6e 65 77 20 65 6e 74 72 69 65 73 20 66  ct new entries f
15170 72 6f 6d 20 74 68 65 20 68 65 61 64 65 72 2c 20  rom the header, 
15180 6e 48 64 72 50 61 72 73 65 64 20 69 73 0a 20 20  nHdrParsed is.  
15190 20 20 2a 2a 20 73 74 69 6c 6c 20 6e 6f 74 20 75    ** still not u
151a0 70 20 74 6f 20 70 32 2c 20 74 68 61 74 20 6d 65  p to p2, that me
151b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 63  ans that the rec
151c0 6f 72 64 20 68 61 73 20 66 65 77 65 72 20 74 68  ord has fewer th
151d0 61 6e 20 70 32 0a 20 20 20 20 2a 2a 20 63 6f 6c  an p2.    ** col
151e0 75 6d 6e 73 2e 20 20 53 6f 20 74 68 65 20 72 65  umns.  So the re
151f0 73 75 6c 74 20 77 69 6c 6c 20 62 65 20 65 69 74  sult will be eit
15200 68 65 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  her the default 
15210 76 61 6c 75 65 20 6f 72 20 61 20 4e 55 4c 4c 2e  value or a NULL.
15220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15230 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d  pC->nHdrParsed<=
15240 70 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p2 ){.      if( 
15250 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
15260 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MEM ){.        s
15270 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
15280 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74 2c 20  llowCopy(pDest, 
15290 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d 45  pOp->p4.pMem, ME
152a0 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20  M_Static);.     
152b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
152c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
152d0 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20  tNull(pDest);.  
152e0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
152f0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
15300 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
15310 20 20 20 74 20 3d 20 70 43 2d 3e 61 54 79 70 65     t = pC->aType
15320 5b 70 32 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  [p2];.  }..  /* 
15330 45 78 74 72 61 63 74 20 74 68 65 20 63 6f 6e 74  Extract the cont
15340 65 6e 74 20 66 6f 72 20 74 68 65 20 70 32 2b 31  ent for the p2+1
15350 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6e  -th column.  Con
15360 74 72 6f 6c 20 63 61 6e 20 6f 6e 6c 79 0a 20 20  trol can only.  
15370 2a 2a 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  ** reach this po
15380 69 6e 74 20 69 66 20 61 4f 66 66 73 65 74 5b 70  int if aOffset[p
15390 32 5d 2c 20 61 4f 66 66 73 65 74 5b 70 32 2b 31  2], aOffset[p2+1
153a0 5d 2c 20 61 6e 64 20 70 43 2d 3e 61 54 79 70 65  ], and pC->aType
153b0 5b 70 32 5d 20 61 72 65 0a 20 20 2a 2a 20 61 6c  [p2] are.  ** al
153c0 6c 20 76 61 6c 69 64 2e 0a 20 20 2a 2f 0a 20 20  l valid..  */.  
153d0 61 73 73 65 72 74 28 20 70 32 3c 70 43 2d 3e 6e  assert( p2<pC->n
153e0 48 64 72 50 61 72 73 65 64 20 29 3b 0a 20 20 61  HdrParsed );.  a
153f0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
15400 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
15410 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
15420 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
15430 70 44 65 73 74 29 20 29 3b 0a 20 20 69 66 28 20  pDest) );.  if( 
15440 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70  VdbeMemDynamic(p
15450 44 65 73 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  Dest) ){.    sql
15460 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
15470 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 20  ll(pDest);.  }. 
15480 20 61 73 73 65 72 74 28 20 74 3d 3d 70 43 2d 3e   assert( t==pC->
15490 61 54 79 70 65 5b 70 32 5d 20 29 3b 0a 20 20 69  aType[p2] );.  i
154a0 66 28 20 70 43 2d 3e 73 7a 52 6f 77 3e 3d 61 4f  f( pC->szRow>=aO
154b0 66 66 73 65 74 5b 70 32 2b 31 5d 20 29 7b 0a 20  ffset[p2+1] ){. 
154c0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
154d0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
154e0 65 72 65 20 74 68 65 20 64 65 73 69 72 65 64 20  ere the desired 
154f0 63 6f 6e 74 65 6e 74 20 66 69 74 73 20 6f 6e 20  content fits on 
15500 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 20  the original.   
15510 20 2a 2a 20 70 61 67 65 20 2d 20 77 68 65 72 65   ** page - where
15520 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20   the content is 
15530 6e 6f 74 20 6f 6e 20 61 6e 20 6f 76 65 72 66 6c  not on an overfl
15540 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 7a  ow page */.    z
15550 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77 20  Data = pC->aRow 
15560 2b 20 61 4f 66 66 73 65 74 5b 70 32 5d 3b 0a 20  + aOffset[p2];. 
15570 20 20 20 69 66 28 20 74 3c 31 32 20 29 7b 0a 20     if( t<12 ){. 
15580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15590 53 65 72 69 61 6c 47 65 74 28 7a 44 61 74 61 2c  SerialGet(zData,
155a0 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   t, pDest);.    
155b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
155c0 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  If the column va
155d0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c  lue is a string,
155e0 20 77 65 20 6e 65 65 64 20 61 20 70 65 72 73 69   we need a persi
155f0 73 74 65 6e 74 20 76 61 6c 75 65 2c 20 6e 6f 74  stent value, not
15600 0a 20 20 20 20 20 20 2a 2a 20 61 20 4d 45 4d 5f  .      ** a MEM_
15610 45 70 68 65 6d 20 76 61 6c 75 65 2e 20 20 54 68  Ephem value.  Th
15620 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 20 66  is branch is a f
15630 61 73 74 20 73 68 6f 72 74 2d 63 75 74 20 74 68  ast short-cut th
15640 61 74 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  at is equivalent
15650 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 63 61 6c  .      ** to cal
15660 6c 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  ling sqlite3Vdbe
15670 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20  SerialGet() and 
15680 73 71 6c 69 74 65 33 56 64 62 65 44 65 65 70 68  sqlite3VdbeDeeph
15690 65 6d 65 72 61 6c 69 7a 65 28 29 2e 0a 20 20 20  emeralize()..   
156a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
156b0 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c  ic const u16 aFl
156c0 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f  ag[] = { MEM_Blo
156d0 62 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  b, MEM_Str|MEM_T
156e0 65 72 6d 20 7d 3b 0a 20 20 20 20 20 20 70 44 65  erm };.      pDe
156f0 73 74 2d 3e 6e 20 3d 20 6c 65 6e 20 3d 20 28 74  st->n = len = (t
15700 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 44  -12)/2;.      pD
15710 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  est->enc = encod
15720 69 6e 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ing;.      if( p
15730 44 65 73 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3c  Dest->szMalloc <
15740 20 6c 65 6e 2b 32 20 29 7b 0a 20 20 20 20 20 20   len+2 ){.      
15750 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d    pDest->flags =
15760 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
15770 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
15780 62 65 4d 65 6d 47 72 6f 77 28 70 44 65 73 74 2c  beMemGrow(pDest,
15790 20 6c 65 6e 2b 32 2c 20 30 29 20 29 20 67 6f 74   len+2, 0) ) got
157a0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20  o no_mem;.      
157b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
157c0 44 65 73 74 2d 3e 7a 20 3d 20 70 44 65 73 74 2d  Dest->z = pDest-
157d0 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  >zMalloc;.      
157e0 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  }.      memcpy(p
157f0 44 65 73 74 2d 3e 7a 2c 20 7a 44 61 74 61 2c 20  Dest->z, zData, 
15800 6c 65 6e 29 3b 0a 20 20 20 20 20 20 70 44 65 73  len);.      pDes
15810 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20  t->z[len] = 0;. 
15820 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 5b 6c 65       pDest->z[le
15830 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  n+1] = 0;.      
15840 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d 20 61  pDest->flags = a
15850 46 6c 61 67 5b 74 26 31 5d 3b 0a 20 20 20 20 7d  Flag[t&1];.    }
15860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 44  .  }else{.    pD
15870 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  est->enc = encod
15880 69 6e 67 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73  ing;.    /* This
15890 20 62 72 61 6e 63 68 20 68 61 70 70 65 6e 73 20   branch happens 
158a0 6f 6e 6c 79 20 77 68 65 6e 20 63 6f 6e 74 65 6e  only when conten
158b0 74 20 69 73 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  t is on overflow
158c0 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 69 66   pages */.    if
158d0 28 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f  ( ((pOp->p5 & (O
158e0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c  PFLAG_LENGTHARG|
158f0 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
15900 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ))!=0.          
15910 26 26 20 28 28 74 3e 3d 31 32 20 26 26 20 28 74  && ((t>=12 && (t
15920 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70 4f 70 2d  &1)==0) || (pOp-
15930 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 54 59 50  >p5 & OPFLAG_TYP
15940 45 4f 46 41 52 47 29 21 3d 30 29 29 0a 20 20 20  EOFARG)!=0)).   
15950 20 20 7c 7c 20 28 6c 65 6e 20 3d 20 73 71 6c 69    || (len = sqli
15960 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
15970 65 4c 65 6e 28 74 29 29 3d 3d 30 0a 20 20 20 20  eLen(t))==0.    
15980 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ){.      /* Cont
15990 65 6e 74 20 69 73 20 69 72 72 65 6c 65 76 61 6e  ent is irrelevan
159a0 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20  t for.      **  
159b0 20 20 31 2e 20 74 68 65 20 74 79 70 65 6f 66 28    1. the typeof(
159c0 29 20 66 75 6e 63 74 69 6f 6e 2c 0a 20 20 20 20  ) function,.    
159d0 20 20 2a 2a 20 20 20 20 32 2e 20 74 68 65 20 6c    **    2. the l
159e0 65 6e 67 74 68 28 58 29 20 66 75 6e 63 74 69 6f  ength(X) functio
159f0 6e 20 69 66 20 58 20 69 73 20 61 20 62 6c 6f 62  n if X is a blob
15a00 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20  , and.      **  
15a10 20 20 33 2e 20 69 66 20 74 68 65 20 63 6f 6e 74    3. if the cont
15a20 65 6e 74 20 6c 65 6e 67 74 68 20 69 73 20 7a 65  ent length is ze
15a30 72 6f 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ro..      ** So 
15a40 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c  we might as well
15a50 20 75 73 65 20 62 6f 67 75 73 20 63 6f 6e 74 65   use bogus conte
15a60 6e 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 72  nt rather than r
15a70 65 61 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  eading.      ** 
15a80 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
15a90 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  k. */.      stat
15aa0 69 63 20 75 38 20 61 5a 65 72 6f 5b 38 5d 3b 20  ic u8 aZero[8]; 
15ab0 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
15ac0 62 6f 67 75 73 20 63 6f 6e 74 65 6e 74 20 2a 2f  bogus content */
15ad0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15ae0 62 65 53 65 72 69 61 6c 47 65 74 28 61 5a 65 72  beSerialGet(aZer
15af0 6f 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20  o, t, pDest);.  
15b00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
15b10 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
15b20 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
15b30 75 63 2e 70 43 75 72 73 6f 72 2c 20 61 4f 66 66  uc.pCursor, aOff
15b40 73 65 74 5b 70 32 5d 2c 20 6c 65 6e 2c 20 70 44  set[p2], len, pD
15b50 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
15b60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
15b70 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
15b80 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 73  o_error;.      s
15b90 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15ba0 47 65 74 28 28 63 6f 6e 73 74 20 75 38 2a 29 70  Get((const u8*)p
15bb0 44 65 73 74 2d 3e 7a 2c 20 74 2c 20 70 44 65 73  Dest->z, t, pDes
15bc0 74 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d  t);.      pDest-
15bd0 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 45  >flags &= ~MEM_E
15be0 70 68 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  phem;.    }.  }.
15bf0 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a  .op_column_out:.
15c00 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
15c10 42 53 49 5a 45 28 70 44 65 73 74 29 3b 0a 20 20  BSIZE(pDest);.  
15c20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
15c30 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a  Op->p3, pDest);.
15c40 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
15c50 70 63 6f 64 65 3a 20 41 66 66 69 6e 69 74 79 20  pcode: Affinity 
15c60 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20  P1 P2 * P4 *.** 
15c70 53 79 6e 6f 70 73 69 73 3a 20 61 66 66 69 6e 69  Synopsis: affini
15c80 74 79 28 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a  ty(r[P1@P2]).**.
15c90 2a 2a 20 41 70 70 6c 79 20 61 66 66 69 6e 69 74  ** Apply affinit
15ca0 69 65 73 20 74 6f 20 61 20 72 61 6e 67 65 20 6f  ies to a range o
15cb0 66 20 50 32 20 72 65 67 69 73 74 65 72 73 20 73  f P2 registers s
15cc0 74 61 72 74 69 6e 67 20 77 69 74 68 20 50 31 2e  tarting with P1.
15cd0 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 73  .**.** P4 is a s
15ce0 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 32  tring that is P2
15cf0 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67   characters long
15d00 2e 20 54 68 65 20 6e 74 68 20 63 68 61 72 61 63  . The nth charac
15d10 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  ter of the.** st
15d20 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74  ring indicates t
15d30 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
15d40 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
15d50 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e  e used for the n
15d60 74 68 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c  th.** memory cel
15d70 6c 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a  l in the range..
15d80 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 66 66 69 6e  */.case OP_Affin
15d90 69 74 79 3a 20 7b 0a 20 20 63 6f 6e 73 74 20 63  ity: {.  const c
15da0 68 61 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20  har *zAffinity; 
15db0 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74    /* The affinit
15dc0 79 20 74 6f 20 62 65 20 61 70 70 6c 69 65 64 20  y to be applied 
15dd0 2a 2f 0a 20 20 63 68 61 72 20 63 41 66 66 3b 20  */.  char cAff; 
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15df0 20 41 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   A single charac
15e00 74 65 72 20 6f 66 20 61 66 66 69 6e 69 74 79 20  ter of affinity 
15e10 2a 2f 0a 0a 20 20 7a 41 66 66 69 6e 69 74 79 20  */..  zAffinity 
15e20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61  = pOp->p4.z;.  a
15e30 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79  ssert( zAffinity
15e40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
15e50 20 7a 41 66 66 69 6e 69 74 79 5b 70 4f 70 2d 3e   zAffinity[pOp->
15e60 70 32 5d 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  p2]==0 );.  pIn1
15e70 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
15e80 5d 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 41 66  ];.  while( (cAf
15e90 66 20 3d 20 2a 28 7a 41 66 66 69 6e 69 74 79 2b  f = *(zAffinity+
15ea0 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  +))!=0 ){.    as
15eb0 73 65 72 74 28 20 70 49 6e 31 20 3c 3d 20 26 70  sert( pIn1 <= &p
15ec0 2d 3e 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b  ->aMem[(p->nMem+
15ed0 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d  1 - p->nCursor)]
15ee0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15ef0 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29  memIsValid(pIn1)
15f00 20 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66   );.    applyAff
15f10 69 6e 69 74 79 28 70 49 6e 31 2c 20 63 41 66 66  inity(pIn1, cAff
15f20 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  , encoding);.   
15f30 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62   pIn1++;.  }.  b
15f40 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
15f50 64 65 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20 50  de: MakeRecord P
15f60 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20  1 P2 P3 P4 *.** 
15f70 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
15f80 6d 6b 72 65 63 28 72 5b 50 31 40 50 32 5d 29 0a  mkrec(r[P1@P2]).
15f90 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 50 32  **.** Convert P2
15fa0 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
15fb0 6e 69 6e 67 20 77 69 74 68 20 50 31 20 69 6e 74  ning with P1 int
15fc0 6f 20 74 68 65 20 5b 72 65 63 6f 72 64 20 66 6f  o the [record fo
15fd0 72 6d 61 74 5d 0a 2a 2a 20 75 73 65 20 61 73 20  rmat].** use as 
15fe0 61 20 64 61 74 61 20 72 65 63 6f 72 64 20 69 6e  a data record in
15ff0 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
16000 65 20 6f 72 20 61 73 20 61 20 6b 65 79 0a 2a 2a  e or as a key.**
16010 20 69 6e 20 61 6e 20 69 6e 64 65 78 2e 20 20 54   in an index.  T
16020 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
16030 6f 64 65 20 63 61 6e 20 64 65 63 6f 64 65 20 74  ode can decode t
16040 68 65 20 72 65 63 6f 72 64 20 6c 61 74 65 72 2e  he record later.
16050 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65  .**.** P4 may be
16060 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
16070 73 20 50 32 20 63 68 61 72 61 63 74 65 72 73 20  s P2 characters 
16080 6c 6f 6e 67 2e 20 20 54 68 65 20 6e 74 68 20 63  long.  The nth c
16090 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a  haracter of the.
160a0 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61  ** string indica
160b0 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  tes the column a
160c0 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
160d0 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
160e0 74 68 65 20 6e 74 68 0a 2a 2a 20 66 69 65 6c 64  the nth.** field
160f0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65   of the index ke
16100 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 70  y..**.** The map
16110 70 69 6e 67 20 66 72 6f 6d 20 63 68 61 72 61 63  ping from charac
16120 74 65 72 20 74 6f 20 61 66 66 69 6e 69 74 79 20  ter to affinity 
16130 69 73 20 67 69 76 65 6e 20 62 79 20 74 68 65 20  is given by the 
16140 53 51 4c 49 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d  SQLITE_AFF_.** m
16150 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20 69 6e  acros defined in
16160 20 73 71 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a   sqliteInt.h..**
16170 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 4e 55 4c  .** If P4 is NUL
16180 4c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 64 65 78  L then all index
16190 20 66 69 65 6c 64 73 20 68 61 76 65 20 74 68 65   fields have the
161a0 20 61 66 66 69 6e 69 74 79 20 42 4c 4f 42 2e 0a   affinity BLOB..
161b0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61 6b 65 52  */.case OP_MakeR
161c0 65 63 6f 72 64 3a 20 7b 0a 20 20 75 38 20 2a 7a  ecord: {.  u8 *z
161d0 4e 65 77 52 65 63 6f 72 64 3b 20 20 20 20 20 20  NewRecord;      
161e0 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
161f0 20 68 6f 6c 64 20 74 68 65 20 64 61 74 61 20 66   hold the data f
16200 6f 72 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  or the new recor
16210 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 63  d */.  Mem *pRec
16220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16230 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   The new record 
16240 2a 2f 0a 20 20 75 36 34 20 6e 44 61 74 61 3b 20  */.  u64 nData; 
16250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16260 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
16270 66 20 64 61 74 61 20 73 70 61 63 65 20 2a 2f 0a  f data space */.
16280 20 20 69 6e 74 20 6e 48 64 72 3b 20 20 20 20 20    int nHdr;     
16290 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
162a0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68  er of bytes of h
162b0 65 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20  eader space */. 
162c0 20 69 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20   i64 nByte;     
162d0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
162e0 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
162f0 6f 72 20 74 68 69 73 20 72 65 63 6f 72 64 20 2a  or this record *
16300 2f 0a 20 20 69 36 34 20 6e 5a 65 72 6f 3b 20 20  /.  i64 nZero;  
16310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16320 6d 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74  mber of zero byt
16330 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  es at the end of
16340 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
16350 20 69 6e 74 20 6e 56 61 72 69 6e 74 3b 20 20 20   int nVarint;   
16360 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16370 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
16380 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
16390 73 65 72 69 61 6c 5f 74 79 70 65 3b 20 20 20 20  serial_type;    
163a0 20 20 20 2f 2a 20 54 79 70 65 20 66 69 65 6c 64     /* Type field
163b0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61   */.  Mem *pData
163c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
163d0 46 69 72 73 74 20 66 69 65 6c 64 20 74 6f 20 62  First field to b
163e0 65 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20  e combined into 
163f0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
16400 4d 65 6d 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  Mem *pLast;     
16410 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66         /* Last f
16420 69 65 6c 64 20 6f 66 20 74 68 65 20 72 65 63 6f  ield of the reco
16430 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65  rd */.  int nFie
16440 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ld;            /
16450 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * Number of fiel
16460 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ds in the record
16470 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
16480 69 6e 69 74 79 3b 20 20 20 20 20 20 20 2f 2a 20  inity;       /* 
16490 54 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  The affinity str
164a0 69 6e 67 20 66 6f 72 20 74 68 65 20 72 65 63 6f  ing for the reco
164b0 72 64 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65  rd */.  int file
164c0 5f 66 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 2f  _format;       /
164d0 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 74 6f  * File format to
164e0 20 75 73 65 20 66 6f 72 20 65 6e 63 6f 64 69 6e   use for encodin
164f0 67 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  g */.  int i;   
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16510 20 53 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a   Space used in z
16520 4e 65 77 52 65 63 6f 72 64 5b 5d 20 68 65 61 64  NewRecord[] head
16530 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  er */.  int j;  
16540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16550 2a 20 53 70 61 63 65 20 75 73 65 64 20 69 6e 20  * Space used in 
16560 7a 4e 65 77 52 65 63 6f 72 64 5b 5d 20 63 6f 6e  zNewRecord[] con
16570 74 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6c 65  tent */.  u32 le
16580 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
16590 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 20   /* Length of a 
165a0 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41  field */..  /* A
165b0 73 73 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f  ssuming the reco
165c0 72 64 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  rd contains N fi
165d0 65 6c 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64  elds, the record
165e0 20 66 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20   format looks.  
165f0 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ** like this:.  
16600 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  **.  ** --------
16610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16650 0a 20 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65  .  ** | hdr-size
16660 20 7c 20 74 79 70 65 20 30 20 7c 20 74 79 70 65   | type 0 | type
16670 20 31 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20   1 | ... | type 
16680 4e 2d 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e  N-1 | data0 | ..
16690 2e 20 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a  . | data N-1 | .
166a0 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    ** -----------
166b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
166f0 2a 2a 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20  **.  ** Data(0) 
16700 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65  is taken from re
16710 67 69 73 74 65 72 20 50 31 2e 20 20 44 61 74 61  gister P1.  Data
16720 28 31 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72  (1) comes from r
16730 65 67 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a  egister P1+1.  *
16740 2a 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a  * and so forth..
16750 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74    **.  ** Each t
16760 79 70 65 20 66 69 65 6c 64 20 69 73 20 61 20 76  ype field is a v
16770 61 72 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69  arint representi
16780 6e 67 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ng the serial ty
16790 70 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  pe of the .  ** 
167a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
167b0 74 61 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20  ta element (see 
167c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
167d0 6c 54 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20  lType()). The.  
167e0 2a 2a 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c  ** hdr-size fiel
167f0 64 20 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69  d is also a vari
16800 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20  nt which is the 
16810 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20  offset from the 
16820 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
16830 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  f the record to 
16840 64 61 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44  data0..  */.  nD
16850 61 74 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ata = 0;        
16860 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
16870 74 65 73 20 6f 66 20 64 61 74 61 20 73 70 61 63  tes of data spac
16880 65 20 2a 2f 0a 20 20 6e 48 64 72 20 3d 20 30 3b  e */.  nHdr = 0;
16890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
168a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
168b0 68 65 61 64 65 72 20 73 70 61 63 65 20 2a 2f 0a  header space */.
168c0 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20    nZero = 0;    
168d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
168e0 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  f zero bytes at 
168f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
16900 65 63 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65 6c  ecord */.  nFiel
16910 64 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a  d = pOp->p1;.  z
16920 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e  Affinity = pOp->
16930 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20  p4.z;.  assert( 
16940 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 4f 70 2d  nField>0 && pOp-
16950 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32  >p2>0 && pOp->p2
16960 2b 6e 46 69 65 6c 64 3c 3d 28 70 2d 3e 6e 4d 65  +nField<=(p->nMe
16970 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
16980 29 2b 31 20 29 3b 0a 20 20 70 44 61 74 61 30 20  )+1 );.  pData0 
16990 3d 20 26 61 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b  = &aMem[nField];
169a0 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d  .  nField = pOp-
169b0 3e 70 32 3b 0a 20 20 70 4c 61 73 74 20 3d 20 26  >p2;.  pLast = &
169c0 70 44 61 74 61 30 5b 6e 46 69 65 6c 64 2d 31 5d  pData0[nField-1]
169d0 3b 0a 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20  ;.  file_format 
169e0 3d 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c  = p->minWriteFil
169f0 65 46 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49  eFormat;..  /* I
16a00 64 65 6e 74 69 66 79 20 74 68 65 20 6f 75 74 70  dentify the outp
16a10 75 74 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ut register */. 
16a20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
16a30 3c 70 4f 70 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d  <pOp->p1 || pOp-
16a40 3e 70 33 3e 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70  >p3>=pOp->p1+pOp
16a50 2d 3e 70 32 20 29 3b 0a 20 20 70 4f 75 74 20 3d  ->p2 );.  pOut =
16a60 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
16a70 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
16a80 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20  nge(p, pOut);.. 
16a90 20 2f 2a 20 41 70 70 6c 79 20 74 68 65 20 72 65   /* Apply the re
16aa0 71 75 65 73 74 65 64 20 61 66 66 69 6e 69 74 79  quested affinity
16ab0 20 74 6f 20 61 6c 6c 20 69 6e 70 75 74 73 0a 20   to all inputs. 
16ac0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 44   */.  assert( pD
16ad0 61 74 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20  ata0<=pLast );. 
16ae0 20 69 66 28 20 7a 41 66 66 69 6e 69 74 79 20 29   if( zAffinity )
16af0 7b 0a 20 20 20 20 70 52 65 63 20 3d 20 70 44 61  {.    pRec = pDa
16b00 74 61 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  ta0;.    do{.   
16b10 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79     applyAffinity
16b20 28 70 52 65 63 2b 2b 2c 20 2a 28 7a 41 66 66 69  (pRec++, *(zAffi
16b30 6e 69 74 79 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e  nity++), encodin
16b40 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
16b50 28 20 7a 41 66 66 69 6e 69 74 79 5b 30 5d 3d 3d  ( zAffinity[0]==
16b60 30 20 7c 7c 20 70 52 65 63 3c 3d 70 4c 61 73 74  0 || pRec<=pLast
16b70 20 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   );.    }while( 
16b80 7a 41 66 66 69 6e 69 74 79 5b 30 5d 20 29 3b 0a  zAffinity[0] );.
16b90 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
16ba0 54 45 5f 45 4e 41 42 4c 45 5f 4e 55 4c 4c 5f 54  TE_ENABLE_NULL_T
16bb0 52 49 4d 0a 20 20 2f 2a 20 4e 55 4c 4c 73 20 63  RIM.  /* NULLs c
16bc0 61 6e 20 62 65 20 73 61 66 65 6c 79 20 74 72 69  an be safely tri
16bd0 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 65 6e  mmed from the en
16be0 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  d of the record,
16bf0 20 61 73 20 6c 6f 6e 67 20 61 73 0a 20 20 2a 2a   as long as.  **
16c00 20 61 73 20 74 68 65 20 73 63 68 65 6d 61 20 66   as the schema f
16c10 6f 72 6d 61 74 20 69 73 20 32 20 6f 72 20 6d 6f  ormat is 2 or mo
16c20 72 65 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  re and none of t
16c30 68 65 20 6f 6d 69 74 74 65 64 20 63 6f 6c 75 6d  he omitted colum
16c40 6e 73 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 6e  ns.  ** have a n
16c50 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20  on-NULL default 
16c60 76 61 6c 75 65 2e 20 20 41 6c 73 6f 2c 20 74 68  value.  Also, th
16c70 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 62 65  e record must be
16c80 20 6c 65 66 74 20 77 69 74 68 0a 20 20 2a 2a 20   left with.  ** 
16c90 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 69 65  at least one fie
16ca0 6c 64 2e 20 20 49 66 20 50 35 3e 30 20 74 68 65  ld.  If P5>0 the
16cb0 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 6e 65  n it will be one
16cc0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 0a 20   more than the. 
16cd0 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
16ce0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
16cf0 6d 6e 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e 55  mn with a non-NU
16d00 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  LL default value
16d10 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   */.  if( pOp->p
16d20 35 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  5 ){.    while( 
16d30 28 70 4c 61 73 74 2d 3e 66 6c 61 67 73 20 26 20  (pLast->flags & 
16d40 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 26 26 20  MEM_Null)!=0 && 
16d50 6e 46 69 65 6c 64 3e 70 4f 70 2d 3e 70 35 20 29  nField>pOp->p5 )
16d60 7b 0a 20 20 20 20 20 20 70 4c 61 73 74 2d 2d 3b  {.      pLast--;
16d70 0a 20 20 20 20 20 20 6e 46 69 65 6c 64 2d 2d 3b  .      nField--;
16d80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
16d90 66 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  f..  /* Loop thr
16da0 6f 75 67 68 20 74 68 65 20 65 6c 65 6d 65 6e 74  ough the element
16db0 73 20 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65  s that will make
16dc0 20 75 70 20 74 68 65 20 72 65 63 6f 72 64 20 74   up the record t
16dd0 6f 20 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f 75  o figure.  ** ou
16de0 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
16df0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
16e00 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e   the new record.
16e10 0a 20 20 2a 2f 0a 20 20 70 52 65 63 20 3d 20 70  .  */.  pRec = p
16e20 4c 61 73 74 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  Last;.  do{.    
16e30 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
16e40 69 64 28 70 52 65 63 29 20 29 3b 0a 20 20 20 20  id(pRec) );.    
16e50 70 52 65 63 2d 3e 75 54 65 6d 70 20 3d 20 73 65  pRec->uTemp = se
16e60 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
16e70 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
16e80 65 28 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72  e(pRec, file_for
16e90 6d 61 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  mat, &len);.    
16ea0 69 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20  if( pRec->flags 
16eb0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
16ec0 20 20 20 20 69 66 28 20 6e 44 61 74 61 20 29 7b      if( nData ){
16ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
16ee0 69 74 65 33 56 64 62 65 4d 65 6d 45 78 70 61 6e  ite3VdbeMemExpan
16ef0 64 42 6c 6f 62 28 70 52 65 63 29 20 29 20 67 6f  dBlob(pRec) ) go
16f00 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20  to no_mem;.     
16f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16f20 6e 5a 65 72 6f 20 2b 3d 20 70 52 65 63 2d 3e 75  nZero += pRec->u
16f30 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20  .nZero;.        
16f40 6c 65 6e 20 2d 3d 20 70 52 65 63 2d 3e 75 2e 6e  len -= pRec->u.n
16f50 5a 65 72 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Zero;.      }.  
16f60 20 20 7d 0a 20 20 20 20 6e 44 61 74 61 20 2b 3d    }.    nData +=
16f70 20 6c 65 6e 3b 0a 20 20 20 20 74 65 73 74 63 61   len;.    testca
16f80 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
16f90 3d 31 32 37 20 29 3b 0a 20 20 20 20 74 65 73 74  =127 );.    test
16fa0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
16fb0 65 3d 3d 31 32 38 20 29 3b 0a 20 20 20 20 6e 48  e==128 );.    nH
16fc0 64 72 20 2b 3d 20 73 65 72 69 61 6c 5f 74 79 70  dr += serial_typ
16fd0 65 3c 3d 31 32 37 20 3f 20 31 20 3a 20 73 71 6c  e<=127 ? 1 : sql
16fe0 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65  ite3VarintLen(se
16ff0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
17000 69 66 28 20 70 52 65 63 3d 3d 70 44 61 74 61 30  if( pRec==pData0
17010 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 52   ) break;.    pR
17020 65 63 2d 2d 3b 0a 20 20 7d 77 68 69 6c 65 28 31  ec--;.  }while(1
17030 29 3b 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  );..  /* EVIDENC
17040 45 2d 4f 46 3a 20 52 2d 32 32 35 36 34 2d 31 31  E-OF: R-22564-11
17050 36 34 37 20 54 68 65 20 68 65 61 64 65 72 20 62  647 The header b
17060 65 67 69 6e 73 20 77 69 74 68 20 61 20 73 69 6e  egins with a sin
17070 67 6c 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20  gle varint.  ** 
17080 77 68 69 63 68 20 64 65 74 65 72 6d 69 6e 65 73  which determines
17090 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
170a0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
170b0 65 20 68 65 61 64 65 72 2e 20 54 68 65 20 76 61  e header. The va
170c0 72 69 6e 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20  rint.  ** value 
170d0 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
170e0 68 65 20 68 65 61 64 65 72 20 69 6e 20 62 79 74  he header in byt
170f0 65 73 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  es including the
17100 20 73 69 7a 65 20 76 61 72 69 6e 74 0a 20 20 2a   size varint.  *
17110 2a 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 74  * itself. */.  t
17120 65 73 74 63 61 73 65 28 20 6e 48 64 72 3d 3d 31  estcase( nHdr==1
17130 32 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  26 );.  testcase
17140 28 20 6e 48 64 72 3d 3d 31 32 37 20 29 3b 0a 20  ( nHdr==127 );. 
17150 20 69 66 28 20 6e 48 64 72 3c 3d 31 32 36 20 29   if( nHdr<=126 )
17160 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d  {.    /* The com
17170 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
17180 6e 48 64 72 20 2b 3d 20 31 3b 0a 20 20 7d 65 6c  nHdr += 1;.  }el
17190 73 65 7b 0a 20 20 20 20 2f 2a 20 52 61 72 65 20  se{.    /* Rare 
171a0 63 61 73 65 20 6f 66 20 61 20 72 65 61 6c 6c 79  case of a really
171b0 20 6c 61 72 67 65 20 68 65 61 64 65 72 20 2a 2f   large header */
171c0 0a 20 20 20 20 6e 56 61 72 69 6e 74 20 3d 20 73  .    nVarint = s
171d0 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
171e0 6e 48 64 72 29 3b 0a 20 20 20 20 6e 48 64 72 20  nHdr);.    nHdr 
171f0 2b 3d 20 6e 56 61 72 69 6e 74 3b 0a 20 20 20 20  += nVarint;.    
17200 69 66 28 20 6e 56 61 72 69 6e 74 3c 73 71 6c 69  if( nVarint<sqli
17210 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64  te3VarintLen(nHd
17220 72 29 20 29 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d  r) ) nHdr++;.  }
17230 0a 20 20 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b  .  nByte = nHdr+
17240 6e 44 61 74 61 3b 0a 20 20 69 66 28 20 6e 42 79  nData;.  if( nBy
17250 74 65 2b 6e 5a 65 72 6f 3e 64 62 2d 3e 61 4c 69  te+nZero>db->aLi
17260 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
17270 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
17280 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
17290 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
172a0 65 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67  e the output reg
172b0 69 73 74 65 72 20 68 61 73 20 61 20 62 75 66 66  ister has a buff
172c0 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
172d0 74 6f 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74  to store .  ** t
172e0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54  he new record. T
172f0 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
17300 65 72 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20  er (pOp->p3) is 
17310 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
17320 20 2a 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68   ** be one of th
17330 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
17340 73 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66  s (because the f
17350 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
17360 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  .  ** sqlite3Vdb
17370 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
17380 7a 65 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62  ze() could clobb
17390 65 72 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  er the value bef
173a0 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 29 2e  ore it is used).
173b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
173c0 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
173d0 6e 64 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 28  ndResize(pOut, (
173e0 69 6e 74 29 6e 42 79 74 65 29 20 29 7b 0a 20 20  int)nByte) ){.  
173f0 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
17400 20 7d 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20   }.  zNewRecord 
17410 3d 20 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b  = (u8 *)pOut->z;
17420 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
17430 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d   record */.  i =
17440 20 70 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65   putVarint32(zNe
17450 77 52 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a  wRecord, nHdr);.
17460 20 20 6a 20 3d 20 6e 48 64 72 3b 0a 20 20 61 73    j = nHdr;.  as
17470 73 65 72 74 28 20 70 44 61 74 61 30 3c 3d 70 4c  sert( pData0<=pL
17480 61 73 74 20 29 3b 0a 20 20 70 52 65 63 20 3d 20  ast );.  pRec = 
17490 70 44 61 74 61 30 3b 0a 20 20 64 6f 7b 0a 20 20  pData0;.  do{.  
174a0 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
174b0 70 52 65 63 2d 3e 75 54 65 6d 70 3b 0a 20 20 20  pRec->uTemp;.   
174c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
174d0 20 52 2d 30 36 35 32 39 2d 34 37 33 36 32 20 46   R-06529-47362 F
174e0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 73 69 7a  ollowing the siz
174f0 65 20 76 61 72 69 6e 74 20 61 72 65 20 6f 6e 65  e varint are one
17500 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20   or more.    ** 
17510 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 6e  additional varin
17520 74 73 2c 20 6f 6e 65 20 70 65 72 20 63 6f 6c 75  ts, one per colu
17530 6d 6e 2e 20 2a 2f 0a 20 20 20 20 69 20 2b 3d 20  mn. */.    i += 
17540 70 75 74 56 61 72 69 6e 74 33 32 28 26 7a 4e 65  putVarint32(&zNe
17550 77 52 65 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69  wRecord[i], seri
17560 61 6c 5f 74 79 70 65 29 3b 20 20 20 20 20 20 20  al_type);       
17570 20 20 20 20 20 2f 2a 20 73 65 72 69 61 6c 20 74       /* serial t
17580 79 70 65 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56  ype */.    /* EV
17590 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35  IDENCE-OF: R-645
175a0 33 36 2d 35 31 37 32 38 20 54 68 65 20 76 61 6c  36-51728 The val
175b0 75 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ues for each col
175c0 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 63 6f 72  umn in the recor
175d0 64 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61  d.    ** immedia
175e0 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20  tely follow the 
175f0 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 6a  header. */.    j
17600 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
17610 65 72 69 61 6c 50 75 74 28 26 7a 4e 65 77 52 65  erialPut(&zNewRe
17620 63 6f 72 64 5b 6a 5d 2c 20 70 52 65 63 2c 20 73  cord[j], pRec, s
17630 65 72 69 61 6c 5f 74 79 70 65 29 3b 20 2f 2a 20  erial_type); /* 
17640 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 7d 77 68  content */.  }wh
17650 69 6c 65 28 20 28 2b 2b 70 52 65 63 29 3c 3d 70  ile( (++pRec)<=p
17660 4c 61 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Last );.  assert
17670 28 20 69 3d 3d 6e 48 64 72 20 29 3b 0a 20 20 61  ( i==nHdr );.  a
17680 73 73 65 72 74 28 20 6a 3d 3d 6e 42 79 74 65 20  ssert( j==nByte 
17690 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  );..  assert( pO
176a0 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p3>0 && pOp->
176b0 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
176c0 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
176d0 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74    pOut->n = (int
176e0 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e  )nByte;.  pOut->
176f0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
17700 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b  ;.  if( nZero ){
17710 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65  .    pOut->u.nZe
17720 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20  ro = nZero;.    
17730 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pOut->flags |= M
17740 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 70  EM_Zero;.  }.  p
17750 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Out->enc = SQLIT
17760 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20 63  E_UTF8;  /* In c
17770 61 73 65 20 74 68 65 20 62 6c 6f 62 20 69 73 20  ase the blob is 
17780 65 76 65 72 20 63 6f 6e 76 65 72 74 65 64 20 74  ever converted t
17790 6f 20 74 65 78 74 20 2a 2f 0a 20 20 52 45 47 49  o text */.  REGI
177a0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
177b0 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50 44  p3, pOut);.  UPD
177c0 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
177d0 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
177e0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
177f0 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  ount P1 P2 * * *
17800 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
17810 50 32 5d 3d 63 6f 75 6e 74 28 29 0a 2a 2a 0a 2a  P2]=count().**.*
17820 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d 62  * Store the numb
17830 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28 61  er of entries (a
17840 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29  n integer value)
17850 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
17860 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e 65   index .** opene
17870 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 20 69  d by cursor P1 i
17880 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2f  n register P2.*/
17890 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
178a0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
178b0 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20 7b  case OP_Count: {
178c0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
178d0 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72 79   */.  i64 nEntry
178e0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
178f0 72 73 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rsr;..  assert( 
17900 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
17910 5d 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  ]->eCurType==CUR
17920 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
17930 70 43 72 73 72 20 3d 20 70 2d 3e 61 70 43 73 72  pCrsr = p->apCsr
17940 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 75 63 2e 70 43  [pOp->p1]->uc.pC
17950 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
17960 20 70 43 72 73 72 20 29 3b 0a 20 20 6e 45 6e 74   pCrsr );.  nEnt
17970 72 79 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  ry = 0;  /* Not 
17980 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73  needed.  Only us
17990 65 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20  ed to silence a 
179a0 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  warning. */.  rc
179b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
179c0 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e 45 6e  ount(pCrsr, &nEn
179d0 74 72 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  try);.  if( rc )
179e0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
179f0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75 74  to_error;.  pOut
17a00 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
17a10 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
17a20 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74 72 79 3b  t->u.i = nEntry;
17a30 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
17a40 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  if../* Opcode: S
17a50 61 76 65 70 6f 69 6e 74 20 50 31 20 2a 20 2a 20  avepoint P1 * * 
17a60 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 2c  P4 *.**.** Open,
17a70 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
17a80 62 61 63 6b 20 74 68 65 20 73 61 76 65 70 6f 69  back the savepoi
17a90 6e 74 20 6e 61 6d 65 64 20 62 79 20 70 61 72 61  nt named by para
17aa0 6d 65 74 65 72 20 50 34 2c 20 64 65 70 65 6e 64  meter P4, depend
17ab0 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 76 61  ing.** on the va
17ac0 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f 20 6f 70  lue of P1. To op
17ad0 65 6e 20 61 20 6e 65 77 20 73 61 76 65 70 6f 69  en a new savepoi
17ae0 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f 20 72 65  nt, P1==0. To re
17af0 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61  lease (commit) a
17b00 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 73 61  n.** existing sa
17b10 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 31 2c 20  vepoint, P1==1, 
17b20 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  or to rollback a
17b30 6e 20 65 78 69 73 74 69 6e 67 20 73 61 76 65 70  n existing savep
17b40 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a 2f 0a 63  oint P1==2..*/.c
17b50 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  ase OP_Savepoint
17b60 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20 20  : {.  int p1;   
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b80 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
17b90 66 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  f P1 operand */.
17ba0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61 76    /* Name of sav
17bd0 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  epoint */.  int 
17be0 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65 70 6f 69  nName;.  Savepoi
17bf0 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53 61 76 65  nt *pNew;.  Save
17c00 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
17c10 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  t;.  Savepoint *
17c20 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69 53 61 76  pTmp;.  int iSav
17c30 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20 69 69  epoint;.  int ii
17c40 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70  ;..  p1 = pOp->p
17c50 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4f 70  1;.  zName = pOp
17c60 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a 20 41 73  ->p4.z;..  /* As
17c70 73 65 72 74 20 74 68 61 74 20 74 68 65 20 70 31  sert that the p1
17c80 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 76 61   parameter is va
17c90 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61 74 20 69  lid. Also that i
17ca0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  f there is no op
17cb0 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  en.  ** transact
17cc0 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ion, then there 
17cd0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20 73 61  cannot be any sa
17ce0 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f 0a  vepoints. .  */.
17cf0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53    assert( db->pS
17d00 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 64  avepoint==0 || d
17d10 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
17d20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31   );.  assert( p1
17d30 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49  ==SAVEPOINT_BEGI
17d40 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  N||p1==SAVEPOINT
17d50 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d 53 41  _RELEASE||p1==SA
17d60 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
17d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
17d80 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c 7c 20  ->pSavepoint || 
17d90 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
17da0 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b  nSavepoint==0 );
17db0 0a 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b  .  assert( check
17dc0 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
17dd0 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
17de0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a  p->bIsReader );.
17df0 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50  .  if( p1==SAVEP
17e00 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20 20  OINT_BEGIN ){.  
17e10 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 57    if( db->nVdbeW
17e20 72 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  rite>0 ){.      
17e30 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70 6f 69  /* A new savepoi
17e40 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 72 65  nt cannot be cre
17e50 61 74 65 64 20 69 66 20 74 68 65 72 65 20 61 72  ated if there ar
17e60 65 20 61 63 74 69 76 65 20 77 72 69 74 65 20 0a  e active write .
17e70 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
17e80 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20 72  nts (i.e. open r
17e90 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72 65 6d  ead/write increm
17ea0 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64 6c  ental blob handl
17eb0 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  es)..      */.  
17ec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
17ed0 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20  rror(p, "cannot 
17ee0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 2d  open savepoint -
17ef0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
17f00 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20  in progress");. 
17f10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17f20 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
17f30 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  {.      nName = 
17f40 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17f50 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e 64 65 66  zName);..#ifndef
17f60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
17f70 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
17f80 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  /* This call is 
17f90 4f 6b 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  Ok even if this 
17fa0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
17fb0 75 61 6c 6c 79 20 61 20 74 72 61 6e 73 61 63 74  ually a transact
17fc0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 73 61 76  ion.      ** sav
17fd0 65 70 6f 69 6e 74 20 28 61 6e 64 20 74 68 65 72  epoint (and ther
17fe0 65 66 6f 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74  efore should not
17ff0 20 70 72 6f 6d 70 74 20 78 53 61 76 65 70 6f 69   prompt xSavepoi
18000 6e 74 28 29 29 20 63 61 6c 6c 62 61 63 6b 73 2e  nt()) callbacks.
18010 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
18020 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  s is a transacti
18030 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69  on savepoint bei
18040 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74 20 69 73  ng opened, it is
18050 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 20 20   guaranteed.    
18060 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64 62    ** that the db
18070 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
18080 79 20 69 73 20 65 6d 70 74 79 2e 20 20 2a 2f 0a  y is empty.  */.
18090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
180a0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
180b0 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e 73 3d 3d  || db->nVTrans==
180c0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
180d0 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
180e0 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
180f0 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20 20 20 20  NT_BEGIN,.      
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53            db->nS
18120 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
18130 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
18140 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18150 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  K ) goto abort_d
18160 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e  ue_to_error;.#en
18170 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  dif..      /* Cr
18180 65 61 74 65 20 61 20 6e 65 77 20 73 61 76 65 70  eate a new savep
18190 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  oint structure. 
181a0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  */.      pNew = 
181b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
181c0 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
181d0 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d 65  Savepoint)+nName
181e0 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
181f0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70  New ){.        p
18200 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  New->zName = (ch
18210 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  ar *)&pNew[1];. 
18220 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
18230 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ew->zName, zName
18240 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  , nName+1);.    
18250 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
18260 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
18270 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
18280 6e 20 6d 61 72 6b 20 74 68 69 73 20 61 73 20 61  n mark this as a
18290 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20   special.       
182a0 20 2a 2a 20 22 74 72 61 6e 73 61 63 74 69 6f 6e   ** "transaction
182b0 20 73 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f 0a   savepoint". */.
182c0 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
182d0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
182e0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
182f0 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  Commit = 0;.    
18300 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e        db->isTran
18310 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
18320 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
18330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
18340 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b 3b  b->nSavepoint++;
18350 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
18360 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
18370 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69 6e  new savepoint in
18380 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18390 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20 2a  handle's list. *
183a0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
183b0 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61 76  pNext = db->pSav
183c0 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20  epoint;.        
183d0 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
183e0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   pNew;.        p
183f0 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  New->nDeferredCo
18400 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72  ns = db->nDeferr
18410 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20  edCons;.        
18420 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 49  pNew->nDeferredI
18430 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65  mmCons = db->nDe
18440 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20  ferredImmCons;. 
18450 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18460 65 6c 73 65 7b 0a 20 20 20 20 69 53 61 76 65 70  else{.    iSavep
18470 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  oint = 0;..    /
18480 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 64  * Find the named
18490 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 74   savepoint. If t
184a0 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
184b0 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20  savepoint, then 
184c0 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  an.    ** an err
184d0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
184e0 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a 2f 0a  o the user.  */.
184f0 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 70      for(.      p
18500 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e  Savepoint = db->
18510 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20 20 20  pSavepoint; .   
18520 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26     pSavepoint &&
18530 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
18540 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e 61 6d  pSavepoint->zNam
18550 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
18560 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 53   pSavepoint = pS
18570 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 0a  avepoint->pNext.
18580 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 53 61      ){.      iSa
18590 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d  vepoint++;.    }
185a0 0a 20 20 20 20 69 66 28 20 21 70 53 61 76 65 70  .    if( !pSavep
185b0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  oint ){.      sq
185c0 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
185d0 2c 20 22 6e 6f 20 73 75 63 68 20 73 61 76 65 70  , "no such savep
185e0 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  oint: %s", zName
185f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
18600 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
18610 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6e 56  }else if( db->nV
18620 64 62 65 57 72 69 74 65 3e 30 20 26 26 20 70 31  dbeWrite>0 && p1
18630 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
18640 41 53 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ASE ){.      /* 
18650 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
18660 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 28 63  le to release (c
18670 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69  ommit) a savepoi
18680 6e 74 20 69 66 20 74 68 65 72 65 20 61 72 65 20  nt if there are 
18690 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 76 65  .      ** active
186a0 20 77 72 69 74 65 20 73 74 61 74 65 6d 65 6e 74   write statement
186b0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
186c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
186d0 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20 72 65  or(p, "cannot re
186e0 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e 74 20  lease savepoint 
186f0 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  - ".            
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
18710 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  QL statements in
18720 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20   progress");.   
18730 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
18740 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
18750 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
18760 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
18770 6f 74 20 74 68 69 73 20 69 73 20 61 20 74 72 61  ot this is a tra
18780 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
18790 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  nt. If so,.     
187a0 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69 73 20   ** and this is 
187b0 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d 61 6e  a RELEASE comman
187c0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72  d, then the curr
187d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
187e0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 6d  .      ** is com
187f0 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20 20 2a  mitted. .      *
18800 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  /.      int isTr
18810 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53 61 76  ansaction = pSav
18820 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d 3d 30  epoint->pNext==0
18830 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e 73 61   && db->isTransa
18840 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  ctionSavepoint;.
18850 20 20 20 20 20 20 69 66 28 20 69 73 54 72 61 6e        if( isTran
18860 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d 53  saction && p1==S
18870 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
18880 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
18890 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62  (rc = sqlite3Vdb
188a0 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21  eCheckFk(p, 1))!
188b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
188c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62          goto vdb
188d0 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  e_return;.      
188e0 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e    }.        db->
188f0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
18900 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
18910 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d 3d  te3VdbeHalt(p)==
18920 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
18930 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20 3d           p->pc =
18940 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
18950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
18960 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b  >autoCommit = 0;
18970 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
18980 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
18990 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67  USY;.          g
189a0 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
189b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
189c0 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63     db->isTransac
189d0 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
189e0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
189f0 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c  p->rc;.      }el
18a00 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
18a10 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  isSchemaChange;.
18a20 20 20 20 20 20 20 20 20 69 53 61 76 65 70 6f 69          iSavepoi
18a30 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70 6f  nt = db->nSavepo
18a40 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e 74  int - iSavepoint
18a50 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   - 1;.        if
18a60 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( p1==SAVEPOINT_
18a70 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
18a80 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 43 68        isSchemaCh
18a90 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ange = (db->flag
18aa0 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
18ab0 6e 43 68 61 6e 67 65 73 29 21 3d 30 3b 0a 20 20  nChanges)!=0;.  
18ac0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
18ad0 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69  ; ii<db->nDb; ii
18ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
18af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
18b00 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
18b10 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
18b20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18b50 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 2c 0a  ABORT_ROLLBACK,.
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 43         isSchemaC
18b90 68 61 6e 67 65 3d 3d 30 29 3b 0a 20 20 20 20 20  hange==0);.     
18ba0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18bb0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18bc0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
18bd0 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
18be0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18bf0 20 20 20 20 20 20 20 20 20 69 73 53 63 68 65 6d           isSchem
18c00 61 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  aChange = 0;.   
18c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
18c20 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e  or(ii=0; ii<db->
18c30 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
18c40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18c50 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
18c60 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
18c70 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e 74  , p1, iSavepoint
18c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
18c90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
18cb0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
18cc0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
18cd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
18ce0 20 20 20 20 20 69 66 28 20 69 73 53 63 68 65 6d       if( isSchem
18cf0 61 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 20  aChange ){.     
18d00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
18d10 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
18d20 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ents(db);.      
18d30 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
18d40 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
18d50 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
18d60 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
18d70 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
18d80 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
18d90 67 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ges);.        }.
18da0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
18db0 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f   /* Regardless o
18dc0 66 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69  f whether this i
18dd0 73 20 61 20 52 45 4c 45 41 53 45 20 6f 72 20 52  s a RELEASE or R
18de0 4f 4c 4c 42 41 43 4b 2c 20 64 65 73 74 72 6f 79  OLLBACK, destroy
18df0 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 73   all .      ** s
18e00 61 76 65 70 6f 69 6e 74 73 20 6e 65 73 74 65 64  avepoints nested
18e10 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 73   inside of the s
18e20 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f  avepoint being o
18e30 70 65 72 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  perated on. */. 
18e40 20 20 20 20 20 77 68 69 6c 65 28 20 64 62 2d 3e       while( db->
18e50 70 53 61 76 65 70 6f 69 6e 74 21 3d 70 53 61 76  pSavepoint!=pSav
18e60 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
18e70 20 20 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61    pTmp = db->pSa
18e80 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20  vepoint;.       
18e90 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
18ea0 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20  = pTmp->pNext;. 
18eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
18ec0 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
18ed0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76          db->nSav
18ee0 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20  epoint--;.      
18ef0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  }..      /* If i
18f00 74 20 69 73 20 61 20 52 45 4c 45 41 53 45 2c 20  t is a RELEASE, 
18f10 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74 68 65  then destroy the
18f20 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67   savepoint being
18f30 20 6f 70 65 72 61 74 65 64 20 6f 6e 20 0a 20 20   operated on .  
18f40 20 20 20 20 2a 2a 20 74 6f 6f 2e 20 49 66 20 69      ** too. If i
18f50 74 20 69 73 20 61 20 52 4f 4c 4c 42 41 43 4b 20  t is a ROLLBACK 
18f60 54 4f 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  TO, then set the
18f70 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 66 65 72   number of defer
18f80 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  red .      ** co
18f90 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
18fa0 6f 6e 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ons present in t
18fb0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  he database to t
18fc0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a  he value stored.
18fd0 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
18fe0 65 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20  e savepoint was 
18ff0 63 72 65 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  created.  */.   
19000 20 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50     if( p1==SAVEP
19010 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
19020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19030 70 53 61 76 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e  pSavepoint==db->
19040 70 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  pSavepoint );.  
19050 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70        db->pSavep
19060 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  oint = pSavepoin
19070 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
19080 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19090 64 62 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b  db, pSavepoint);
190a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
190b0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
190c0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61           db->nSa
190d0 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20  vepoint--;.     
190e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
190f0 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44  {.        db->nD
19100 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 53  eferredCons = pS
19110 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66 65 72  avepoint->nDefer
19120 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20  redCons;.       
19130 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
19140 6d 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69  mCons = pSavepoi
19150 6e 74 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  nt->nDeferredImm
19160 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Cons;.      }.. 
19170 20 20 20 20 20 69 66 28 20 21 69 73 54 72 61 6e       if( !isTran
19180 73 61 63 74 69 6f 6e 20 7c 7c 20 70 31 3d 3d 53  saction || p1==S
19190 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
191a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
191b0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
191c0 65 70 6f 69 6e 74 28 64 62 2c 20 70 31 2c 20 69  epoint(db, p1, i
191d0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
191e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
191f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
19200 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
19210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19220 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
19230 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
19240 65 72 72 6f 72 3b 0a 0a 20 20 62 72 65 61 6b 3b  error;..  break;
19250 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
19260 75 74 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20  utoCommit P1 P2 
19270 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20  * * *.**.** Set 
19280 74 68 65 20 64 61 74 61 62 61 73 65 20 61 75 74  the database aut
19290 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f  o-commit flag to
192a0 20 50 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66   P1 (1 or 0). If
192b0 20 50 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c   P2 is true, rol
192c0 6c 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75  l.** back any cu
192d0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62  rrently active b
192e0 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
192f0 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  s. If there are 
19300 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d  any active.** VM
19310 73 20 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68  s (apart from th
19320 69 73 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20  is one), then a 
19330 52 4f 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20  ROLLBACK fails. 
19340 20 41 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20   A COMMIT fails 
19350 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  if.** there are 
19360 61 63 74 69 76 65 20 77 72 69 74 69 6e 67 20 56  active writing V
19370 4d 73 20 6f 72 20 61 63 74 69 76 65 20 56 4d 73  Ms or active VMs
19380 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
19390 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
193a0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  is instruction c
193b0 61 75 73 65 73 20 74 68 65 20 56 4d 20 74 6f 20  auses the VM to 
193c0 68 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  halt..*/.case OP
193d0 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20  _AutoCommit: {. 
193e0 20 69 6e 74 20 64 65 73 69 72 65 64 41 75 74 6f   int desiredAuto
193f0 43 6f 6d 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52  Commit;.  int iR
19400 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 64 65 73 69  ollback;..  desi
19410 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  redAutoCommit = 
19420 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c  pOp->p1;.  iRoll
19430 62 61 63 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  back = pOp->p2;.
19440 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
19450 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c  dAutoCommit==1 |
19460 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  | desiredAutoCom
19470 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  mit==0 );.  asse
19480 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
19490 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52 6f 6c  ommit==1 || iRol
194a0 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  lback==0 );.  as
194b0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
194c0 63 74 69 76 65 3e 30 20 29 3b 20 20 2f 2a 20 41  ctive>0 );  /* A
194d0 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f 6e 65  t least this one
194e0 20 56 4d 20 69 73 20 61 63 74 69 76 65 20 2a 2f   VM is active */
194f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
19500 73 52 65 61 64 65 72 20 29 3b 0a 0a 20 20 69 66  sReader );..  if
19510 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
19520 6d 69 74 21 3d 64 62 2d 3e 61 75 74 6f 43 6f 6d  mit!=db->autoCom
19530 6d 69 74 20 29 7b 0a 20 20 20 20 69 66 28 20 69  mit ){.    if( i
19540 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
19550 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
19560 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 29  dAutoCommit==1 )
19570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19580 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
19590 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
195a0 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 64 62 2d  BACK);.      db-
195b0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
195c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64  .    }else if( d
195d0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
195e0 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69   && db->nVdbeWri
195f0 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  te>0 ){.      /*
19600 20 49 66 20 74 68 69 73 20 69 6e 73 74 72 75 63   If this instruc
19610 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tion implements 
19620 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20 6f 74 68  a COMMIT and oth
19630 65 72 20 56 4d 73 20 61 72 65 20 77 72 69 74 69  er VMs are writi
19640 6e 67 0a 20 20 20 20 20 20 2a 2a 20 72 65 74 75  ng.      ** retu
19650 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69  rn an error indi
19660 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
19670 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20 63  other VMs must c
19680 6f 6d 70 6c 65 74 65 20 66 69 72 73 74 2e 20 0a  omplete first. .
19690 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
196a0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
196b0 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69  p, "cannot commi
196c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20  t transaction - 
196d0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
196e0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c              "SQL
196f0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70   statements in p
19700 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 20  rogress");.     
19710 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
19720 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62  Y;.      goto ab
19730 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
19740 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
19750 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62  (rc = sqlite3Vdb
19760 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21  eCheckFk(p, 1))!
19770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19780 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65      goto vdbe_re
19790 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
197a0 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43  .      db->autoC
197b0 6f 6d 6d 69 74 20 3d 20 28 75 38 29 64 65 73 69  ommit = (u8)desi
197c0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20  redAutoCommit;. 
197d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
197e0 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d  ite3VdbeHalt(p)=
197f0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
19800 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 28 69        p->pc = (i
19810 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a  nt)(pOp - aOp);.
19820 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
19830 6d 6d 69 74 20 3d 20 28 75 38 29 28 31 2d 64 65  mmit = (u8)(1-de
19840 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29  siredAutoCommit)
19850 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
19860 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
19870 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62  ;.      goto vdb
19880 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  e_return;.    }.
19890 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
198a0 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b  nStatement==0 );
198b0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  .    sqlite3Clos
198c0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
198d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
198e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
198f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
19900 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ONE;.    }else{.
19910 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19920 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
19930 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
19940 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  urn;.  }else{.  
19950 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
19960 6f 72 28 70 2c 0a 20 20 20 20 20 20 20 20 28 21  or(p,.        (!
19970 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
19980 74 29 3f 22 63 61 6e 6e 6f 74 20 73 74 61 72 74  t)?"cannot start
19990 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
199a0 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
199b0 69 6f 6e 22 3a 28 0a 20 20 20 20 20 20 20 20 28  ion":(.        (
199c0 69 52 6f 6c 6c 62 61 63 6b 29 3f 22 63 61 6e 6e  iRollback)?"cann
199d0 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f  ot rollback - no
199e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
199f0 61 63 74 69 76 65 22 3a 0a 20 20 20 20 20 20 20  active":.       
19a00 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
19a10 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20  not commit - no 
19a20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
19a30 63 74 69 76 65 22 29 29 3b 0a 20 20 20 20 20 20  ctive"));.      
19a40 20 20 20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c     .    rc = SQL
19a50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67  ITE_ERROR;.    g
19a60 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
19a70 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72  _error;.  }.  br
19a80 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
19a90 65 3a 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 50  e: Transaction P
19aa0 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
19ab0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
19ac0 73 61 63 74 69 6f 6e 20 6f 6e 20 64 61 74 61 62  saction on datab
19ad0 61 73 65 20 50 31 20 69 66 20 61 20 74 72 61 6e  ase P1 if a tran
19ae0 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  saction is not a
19af0 6c 72 65 61 64 79 0a 2a 2a 20 61 63 74 69 76 65  lready.** active
19b00 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 6e 6f  ..** If P2 is no
19b10 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 77  n-zero, then a w
19b20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
19b30 20 69 73 20 73 74 61 72 74 65 64 2c 20 6f 72 20   is started, or 
19b40 69 66 20 61 20 0a 2a 2a 20 72 65 61 64 2d 74 72  if a .** read-tr
19b50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
19b60 65 61 64 79 20 61 63 74 69 76 65 2c 20 69 74 20  eady active, it 
19b70 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
19b80 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
19b90 6f 6e 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  on..** If P2 is 
19ba0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 72 65 61  zero, then a rea
19bb0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
19bc0 20 73 74 61 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   started..**.** 
19bd0 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  P1 is the index 
19be0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19bf0 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68  file on which th
19c00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
19c10 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20 49 6e  .** started.  In
19c20 64 65 78 20 30 20 69 73 20 74 68 65 20 6d 61 69  dex 0 is the mai
19c30 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
19c40 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73 20 74  and index 1 is t
19c50 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65 64 20  he.** file used 
19c60 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61  for temporary ta
19c70 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73 20 6f  bles.  Indices o
19c80 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72 65 20  f 2 or more are 
19c90 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74 74 61  used for.** atta
19ca0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a  ched databases..
19cb0 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74 65  **.** If a write
19cc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
19cd0 73 74 61 72 74 65 64 20 61 6e 64 20 74 68 65 20  started and the 
19ce0 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75  Vdbe.usesStmtJou
19cf0 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a 2a 20  rnal flag is.** 
19d00 74 72 75 65 20 28 74 68 69 73 20 66 6c 61 67 20  true (this flag 
19d10 69 73 20 73 65 74 20 69 66 20 74 68 65 20 56 64  is set if the Vd
19d20 62 65 20 6d 61 79 20 6d 6f 64 69 66 79 20 6d 6f  be may modify mo
19d30 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
19d40 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77  and may.** throw
19d50 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74   an ABORT except
19d60 69 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d 65 6e  ion), a statemen
19d70 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  t transaction ma
19d80 79 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e 65 64  y also be opened
19d90 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  ..** More specif
19da0 69 63 61 6c 6c 79 2c 20 61 20 73 74 61 74 65 6d  ically, a statem
19db0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
19dc0 69 73 20 6f 70 65 6e 65 64 20 69 66 66 20 74 68  is opened iff th
19dd0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
19de0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nnection is curr
19df0 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61 75 74  ently not in aut
19e00 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f 72  ocommit mode, or
19e10 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   if there are ot
19e20 68 65 72 0a 2a 2a 20 61 63 74 69 76 65 20 73 74  her.** active st
19e30 61 74 65 6d 65 6e 74 73 2e 20 41 20 73 74 61 74  atements. A stat
19e40 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
19e50 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 61  n allows the cha
19e60 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
19e70 73 0a 2a 2a 20 56 44 42 45 20 74 6f 20 62 65 20  s.** VDBE to be 
19e80 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
19e90 72 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 6f  r an error witho
19ea0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
19eb0 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65 6e  l back the.** en
19ec0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
19ed0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 69 73  . If no error is
19ee0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
19ef0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
19f00 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
19f10 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
19f20 6d 6d 69 74 20 77 68 65 6e 20 74 68 65 20 56 44  mmit when the VD
19f30 42 45 20 68 61 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20  BE halts..**.** 
19f40 49 66 20 50 35 21 3d 30 20 74 68 65 6e 20 74 68  If P5!=0 then th
19f50 69 73 20 6f 70 63 6f 64 65 20 61 6c 73 6f 20 63  is opcode also c
19f60 68 65 63 6b 73 20 74 68 65 20 73 63 68 65 6d 61  hecks the schema
19f70 20 63 6f 6f 6b 69 65 20 61 67 61 69 6e 73 74 20   cookie against 
19f80 50 33 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 63  P3.** and the sc
19f90 68 65 6d 61 20 67 65 6e 65 72 61 74 69 6f 6e 20  hema generation 
19fa0 63 6f 75 6e 74 65 72 20 61 67 61 69 6e 73 74 20  counter against 
19fb0 50 34 2e 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b 69  P4..** The cooki
19fc0 65 20 63 68 61 6e 67 65 73 20 69 74 73 20 76 61  e changes its va
19fd0 6c 75 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  lue whenever the
19fe0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
19ff0 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 20 54 68 69   changes..** Thi
1a000 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 75  s operation is u
1a010 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 77 68  sed to detect wh
1a020 65 6e 20 74 68 61 74 20 74 68 65 20 63 6f 6f 6b  en that the cook
1a030 69 65 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ie has changed.*
1a040 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 63  * and that the c
1a050 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 6e  urrent process n
1a060 65 65 64 73 20 74 6f 20 72 65 72 65 61 64 20 74  eeds to reread t
1a070 68 65 20 73 63 68 65 6d 61 2e 20 20 49 66 20 74  he schema.  If t
1a080 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 63 6f 6f  he schema.** coo
1a090 6b 69 65 20 69 6e 20 50 33 20 64 69 66 66 65 72  kie in P3 differ
1a0a0 73 20 66 72 6f 6d 20 74 68 65 20 73 63 68 65 6d  s from the schem
1a0b0 61 20 63 6f 6f 6b 69 65 20 69 6e 20 74 68 65 20  a cookie in the 
1a0c0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
1a0d0 6f 72 0a 2a 2a 20 69 66 20 74 68 65 20 73 63 68  or.** if the sch
1a0e0 65 6d 61 20 67 65 6e 65 72 61 74 69 6f 6e 20 63  ema generation c
1a0f0 6f 75 6e 74 65 72 20 69 6e 20 50 34 20 64 69 66  ounter in P4 dif
1a100 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 75  fers from the cu
1a110 72 72 65 6e 74 0a 2a 2a 20 67 65 6e 65 72 61 74  rrent.** generat
1a120 69 6f 6e 20 63 6f 75 6e 74 65 72 2c 20 74 68 65  ion counter, the
1a130 6e 20 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45  n an SQLITE_SCHE
1a140 4d 41 20 65 72 72 6f 72 20 69 73 20 72 61 69 73  MA error is rais
1a150 65 64 20 61 6e 64 20 65 78 65 63 75 74 69 6f 6e  ed and execution
1a160 0a 2a 2a 20 68 61 6c 74 73 2e 20 20 54 68 65 20  .** halts.  The 
1a170 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
1a180 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  rapper function 
1a190 6d 69 67 68 74 20 74 68 65 6e 20 72 65 70 72 65  might then repre
1a1a0 70 61 72 65 20 74 68 65 0a 2a 2a 20 73 74 61 74  pare the.** stat
1a1b0 65 6d 65 6e 74 20 61 6e 64 20 72 65 72 75 6e 20  ement and rerun 
1a1c0 69 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  it from the begi
1a1d0 6e 6e 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f  nning..*/.case O
1a1e0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b  P_Transaction: {
1a1f0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
1a200 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e   int iMeta;.  in
1a210 74 20 69 47 65 6e 3b 0a 0a 20 20 61 73 73 65 72  t iGen;..  asser
1a220 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
1a230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1a240 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70  readOnly==0 || p
1a250 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20 20 61  Op->p2==0 );.  a
1a260 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1a270 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
1a280 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
1a290 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
1a2a0 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
1a2b0 70 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  p1) );.  if( pOp
1a2c0 2d 3e 70 32 20 26 26 20 28 64 62 2d 3e 66 6c 61  ->p2 && (db->fla
1a2d0 67 73 20 26 20 53 51 4c 49 54 45 5f 51 75 65 72  gs & SQLITE_Quer
1a2e0 79 4f 6e 6c 79 29 21 3d 30 20 29 7b 0a 20 20 20  yOnly)!=0 ){.   
1a2f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1a300 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
1a310 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1a320 6f 72 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20  or;.  }.  pBt = 
1a330 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
1a340 2e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 42 74  .pBt;..  if( pBt
1a350 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a360 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1a370 61 6e 73 28 70 42 74 2c 20 70 4f 70 2d 3e 70 32  ans(pBt, pOp->p2
1a380 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1a390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1a3a0 5f 53 4e 41 50 53 48 4f 54 20 29 3b 0a 20 20 20  _SNAPSHOT );.   
1a3b0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
1a3c0 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
1a3d0 45 52 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ERY );.    if( r
1a3e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a3f0 20 20 20 20 20 20 69 66 28 20 28 72 63 26 30 78        if( (rc&0x
1a400 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  ff)==SQLITE_BUSY
1a410 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
1a420 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  c = (int)(pOp - 
1a430 61 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aOp);.        p-
1a440 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
1a450 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75    goto vdbe_retu
1a460 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
1a470 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1a480 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
1a490 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ..    if( pOp->p
1a4a0 32 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  2 && p->usesStmt
1a4b0 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 20 26 26  Journal .     &&
1a4c0 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   (db->autoCommit
1a4d0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65  ==0 || db->nVdbe
1a4e0 52 65 61 64 3e 31 29 20 0a 20 20 20 20 29 7b 0a  Read>1) .    ){.
1a4f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
1a500 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
1a510 61 6e 73 28 70 42 74 29 20 29 3b 0a 20 20 20 20  ans(pBt) );.    
1a520 20 20 69 66 28 20 70 2d 3e 69 53 74 61 74 65 6d    if( p->iStatem
1a530 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent==0 ){.      
1a540 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
1a550 74 61 74 65 6d 65 6e 74 3e 3d 30 20 26 26 20 64  tatement>=0 && d
1a560 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 3d 30  b->nSavepoint>=0
1a570 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   );.        db->
1a580 6e 53 74 61 74 65 6d 65 6e 74 2b 2b 3b 20 0a 20  nStatement++; . 
1a590 20 20 20 20 20 20 20 70 2d 3e 69 53 74 61 74 65         p->iState
1a5a0 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65  ment = db->nSave
1a5b0 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 6e 53 74 61  point + db->nSta
1a5c0 74 65 6d 65 6e 74 3b 0a 20 20 20 20 20 20 7d 0a  tement;.      }.
1a5d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a5e0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
1a5f0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42  (db, SAVEPOINT_B
1a600 45 47 49 4e 2c 20 70 2d 3e 69 53 74 61 74 65 6d  EGIN, p->iStatem
1a610 65 6e 74 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  ent-1);.      if
1a620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a630 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a640 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1a650 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e 69 53  nStmt(pBt, p->iS
1a660 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20  tatement);.     
1a670 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 74 6f   }..      /* Sto
1a680 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  re the current v
1a690 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
1a6a0 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
1a6b0 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
1a6c0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65  .      ** counte
1a6d0 72 2e 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  r. If the statem
1a6e0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1a6f0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
1a700 65 64 20 62 61 63 6b 2c 0a 20 20 20 20 20 20 2a  ed back,.      *
1a710 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1a720 68 69 73 20 63 6f 75 6e 74 65 72 20 6e 65 65 64  his counter need
1a730 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
1a740 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20 20 20   too.  */.      
1a750 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 20  p->nStmtDefCons 
1a760 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43  = db->nDeferredC
1a770 6f 6e 73 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ons;.      p->nS
1a780 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 20 3d 20  tmtDefImmCons = 
1a790 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
1a7a0 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cons;.    }..   
1a7b0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 73   /* Gather the s
1a7c0 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 6e 75  chema version nu
1a7d0 6d 62 65 72 20 66 6f 72 20 63 68 65 63 6b 69 6e  mber for checkin
1a7e0 67 3a 0a 20 20 20 20 2a 2a 20 49 4d 50 4c 45 4d  g:.    ** IMPLEM
1a7f0 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30  ENTATION-OF: R-0
1a800 33 31 38 39 2d 35 31 31 33 35 20 41 73 20 65 61  3189-51135 As ea
1a810 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
1a820 20 72 75 6e 73 2c 20 74 68 65 20 73 63 68 65 6d   runs, the schem
1a830 61 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  a.    ** version
1a840 20 69 73 20 63 68 65 63 6b 65 64 20 74 6f 20 65   is checked to e
1a850 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
1a860 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
1a870 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 0a  anged since the.
1a880 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65      ** SQL state
1a890 6d 65 6e 74 20 77 61 73 20 70 72 65 70 61 72 65  ment was prepare
1a8a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
1a8b0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
1a8c0 61 28 70 42 74 2c 20 42 54 52 45 45 5f 53 43 48  a(pBt, BTREE_SCH
1a8d0 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 28 75 33  EMA_VERSION, (u3
1a8e0 32 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 20  2 *)&iMeta);.   
1a8f0 20 69 47 65 6e 20 3d 20 64 62 2d 3e 61 44 62 5b   iGen = db->aDb[
1a900 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d 61  pOp->p1].pSchema
1a910 2d 3e 69 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 20  ->iGeneration;. 
1a920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 47 65 6e   }else{.    iGen
1a930 20 3d 20 69 4d 65 74 61 20 3d 20 30 3b 0a 20 20   = iMeta = 0;.  
1a940 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  }.  assert( pOp-
1a950 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  >p5==0 || pOp->p
1a960 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
1a970 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35  );.  if( pOp->p5
1a980 20 26 26 20 28 69 4d 65 74 61 21 3d 70 4f 70 2d   && (iMeta!=pOp-
1a990 3e 70 33 20 7c 7c 20 69 47 65 6e 21 3d 70 4f 70  >p3 || iGen!=pOp
1a9a0 2d 3e 70 34 2e 69 29 20 29 7b 0a 20 20 20 20 73  ->p4.i) ){.    s
1a9b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a9c0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
1a9d0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
1a9e0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1a9f0 62 2c 20 22 64 61 74 61 62 61 73 65 20 73 63 68  b, "database sch
1aa00 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
1aa10 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  );.    /* If the
1aa20 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 66   schema-cookie f
1aa30 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1aa40 20 66 69 6c 65 20 6d 61 74 63 68 65 73 20 74 68   file matches th
1aa50 65 20 63 6f 6f 6b 69 65 20 0a 20 20 20 20 2a 2a  e cookie .    **
1aa60 20 73 74 6f 72 65 64 20 77 69 74 68 20 74 68 65   stored with the
1aa70 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
1aa80 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1aa90 20 73 63 68 65 6d 61 2c 20 64 6f 0a 20 20 20 20   schema, do.    
1aaa0 2a 2a 20 6e 6f 74 20 72 65 6c 6f 61 64 20 74 68  ** not reload th
1aab0 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 74 68  e schema from th
1aac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1aad0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1aae0 66 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 73  f virtual-tables
1aaf0 20 61 72 65 20 69 6e 20 75 73 65 2c 20 74 68 69   are in use, thi
1ab00 73 20 69 73 20 6e 6f 74 20 6a 75 73 74 20 61 6e  s is not just an
1ab10 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20   optimization.. 
1ab20 20 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 76 2d 74     ** Often, v-t
1ab30 61 62 6c 65 73 20 73 74 6f 72 65 20 74 68 65 69  ables store thei
1ab40 72 20 64 61 74 61 20 69 6e 20 6f 74 68 65 72 20  r data in other 
1ab50 53 51 4c 69 74 65 20 74 61 62 6c 65 73 2c 20 77  SQLite tables, w
1ab60 68 69 63 68 0a 20 20 20 20 2a 2a 20 61 72 65 20  hich.    ** are 
1ab70 71 75 65 72 69 65 64 20 66 72 6f 6d 20 77 69 74  queried from wit
1ab80 68 69 6e 20 78 4e 65 78 74 28 29 20 61 6e 64 20  hin xNext() and 
1ab90 6f 74 68 65 72 20 76 2d 74 61 62 6c 65 20 6d 65  other v-table me
1aba0 74 68 6f 64 73 20 75 73 69 6e 67 0a 20 20 20 20  thods using.    
1abb0 2a 2a 20 70 72 65 70 61 72 65 64 20 71 75 65 72  ** prepared quer
1abc0 69 65 73 2e 20 49 66 20 73 75 63 68 20 61 20 71  ies. If such a q
1abd0 75 65 72 79 20 69 73 20 6f 75 74 2d 6f 66 2d 64  uery is out-of-d
1abe0 61 74 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 77  ate, we do not w
1abf0 61 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  ant to.    ** di
1ac00 73 63 61 72 64 20 74 68 65 20 64 61 74 61 62 61  scard the databa
1ac10 73 65 20 73 63 68 65 6d 61 2c 20 61 73 20 74 68  se schema, as th
1ac20 65 20 75 73 65 72 20 63 6f 64 65 20 69 6d 70 6c  e user code impl
1ac30 65 6d 65 6e 74 69 6e 67 20 74 68 65 0a 20 20 20  ementing the.   
1ac40 20 2a 2a 20 76 2d 74 61 62 6c 65 20 77 6f 75 6c   ** v-table woul
1ac50 64 20 68 61 76 65 20 74 6f 20 62 65 20 72 65 61  d have to be rea
1ac60 64 79 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  dy for the sqlit
1ac70 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
1ac80 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20  e itself.    ** 
1ac90 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
1aca0 64 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74  d whenever sqlit
1acb0 65 33 5f 73 74 65 70 28 29 20 69 73 20 63 61 6c  e3_step() is cal
1acc0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
1acd0 0a 20 20 20 20 2a 2a 20 61 20 76 2d 74 61 62 6c  .    ** a v-tabl
1ace0 65 20 6d 65 74 68 6f 64 2e 0a 20 20 20 20 2a 2f  e method..    */
1acf0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
1ad00 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65 6d  [pOp->p1].pSchem
1ad10 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
1ad20 21 3d 69 4d 65 74 61 20 29 7b 0a 20 20 20 20 20  !=iMeta ){.     
1ad30 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
1ad40 53 63 68 65 6d 61 28 64 62 2c 20 70 4f 70 2d 3e  Schema(db, pOp->
1ad50 70 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  p1);.    }.    p
1ad60 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
1ad70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53     rc = SQLITE_S
1ad80 43 48 45 4d 41 3b 0a 20 20 7d 0a 20 20 69 66 28  CHEMA;.  }.  if(
1ad90 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
1ada0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1adb0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1adc0 63 6f 64 65 3a 20 52 65 61 64 43 6f 6f 6b 69 65  code: ReadCookie
1add0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
1ade0 0a 2a 2a 20 52 65 61 64 20 63 6f 6f 6b 69 65 20  .** Read cookie 
1adf0 6e 75 6d 62 65 72 20 50 33 20 66 72 6f 6d 20 64  number P3 from d
1ae00 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20 77  atabase P1 and w
1ae10 72 69 74 65 20 69 74 20 69 6e 74 6f 20 72 65 67  rite it into reg
1ae20 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 50 33 3d  ister P2..** P3=
1ae30 3d 31 20 69 73 20 74 68 65 20 73 63 68 65 6d 61  =1 is the schema
1ae40 20 76 65 72 73 69 6f 6e 2e 20 20 50 33 3d 3d 32   version.  P3==2
1ae50 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1ae60 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 33 3d 3d   format..** P3==
1ae70 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65  3 is the recomme
1ae80 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65  nded pager cache
1ae90 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f   size, and so fo
1aea0 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 0a 2a  rth.  P1==0 is.*
1aeb0 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  * the main datab
1aec0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d  ase file and P1=
1aed0 3d 31 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =1 is the databa
1aee0 73 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  se file used to 
1aef0 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
1af00 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ry tables..**.**
1af10 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1af20 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
1af30 65 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  e database (eith
1af40 65 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  er a transaction
1af50 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 74 61 72  .** must be star
1af60 74 65 64 20 6f 72 20 74 68 65 72 65 20 6d 75 73  ted or there mus
1af70 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
1af80 73 6f 72 29 20 62 65 66 6f 72 65 0a 2a 2a 20 65  sor) before.** e
1af90 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 69 6e  xecuting this in
1afa0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
1afb0 73 65 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  se OP_ReadCookie
1afc0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
1afd0 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69    /* out2 */.  i
1afe0 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20  nt iMeta;.  int 
1aff0 69 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b  iDb;.  int iCook
1b000 69 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ie;..  assert( p
1b010 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20  ->bIsReader );. 
1b020 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a   iDb = pOp->p1;.
1b030 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d    iCookie = pOp-
1b040 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p3;.  assert( p
1b050 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45 5f 4e 5f  Op->p3<SQLITE_N_
1b060 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20  BTREE_META );.  
1b070 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
1b080 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
1b090 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
1b0a0 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 29  Db[iDb].pBt!=0 )
1b0b0 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  ;.  assert( DbMa
1b0c0 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
1b0d0 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a 0a 20 20  ask, iDb) );..  
1b0e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
1b0f0 65 74 61 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  eta(db->aDb[iDb]
1b100 2e 70 42 74 2c 20 69 43 6f 6f 6b 69 65 2c 20 28  .pBt, iCookie, (
1b110 75 33 32 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20  u32 *)&iMeta);. 
1b120 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
1b130 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
1b140 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d    pOut->u.i = iM
1b150 65 74 61 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  eta;.  break;.}.
1b160 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 74 43  ./* Opcode: SetC
1b170 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20 2a  ookie P1 P2 P3 *
1b180 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74   *.**.** Write t
1b190 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
1b1a0 20 50 33 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20   P3 into cookie 
1b1b0 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74  number P2 of dat
1b1c0 61 62 61 73 65 20 50 31 2e 0a 2a 2a 20 50 32 3d  abase P1..** P2=
1b1d0 3d 31 20 69 73 20 74 68 65 20 73 63 68 65 6d 61  =1 is the schema
1b1e0 20 76 65 72 73 69 6f 6e 2e 20 20 50 32 3d 3d 32   version.  P2==2
1b1f0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1b200 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 32 3d 3d   format..** P2==
1b210 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65  3 is the recomme
1b220 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65  nded pager cache
1b230 20 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73   .** size, and s
1b240 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20  o forth.  P1==0 
1b250 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  is the main data
1b260 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31  base file and P1
1b270 3d 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64  ==1 is the .** d
1b280 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
1b290 64 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f  d to store tempo
1b2a0 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  rary tables..**.
1b2b0 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
1b2c0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
1b2d0 20 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e   before executin
1b2e0 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a  g this opcode..*
1b2f0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f  /.case OP_SetCoo
1b300 6b 69 65 3a 20 7b 0a 20 20 44 62 20 2a 70 44 62  kie: {.  Db *pDb
1b310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1b320 3e 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52  >p2<SQLITE_N_BTR
1b330 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73  EE_META );.  ass
1b340 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1b350 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
1b360 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
1b370 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74  DbMaskTest(p->bt
1b380 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31  reeMask, pOp->p1
1b390 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1b3a0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
1b3b0 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
1b3c0 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  b[pOp->p1];.  as
1b3d0 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d  sert( pDb->pBt!=
1b3e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
1b3f0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
1b400 78 48 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70  xHeld(db, pOp->p
1b410 31 2c 20 30 29 20 29 3b 0a 20 20 2f 2a 20 53 65  1, 0) );.  /* Se
1b420 65 20 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e 64  e note about ind
1b430 65 78 20 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f  ex shifting on O
1b440 50 5f 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a  P_ReadCookie */.
1b450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1b460 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 44  reeUpdateMeta(pD
1b470 62 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c  b->pBt, pOp->p2,
1b480 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 69 66 28   pOp->p3);.  if(
1b490 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f   pOp->p2==BTREE_
1b4a0 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29  SCHEMA_VERSION )
1b4b0 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  {.    /* When th
1b4c0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1b4d0 63 68 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20  changes, record 
1b4e0 74 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69  the new cookie i
1b4f0 6e 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20  nternally */.   
1b500 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73   pDb->pSchema->s
1b510 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 70  chema_cookie = p
1b520 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 64 62 2d 3e  Op->p3;.    db->
1b530 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1b540 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
1b550 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
1b560 70 32 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46  p2==BTREE_FILE_F
1b570 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20  ORMAT ){.    /* 
1b580 52 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20 69  Record changes i
1b590 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  n the file forma
1b5a0 74 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53  t */.    pDb->pS
1b5b0 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1b5c0 61 74 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  at = pOp->p3;.  
1b5d0 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d  }.  if( pOp->p1=
1b5e0 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76  =1 ){.    /* Inv
1b5f0 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 70  alidate all prep
1b600 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
1b610 77 68 65 6e 65 76 65 72 20 74 68 65 20 54 45 4d  whenever the TEM
1b620 50 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  P database.    *
1b630 2a 20 73 63 68 65 6d 61 20 69 73 20 63 68 61 6e  * schema is chan
1b640 67 65 64 2e 20 20 54 69 63 6b 65 74 20 23 31 36  ged.  Ticket #16
1b650 34 34 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  44 */.    sqlite
1b660 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
1b670 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
1b680 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
1b690 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20  0;.  }.  if( rc 
1b6a0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1b6b0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
1b6c0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1b6d0 3a 20 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32  : OpenRead P1 P2
1b6e0 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
1b6f0 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69  opsis: root=P2 i
1b700 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  Db=P3.**.** Open
1b710 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
1b720 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61  sor for the data
1b730 62 61 73 65 20 74 61 62 6c 65 20 77 68 6f 73 65  base table whose
1b740 20 72 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a 2a   root page is.**
1b750 20 50 32 20 69 6e 20 61 20 64 61 74 61 62 61 73   P2 in a databas
1b760 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64 61 74  e file.  The dat
1b770 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 64 65  abase file is de
1b780 74 65 72 6d 69 6e 65 64 20 62 79 20 50 33 2e 20  termined by P3. 
1b790 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73 20  .** P3==0 means 
1b7a0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1b7b0 65 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20 74  e, P3==1 means t
1b7c0 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 64  he database used
1b7d0 20 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72 61   for .** tempora
1b7e0 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 50  ry tables, and P
1b7f0 33 3e 31 20 6d 65 61 6e 73 20 75 73 65 64 20 74  3>1 means used t
1b800 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1b810 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 64 61 74   attached.** dat
1b820 61 62 61 73 65 2e 20 20 47 69 76 65 20 74 68 65  abase.  Give the
1b830 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e 20 69   new cursor an i
1b840 64 65 6e 74 69 66 69 65 72 20 6f 66 20 50 31 2e  dentifier of P1.
1b850 20 20 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c 75    The P1.** valu
1b860 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 63  es need not be c
1b870 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20 61 6c  ontiguous but al
1b880 6c 20 50 31 20 76 61 6c 75 65 73 20 73 68 6f 75  l P1 values shou
1b890 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74 65  ld be small inte
1b8a0 67 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20 61  gers..** It is a
1b8b0 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20 74  n error for P1 t
1b8c0 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a  o be negative..*
1b8d0 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20 74 68  *.** If P5!=0 th
1b8e0 65 6e 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65  en use the conte
1b8f0 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
1b900 32 20 61 73 20 74 68 65 20 72 6f 6f 74 20 70 61  2 as the root pa
1b910 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 76  ge, not.** the v
1b920 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73 65 6c  alue of P2 itsel
1b930 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 77  f..**.** There w
1b940 69 6c 6c 20 62 65 20 61 20 72 65 61 64 20 6c 6f  ill be a read lo
1b950 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1b960 73 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 72  se whenever ther
1b970 65 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e is an.** open 
1b980 63 75 72 73 6f 72 2e 20 20 49 66 20 74 68 65 20  cursor.  If the 
1b990 64 61 74 61 62 61 73 65 20 77 61 73 20 75 6e 6c  database was unl
1b9a0 6f 63 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 74  ocked prior to t
1b9b0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
1b9c0 2a 2a 20 74 68 65 6e 20 61 20 72 65 61 64 20 6c  ** then a read l
1b9d0 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 64 20  ock is acquired 
1b9e0 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1b9f0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 41 20  instruction.  A 
1ba00 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c 6c  read.** lock all
1ba10 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ows other proces
1ba20 73 65 73 20 74 6f 20 72 65 61 64 20 74 68 65 20  ses to read the 
1ba30 64 61 74 61 62 61 73 65 20 62 75 74 20 70 72 6f  database but pro
1ba40 68 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f 74  hibits.** any ot
1ba50 68 65 72 20 70 72 6f 63 65 73 73 20 66 72 6f 6d  her process from
1ba60 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 64   modifying the d
1ba70 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
1ba80 61 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72 65  ad lock is.** re
1ba90 6c 65 61 73 65 64 20 77 68 65 6e 20 61 6c 6c 20  leased when all 
1baa0 63 75 72 73 6f 72 73 20 61 72 65 20 63 6c 6f 73  cursors are clos
1bab0 65 64 2e 20 20 49 66 20 74 68 69 73 20 69 6e 73  ed.  If this ins
1bac0 74 72 75 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  truction attempt
1bad0 73 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20 72 65  s.** to get a re
1bae0 61 64 20 6c 6f 63 6b 20 62 75 74 20 66 61 69 6c  ad lock but fail
1baf0 73 2c 20 74 68 65 20 73 63 72 69 70 74 20 74 65  s, the script te
1bb00 72 6d 69 6e 61 74 65 73 20 77 69 74 68 20 61 6e  rminates with an
1bb10 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1bb20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1bb30 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d  * The P4 value m
1bb40 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  ay be either an 
1bb50 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33  integer (P4_INT3
1bb60 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  2) or a pointer 
1bb70 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20  to.** a KeyInfo 
1bb80 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45  structure (P4_KE
1bb90 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73  YINFO). If it is
1bba0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1bbb0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
1bbc0 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64  cture, then said
1bbd0 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
1bbe0 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  es the content a
1bbf0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a  nd collating .**
1bc00 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
1bc10 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65   index being ope
1bc20 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1bc30 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65  if P4 is an inte
1bc40 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69  ger .** value, i
1bc50 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1bc60 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1bc70 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
1bc80 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1bc90 4f 70 65 6e 57 72 69 74 65 2c 20 52 65 6f 70 65  OpenWrite, Reope
1bca0 6e 49 64 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  nIdx.*/./* Opcod
1bcb0 65 3a 20 52 65 6f 70 65 6e 49 64 78 20 50 31 20  e: ReopenIdx P1 
1bcc0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
1bcd0 79 6e 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32  ynopsis: root=P2
1bce0 20 69 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 54 68   iDb=P3.**.** Th
1bcf0 65 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f  e ReopenIdx opco
1bd00 64 65 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79  de works exactly
1bd10 20 6c 69 6b 65 20 52 65 61 64 4f 70 65 6e 20 65   like ReadOpen e
1bd20 78 63 65 70 74 20 74 68 61 74 20 69 74 20 66 69  xcept that it fi
1bd30 72 73 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 6f  rst.** checks to
1bd40 20 73 65 65 20 69 66 20 74 68 65 20 63 75 72 73   see if the curs
1bd50 6f 72 20 6f 6e 20 50 31 20 69 73 20 61 6c 72 65  or on P1 is alre
1bd60 61 64 79 20 6f 70 65 6e 20 77 69 74 68 20 61 20  ady open with a 
1bd70 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6e 75 6d  root page.** num
1bd80 62 65 72 20 6f 66 20 50 32 20 61 6e 64 20 69 66  ber of P2 and if
1bd90 20 69 74 20 69 73 20 74 68 69 73 20 6f 70 63 6f   it is this opco
1bda0 64 65 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d  de becomes a no-
1bdb0 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  op.  In other wo
1bdc0 72 64 73 2c 0a 2a 2a 20 69 66 20 74 68 65 20 63  rds,.** if the c
1bdd0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
1bde0 20 6f 70 65 6e 2c 20 64 6f 20 6e 6f 74 20 72 65   open, do not re
1bdf0 6f 70 65 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  open it..**.** T
1be00 68 65 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63  he ReopenIdx opc
1be10 6f 64 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ode may only be 
1be20 75 73 65 64 20 77 69 74 68 20 50 35 3d 3d 30 20  used with P5==0 
1be30 61 6e 64 20 77 69 74 68 20 50 34 20 62 65 69 6e  and with P4 bein
1be40 67 0a 2a 2a 20 61 20 50 34 5f 4b 45 59 49 4e 46  g.** a P4_KEYINF
1be50 4f 20 6f 62 6a 65 63 74 2e 20 20 46 75 72 74 68  O object.  Furth
1be60 65 72 6d 6f 72 65 2c 20 74 68 65 20 50 33 20 76  ermore, the P3 v
1be70 61 6c 75 65 20 6d 75 73 74 20 62 65 20 74 68 65  alue must be the
1be80 20 73 61 6d 65 20 61 73 0a 2a 2a 20 65 76 65 72   same as.** ever
1be90 79 20 6f 74 68 65 72 20 52 65 6f 70 65 6e 49 64  y other ReopenId
1bea0 78 20 6f 72 20 4f 70 65 6e 52 65 61 64 20 66 6f  x or OpenRead fo
1beb0 72 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f  r the same curso
1bec0 72 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  r number..**.** 
1bed0 53 65 65 20 74 68 65 20 4f 70 65 6e 52 65 61 64  See the OpenRead
1bee0 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74   opcode document
1bef0 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ation for additi
1bf00 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1bf10 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
1bf20 4f 70 65 6e 57 72 69 74 65 20 50 31 20 50 32 20  OpenWrite P1 P2 
1bf30 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
1bf40 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44  psis: root=P2 iD
1bf50 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  b=P3.**.** Open 
1bf60 61 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  a read/write cur
1bf70 73 6f 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20  sor named P1 on 
1bf80 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
1bf90 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a  ex whose root.**
1bfa0 20 70 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72   page is P2.  Or
1bfb0 20 69 66 20 50 35 21 3d 30 20 75 73 65 20 74 68   if P5!=0 use th
1bfc0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
1bfd0 69 73 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64  ister P2 to find
1bfe0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
1bff0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  e..**.** The P4 
1c000 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74  value may be eit
1c010 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28  her an integer (
1c020 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70  P4_INT32) or a p
1c030 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b  ointer to.** a K
1c040 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1c050 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49   (P4_KEYINFO). I
1c060 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65  f it is a pointe
1c070 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a  r to a KeyInfo .
1c080 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
1c090 65 6e 20 73 61 69 64 20 73 74 72 75 63 74 75 72  en said structur
1c0a0 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f  e defines the co
1c0b0 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74  ntent and collat
1c0c0 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ing .** sequence
1c0d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   of the index be
1c0e0 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65  ing opened. Othe
1c0f0 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 73 20  rwise, if P4 is 
1c100 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76  an integer .** v
1c110 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65 74 20  alue, it is set 
1c120 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1c130 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1c140 74 61 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65  table, or to the
1c150 0a 2a 2a 20 6c 61 72 67 65 73 74 20 69 6e 64 65  .** largest inde
1c160 78 20 6f 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  x of any column 
1c170 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
1c180 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 75 73  t is actually us
1c190 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ed..**.** This i
1c1a0 6e 73 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73  nstruction works
1c1b0 20 6a 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52   just like OpenR
1c1c0 65 61 64 20 65 78 63 65 70 74 20 74 68 61 74 20  ead except that 
1c1d0 69 74 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72  it opens the cur
1c1e0 73 6f 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77  sor.** in read/w
1c1f0 72 69 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rite mode.  For 
1c200 61 20 67 69 76 65 6e 20 74 61 62 6c 65 2c 20 74  a given table, t
1c210 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e 65 20  here can be one 
1c220 6f 72 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c  or more read-onl
1c230 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72 20  y.** cursors or 
1c240 61 20 73 69 6e 67 6c 65 20 72 65 61 64 2f 77 72  a single read/wr
1c250 69 74 65 20 63 75 72 73 6f 72 20 62 75 74 20 6e  ite cursor but n
1c260 6f 74 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53  ot both..**.** S
1c270 65 65 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64  ee also OpenRead
1c280 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6f  ..*/.case OP_Reo
1c290 70 65 6e 49 64 78 3a 20 7b 0a 20 20 69 6e 74 20  penIdx: {.  int 
1c2a0 6e 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66  nField;.  KeyInf
1c2b0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
1c2c0 6e 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62  nt p2;.  int iDb
1c2d0 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a  ;.  int wrFlag;.
1c2e0 20 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56    Btree *pX;.  V
1c2f0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
1c300 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
1c310 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d  ssert( pOp->p5==
1c320 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50  0 || pOp->p5==OP
1c330 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20  FLAG_SEEKEQ );. 
1c340 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1c350 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
1c360 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e   );.  pCur = p->
1c370 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1c380 20 20 69 66 28 20 70 43 75 72 20 26 26 20 70 43    if( pCur && pC
1c390 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 75  ur->pgnoRoot==(u
1c3a0 33 32 29 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20  32)pOp->p2 ){.  
1c3b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c3c0 69 44 62 3d 3d 70 4f 70 2d 3e 70 33 20 29 3b 20  iDb==pOp->p3 ); 
1c3d0 20 20 20 20 20 2f 2a 20 47 75 61 72 61 6e 74 65       /* Guarante
1c3e0 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 67  ed by the code g
1c3f0 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  enerator */.    
1c400 67 6f 74 6f 20 6f 70 65 6e 5f 63 75 72 73 6f 72  goto open_cursor
1c410 5f 73 65 74 5f 68 69 6e 74 73 3b 0a 20 20 7d 0a  _set_hints;.  }.
1c420 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1c430 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
1c440 74 6c 79 20 6f 70 65 6e 20 6f 72 20 69 73 20 6f  tly open or is o
1c450 70 65 6e 20 6f 6e 20 61 20 64 69 66 66 65 72 65  pen on a differe
1c460 6e 74 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  nt.  ** index, t
1c470 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
1c480 20 69 6e 74 6f 20 4f 50 5f 4f 70 65 6e 52 65 61   into OP_OpenRea
1c490 64 20 74 6f 20 66 6f 72 63 65 20 61 20 72 65 6f  d to force a reo
1c4a0 70 65 6e 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  pen */.case OP_O
1c4b0 70 65 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50  penRead:.case OP
1c4c0 5f 4f 70 65 6e 57 72 69 74 65 3a 0a 0a 20 20 61  _OpenWrite:..  a
1c4d0 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
1c4e0 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  de==OP_OpenWrite
1c4f0 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c   || pOp->p5==0 |
1c500 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41  | pOp->p5==OPFLA
1c510 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20 61 73  G_SEEKEQ );.  as
1c520 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
1c530 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
1c540 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1c550 4f 70 65 6e 52 65 61 64 20 7c 7c 20 70 4f 70 2d  OpenRead || pOp-
1c560 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 65 6f 70  >opcode==OP_Reop
1c570 65 6e 49 64 78 0a 20 20 20 20 20 20 20 20 20 20  enIdx.          
1c580 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  || p->readOnly==
1c590 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65  0 );..  if( p->e
1c5a0 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 72 63  xpired ){.    rc
1c5b0 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f   = SQLITE_ABORT_
1c5c0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 67 6f  ROLLBACK;.    go
1c5d0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1c5e0 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 6e 46  error;.  }..  nF
1c5f0 69 65 6c 64 20 3d 20 30 3b 0a 20 20 70 4b 65 79  ield = 0;.  pKey
1c600 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 70 32 20 3d  Info = 0;.  p2 =
1c610 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 44 62 20   pOp->p2;.  iDb 
1c620 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73  = pOp->p3;.  ass
1c630 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
1c640 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1c650 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
1c660 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
1c670 20 69 44 62 29 20 29 3b 0a 20 20 70 44 62 20 3d   iDb) );.  pDb =
1c680 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
1c690 20 20 70 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b    pX = pDb->pBt;
1c6a0 0a 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30  .  assert( pX!=0
1c6b0 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f   );.  if( pOp->o
1c6c0 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72  pcode==OP_OpenWr
1c6d0 69 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ite ){.    asser
1c6e0 74 28 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c  t( OPFLAG_FORDEL
1c6f0 45 54 45 3d 3d 42 54 52 45 45 5f 46 4f 52 44 45  ETE==BTREE_FORDE
1c700 4c 45 54 45 20 29 3b 0a 20 20 20 20 77 72 46 6c  LETE );.    wrFl
1c710 61 67 20 3d 20 42 54 52 45 45 5f 57 52 43 53 52  ag = BTREE_WRCSR
1c720 20 7c 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50   | (pOp->p5 & OP
1c730 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3b  FLAG_FORDELETE);
1c740 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1c750 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1c760 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
1c770 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  );.    if( pDb->
1c780 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
1c790 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69  rmat < p->minWri
1c7a0 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a  teFileFormat ){.
1c7b0 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74        p->minWrit
1c7c0 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44  eFileFormat = pD
1c7d0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
1c7e0 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20  _format;.    }. 
1c7f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c   }else{.    wrFl
1c800 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ag = 0;.  }.  if
1c810 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ( pOp->p5 & OPFL
1c820 41 47 5f 50 32 49 53 52 45 47 20 29 7b 0a 20 20  AG_P2ISREG ){.  
1c830 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 29    assert( p2>0 )
1c840 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32  ;.    assert( p2
1c850 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
1c860 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
1c870 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
1c880 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2];.    assert( 
1c890 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 32 29  memIsValid(pIn2)
1c8a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1c8b0 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn2->flags & M
1c8c0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
1c8d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c8e0 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29  Integerify(pIn2)
1c8f0 3b 0a 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29  ;.    p2 = (int)
1c900 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f  pIn2->u.i;.    /
1c910 2a 20 54 68 65 20 70 32 20 76 61 6c 75 65 20 61  * The p2 value a
1c920 6c 77 61 79 73 20 63 6f 6d 65 73 20 66 72 6f 6d  lways comes from
1c930 20 61 20 70 72 69 6f 72 20 4f 50 5f 43 72 65 61   a prior OP_Crea
1c940 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 61  teTable opcode a
1c950 6e 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  nd.    ** that o
1c960 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79  pcode will alway
1c970 73 20 73 65 74 20 74 68 65 20 70 32 20 76 61 6c  s set the p2 val
1c980 75 65 20 74 6f 20 32 20 6f 72 20 6d 6f 72 65 20  ue to 2 or more 
1c990 6f 72 20 65 6c 73 65 20 66 61 69 6c 2e 0a 20 20  or else fail..  
1c9a0 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 77 65    ** If there we
1c9b0 72 65 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68  re a failure, th
1c9c0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1c9d0 6d 65 6e 74 20 77 6f 75 6c 64 20 68 61 76 65 20  ment would have 
1c9e0 68 61 6c 74 65 64 0a 20 20 20 20 2a 2a 20 62 65  halted.    ** be
1c9f0 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74 68  fore reaching th
1ca00 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  is instruction. 
1ca10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1ca20 32 3e 3d 32 20 29 3b 0a 20 20 7d 0a 20 20 69 66  2>=2 );.  }.  if
1ca30 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1ca40 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  4_KEYINFO ){.   
1ca50 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d   pKeyInfo = pOp-
1ca60 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
1ca70 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1ca80 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29  fo->enc==ENC(db)
1ca90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1caa0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62  pKeyInfo->db==db
1cab0 20 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d   );.    nField =
1cac0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1cad0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1cae0 65 6c 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eld;.  }else if(
1caf0 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
1cb00 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 6e 46  _INT32 ){.    nF
1cb10 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  ield = pOp->p4.i
1cb20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1cb30 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20  pOp->p1>=0 );.  
1cb40 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 3d  assert( nField>=
1cb50 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1cb60 20 6e 46 69 65 6c 64 3d 3d 30 20 29 3b 20 20 2f   nField==0 );  /
1cb70 2a 20 54 61 62 6c 65 20 77 69 74 68 20 49 4e 54  * Table with INT
1cb80 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1cb90 20 61 6e 64 20 6e 6f 74 68 69 6e 67 20 65 6c 73   and nothing els
1cba0 65 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61 6c  e */.  pCur = al
1cbb0 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
1cbc0 70 4f 70 2d 3e 70 31 2c 20 6e 46 69 65 6c 64 2c  pOp->p1, nField,
1cbd0 20 69 44 62 2c 20 43 55 52 54 59 50 45 5f 42 54   iDb, CURTYPE_BT
1cbe0 52 45 45 29 3b 0a 20 20 69 66 28 20 70 43 75 72  REE);.  if( pCur
1cbf0 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
1cc00 6d 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52  m;.  pCur->nullR
1cc10 6f 77 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e  ow = 1;.  pCur->
1cc20 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  isOrdered = 1;. 
1cc30 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
1cc40 3d 20 70 32 3b 0a 23 69 66 64 65 66 20 53 51 4c  = p2;.#ifdef SQL
1cc50 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 75 72  ITE_DEBUG.  pCur
1cc60 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61  ->wrFlag = wrFla
1cc70 67 3b 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d  g;.#endif.  rc =
1cc80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1cc90 73 6f 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c  sor(pX, p2, wrFl
1cca0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1ccb0 75 72 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  ur->uc.pCursor);
1ccc0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
1ccd0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1cce0 2f 2a 20 53 65 74 20 74 68 65 20 56 64 62 65 43  /* Set the VdbeC
1ccf0 75 72 73 6f 72 2e 69 73 54 61 62 6c 65 20 76 61  ursor.isTable va
1cd00 72 69 61 62 6c 65 2e 20 50 72 65 76 69 6f 75 73  riable. Previous
1cd10 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 20 20 2a   versions of.  *
1cd20 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f  * SQLite used to
1cd30 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 72 6f   check if the ro
1cd40 6f 74 2d 70 61 67 65 20 66 6c 61 67 73 20 77 65  ot-page flags we
1cd50 72 65 20 73 61 6e 65 20 61 74 20 74 68 69 73 20  re sane at this 
1cd60 70 6f 69 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 72  point.  ** and r
1cd70 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20 63  eport database c
1cd80 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 65  orruption if the
1cd90 79 20 77 65 72 65 20 6e 6f 74 2c 20 62 75 74 20  y were not, but 
1cda0 74 68 69 73 20 63 68 65 63 6b 20 68 61 73 0a 20  this check has. 
1cdb0 20 2a 2a 20 73 69 6e 63 65 20 6d 6f 76 65 64 20   ** since moved 
1cdc0 69 6e 74 6f 20 74 68 65 20 62 74 72 65 65 20 6c  into the btree l
1cdd0 61 79 65 72 2e 20 20 2a 2f 20 20 0a 20 20 70 43  ayer.  */  .  pC
1cde0 75 72 2d 3e 69 73 54 61 62 6c 65 20 3d 20 70 4f  ur->isTable = pO
1cdf0 70 2d 3e 70 34 74 79 70 65 21 3d 50 34 5f 4b 45  p->p4type!=P4_KE
1ce00 59 49 4e 46 4f 3b 0a 0a 6f 70 65 6e 5f 63 75 72  YINFO;..open_cur
1ce10 73 6f 72 5f 73 65 74 5f 68 69 6e 74 73 3a 0a 20  sor_set_hints:. 
1ce20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f   assert( OPFLAG_
1ce30 42 55 4c 4b 43 53 52 3d 3d 42 54 52 45 45 5f 42  BULKCSR==BTREE_B
1ce40 55 4c 4b 4c 4f 41 44 20 29 3b 0a 20 20 61 73 73  ULKLOAD );.  ass
1ce50 65 72 74 28 20 4f 50 46 4c 41 47 5f 53 45 45 4b  ert( OPFLAG_SEEK
1ce60 45 51 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45  EQ==BTREE_SEEK_E
1ce70 51 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Q );.  testcase(
1ce80 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
1ce90 47 5f 42 55 4c 4b 43 53 52 20 29 3b 0a 23 69 66  G_BULKCSR );.#if
1cea0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ceb0 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
1cec0 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
1ced0 70 32 20 26 20 4f 50 46 4c 41 47 5f 53 45 45 4b  p2 & OPFLAG_SEEK
1cee0 45 51 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  EQ );.#endif.  s
1cef0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1cf00 72 48 69 6e 74 46 6c 61 67 73 28 70 43 75 72 2d  rHintFlags(pCur-
1cf10 3e 75 63 2e 70 43 75 72 73 6f 72 2c 0a 20 20 20  >uc.pCursor,.   
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 28 70 4f 70              (pOp
1cf40 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 42  ->p5 & (OPFLAG_B
1cf50 55 4c 4b 43 53 52 7c 4f 50 46 4c 41 47 5f 53 45  ULKCSR|OPFLAG_SE
1cf60 45 4b 45 51 29 29 29 3b 0a 20 20 69 66 28 20 72  EKEQ)));.  if( r
1cf70 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
1cf80 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
1cf90 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1cfa0 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  de: OpenEphemera
1cfb0 6c 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a  l P1 P2 * P4 P5.
1cfc0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f  ** Synopsis: nCo
1cfd0 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 4f 70  lumn=P2.**.** Op
1cfe0 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  en a new cursor 
1cff0 50 31 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e  P1 to a transien
1d000 74 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  t table..** The 
1d010 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
1d020 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
1d030 74 65 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74  te even if .** t
1d040 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1d050 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20   is read-only.  
1d060 54 68 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a  The ephemeral.**
1d070 20 74 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65   table is delete
1d080 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1d090 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  when the cursor 
1d0a0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
1d0b0 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65   P2 is the numbe
1d0c0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
1d0d0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
1d0e0 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73  ble..** The curs
1d0f0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42  or points to a B
1d100 54 72 65 65 20 74 61 62 6c 65 20 69 66 20 50 34  Tree table if P4
1d110 3d 3d 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72  ==0 and to a BTr
1d120 65 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50  ee index.** if P
1d130 34 20 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20  4 is not 0.  If 
1d140 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  P4 is not NULL, 
1d150 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  it points to a K
1d160 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1d170 0a 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73  .** that defines
1d180 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b   the format of k
1d190 65 79 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  eys in the index
1d1a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 70  ..**.** The P5 p
1d1b0 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
1d1c0 61 20 6d 61 73 6b 20 6f 66 20 74 68 65 20 42 54  a mask of the BT
1d1d0 52 45 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  REE_* flags defi
1d1e0 6e 65 64 0a 2a 2a 20 69 6e 20 62 74 72 65 65 2e  ned.** in btree.
1d1f0 68 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  h.  These flags 
1d200 63 6f 6e 74 72 6f 6c 20 61 73 70 65 63 74 73 20  control aspects 
1d210 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  of the operation
1d220 20 6f 66 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   of.** the btree
1d230 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4f 4d 49  .  The BTREE_OMI
1d240 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 42 54  T_JOURNAL and BT
1d250 52 45 45 5f 53 49 4e 47 4c 45 20 66 6c 61 67 73  REE_SINGLE flags
1d260 20 61 72 65 0a 2a 2a 20 61 64 64 65 64 20 61 75   are.** added au
1d270 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a  tomatically..*/.
1d280 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 41  /* Opcode: OpenA
1d290 75 74 6f 69 6e 64 65 78 20 50 31 20 50 32 20 2a  utoindex P1 P2 *
1d2a0 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
1d2b0 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a  s: nColumn=P2.**
1d2c0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1d2d0 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20 61  works the same a
1d2e0 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  s OP_OpenEphemer
1d2f0 61 6c 2e 20 20 49 74 20 68 61 73 20 61 0a 2a 2a  al.  It has a.**
1d300 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 20   different name 
1d310 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 69  to distinguish i
1d320 74 73 20 75 73 65 2e 20 20 54 61 62 6c 65 73 20  ts use.  Tables 
1d330 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  created using.**
1d340 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20   by this opcode 
1d350 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
1d360 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1d370 72 65 61 74 65 64 20 74 72 61 6e 73 69 65 6e 74  reated transient
1d380 0a 2a 2a 20 69 6e 64 69 63 65 73 20 69 6e 20 6a  .** indices in j
1d390 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  oins..*/.case OP
1d3a0 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 3a 20  _OpenAutoindex: 
1d3b0 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 45 70 68  .case OP_OpenEph
1d3c0 65 6d 65 72 61 6c 3a 20 7b 0a 20 20 56 64 62 65  emeral: {.  Vdbe
1d3d0 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 4b  Cursor *pCx;.  K
1d3e0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1d3f0 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ;..  static cons
1d400 74 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 3d  t int vfsFlags =
1d410 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
1d420 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
1d430 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1d440 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
1d450 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1d460 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 53  LUSIVE |.      S
1d470 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1d480 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
1d490 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
1d4a0 4e 53 49 45 4e 54 5f 44 42 3b 0a 20 20 61 73 73  NSIENT_DB;.  ass
1d4b0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1d4c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1d4d0 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43 78  ->p2>=0 );.  pCx
1d4e0 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f   = allocateCurso
1d4f0 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  r(p, pOp->p1, pO
1d500 70 2d 3e 70 32 2c 20 2d 31 2c 20 43 55 52 54 59  p->p2, -1, CURTY
1d510 50 45 5f 42 54 52 45 45 29 3b 0a 20 20 69 66 28  PE_BTREE);.  if(
1d520 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
1d530 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75  o_mem;.  pCx->nu
1d540 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78  llRow = 1;.  pCx
1d550 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 3d 20  ->isEphemeral = 
1d560 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
1d570 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
1d580 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 43 78  Vfs, 0, db, &pCx
1d590 2d 3e 70 42 74 78 2c 20 0a 20 20 20 20 20 20 20  ->pBtx, .       
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5b0 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
1d5c0 4e 41 4c 20 7c 20 42 54 52 45 45 5f 53 49 4e 47  NAL | BTREE_SING
1d5d0 4c 45 20 7c 20 70 4f 70 2d 3e 70 35 2c 20 76 66  LE | pOp->p5, vf
1d5e0 73 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72  sFlags);.  if( r
1d5f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d610 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
1d620 70 43 78 2d 3e 70 42 74 78 2c 20 31 29 3b 0a 20  pCx->pBtx, 1);. 
1d630 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1d640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
1d650 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20   If a transient 
1d660 69 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65  index is require
1d670 64 2c 20 63 72 65 61 74 65 20 69 74 20 62 79 20  d, create it by 
1d680 63 61 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 73  calling.    ** s
1d690 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1d6a0 65 54 61 62 6c 65 28 29 20 77 69 74 68 20 74 68  eTable() with th
1d6b0 65 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20  e BTREE_BLOBKEY 
1d6c0 66 6c 61 67 20 62 65 66 6f 72 65 0a 20 20 20 20  flag before.    
1d6d0 2a 2a 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20 49  ** opening it. I
1d6e0 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  f a transient ta
1d6f0 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 2c  ble is required,
1d700 20 6a 75 73 74 20 75 73 65 20 74 68 65 0a 20 20   just use the.  
1d710 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
1d720 6c 79 20 63 72 65 61 74 65 64 20 74 61 62 6c 65  ly created table
1d730 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
1d740 31 20 28 61 6e 20 42 4c 4f 42 5f 49 4e 54 4b 45  1 (an BLOB_INTKE
1d750 59 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a 2f  Y table)..    */
1d760 0a 20 20 20 20 69 66 28 20 28 70 43 78 2d 3e 70  .    if( (pCx->p
1d770 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
1d780 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
1d790 79 49 6e 66 6f 29 21 3d 30 20 29 7b 0a 20 20 20  yInfo)!=0 ){.   
1d7a0 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20     int pgno;.   
1d7b0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
1d7c0 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e  p4type==P4_KEYIN
1d7d0 46 4f 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  FO );.      rc =
1d7e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1d7f0 61 74 65 54 61 62 6c 65 28 70 43 78 2d 3e 70 42  ateTable(pCx->pB
1d800 74 78 2c 20 26 70 67 6e 6f 2c 20 42 54 52 45 45  tx, &pgno, BTREE
1d810 5f 42 4c 4f 42 4b 45 59 20 7c 20 70 4f 70 2d 3e  _BLOBKEY | pOp->
1d820 70 35 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  p5); .      if( 
1d830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d840 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d850 20 70 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 4f   pgno==MASTER_RO
1d860 4f 54 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  OT+1 );.        
1d870 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1d880 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20 20  ->db==db );.    
1d890 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
1d8a0 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64  Info->enc==ENC(d
1d8b0 62 29 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  b) );.        rc
1d8c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1d8d0 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 78 2c  ursor(pCx->pBtx,
1d8e0 20 70 67 6e 6f 2c 20 42 54 52 45 45 5f 57 52 43   pgno, BTREE_WRC
1d8f0 53 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  SR,.            
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d910 20 20 20 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43      pKeyInfo, pC
1d920 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a  x->uc.pCursor);.
1d930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
1d940 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a  x->isTable = 0;.
1d950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1d970 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42  eeCursor(pCx->pB
1d980 74 78 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  tx, MASTER_ROOT,
1d990 20 42 54 52 45 45 5f 57 52 43 53 52 2c 0a 20 20   BTREE_WRCSR,.  
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70              0, p
1d9c0 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  Cx->uc.pCursor);
1d9d0 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61  .      pCx->isTa
1d9e0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ble = 1;.    }. 
1d9f0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
1da00 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1da10 65 72 72 6f 72 3b 0a 20 20 70 43 78 2d 3e 69 73  error;.  pCx->is
1da20 4f 72 64 65 72 65 64 20 3d 20 28 70 4f 70 2d 3e  Ordered = (pOp->
1da30 70 35 21 3d 42 54 52 45 45 5f 55 4e 4f 52 44 45  p5!=BTREE_UNORDE
1da40 52 45 44 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  RED);.  break;.}
1da50 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  ../* Opcode: Sor
1da60 74 65 72 4f 70 65 6e 20 50 31 20 50 32 20 50 33  terOpen P1 P2 P3
1da70 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73   P4 *.**.** This
1da80 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6c 69   opcode works li
1da90 6b 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ke OP_OpenEpheme
1daa0 72 61 6c 20 65 78 63 65 70 74 20 74 68 61 74 20  ral except that 
1dab0 69 74 20 6f 70 65 6e 73 0a 2a 2a 20 61 20 74 72  it opens.** a tr
1dac0 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68  ansient index th
1dad0 61 74 20 69 73 20 73 70 65 63 69 66 69 63 61 6c  at is specifical
1dae0 6c 79 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73  ly designed to s
1daf0 6f 72 74 20 6c 61 72 67 65 0a 2a 2a 20 74 61 62  ort large.** tab
1db00 6c 65 73 20 75 73 69 6e 67 20 61 6e 20 65 78 74  les using an ext
1db10 65 72 6e 61 6c 20 6d 65 72 67 65 2d 73 6f 72 74  ernal merge-sort
1db20 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a   algorithm..**.*
1db30 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 50 33  * If argument P3
1db40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1db50 65 6e 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  en it indicates 
1db60 74 68 61 74 20 74 68 65 20 73 6f 72 74 65 72 20  that the sorter 
1db70 6d 61 79 0a 2a 2a 20 61 73 73 75 6d 65 20 74 68  may.** assume th
1db80 61 74 20 61 20 73 74 61 62 6c 65 20 73 6f 72 74  at a stable sort
1db90 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65   considering the
1dba0 20 66 69 72 73 74 20 50 33 20 66 69 65 6c 64 73   first P3 fields
1dbb0 20 6f 66 20 65 61 63 68 0a 2a 2a 20 6b 65 79 20   of each.** key 
1dbc0 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
1dbd0 20 70 72 6f 64 75 63 65 20 74 68 65 20 72 65 71   produce the req
1dbe0 75 69 72 65 64 20 72 65 73 75 6c 74 73 2e 0a 2a  uired results..*
1dbf0 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
1dc00 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75  Open: {.  VdbeCu
1dc10 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73  rsor *pCx;..  as
1dc20 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1dc30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1dc40 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43  p->p2>=0 );.  pC
1dc50 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  x = allocateCurs
1dc60 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  or(p, pOp->p1, p
1dc70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 43 55 52 54  Op->p2, -1, CURT
1dc80 59 50 45 5f 53 4f 52 54 45 52 29 3b 0a 20 20 69  YPE_SORTER);.  i
1dc90 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f  f( pCx==0 ) goto
1dca0 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e   no_mem;.  pCx->
1dcb0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
1dcc0 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61  p4.pKeyInfo;.  a
1dcd0 73 73 65 72 74 28 20 70 43 78 2d 3e 70 4b 65 79  ssert( pCx->pKey
1dce0 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  Info->db==db );.
1dcf0 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70    assert( pCx->p
1dd00 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e  KeyInfo->enc==EN
1dd10 43 28 64 62 29 20 29 3b 0a 20 20 72 63 20 3d 20  C(db) );.  rc = 
1dd20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
1dd30 72 49 6e 69 74 28 64 62 2c 20 70 4f 70 2d 3e 70  rInit(db, pOp->p
1dd40 33 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 72  3, pCx);.  if( r
1dd50 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
1dd60 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
1dd70 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1dd80 64 65 3a 20 53 65 71 75 65 6e 63 65 54 65 73 74  de: SequenceTest
1dd90 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
1dda0 53 79 6e 6f 70 73 69 73 3a 20 69 66 28 20 63 75  Synopsis: if( cu
1ddb0 72 73 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b 20 29  rsor[P1].ctr++ )
1ddc0 20 70 63 20 3d 20 50 32 0a 2a 2a 0a 2a 2a 20 50   pc = P2.**.** P
1ddd0 31 20 69 73 20 61 20 73 6f 72 74 65 72 20 63 75  1 is a sorter cu
1dde0 72 73 6f 72 2e 20 49 66 20 74 68 65 20 73 65 71  rsor. If the seq
1ddf0 75 65 6e 63 65 20 63 6f 75 6e 74 65 72 20 69 73  uence counter is
1de00 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2c   currently zero,
1de10 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20 50 32 2e 20   jump.** to P2. 
1de20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
1de30 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1de40 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20   jump is taken, 
1de50 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  increment the.**
1de60 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 76 61   the sequence va
1de70 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lue..*/.case OP_
1de80 53 65 71 75 65 6e 63 65 54 65 73 74 3a 20 7b 0a  SequenceTest: {.
1de90 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1dea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1deb0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1dec0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1ded0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
1dee0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
1def0 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29  rt( isSorter(pC)
1df00 20 29 3b 0a 20 20 69 66 28 20 28 70 43 2d 3e 73   );.  if( (pC->s
1df10 65 71 43 6f 75 6e 74 2b 2b 29 3d 3d 30 20 29 7b  eqCount++)==0 ){
1df20 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
1df30 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61  o_p2;.  }.  brea
1df40 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1df50 20 4f 70 65 6e 50 73 65 75 64 6f 20 50 31 20 50   OpenPseudo P1 P
1df60 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
1df70 70 73 69 73 3a 20 50 33 20 63 6f 6c 75 6d 6e 73  psis: P3 columns
1df80 20 69 6e 20 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20   in r[P2].**.** 
1df90 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f  Open a new curso
1dfa0 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
1dfb0 20 61 20 66 61 6b 65 20 74 61 62 6c 65 20 74 68   a fake table th
1dfc0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  at contains a si
1dfd0 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 66 20 64  ngle.** row of d
1dfe0 61 74 61 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e  ata.  The conten
1dff0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 72 6f  t of that one ro
1e000 77 20 69 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  w is the content
1e010 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65   of memory.** re
1e020 67 69 73 74 65 72 20 50 32 2e 20 20 49 6e 20 6f  gister P2.  In o
1e030 74 68 65 72 20 77 6f 72 64 73 2c 20 63 75 72 73  ther words, curs
1e040 6f 72 20 50 31 20 62 65 63 6f 6d 65 73 20 61 6e  or P1 becomes an
1e050 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 0a   alias for the .
1e060 2a 2a 20 4d 45 4d 5f 42 6c 6f 62 20 63 6f 6e 74  ** MEM_Blob cont
1e070 65 6e 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ent contained in
1e080 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
1e090 0a 2a 2a 20 41 20 70 73 65 75 64 6f 2d 74 61 62  .** A pseudo-tab
1e0a0 6c 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  le created by th
1e0b0 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
1e0c0 64 20 74 6f 20 68 6f 6c 64 20 61 20 73 69 6e 67  d to hold a sing
1e0d0 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75 74 70 75 74  le.** row output
1e0e0 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
1e0f0 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 6f 77   so that the row
1e100 20 63 61 6e 20 62 65 20 64 65 63 6f 6d 70 6f 73   can be decompos
1e110 65 64 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64 69 76  ed into.** indiv
1e120 69 64 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 75 73  idual columns us
1e130 69 6e 67 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d  ing the OP_Colum
1e140 6e 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 4f  n opcode.  The O
1e150 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 0a  P_Column opcode.
1e160 2a 2a 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63  ** is the only c
1e170 75 72 73 6f 72 20 6f 70 63 6f 64 65 20 74 68 61  ursor opcode tha
1e180 74 20 77 6f 72 6b 73 20 77 69 74 68 20 61 20 70  t works with a p
1e190 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a  seudo-table..**.
1e1a0 2a 2a 20 50 33 20 69 73 20 74 68 65 20 6e 75 6d  ** P3 is the num
1e1b0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1e1c0 20 74 68 65 20 72 65 63 6f 72 64 73 20 74 68 61   the records tha
1e1d0 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  t will be stored
1e1e0 20 62 79 0a 2a 2a 20 74 68 65 20 70 73 65 75 64   by.** the pseud
1e1f0 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  o-table..*/.case
1e200 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 3a 20   OP_OpenPseudo: 
1e210 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
1e220 70 43 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pCx;..  assert( 
1e230 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20  pOp->p1>=0 );.  
1e240 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
1e250 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c  =0 );.  pCx = al
1e260 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
1e270 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 33  pOp->p1, pOp->p3
1e280 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 50 53  , -1, CURTYPE_PS
1e290 45 55 44 4f 29 3b 0a 20 20 69 66 28 20 70 43 78  EUDO);.  if( pCx
1e2a0 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
1e2b0 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f  m;.  pCx->nullRo
1e2c0 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 75 63  w = 1;.  pCx->uc
1e2d0 2e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 20  .pseudoTableReg 
1e2e0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 78  = pOp->p2;.  pCx
1e2f0 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20  ->isTable = 1;. 
1e300 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
1e310 3d 3d 30 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  ==0 );.  break;.
1e320 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c  }../* Opcode: Cl
1e330 6f 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  ose P1 * * * *.*
1e340 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
1e350 73 6f 72 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  sor previously o
1e360 70 65 6e 65 64 20 61 73 20 50 31 2e 20 20 49 66  pened as P1.  If
1e370 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 75   P1 is not.** cu
1e380 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68  rrently open, th
1e390 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  is instruction i
1e3a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61  s a no-op..*/.ca
1e3b0 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20  se OP_Close: {. 
1e3c0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1e3d0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
1e3e0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 73  ->nCursor );.  s
1e3f0 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
1e400 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72  rsor(p, p->apCsr
1e410 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d  [pOp->p1]);.  p-
1e420 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 20  >apCsr[pOp->p1] 
1e430 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
1e440 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1e450 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
1e460 44 5f 4d 41 53 4b 0a 2f 2a 20 4f 70 63 6f 64 65  D_MASK./* Opcode
1e470 3a 20 43 6f 6c 75 6d 6e 73 55 73 65 64 20 50 31  : ColumnsUsed P1
1e480 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
1e490 54 68 69 73 20 6f 70 63 6f 64 65 20 28 77 68 69  This opcode (whi
1e4a0 63 68 20 6f 6e 6c 79 20 65 78 69 73 74 73 20 69  ch only exists i
1e4b0 66 20 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d  f SQLite was com
1e4c0 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a 20 53 51  piled with.** SQ
1e4d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
1e4e0 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 29 20 69 64  MN_USED_MASK) id
1e4f0 65 6e 74 69 66 69 65 73 20 77 68 69 63 68 20 63  entifies which c
1e500 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a 2a 2a  olumns of the.**
1e510 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1e520 66 6f 72 20 63 75 72 73 6f 72 20 50 31 20 61 72  for cursor P1 ar
1e530 65 20 75 73 65 64 2e 20 20 50 34 20 69 73 20 61  e used.  P4 is a
1e540 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
1e550 2a 2a 20 28 50 34 5f 49 4e 54 36 34 29 20 69 6e  ** (P4_INT64) in
1e560 20 77 68 69 63 68 20 74 68 65 20 66 69 72 73 74   which the first
1e570 20 36 33 20 62 69 74 73 20 61 72 65 20 6f 6e 65   63 bits are one
1e580 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
1e590 0a 2a 2a 20 66 69 72 73 74 20 36 33 20 63 6f 6c  .** first 63 col
1e5a0 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
1e5b0 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
1e5c0 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65  are actually use
1e5d0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 73  d.** by the curs
1e5e0 6f 72 2e 20 20 54 68 65 20 68 69 67 68 2d 6f 72  or.  The high-or
1e5f0 64 65 72 20 62 69 74 20 69 73 20 73 65 74 20 69  der bit is set i
1e600 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 61 66 74  f any column aft
1e610 65 72 0a 2a 2a 20 74 68 65 20 36 34 74 68 20 69  er.** the 64th i
1e620 73 20 75 73 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  s used..*/.case 
1e630 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 3a 20  OP_ColumnsUsed: 
1e640 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
1e650 70 43 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70  pC;.  pC = p->ap
1e660 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1e670 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
1e680 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
1e690 52 45 45 20 29 3b 0a 20 20 70 43 2d 3e 6d 61 73  REE );.  pC->mas
1e6a0 6b 55 73 65 64 20 3d 20 2a 28 75 36 34 2a 29 70  kUsed = *(u64*)p
1e6b0 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62  Op->p4.pI64;.  b
1e6c0 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
1e6d0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47  /* Opcode: SeekG
1e6e0 45 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  E P1 P2 P3 P4 *.
1e6f0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
1e700 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
1e710 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66  If cursor P1 ref
1e720 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61  ers to an SQL ta
1e730 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74  ble (B-Tree that
1e740 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65   uses integer ke
1e750 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65  ys), .** use the
1e760 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
1e770 65 72 20 50 33 20 61 73 20 74 68 65 20 6b 65 79  er P3 as the key
1e780 2e 20 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  .  If cursor P1 
1e790 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e  refers .** to an
1e7a0 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e   SQL index, then
1e7b0 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74   P3 is the first
1e7c0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
1e7d0 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a  P4 registers .**
1e7e0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
1e7f0 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  s an unpacked in
1e800 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20  dex key. .**.** 
1e810 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f  Reposition curso
1e820 72 20 50 31 20 73 6f 20 74 68 61 74 20 20 69 74  r P1 so that  it
1e830 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
1e840 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68  mallest entry th
1e850 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  at .** is greate
1e860 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1e870 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  to the key value
1e880 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  . If there are n
1e890 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 67 72  o records .** gr
1e8a0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1e8b0 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 61  ual to the key a
1e8c0 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72  nd P2 is not zer
1e8d0 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  o, then jump to 
1e8e0 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P2..**.** If the
1e8f0 20 63 75 72 73 6f 72 20 50 31 20 77 61 73 20 6f   cursor P1 was o
1e900 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
1e910 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 66 6c  OPFLAG_SEEKEQ fl
1e920 61 67 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ag, then this.**
1e930 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77   opcode will alw
1e940 61 79 73 20 6c 61 6e 64 20 6f 6e 20 61 20 72 65  ays land on a re
1e950 63 6f 72 64 20 74 68 61 74 20 65 71 75 61 6c 6c  cord that equall
1e960 79 20 65 71 75 61 6c 73 20 74 68 65 20 6b 65 79  y equals the key
1e970 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65 20 6a 75 6d  , or.** else jum
1e980 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
1e990 20 50 32 2e 20 20 57 68 65 6e 20 74 68 65 20 63   P2.  When the c
1e9a0 75 72 73 6f 72 20 69 73 20 4f 50 46 4c 41 47 5f  ursor is OPFLAG_
1e9b0 53 45 45 4b 45 51 2c 20 74 68 69 73 0a 2a 2a 20  SEEKEQ, this.** 
1e9c0 6f 70 63 6f 64 65 20 6d 75 73 74 20 62 65 20 66  opcode must be f
1e9d0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 49 64  ollowed by an Id
1e9e0 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 74 68 20  xLE opcode with 
1e9f0 74 68 65 20 73 61 6d 65 20 61 72 67 75 6d 65 6e  the same argumen
1ea00 74 73 2e 0a 2a 2a 20 54 68 65 20 49 64 78 4c 45  ts..** The IdxLE
1ea10 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20   opcode will be 
1ea20 73 6b 69 70 70 65 64 20 69 66 20 74 68 69 73 20  skipped if this 
1ea30 6f 70 63 6f 64 65 20 73 75 63 63 65 65 64 73 2c  opcode succeeds,
1ea40 20 62 75 74 20 74 68 65 0a 2a 2a 20 49 64 78 4c   but the.** IdxL
1ea50 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65  E opcode will be
1ea60 20 75 73 65 64 20 6f 6e 20 73 75 62 73 65 71 75   used on subsequ
1ea70 65 6e 74 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  ent loop iterati
1ea80 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
1ea90 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68  opcode leaves th
1eaa0 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75  e cursor configu
1eab0 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66  red to move in f
1eac0 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a  orward order,.**
1ead0 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
1eae0 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20 65  ing toward the e
1eaf0 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  nd.  In other wo
1eb00 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20  rds, the cursor 
1eb10 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  is.** configured
1eb20 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f   to use Next, no
1eb30 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53 65  t Prev..**.** Se
1eb40 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e  e also: Found, N
1eb50 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 4c 74 2c  otFound, SeekLt,
1eb60 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 4c 65 0a   SeekGt, SeekLe.
1eb70 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  */./* Opcode: Se
1eb80 65 6b 47 54 20 50 31 20 50 32 20 50 33 20 50 34  ekGT P1 P2 P3 P4
1eb90 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
1eba0 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a  key=r[P3@P4].**.
1ebb0 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
1ebc0 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c  refers to an SQL
1ebd0 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74   table (B-Tree t
1ebe0 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72  hat uses integer
1ebf0 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20   keys), .** use 
1ec00 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
1ec10 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b 65  ister P3 as a ke
1ec20 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  y. If cursor P1 
1ec30 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e  refers .** to an
1ec40 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e   SQL index, then
1ec50 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74   P3 is the first
1ec60 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
1ec70 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a  P4 registers .**
1ec80 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
1ec90 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  s an unpacked in
1eca0 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20  dex key. .**.** 
1ecb0 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f  Reposition curso
1ecc0 72 20 50 31 20 73 6f 20 74 68 61 74 20 20 69 74  r P1 so that  it
1ecd0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
1ece0 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68  mallest entry th
1ecf0 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  at .** is greate
1ed00 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76  r than the key v
1ed10 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
1ed20 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 67 72  re no records gr
1ed30 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 74  eater than .** t
1ed40 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73  he key and P2 is
1ed50 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
1ed60 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  jump to P2..**.*
1ed70 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65  * This opcode le
1ed80 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  aves the cursor 
1ed90 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f  configured to mo
1eda0 76 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72  ve in forward or
1edb0 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  der,.** from the
1edc0 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72   beginning towar
1edd0 64 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f  d the end.  In o
1ede0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1edf0 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e  cursor is.** con
1ee00 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e  figured to use N
1ee10 65 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a  ext, not Prev..*
1ee20 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
1ee30 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
1ee40 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 65 2c 20  SeekLt, SeekGe, 
1ee50 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63  SeekLe.*/./* Opc
1ee60 6f 64 65 3a 20 53 65 65 6b 4c 54 20 50 31 20 50  ode: SeekLT P1 P
1ee70 32 20 50 33 20 50 34 20 2a 20 0a 2a 2a 20 53 79  2 P3 P4 * .** Sy
1ee80 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
1ee90 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75  @P4].**.** If cu
1eea0 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74  rsor P1 refers t
1eeb0 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28  o an SQL table (
1eec0 42 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73  B-Tree that uses
1eed0 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20   integer keys), 
1eee0 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75  .** use the valu
1eef0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  e in register P3
1ef00 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75   as a key. If cu
1ef10 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a  rsor P1 refers .
1ef20 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ** to an SQL ind
1ef30 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74  ex, then P3 is t
1ef40 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
1ef50 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73  rray of P4 regis
1ef60 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72  ters .** that ar
1ef70 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70  e used as an unp
1ef80 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e  acked index key.
1ef90 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69   .**.** Repositi
1efa0 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20  on cursor P1 so 
1efb0 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20  that  it points 
1efc0 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  to the largest e
1efd0 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73  ntry that .** is
1efe0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b   less than the k
1eff0 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65  ey value. If the
1f000 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64  re are no record
1f010 73 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20  s less than .** 
1f020 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
1f030 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1f040 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
1f050 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
1f060 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
1f070 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d   configured to m
1f080 6f 76 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f  ove in reverse o
1f090 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68  rder,.** from th
1f0a0 65 20 65 6e 64 20 74 6f 77 61 72 64 20 74 68 65  e end toward the
1f0b0 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20   beginning.  In 
1f0c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
1f0d0 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f   cursor is.** co
1f0e0 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
1f0f0 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a  Prev, not Next..
1f100 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1f110 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
1f120 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c   SeekGt, SeekGe,
1f130 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70   SeekLe.*/./* Op
1f140 63 6f 64 65 3a 20 53 65 65 6b 4c 45 20 50 31 20  code: SeekLE P1 
1f150 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
1f160 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
1f170 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75  @P4].**.** If cu
1f180 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74  rsor P1 refers t
1f190 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28  o an SQL table (
1f1a0 42 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73  B-Tree that uses
1f1b0 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20   integer keys), 
1f1c0 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75  .** use the valu
1f1d0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  e in register P3
1f1e0 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75   as a key. If cu
1f1f0 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a  rsor P1 refers .
1f200 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ** to an SQL ind
1f210 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74  ex, then P3 is t
1f220 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
1f230 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73  rray of P4 regis
1f240 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72  ters .** that ar
1f250 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70  e used as an unp
1f260 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e  acked index key.
1f270 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69   .**.** Repositi
1f280 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20  on cursor P1 so 
1f290 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1f2a0 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
1f2b0 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
1f2c0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1f2d0 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61  al to the key va
1f2e0 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1f2f0 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a  e no records .**
1f300 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1f310 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 61  ual to the key a
1f320 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72  nd P2 is not zer
1f330 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  o, then jump to 
1f340 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  P2..**.** This o
1f350 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65  pcode leaves the
1f360 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72   cursor configur
1f370 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65  ed to move in re
1f380 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20  verse order,.** 
1f390 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77  from the end tow
1f3a0 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ard the beginnin
1f3b0 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  g.  In other wor
1f3c0 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  ds, the cursor i
1f3d0 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  s.** configured 
1f3e0 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74  to use Prev, not
1f3f0 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   Next..**.** If 
1f400 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 77 61  the cursor P1 wa
1f410 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  s opened using t
1f420 68 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  he OPFLAG_SEEKEQ
1f430 20 66 6c 61 67 2c 20 74 68 65 6e 20 74 68 69 73   flag, then this
1f440 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  .** opcode will 
1f450 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20 61  always land on a
1f460 20 72 65 63 6f 72 64 20 74 68 61 74 20 65 71 75   record that equ
1f470 61 6c 6c 79 20 65 71 75 61 6c 73 20 74 68 65 20  ally equals the 
1f480 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65 20  key, or.** else 
1f490 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
1f4a0 20 74 6f 20 50 32 2e 20 20 57 68 65 6e 20 74 68   to P2.  When th
1f4b0 65 20 63 75 72 73 6f 72 20 69 73 20 4f 50 46 4c  e cursor is OPFL
1f4c0 41 47 5f 53 45 45 4b 45 51 2c 20 74 68 69 73 0a  AG_SEEKEQ, this.
1f4d0 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 62  ** opcode must b
1f4e0 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  e followed by an
1f4f0 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69   IdxGE opcode wi
1f500 74 68 20 74 68 65 20 73 61 6d 65 20 61 72 67 75  th the same argu
1f510 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49 64  ments..** The Id
1f520 78 47 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  xGE opcode will 
1f530 62 65 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  be skipped if th
1f540 69 73 20 6f 70 63 6f 64 65 20 73 75 63 63 65 65  is opcode succee
1f550 64 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20 49  ds, but the.** I
1f560 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c  dxGE opcode will
1f570 20 62 65 20 75 73 65 64 20 6f 6e 20 73 75 62 73   be used on subs
1f580 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65 72  equent loop iter
1f590 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  ations..**.** Se
1f5a0 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e  e also: Found, N
1f5b0 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 47 74 2c  otFound, SeekGt,
1f5c0 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74 0a   SeekGe, SeekLt.
1f5d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c  */.case OP_SeekL
1f5e0 54 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  T:         /* ju
1f5f0 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  mp, in3 */.case 
1f600 4f 50 5f 53 65 65 6b 4c 45 3a 20 20 20 20 20 20  OP_SeekLE:      
1f610 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
1f620 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47  */.case OP_SeekG
1f630 45 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  E:         /* ju
1f640 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  mp, in3 */.case 
1f650 4f 50 5f 53 65 65 6b 47 54 3a 20 7b 20 20 20 20  OP_SeekGT: {    
1f660 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
1f670 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
1f680 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
1f690 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 2a 2f 0a  rison result */.
1f6a0 20 20 69 6e 74 20 6f 63 3b 20 20 20 20 20 20 20    int oc;       
1f6b0 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a       /* Opcode *
1f6c0 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
1f6d0 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 75  pC;    /* The cu
1f6e0 72 73 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a  rsor to seek */.
1f6f0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1f700 20 72 3b 20 20 2f 2a 20 54 68 65 20 6b 65 79 20   r;  /* The key 
1f710 74 6f 20 73 65 65 6b 20 66 6f 72 20 2a 2f 0a 20  to seek for */. 
1f720 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20   int nField;    
1f730 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f740 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 66 69 65 6c   columns or fiel
1f750 64 73 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ds in the key */
1f760 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20 20 20  .  i64 iKey;    
1f770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
1f780 69 64 20 77 65 20 61 72 65 20 74 6f 20 73 65 65  id we are to see
1f790 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 65 71  k to */.  int eq
1f7a0 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  Only;        /* 
1f7b0 4f 6e 6c 79 20 69 6e 74 65 72 65 73 74 65 64 20  Only interested 
1f7c0 69 6e 20 3d 3d 20 72 65 73 75 6c 74 73 20 2a 2f  in == results */
1f7d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
1f7e0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
1f7f0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
1f800 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1f810 32 21 3d 30 20 29 3b 0a 20 20 70 43 20 3d 20 70  2!=0 );.  pC = p
1f820 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1f830 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
1f840 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1f850 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
1f860 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
1f870 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c  assert( OP_SeekL
1f880 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 31  E == OP_SeekLT+1
1f890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50   );.  assert( OP
1f8a0 5f 53 65 65 6b 47 45 20 3d 3d 20 4f 50 5f 53 65  _SeekGE == OP_Se
1f8b0 65 6b 4c 54 2b 32 20 29 3b 0a 20 20 61 73 73 65  ekLT+2 );.  asse
1f8c0 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 20 3d 3d  rt( OP_SeekGT ==
1f8d0 20 4f 50 5f 53 65 65 6b 4c 54 2b 33 20 29 3b 0a   OP_SeekLT+3 );.
1f8e0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
1f8f0 4f 72 64 65 72 65 64 20 29 3b 0a 20 20 61 73 73  Ordered );.  ass
1f900 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
1f910 73 6f 72 21 3d 30 20 29 3b 0a 20 20 6f 63 20 3d  sor!=0 );.  oc =
1f920 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
1f930 65 71 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 70 43  eqOnly = 0;.  pC
1f940 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 23  ->nullRow = 0;.#
1f950 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1f960 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20  UG.  pC->seekOp 
1f970 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23  = pOp->opcode;.#
1f980 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 43 2d  endif..  if( pC-
1f990 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  >isTable ){.    
1f9a0 2f 2a 20 54 68 65 20 42 54 52 45 45 5f 53 45 45  /* The BTREE_SEE
1f9b0 4b 5f 45 51 20 66 6c 61 67 20 69 73 20 6f 6e 6c  K_EQ flag is onl
1f9c0 79 20 73 65 74 20 6f 6e 20 69 6e 64 65 78 20 63  y set on index c
1f9d0 75 72 73 6f 72 73 20 2a 2f 0a 20 20 20 20 61 73  ursors */.    as
1f9e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1f9f0 65 65 43 75 72 73 6f 72 48 61 73 48 69 6e 74 28  eeCursorHasHint(
1fa00 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
1fa10 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 29 3d 3d  BTREE_SEEK_EQ)==
1fa20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1fa30 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1fa40 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70  ..    /* The inp
1fa50 75 74 20 76 61 6c 75 65 20 69 6e 20 50 33 20 6d  ut value in P3 m
1fa60 69 67 68 74 20 62 65 20 6f 66 20 61 6e 79 20 74  ight be of any t
1fa70 79 70 65 3a 20 69 6e 74 65 67 65 72 2c 20 72 65  ype: integer, re
1fa80 61 6c 2c 20 73 74 72 69 6e 67 2c 0a 20 20 20 20  al, string,.    
1fa90 2a 2a 20 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c  ** blob, or NULL
1faa0 2e 20 20 42 75 74 20 69 74 20 6e 65 65 64 73 20  .  But it needs 
1fab0 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  to be an integer
1fac0 20 62 65 66 6f 72 65 20 77 65 20 63 61 6e 20 64   before we can d
1fad0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 65 65  o.    ** the see
1fae0 6b 2c 20 73 6f 20 63 6f 6e 76 65 72 74 20 69 74  k, so convert it
1faf0 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 33 20 3d 20  . */.    pIn3 = 
1fb00 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
1fb10 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66      if( (pIn3->f
1fb20 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  lags & (MEM_Int|
1fb30 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72  MEM_Real|MEM_Str
1fb40 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ))==MEM_Str ){. 
1fb50 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69       applyNumeri
1fb60 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 20  cAffinity(pIn3, 
1fb70 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4b  0);.    }.    iK
1fb80 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1fb90 49 6e 74 56 61 6c 75 65 28 70 49 6e 33 29 3b 0a  IntValue(pIn3);.
1fba0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
1fbb0 33 20 76 61 6c 75 65 20 63 6f 75 6c 64 20 6e 6f  3 value could no
1fbc0 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  t be converted i
1fbd0 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 77  nto an integer w
1fbe0 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 6c 6f  ithout.    ** lo
1fbf0 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f  ss of informatio
1fc00 6e 2c 20 74 68 65 6e 20 73 70 65 63 69 61 6c 20  n, then special 
1fc10 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65  processing is re
1fc20 71 75 69 72 65 64 2e 2e 2e 20 2a 2f 0a 20 20 20  quired... */.   
1fc30 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
1fc40 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20  s & MEM_Int)==0 
1fc50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 49  ){.      if( (pI
1fc60 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
1fc70 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Real)==0 ){.    
1fc80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33      /* If the P3
1fc90 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
1fca0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
1fcb0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 61 20 6e 75  any kind of a nu
1fcc0 6d 62 65 72 2c 0a 20 20 20 20 20 20 20 20 2a 2a  mber,.        **
1fcd0 20 74 68 65 6e 20 74 68 65 20 73 65 65 6b 20 69   then the seek i
1fce0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20  s not possible, 
1fcf0 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f  so jump to P2 */
1fd00 0a 20 20 20 20 20 20 20 20 56 64 62 65 42 72 61  .        VdbeBra
1fd10 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b 20 67  nchTaken(1,2); g
1fd20 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
1fd30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1fd40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1fd50 20 49 66 20 74 68 65 20 61 70 70 72 6f 78 69 6d   If the approxim
1fd60 61 74 69 6f 6e 20 69 4b 65 79 20 69 73 20 6c 61  ation iKey is la
1fd70 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 61 63  rger than the ac
1fd80 74 75 61 6c 20 72 65 61 6c 20 73 65 61 72 63 68  tual real search
1fd90 0a 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20  .      ** term, 
1fda0 73 75 62 73 74 69 74 75 74 65 20 3e 3d 20 66 6f  substitute >= fo
1fdb0 72 20 3e 20 61 6e 64 20 3c 20 66 6f 72 20 3c 3d  r > and < for <=
1fdc0 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20 73 65  . e.g. if the se
1fdd0 61 72 63 68 20 74 65 72 6d 0a 20 20 20 20 20 20  arch term.      
1fde0 2a 2a 20 69 73 20 34 2e 39 20 61 6e 64 20 74 68  ** is 4.9 and th
1fdf0 65 20 69 6e 74 65 67 65 72 20 61 70 70 72 6f 78  e integer approx
1fe00 69 6d 61 74 69 6f 6e 20 35 3a 0a 20 20 20 20 20  imation 5:.     
1fe10 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
1fe20 20 20 20 20 28 78 20 3e 20 20 34 2e 39 29 20 20      (x >  4.9)  
1fe30 20 20 2d 3e 20 20 20 20 20 28 78 20 3e 3d 20 35    ->     (x >= 5
1fe40 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  ).      **      
1fe50 20 20 28 78 20 3c 3d 20 34 2e 39 29 20 20 20 20    (x <= 4.9)    
1fe60 2d 3e 20 20 20 20 20 28 78 20 3c 20 20 35 29 0a  ->     (x <  5).
1fe70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1fe80 66 28 20 70 49 6e 33 2d 3e 75 2e 72 3c 28 64 6f  f( pIn3->u.r<(do
1fe90 75 62 6c 65 29 69 4b 65 79 20 29 7b 0a 20 20 20  uble)iKey ){.   
1fea0 20 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f       assert( OP_
1feb0 53 65 65 6b 47 45 3d 3d 28 4f 50 5f 53 65 65 6b  SeekGE==(OP_Seek
1fec0 47 54 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  GT-1) );.       
1fed0 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b   assert( OP_Seek
1fee0 4c 54 3d 3d 28 4f 50 5f 53 65 65 6b 4c 45 2d 31  LT==(OP_SeekLE-1
1fef0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
1ff00 65 72 74 28 20 28 4f 50 5f 53 65 65 6b 4c 45 20  ert( (OP_SeekLE 
1ff10 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53  & 0x0001)==(OP_S
1ff20 65 65 6b 47 54 20 26 20 30 78 30 30 30 31 29 20  eekGT & 0x0001) 
1ff30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1ff40 6f 63 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f  oc & 0x0001)==(O
1ff50 50 5f 53 65 65 6b 47 54 20 26 20 30 78 30 30 30  P_SeekGT & 0x000
1ff60 31 29 20 29 20 6f 63 2d 2d 3b 0a 20 20 20 20 20  1) ) oc--;.     
1ff70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
1ff80 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  the approximatio
1ff90 6e 20 69 4b 65 79 20 69 73 20 73 6d 61 6c 6c 65  n iKey is smalle
1ffa0 72 20 74 68 61 6e 20 74 68 65 20 61 63 74 75 61  r than the actua
1ffb0 6c 20 72 65 61 6c 20 73 65 61 72 63 68 0a 20 20  l real search.  
1ffc0 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62      ** term, sub
1ffd0 73 74 69 74 75 74 65 20 3c 3d 20 66 6f 72 20 3c  stitute <= for <
1ffe0 20 61 6e 64 20 3e 20 66 6f 72 20 3e 3d 2e 20 20   and > for >=.  
1fff0 2a 2f 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66  */.      else if
20000 28 20 70 49 6e 33 2d 3e 75 2e 72 3e 28 64 6f 75  ( pIn3->u.r>(dou
20010 62 6c 65 29 69 4b 65 79 20 29 7b 0a 20 20 20 20  ble)iKey ){.    
20020 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53      assert( OP_S
20030 65 65 6b 4c 45 3d 3d 28 4f 50 5f 53 65 65 6b 4c  eekLE==(OP_SeekL
20040 54 2b 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  T+1) );.        
20050 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47  assert( OP_SeekG
20060 54 3d 3d 28 4f 50 5f 53 65 65 6b 47 45 2b 31 29  T==(OP_SeekGE+1)
20070 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
20080 72 74 28 20 28 4f 50 5f 53 65 65 6b 4c 54 20 26  rt( (OP_SeekLT &
20090 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65   0x0001)==(OP_Se
200a0 65 6b 47 45 20 26 20 30 78 30 30 30 31 29 20 29  ekGE & 0x0001) )
200b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6f  ;.        if( (o
200c0 63 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50  c & 0x0001)==(OP
200d0 5f 53 65 65 6b 4c 54 20 26 20 30 78 30 30 30 31  _SeekLT & 0x0001
200e0 29 20 29 20 6f 63 2b 2b 3b 0a 20 20 20 20 20 20  ) ) oc++;.      
200f0 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20 72 63 20  }.    } .    rc 
20100 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
20110 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
20120 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
20130 28 75 36 34 29 69 4b 65 79 2c 20 30 2c 20 26 72  (u64)iKey, 0, &r
20140 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 6d 6f 76  es);.    pC->mov
20150 65 74 6f 54 61 72 67 65 74 20 3d 20 69 4b 65 79  etoTarget = iKey
20160 3b 20 20 2f 2a 20 55 73 65 64 20 62 79 20 4f 50  ;  /* Used by OP
20170 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 69  _Delete */.    i
20180 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20190 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61   ){.      goto a
201a0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
201b0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  r;.    }.  }else
201c0 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63  {.    /* For a c
201d0 75 72 73 6f 72 20 77 69 74 68 20 74 68 65 20 42  ursor with the B
201e0 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 68 69 6e  TREE_SEEK_EQ hin
201f0 74 2c 20 6f 6e 6c 79 20 74 68 65 20 4f 50 5f 53  t, only the OP_S
20200 65 65 6b 47 45 20 61 6e 64 0a 20 20 20 20 2a 2a  eekGE and.    **
20210 20 4f 50 5f 53 65 65 6b 4c 45 20 6f 70 63 6f 64   OP_SeekLE opcod
20220 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20  es are allowed, 
20230 61 6e 64 20 74 68 65 73 65 20 6d 75 73 74 20 62  and these must b
20240 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
20250 6c 6c 6f 77 65 64 0a 20 20 20 20 2a 2a 20 62 79  llowed.    ** by
20260 20 61 6e 20 4f 50 5f 49 64 78 47 54 20 6f 72 20   an OP_IdxGT or 
20270 4f 50 5f 49 64 78 4c 54 20 6f 70 63 6f 64 65 2c  OP_IdxLT opcode,
20280 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 77   respectively, w
20290 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
202a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
202b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
202c0 73 6f 72 48 61 73 48 69 6e 74 28 70 43 2d 3e 75  sorHasHint(pC->u
202d0 63 2e 70 43 75 72 73 6f 72 2c 20 42 54 52 45 45  c.pCursor, BTREE
202e0 5f 53 45 45 4b 5f 45 51 29 20 29 7b 0a 20 20 20  _SEEK_EQ) ){.   
202f0 20 20 20 65 71 4f 6e 6c 79 20 3d 20 31 3b 0a 20     eqOnly = 1;. 
20300 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
20310 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65  ->opcode==OP_See
20320 6b 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  kGE || pOp->opco
20330 64 65 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b  de==OP_SeekLE );
20340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20350 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  Op[1].opcode==OP
20360 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d  _IdxLT || pOp[1]
20370 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47  .opcode==OP_IdxG
20380 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
20390 74 28 20 70 4f 70 5b 31 5d 2e 70 31 3d 3d 70 4f  t( pOp[1].p1==pO
203a0 70 5b 30 5d 2e 70 31 20 29 3b 0a 20 20 20 20 20  p[0].p1 );.     
203b0 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e   assert( pOp[1].
203c0 70 32 3d 3d 70 4f 70 5b 30 5d 2e 70 32 20 29 3b  p2==pOp[0].p2 );
203d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
203e0 4f 70 5b 31 5d 2e 70 33 3d 3d 70 4f 70 5b 30 5d  Op[1].p3==pOp[0]
203f0 2e 70 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  .p3 );.      ass
20400 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 34 2e 69  ert( pOp[1].p4.i
20410 3d 3d 70 4f 70 5b 30 5d 2e 70 34 2e 69 20 29 3b  ==pOp[0].p4.i );
20420 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 69 65  .    }..    nFie
20430 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ld = pOp->p4.i;.
20440 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
20450 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
20460 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
20470 20 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 20   nField>0 );.   
20480 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43   r.pKeyInfo = pC
20490 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  ->pKeyInfo;.    
204a0 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  r.nField = (u16)
204b0 6e 46 69 65 6c 64 3b 0a 0a 20 20 20 20 2f 2a 20  nField;..    /* 
204c0 54 68 65 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66  The next line of
204d0 20 63 6f 64 65 20 63 6f 6d 70 75 74 65 73 20 61   code computes a
204e0 73 20 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20  s follows, only 
204f0 66 61 73 74 65 72 3a 0a 20 20 20 20 2a 2a 20 20  faster:.    **  
20500 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b   if( oc==OP_Seek
20510 47 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  GT || oc==OP_See
20520 6b 4c 45 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  kLE ){.    **   
20530 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d    r.default_rc =
20540 20 2d 31 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 65   -1;.    **   }e
20550 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  lse{.    **     
20560 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2b  r.default_rc = +
20570 31 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 0a 20 20  1;.    **   }.  
20580 20 20 2a 2f 0a 20 20 20 20 72 2e 64 65 66 61 75    */.    r.defau
20590 6c 74 5f 72 63 20 3d 20 28 28 31 20 26 20 28 6f  lt_rc = ((1 & (o
205a0 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 54 29 29 20  c - OP_SeekLT)) 
205b0 3f 20 2d 31 20 3a 20 2b 31 29 3b 0a 20 20 20 20  ? -1 : +1);.    
205c0 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53  assert( oc!=OP_S
205d0 65 65 6b 47 54 20 7c 7c 20 72 2e 64 65 66 61 75  eekGT || r.defau
205e0 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20  lt_rc==-1 );.   
205f0 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f   assert( oc!=OP_
20600 53 65 65 6b 4c 45 20 7c 7c 20 72 2e 64 65 66 61  SeekLE || r.defa
20610 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 20  ult_rc==-1 );.  
20620 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50    assert( oc!=OP
20630 5f 53 65 65 6b 47 45 20 7c 7c 20 72 2e 64 65 66  _SeekGE || r.def
20640 61 75 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 20  ault_rc==+1 );. 
20650 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f     assert( oc!=O
20660 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 72 2e 64 65  P_SeekLT || r.de
20670 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a  fault_rc==+1 );.
20680 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61  .    r.aMem = &a
20690 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69  Mem[pOp->p3];.#i
206a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
206b0 47 0a 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66  G.    { int i; f
206c0 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65  or(i=0; i<r.nFie
206d0 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  ld; i++) assert(
206e0 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61   memIsValid(&r.a
206f0 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e  Mem[i]) ); }.#en
20700 64 69 66 0a 20 20 20 20 72 2e 65 71 53 65 65 6e  dif.    r.eqSeen
20710 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
20720 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
20730 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63  oUnpacked(pC->uc
20740 2e 70 43 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c  .pCursor, &r, 0,
20750 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
20760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20770 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61   ){.      goto a
20780 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
20790 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
207a0 20 65 71 4f 6e 6c 79 20 26 26 20 72 2e 65 71 53   eqOnly && r.eqS
207b0 65 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  een==0 ){.      
207c0 61 73 73 65 72 74 28 20 72 65 73 21 3d 30 20 29  assert( res!=0 )
207d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 65  ;.      goto see
207e0 6b 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20  k_not_found;.   
207f0 20 7d 0a 20 20 7d 0a 20 20 70 43 2d 3e 64 65 66   }.  }.  pC->def
20800 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
20810 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
20820 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
20830 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20840 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73  TEST.  sqlite3_s
20850 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
20860 65 6e 64 69 66 0a 20 20 69 66 28 20 6f 63 3e 3d  endif.  if( oc>=
20870 4f 50 5f 53 65 65 6b 47 45 20 29 7b 20 20 61 73  OP_SeekGE ){  as
20880 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65  sert( oc==OP_See
20890 6b 47 45 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65  kGE || oc==OP_Se
208a0 65 6b 47 54 20 29 3b 0a 20 20 20 20 69 66 28 20  ekGT );.    if( 
208b0 72 65 73 3c 30 20 7c 7c 20 28 72 65 73 3d 3d 30  res<0 || (res==0
208c0 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   && oc==OP_SeekG
208d0 54 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  T) ){.      res 
208e0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
208f0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
20900 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
20910 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
20920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20930 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
20940 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
20950 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
20960 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
20970 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
20980 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c  oc==OP_SeekLT ||
20990 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29   oc==OP_SeekLE )
209a0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3e 30 20  ;.    if( res>0 
209b0 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63  || (res==0 && oc
209c0 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 20 29 7b 0a  ==OP_SeekLT) ){.
209d0 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
209e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
209f0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
20a00 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26  C->uc.pCursor, &
20a10 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  res);.      if( 
20a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
20a30 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
20a40 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  o_error;.    }el
20a50 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 72 65 73  se{.      /* res
20a60 20 6d 69 67 68 74 20 62 65 20 6e 65 67 61 74 69   might be negati
20a70 76 65 20 62 65 63 61 75 73 65 20 74 68 65 20 74  ve because the t
20a80 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 20  able is empty.  
20a90 43 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a  Check to.      *
20aa0 2a 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  * see if this is
20ab0 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 20   the case..     
20ac0 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 20 3d 20   */.      res = 
20ad0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
20ae0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  pC->uc.pCursor);
20af0 0a 20 20 20 20 7d 0a 20 20 7d 0a 73 65 65 6b 5f  .    }.  }.seek_
20b00 6e 6f 74 5f 66 6f 75 6e 64 3a 0a 20 20 61 73 73  not_found:.  ass
20b10 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29  ert( pOp->p2>0 )
20b20 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
20b30 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20  ken(res!=0,2);. 
20b40 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
20b50 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
20b60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 71 4f  .  }else if( eqO
20b70 6e 6c 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nly ){.    asser
20b80 74 28 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65  t( pOp[1].opcode
20b90 3d 3d 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f  ==OP_IdxLT || pO
20ba0 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  p[1].opcode==OP_
20bb0 49 64 78 47 54 20 29 3b 0a 20 20 20 20 70 4f 70  IdxGT );.    pOp
20bc0 2b 2b 3b 20 2f 2a 20 53 6b 69 70 20 74 68 65 20  ++; /* Skip the 
20bd0 4f 50 5f 49 64 78 4c 74 20 6f 72 20 4f 50 5f 49  OP_IdxLt or OP_I
20be0 64 78 47 54 20 74 68 61 74 20 66 6f 6c 6c 6f 77  dxGT that follow
20bf0 73 20 2a 2f 0a 20 20 7d 0a 20 20 62 72 65 61 6b  s */.  }.  break
20c00 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
20c10 46 6f 75 6e 64 20 50 31 20 50 32 20 50 33 20 50  Found P1 P2 P3 P
20c20 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
20c30 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
20c40 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65  .** If P4==0 the
20c50 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 68 6f  n register P3 ho
20c60 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74  lds a blob const
20c70 72 75 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65  ructed by MakeRe
20c80 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e  cord.  If.** P4>
20c90 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  0 then register 
20ca0 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
20cb0 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
20cc0 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70  that form an unp
20cd0 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e  acked.** record.
20ce0 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31  .**.** Cursor P1
20cf0 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   is on an index 
20d00 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 72  btree.  If the r
20d10 65 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64  ecord identified
20d20 20 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a   by P3 and P4.**
20d30 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
20d40 61 6e 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20  any entry in P1 
20d50 74 68 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d  then a jump is m
20d60 61 64 65 20 74 6f 20 50 32 20 61 6e 64 0a 2a 2a  ade to P2 and.**
20d70 20 50 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e   P1 is left poin
20d80 74 69 6e 67 20 61 74 20 74 68 65 20 6d 61 74 63  ting at the matc
20d90 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  hing entry..**.*
20da0 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
20db0 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
20dc0 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20 77 68  or in a state wh
20dd0 65 72 65 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  ere it can be.**
20de0 20 61 64 76 61 6e 63 65 64 20 69 6e 20 74 68 65   advanced in the
20df0 20 66 6f 72 77 61 72 64 20 64 69 72 65 63 74 69   forward directi
20e00 6f 6e 2e 20 20 54 68 65 20 4e 65 78 74 20 69 6e  on.  The Next in
20e10 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 77  struction will w
20e20 6f 72 6b 2c 0a 2a 2a 20 62 75 74 20 6e 6f 74 20  ork,.** but not 
20e30 74 68 65 20 50 72 65 76 20 69 6e 73 74 72 75 63  the Prev instruc
20e40 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tion..**.** See 
20e50 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20  also: NotFound, 
20e60 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20 4e 6f 74 45  NoConflict, NotE
20e70 78 69 73 74 73 2e 20 53 65 65 6b 47 65 0a 2a 2f  xists. SeekGe.*/
20e80 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46  ./* Opcode: NotF
20e90 6f 75 6e 64 20 50 31 20 50 32 20 50 33 20 50 34  ound P1 P2 P3 P4
20ea0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
20eb0 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a  key=r[P3@P4].**.
20ec0 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e  ** If P4==0 then
20ed0 20 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c   register P3 hol
20ee0 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72  ds a blob constr
20ef0 75 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63  ucted by MakeRec
20f00 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30  ord.  If.** P4>0
20f10 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50   then register P
20f20 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  3 is the first o
20f30 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74  f P4 registers t
20f40 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61  hat form an unpa
20f50 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a  cked.** record..
20f60 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31  ** .** Cursor P1
20f70 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   is on an index 
20f80 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 72  btree.  If the r
20f90 65 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64  ecord identified
20fa0 20 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a   by P3 and P4.**
20fb0 20 69 73 20 6e 6f 74 20 74 68 65 20 70 72 65 66   is not the pref
20fc0 69 78 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20  ix of any entry 
20fd0 69 6e 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d  in P1 then a jum
20fe0 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50 32 2e  p is made to P2.
20ff0 20 20 49 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73    If P1 .** does
21000 20 63 6f 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72   contain an entr
21010 79 20 77 68 6f 73 65 20 70 72 65 66 69 78 20 6d  y whose prefix m
21020 61 74 63 68 65 73 20 74 68 65 20 50 33 2f 50 34  atches the P3/P4
21030 20 72 65 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e   record then con
21040 74 72 6f 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68  trol.** falls th
21050 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
21060 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  t instruction an
21070 64 20 50 31 20 69 73 20 6c 65 66 74 20 70 6f 69  d P1 is left poi
21080 6e 74 69 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20  nting at the.** 
21090 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a  matching entry..
210a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61  **.** This opera
210b0 74 69 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20  tion leaves the 
210c0 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74  cursor in a stat
210d0 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f  e where it canno
210e0 74 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64  t be.** advanced
210f0 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63   in either direc
21100 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
21110 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20  words, the Next 
21120 61 6e 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f  and Prev.** opco
21130 64 65 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20  des do not work 
21140 61 66 74 65 72 20 74 68 69 73 20 6f 70 65 72 61  after this opera
21150 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tion..**.** See 
21160 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
21170 45 78 69 73 74 73 2c 20 4e 6f 43 6f 6e 66 6c 69  Exists, NoConfli
21180 63 74 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ct.*/./* Opcode:
21190 20 4e 6f 43 6f 6e 66 6c 69 63 74 20 50 31 20 50   NoConflict P1 P
211a0 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
211b0 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
211c0 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d  P4].**.** If P4=
211d0 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  =0 then register
211e0 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
211f0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
21200 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a  MakeRecord.  If.
21210 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67  ** P4>0 then reg
21220 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65 20  ister P3 is the 
21230 66 69 72 73 74 20 6f 66 20 50 34 20 72 65 67 69  first of P4 regi
21240 73 74 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20  sters that form 
21250 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72  an unpacked.** r
21260 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75  ecord..** .** Cu
21270 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e  rsor P1 is on an
21280 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49   index btree.  I
21290 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 64 65  f the record ide
212a0 6e 74 69 66 69 65 64 20 62 79 20 50 33 20 61 6e  ntified by P3 an
212b0 64 20 50 34 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  d P4.** contains
212c0 20 61 6e 79 20 4e 55 4c 4c 20 76 61 6c 75 65 2c   any NULL value,
212d0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
212e0 79 20 74 6f 20 50 32 2e 20 20 49 66 20 61 6c 6c  y to P2.  If all
212f0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
21300 20 72 65 63 6f 72 64 20 61 72 65 20 6e 6f 74 2d   record are not-
21310 4e 55 4c 4c 20 74 68 65 6e 20 61 20 63 68 65 63  NULL then a chec
21320 6b 20 69 73 20 64 6f 6e 65 20 74 6f 20 64 65 74  k is done to det
21330 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 72 6f  ermine if any ro
21340 77 20 69 6e 20 74 68 65 0a 2a 2a 20 50 31 20 69  w in the.** P1 i
21350 6e 64 65 78 20 62 74 72 65 65 20 68 61 73 20 61  ndex btree has a
21360 20 6d 61 74 63 68 69 6e 67 20 6b 65 79 20 70 72   matching key pr
21370 65 66 69 78 2e 20 20 49 66 20 74 68 65 72 65 20  efix.  If there 
21380 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20  are no matches, 
21390 6a 75 6d 70 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  jump.** immediat
213a0 65 6c 79 20 74 6f 20 50 32 2e 20 20 49 66 20 74  ely to P2.  If t
213b0 68 65 72 65 20 69 73 20 61 20 6d 61 74 63 68 2c  here is a match,
213c0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e   fall through an
213d0 64 20 6c 65 61 76 65 20 74 68 65 20 50 31 0a 2a  d leave the P1.*
213e0 2a 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * cursor pointin
213f0 67 20 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e  g to the matchin
21400 67 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  g row..**.** Thi
21410 73 20 6f 70 63 6f 64 65 20 69 73 20 73 69 6d 69  s opcode is simi
21420 6c 61 72 20 74 6f 20 4f 50 5f 4e 6f 74 46 6f 75  lar to OP_NotFou
21430 6e 64 20 77 69 74 68 20 74 68 65 20 65 78 63 65  nd with the exce
21440 70 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 0a  ptions that the.
21450 2a 2a 20 62 72 61 6e 63 68 20 69 73 20 61 6c 77  ** branch is alw
21460 61 79 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 79  ays taken if any
21470 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 65 61   part of the sea
21480 72 63 68 20 6b 65 79 20 69 6e 70 75 74 20 69 73  rch key input is
21490 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
214a0 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76  s operation leav
214b0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  es the cursor in
214c0 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69   a state where i
214d0 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61  t cannot be.** a
214e0 64 76 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65  dvanced in eithe
214f0 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e  r direction.  In
21500 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
21510 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a  e Next and Prev.
21520 2a 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f  ** opcodes do no
21530 74 20 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69  t work after thi
21540 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
21550 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74  ** See also: Not
21560 46 6f 75 6e 64 2c 20 46 6f 75 6e 64 2c 20 4e 6f  Found, Found, No
21570 74 45 78 69 73 74 73 0a 2a 2f 0a 63 61 73 65 20  tExists.*/.case 
21580 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 3a 20 20  OP_NoConflict:  
21590 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
215a0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 46 6f  */.case OP_NotFo
215b0 75 6e 64 3a 20 20 20 20 20 20 20 2f 2a 20 6a 75  und:       /* ju
215c0 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  mp, in3 */.case 
215d0 4f 50 5f 46 6f 75 6e 64 3a 20 7b 20 20 20 20 20  OP_Found: {     
215e0 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
215f0 2a 2f 0a 20 20 69 6e 74 20 61 6c 72 65 61 64 79  */.  int already
21600 45 78 69 73 74 73 3b 0a 20 20 69 6e 74 20 74 61  Exists;.  int ta
21610 6b 65 4a 75 6d 70 3b 0a 20 20 69 6e 74 20 69 69  keJump;.  int ii
21620 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
21630 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  pC;.  int res;. 
21640 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
21650 2a 70 46 72 65 65 3b 0a 20 20 55 6e 70 61 63 6b  *pFree;.  Unpack
21660 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
21670 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  y;.  UnpackedRec
21680 6f 72 64 20 72 3b 0a 0a 23 69 66 64 65 66 20 53  ord r;..#ifdef S
21690 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
216a0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
216b0 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 20 73 71  _NoConflict ) sq
216c0 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e  lite3_found_coun
216d0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  t++;.#endif..  a
216e0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
216f0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
21700 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73  nCursor );.  ass
21710 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
21720 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20  ==P4_INT32 );.  
21730 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
21740 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
21750 28 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65  ( pC!=0 );.#ifde
21760 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21770 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70 4f   pC->seekOp = pO
21780 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64 69  p->opcode;.#endi
21790 66 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  f.  pIn3 = &aMem
217a0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73  [pOp->p3];.  ass
217b0 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
217c0 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
217d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
217e0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
217f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
21800 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  >isTable==0 );. 
21810 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30   if( pOp->p4.i>0
21820 20 29 7b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e   ){.    r.pKeyIn
21830 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66  fo = pC->pKeyInf
21840 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20  o;.    r.nField 
21850 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69  = (u16)pOp->p4.i
21860 3b 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 70  ;.    r.aMem = p
21870 49 6e 33 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  In3;.#ifdef SQLI
21880 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72  TE_DEBUG.    for
21890 28 69 69 3d 30 3b 20 69 69 3c 72 2e 6e 46 69 65  (ii=0; ii<r.nFie
218a0 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ld; ii++){.     
218b0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
218c0 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 69 5d 29  lid(&r.aMem[ii])
218d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
218e0 28 20 28 72 2e 61 4d 65 6d 5b 69 69 5d 2e 66 6c  ( (r.aMem[ii].fl
218f0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
21900 3d 30 20 7c 7c 20 72 2e 61 4d 65 6d 5b 69 69 5d  =0 || r.aMem[ii]
21910 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  .n==0 );.      i
21920 66 28 20 69 69 20 29 20 52 45 47 49 53 54 45 52  f( ii ) REGISTER
21930 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2b 69  _TRACE(pOp->p3+i
21940 69 2c 20 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 3b  i, &r.aMem[ii]);
21950 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
21960 20 20 70 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a    pIdxKey = &r;.
21970 20 20 20 20 70 46 72 65 65 20 3d 20 30 3b 0a 20      pFree = 0;. 
21980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 72 65   }else{.    pFre
21990 65 20 3d 20 70 49 64 78 4b 65 79 20 3d 20 73 71  e = pIdxKey = sq
219a0 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
219b0 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43 2d  packedRecord(pC-
219c0 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
219d0 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
219e0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
219f0 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e    assert( pIn3->
21a00 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
21a10 20 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 45 78   );.    (void)Ex
21a20 70 61 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b 0a  pandBlob(pIn3);.
21a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21a40 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e  ecordUnpack(pC->
21a50 70 4b 65 79 49 6e 66 6f 2c 20 70 49 6e 33 2d 3e  pKeyInfo, pIn3->
21a60 6e 2c 20 70 49 6e 33 2d 3e 7a 2c 20 70 49 64 78  n, pIn3->z, pIdx
21a70 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78  Key);.  }.  pIdx
21a80 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  Key->default_rc 
21a90 3d 20 30 3b 0a 20 20 74 61 6b 65 4a 75 6d 70 20  = 0;.  takeJump 
21aa0 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  = 0;.  if( pOp->
21ab0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 43 6f 6e  opcode==OP_NoCon
21ac0 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 2f 2a 20  flict ){.    /* 
21ad0 46 6f 72 20 74 68 65 20 4f 50 5f 4e 6f 43 6f 6e  For the OP_NoCon
21ae0 66 6c 69 63 74 20 6f 70 63 6f 64 65 2c 20 74 61  flict opcode, ta
21af0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61  ke the jump if a
21b00 6e 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ny of the.    **
21b10 20 69 6e 70 75 74 20 66 69 65 6c 64 73 20 61 72   input fields ar
21b20 65 20 4e 55 4c 4c 2c 20 73 69 6e 63 65 20 61 6e  e NULL, since an
21b30 79 20 6b 65 79 20 77 69 74 68 20 61 20 4e 55 4c  y key with a NUL
21b40 4c 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a  L will not.    *
21b50 2a 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  * conflict */.  
21b60 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
21b70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3b 20  IdxKey->nField; 
21b80 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
21b90 20 70 49 64 78 4b 65 79 2d 3e 61 4d 65 6d 5b 69   pIdxKey->aMem[i
21ba0 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  i].flags & MEM_N
21bb0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  ull ){.        t
21bc0 61 6b 65 4a 75 6d 70 20 3d 20 31 3b 0a 20 20 20  akeJump = 1;.   
21bd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21be0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21c00 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
21c10 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  pC->uc.pCursor, 
21c20 70 49 64 78 4b 65 79 2c 20 30 2c 20 30 2c 20 26  pIdxKey, 0, 0, &
21c30 72 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65  res);.  if( pFre
21c40 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
21c50 65 28 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20  e(db, pFree);.  
21c60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21c70 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 62  K ){.    goto ab
21c80 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
21c90 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e 73 65 65 6b  ;.  }.  pC->seek
21ca0 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20  Result = res;.  
21cb0 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 3d 20  alreadyExists = 
21cc0 28 72 65 73 3d 3d 30 29 3b 0a 20 20 70 43 2d 3e  (res==0);.  pC->
21cd0 6e 75 6c 6c 52 6f 77 20 3d 20 31 2d 61 6c 72 65  nullRow = 1-alre
21ce0 61 64 79 45 78 69 73 74 73 3b 0a 20 20 70 43 2d  adyExists;.  pC-
21cf0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
21d00 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65  = 0;.  pC->cache
21d10 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
21d20 54 41 4c 45 3b 0a 20 20 69 66 28 20 70 4f 70 2d  TALE;.  if( pOp-
21d30 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e  >opcode==OP_Foun
21d40 64 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61  d ){.    VdbeBra
21d50 6e 63 68 54 61 6b 65 6e 28 61 6c 72 65 61 64 79  nchTaken(already
21d60 45 78 69 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20  Exists!=0,2);.  
21d70 20 20 69 66 28 20 61 6c 72 65 61 64 79 45 78 69    if( alreadyExi
21d80 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  sts ) goto jump_
21d90 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  to_p2;.  }else{.
21da0 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
21db0 6b 65 6e 28 74 61 6b 65 4a 75 6d 70 7c 7c 61 6c  ken(takeJump||al
21dc0 72 65 61 64 79 45 78 69 73 74 73 3d 3d 30 2c 32  readyExists==0,2
21dd0 29 3b 0a 20 20 20 20 69 66 28 20 74 61 6b 65 4a  );.    if( takeJ
21de0 75 6d 70 20 7c 7c 20 21 61 6c 72 65 61 64 79 45  ump || !alreadyE
21df0 78 69 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d  xists ) goto jum
21e00 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
21e10 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
21e20 64 65 3a 20 53 65 65 6b 52 6f 77 69 64 20 50 31  de: SeekRowid P1
21e30 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
21e40 6e 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72  nopsis: intkey=r
21e50 5b 50 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  [P3].**.** P1 is
21e60 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
21e70 63 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61  cursor open on a
21e80 6e 20 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65  n SQL table btre
21e90 65 20 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a  e (with integer.
21ea0 2a 2a 20 6b 65 79 73 29 2e 20 20 49 66 20 72 65  ** keys).  If re
21eb0 67 69 73 74 65 72 20 50 33 20 64 6f 65 73 20 6e  gister P3 does n
21ec0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e  ot contain an in
21ed0 74 65 67 65 72 20 6f 72 20 69 66 20 50 31 20 64  teger or if P1 d
21ee0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61  oes not.** conta
21ef0 69 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74 68  in a record with
21f00 20 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 6a   rowid P3 then j
21f10 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
21f20 74 6f 20 50 32 2e 20 20 0a 2a 2a 20 4f 72 2c 20  to P2.  .** Or, 
21f30 69 66 20 50 32 20 69 73 20 30 2c 20 72 61 69 73  if P2 is 0, rais
21f40 65 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  e an SQLITE_CORR
21f50 55 50 54 20 65 72 72 6f 72 2e 20 49 66 20 50 31  UPT error. If P1
21f60 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 0a 2a 2a   does contain.**
21f70 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 72   a record with r
21f80 6f 77 69 64 20 50 33 20 74 68 65 6e 20 0a 2a 2a  owid P3 then .**
21f90 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f   leave the curso
21fa0 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  r pointing at th
21fb0 61 74 20 72 65 63 6f 72 64 20 61 6e 64 20 66 61  at record and fa
21fc0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
21fd0 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75  e next.** instru
21fe0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
21ff0 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70   OP_NotExists op
22000 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68  code performs th
22010 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e  e same operation
22020 2c 20 62 75 74 20 77 69 74 68 20 4f 50 5f 4e 6f  , but with OP_No
22030 74 45 78 69 73 74 73 0a 2a 2a 20 74 68 65 20 50  tExists.** the P
22040 33 20 72 65 67 69 73 74 65 72 20 6d 75 73 74 20  3 register must 
22050 62 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  be guaranteed to
22060 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
22070 67 65 72 20 76 61 6c 75 65 2e 20 20 57 69 74 68  ger value.  With
22080 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 2c   this.** opcode,
22090 20 72 65 67 69 73 74 65 72 20 50 33 20 6d 69 67   register P3 mig
220a0 68 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ht not contain a
220b0 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  n integer..**.**
220c0 20 54 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64   The OP_NotFound
220d0 20 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73   opcode performs
220e0 20 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74   the same operat
220f0 69 6f 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72  ion on index btr
22100 65 65 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62  ees.** (with arb
22110 69 74 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c  itrary multi-val
22120 75 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20  ue keys)..**.** 
22130 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76  This opcode leav
22140 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  es the cursor in
22150 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69   a state where i
22160 74 20 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61  t cannot be adva
22170 6e 63 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65  nced.** in eithe
22180 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e  r direction.  In
22190 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
221a0 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20  e Next and Prev 
221b0 6f 70 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20  opcodes will.** 
221c0 6e 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69  not work followi
221d0 6e 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a  ng this opcode..
221e0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
221f0 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
22200 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65   NoConflict, See
22210 6b 52 6f 77 69 64 0a 2a 2f 0a 2f 2a 20 4f 70 63  kRowid.*/./* Opc
22220 6f 64 65 3a 20 4e 6f 74 45 78 69 73 74 73 20 50  ode: NotExists P
22230 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
22240 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d  ynopsis: intkey=
22250 72 5b 50 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69  r[P3].**.** P1 i
22260 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
22270 20 63 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   cursor open on 
22280 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 62 74 72  an SQL table btr
22290 65 65 20 28 77 69 74 68 20 69 6e 74 65 67 65 72  ee (with integer
222a0 0a 2a 2a 20 6b 65 79 73 29 2e 20 20 50 33 20 69  .** keys).  P3 i
222b0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77  s an integer row
222c0 69 64 2e 20 20 49 66 20 50 31 20 64 6f 65 73 20  id.  If P1 does 
222d0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 72 65  not contain a re
222e0 63 6f 72 64 20 77 69 74 68 0a 2a 2a 20 72 6f 77  cord with.** row
222f0 69 64 20 50 33 20 74 68 65 6e 20 6a 75 6d 70 20  id P3 then jump 
22300 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
22310 32 2e 20 20 4f 72 2c 20 69 66 20 50 32 20 69 73  2.  Or, if P2 is
22320 20 30 2c 20 72 61 69 73 65 20 61 6e 0a 2a 2a 20   0, raise an.** 
22330 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
22340 72 72 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73  rror. If P1 does
22350 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f 72   contain a recor
22360 64 20 77 69 74 68 20 72 6f 77 69 64 20 50 33 20  d with rowid P3 
22370 74 68 65 6e 20 0a 2a 2a 20 6c 65 61 76 65 20 74  then .** leave t
22380 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
22390 6e 67 20 61 74 20 74 68 61 74 20 72 65 63 6f 72  ng at that recor
223a0 64 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75  d and fall throu
223b0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a  gh to the next.*
223c0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  * instruction..*
223d0 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 53 65 65 6b  *.** The OP_Seek
223e0 52 6f 77 69 64 20 6f 70 63 6f 64 65 20 70 65 72  Rowid opcode per
223f0 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f  forms the same o
22400 70 65 72 61 74 69 6f 6e 20 62 75 74 20 61 6c 73  peration but als
22410 6f 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20  o allows the.** 
22420 50 33 20 72 65 67 69 73 74 65 72 20 74 6f 20 63  P3 register to c
22430 6f 6e 74 61 69 6e 20 61 20 6e 6f 6e 2d 69 6e 74  ontain a non-int
22440 65 67 65 72 20 76 61 6c 75 65 2c 20 69 6e 20 77  eger value, in w
22450 68 69 63 68 20 63 61 73 65 20 74 68 65 20 6a 75  hich case the ju
22460 6d 70 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  mp is.** always 
22470 74 61 6b 65 6e 2e 20 20 54 68 69 73 20 6f 70 63  taken.  This opc
22480 6f 64 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ode requires tha
22490 74 20 50 33 20 61 6c 77 61 79 73 20 63 6f 6e 74  t P3 always cont
224a0 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  ain an integer..
224b0 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74  **.** The OP_Not
224c0 46 6f 75 6e 64 20 6f 70 63 6f 64 65 20 70 65 72  Found opcode per
224d0 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f  forms the same o
224e0 70 65 72 61 74 69 6f 6e 20 6f 6e 20 69 6e 64 65  peration on inde
224f0 78 20 62 74 72 65 65 73 0a 2a 2a 20 28 77 69 74  x btrees.** (wit
22500 68 20 61 72 62 69 74 72 61 72 79 20 6d 75 6c 74  h arbitrary mult
22510 69 2d 76 61 6c 75 65 20 6b 65 79 73 29 2e 0a 2a  i-value keys)..*
22520 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
22530 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
22540 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20 77 68  or in a state wh
22550 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  ere it cannot be
22560 20 61 64 76 61 6e 63 65 64 0a 2a 2a 20 69 6e 20   advanced.** in 
22570 65 69 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e  either direction
22580 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
22590 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20  s, the Next and 
225a0 50 72 65 76 20 6f 70 63 6f 64 65 73 20 77 69 6c  Prev opcodes wil
225b0 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f  l.** not work fo
225c0 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 63  llowing this opc
225d0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ode..**.** See a
225e0 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46  lso: Found, NotF
225f0 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74  ound, NoConflict
22600 2c 20 53 65 65 6b 52 6f 77 69 64 0a 2a 2f 0a 63  , SeekRowid.*/.c
22610 61 73 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  ase OP_SeekRowid
22620 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
22630 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64 62  mp, in3 */.  Vdb
22640 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
22650 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
22660 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 36 34    int res;.  u64
22670 20 69 4b 65 79 3b 0a 0a 20 20 70 49 6e 33 20 3d   iKey;..  pIn3 =
22680 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
22690 0a 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c  .  if( (pIn3->fl
226a0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
226b0 30 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66  0 ){.    applyAf
226c0 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 53 51 4c  finity(pIn3, SQL
226d0 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c  ITE_AFF_NUMERIC,
226e0 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
226f0 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  if( (pIn3->flags
22700 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29   & MEM_Int)==0 )
22710 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
22720 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c 20  ;.  }.  /* Fall 
22730 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f  through into OP_
22740 4e 6f 74 45 78 69 73 74 73 20 2a 2f 0a 63 61 73  NotExists */.cas
22750 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 3a 20  e OP_NotExists: 
22760 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
22770 2c 20 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 33 20  , in3 */.  pIn3 
22780 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
22790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 33  ;.  assert( pIn3
227a0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
227b0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
227c0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
227d0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
227e0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
227f0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
22800 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
22810 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
22820 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70  BUG.  pC->seekOp
22830 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 61   = 0;.#endif.  a
22840 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
22850 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
22860 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
22870 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
22880 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e   pCrsr = pC->uc.
22890 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
228a0 74 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 20  t( pCrsr!=0 );. 
228b0 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 4b 65 79   res = 0;.  iKey
228c0 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20   = pIn3->u.i;.  
228d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
228e0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
228f0 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20  pCrsr, 0, iKey, 
22900 30 2c 20 26 72 65 73 29 3b 0a 20 20 61 73 73 65  0, &res);.  asse
22910 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
22920 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 3b 0a 20  K || res==0 );. 
22930 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65   pC->movetoTarge
22940 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55 73  t = iKey;  /* Us
22950 65 64 20 62 79 20 4f 50 5f 44 65 6c 65 74 65 20  ed by OP_Delete 
22960 2a 2f 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  */.  pC->nullRow
22970 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68   = 0;.  pC->cach
22980 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
22990 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 64 65 66  STALE;.  pC->def
229a0 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
229b0 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
229c0 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20  en(res!=0,2);.  
229d0 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  pC->seekResult =
229e0 20 72 65 73 3b 0a 20 20 69 66 28 20 72 65 73 21   res;.  if( res!
229f0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
22a00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a10 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  );.    if( pOp->
22a20 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  p2==0 ){.      r
22a30 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22a40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
22a50 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a  se{.      goto j
22a60 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d  ump_to_p2;.    }
22a70 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
22a80 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
22a90 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
22aa0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
22ab0 53 65 71 75 65 6e 63 65 20 50 31 20 50 32 20 2a  Sequence P1 P2 *
22ac0 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
22ad0 3a 20 72 5b 50 32 5d 3d 63 75 72 73 6f 72 5b 50  : r[P2]=cursor[P
22ae0 31 5d 2e 63 74 72 2b 2b 0a 2a 2a 0a 2a 2a 20 46  1].ctr++.**.** F
22af0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 61 76 61  ind the next ava
22b00 69 6c 61 62 6c 65 20 73 65 71 75 65 6e 63 65 20  ilable sequence 
22b10 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 73 6f  number for curso
22b20 72 20 50 31 2e 0a 2a 2a 20 57 72 69 74 65 20 74  r P1..** Write t
22b30 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62  he sequence numb
22b40 65 72 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  er into register
22b50 20 50 32 2e 0a 2a 2a 20 54 68 65 20 73 65 71 75   P2..** The sequ
22b60 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f 6e 20 74  ence number on t
22b70 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 63  he cursor is inc
22b80 72 65 6d 65 6e 74 65 64 20 61 66 74 65 72 20 74  remented after t
22b90 68 69 73 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69  his.** instructi
22ba0 6f 6e 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50  on.  .*/.case OP
22bb0 5f 53 65 71 75 65 6e 63 65 3a 20 7b 20 20 20 20  _Sequence: {    
22bc0 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
22bd0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
22be0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
22bf0 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
22c00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
22c10 73 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d 30 20 29  sr[pOp->p1]!=0 )
22c20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
22c30 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 65  pCsr[pOp->p1]->e
22c40 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45  CurType!=CURTYPE
22c50 5f 56 54 41 42 20 29 3b 0a 20 20 70 4f 75 74 20  _VTAB );.  pOut 
22c60 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
22c70 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74  (p, pOp);.  pOut
22c80 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72  ->u.i = p->apCsr
22c90 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f  [pOp->p1]->seqCo
22ca0 75 6e 74 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a  unt++;.  break;.
22cb0 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  }.../* Opcode: N
22cc0 65 77 52 6f 77 69 64 20 50 31 20 50 32 20 50 33  ewRowid P1 P2 P3
22cd0 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
22ce0 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a  : r[P2]=rowid.**
22cf0 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77 20 69 6e  .** Get a new in
22d00 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75 6d  teger record num
22d10 62 65 72 20 28 61 2e 6b 2e 61 20 22 72 6f 77 69  ber (a.k.a "rowi
22d20 64 22 29 20 75 73 65 64 20 61 73 20 74 68 65 20  d") used as the 
22d30 6b 65 79 20 74 6f 20 61 20 74 61 62 6c 65 2e 0a  key to a table..
22d40 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75  ** The record nu
22d50 6d 62 65 72 20 69 73 20 6e 6f 74 20 70 72 65 76  mber is not prev
22d60 69 6f 75 73 6c 79 20 75 73 65 64 20 61 73 20 61  iously used as a
22d70 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74 61   key in the data
22d80 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 74 68  base.** table th
22d90 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69  at cursor P1 poi
22da0 6e 74 73 20 74 6f 2e 20 20 54 68 65 20 6e 65 77  nts to.  The new
22db0 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69   record number i
22dc0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 77 72 69  s written.** wri
22dd0 74 74 65 6e 20 74 6f 20 72 65 67 69 73 74 65 72  tten to register
22de0 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33   P2..**.** If P3
22df0 3e 30 20 74 68 65 6e 20 50 33 20 69 73 20 61 20  >0 then P3 is a 
22e00 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
22e10 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 74 68  root frame of th
22e20 69 73 20 56 44 42 45 20 74 68 61 74 20 68 6f 6c  is VDBE that hol
22e30 64 73 20 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  ds .** the large
22e40 73 74 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65  st previously ge
22e50 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64 20 6e  nerated record n
22e60 75 6d 62 65 72 2e 20 4e 6f 20 6e 65 77 20 72 65  umber. No new re
22e70 63 6f 72 64 20 6e 75 6d 62 65 72 73 20 61 72 65  cord numbers are
22e80 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  .** allowed to b
22e90 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 69 73  e less than this
22ea0 20 76 61 6c 75 65 2e 20 57 68 65 6e 20 74 68 69   value. When thi
22eb0 73 20 76 61 6c 75 65 20 72 65 61 63 68 65 73 20  s value reaches 
22ec0 69 74 73 20 6d 61 78 69 6d 75 6d 2c 20 0a 2a 2a  its maximum, .**
22ed0 20 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   an SQLITE_FULL 
22ee0 65 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61 74  error is generat
22ef0 65 64 2e 20 54 68 65 20 50 33 20 72 65 67 69 73  ed. The P3 regis
22f00 74 65 72 20 69 73 20 75 70 64 61 74 65 64 20 77  ter is updated w
22f10 69 74 68 20 74 68 65 20 27 0a 2a 2a 20 67 65 6e  ith the '.** gen
22f20 65 72 61 74 65 64 20 72 65 63 6f 72 64 20 6e 75  erated record nu
22f30 6d 62 65 72 2e 20 54 68 69 73 20 50 33 20 6d 65  mber. This P3 me
22f40 63 68 61 6e 69 73 6d 20 69 73 20 75 73 65 64 20  chanism is used 
22f50 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d 65 6e  to help implemen
22f60 74 20 74 68 65 0a 2a 2a 20 41 55 54 4f 49 4e 43  t the.** AUTOINC
22f70 52 45 4d 45 4e 54 20 66 65 61 74 75 72 65 2e 0a  REMENT feature..
22f80 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 77 52 6f  */.case OP_NewRo
22f90 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20  wid: {          
22fa0 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 36   /* out2 */.  i6
22fb0 34 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  4 v;            
22fc0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
22fd0 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62 65 43  rowid */.  VdbeC
22fe0 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20  ursor *pC;      
22ff0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
23000 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
23010 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  new rowid */.  i
23020 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
23030 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
23040 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 42 74 72  of an sqlite3Btr
23050 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20 69 6e  eeLast() */.  in
23060 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
23070 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
23080 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d  to limit the num
23090 62 65 72 20 6f 66 20 73 65 61 72 63 68 65 73 20  ber of searches 
230a0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20  */.  Mem *pMem; 
230b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
230c0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
230d0 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f  largest rowid fo
230e0 72 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  r AUTOINCREMENT 
230f0 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a  */.  VdbeFrame *
23100 70 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a 20 52  pFrame;     /* R
23110 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 56 44 42  oot frame of VDB
23120 45 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b 0a 20  E */..  v = 0;. 
23130 20 72 65 73 20 3d 20 30 3b 0a 20 20 70 4f 75 74   res = 0;.  pOut
23140 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
23150 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73  e(p, pOp);.  ass
23160 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
23170 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
23180 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
23190 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
231a0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
231b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
231c0 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
231d0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
231e0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
231f0 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
23200 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78  {.    /* The nex
23210 74 20 72 6f 77 69 64 20 6f 72 20 72 65 63 6f 72  t rowid or recor
23220 64 20 6e 75 6d 62 65 72 20 28 64 69 66 66 65 72  d number (differ
23230 65 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  ent terms for th
23240 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 74 68  e same.    ** th
23250 69 6e 67 29 20 69 73 20 6f 62 74 61 69 6e 65 64  ing) is obtained
23260 20 69 6e 20 61 20 74 77 6f 2d 73 74 65 70 20 61   in a two-step a
23270 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a  lgorithm..    **
23280 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 77 65  .    ** First we
23290 20 61 74 74 65 6d 70 74 20 74 6f 20 66 69 6e 64   attempt to find
232a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 69   the largest exi
232b0 73 74 69 6e 67 20 72 6f 77 69 64 20 61 6e 64 20  sting rowid and 
232c0 61 64 64 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 74  add one.    ** t
232d0 6f 20 74 68 61 74 2e 20 20 42 75 74 20 69 66 20  o that.  But if 
232e0 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73  the largest exis
232f0 74 69 6e 67 20 72 6f 77 69 64 20 69 73 20 61 6c  ting rowid is al
23300 72 65 61 64 79 20 74 68 65 20 6d 61 78 69 6d 75  ready the maximu
23310 6d 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 76  m.    ** positiv
23320 65 20 69 6e 74 65 67 65 72 2c 20 77 65 20 68 61  e integer, we ha
23330 76 65 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75  ve to fall throu
23340 67 68 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64  gh to the second
23350 0a 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 69 6c  .    ** probabil
23360 69 73 74 69 63 20 61 6c 67 6f 72 69 74 68 6d 0a  istic algorithm.
23370 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
23380 65 20 73 65 63 6f 6e 64 20 61 6c 67 6f 72 69 74  e second algorit
23390 68 6d 20 69 73 20 74 6f 20 73 65 6c 65 63 74 20  hm is to select 
233a0 61 20 72 6f 77 69 64 20 61 74 20 72 61 6e 64 6f  a rowid at rando
233b0 6d 20 61 6e 64 20 73 65 65 20 69 66 0a 20 20 20  m and see if.   
233c0 20 2a 2a 20 69 74 20 61 6c 72 65 61 64 79 20 65   ** it already e
233d0 78 69 73 74 73 20 69 6e 20 74 68 65 20 74 61 62  xists in the tab
233e0 6c 65 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20  le.  If it does 
233f0 6e 6f 74 20 65 78 69 73 74 2c 20 77 65 20 68 61  not exist, we ha
23400 76 65 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65  ve.    ** succee
23410 64 65 64 2e 20 20 49 66 20 74 68 65 20 72 61 6e  ded.  If the ran
23420 64 6f 6d 20 72 6f 77 69 64 20 64 6f 65 73 20 65  dom rowid does e
23430 78 69 73 74 2c 20 77 65 20 73 65 6c 65 63 74 20  xist, we select 
23440 61 20 6e 65 77 20 6f 6e 65 0a 20 20 20 20 2a 2a  a new one.    **
23450 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2c 20   and try again, 
23460 75 70 20 74 6f 20 31 30 30 20 74 69 6d 65 73 2e  up to 100 times.
23470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
23480 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20  rt( pC->isTable 
23490 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
234a0 45 5f 33 32 42 49 54 5f 52 4f 57 49 44 0a 23 20  E_32BIT_ROWID.# 
234b0 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57    define MAX_ROW
234c0 49 44 20 30 78 37 66 66 66 66 66 66 66 0a 23 65  ID 0x7fffffff.#e
234d0 6c 73 65 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 20  lse.    /* Some 
234e0 63 6f 6d 70 69 6c 65 72 73 20 63 6f 6d 70 6c 61  compilers compla
234f0 69 6e 20 61 62 6f 75 74 20 63 6f 6e 73 74 61 6e  in about constan
23500 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 30  ts of the form 0
23510 78 37 66 66 66 66 66 66 66 66 66 66 66 66 66 66  x7ffffffffffffff
23520 66 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 73  f..    ** Others
23530 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20   complain about 
23540 30 78 37 66 66 66 66 66 66 66 66 66 66 66 66 66  0x7fffffffffffff
23550 66 66 66 4c 4c 2e 20 20 54 68 65 20 66 6f 6c 6c  fffLL.  The foll
23560 6f 77 69 6e 67 20 6d 61 63 72 6f 20 73 65 65 6d  owing macro seem
23570 73 0a 20 20 20 20 2a 2a 20 74 6f 20 70 72 6f 76  s.    ** to prov
23580 69 64 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  ide the constant
23590 20 77 68 69 6c 65 20 6d 61 6b 69 6e 67 20 61 6c   while making al
235a0 6c 20 63 6f 6d 70 69 6c 65 72 73 20 68 61 70 70  l compilers happ
235b0 79 2e 0a 20 20 20 20 2a 2f 0a 23 20 20 20 64 65  y..    */.#   de
235c0 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 20  fine MAX_ROWID  
235d0 28 69 36 34 29 28 20 28 28 28 75 36 34 29 30 78  (i64)( (((u64)0x
235e0 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 20 7c  7fffffff)<<32) |
235f0 20 28 75 36 34 29 30 78 66 66 66 66 66 66 66 66   (u64)0xffffffff
23600 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   ).#endif..    i
23610 66 28 20 21 70 43 2d 3e 75 73 65 52 61 6e 64 6f  f( !pC->useRando
23620 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  mRowid ){.      
23630 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23640 65 4c 61 73 74 28 70 43 2d 3e 75 63 2e 70 43 75  eLast(pC->uc.pCu
23650 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
23660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23680 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
23690 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
236a0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29  .      if( res )
236b0 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 31 3b  {.        v = 1;
236c0 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39     /* IMP: R-619
236d0 31 34 2d 34 38 30 37 34 20 2a 2f 0a 20 20 20 20  14-48074 */.    
236e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
236f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23700 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
23710 69 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  id(pC->uc.pCurso
23720 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 76 20  r) );.        v 
23730 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
23740 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e  tegerKey(pC->uc.
23750 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
23760 20 20 69 66 28 20 76 3e 3d 4d 41 58 5f 52 4f 57    if( v>=MAX_ROW
23770 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
23780 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77  pC->useRandomRow
23790 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
237a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
237b0 20 76 2b 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20   v++;   /* IMP: 
237c0 52 2d 32 39 35 33 38 2d 33 34 39 38 37 20 2a 2f  R-29538-34987 */
237d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
237e0 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65   }.    }..#ifnde
237f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23800 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
23810 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20  if( pOp->p3 ){. 
23820 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74       /* Assert t
23830 68 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69  hat P3 is a vali
23840 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a  d memory cell. *
23850 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
23860 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20  pOp->p3>0 );.   
23870 20 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65     if( p->pFrame
23880 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
23890 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
238a0 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
238b0 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
238c0 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
238d0 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68      /* Assert th
238e0 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64  at P3 is a valid
238f0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f   memory cell. */
23900 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23910 20 70 4f 70 2d 3e 70 33 3c 3d 70 46 72 61 6d 65   pOp->p3<=pFrame
23920 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20  ->nMem );.      
23930 20 20 70 4d 65 6d 20 3d 20 26 70 46 72 61 6d 65    pMem = &pFrame
23940 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b  ->aMem[pOp->p3];
23950 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23960 20 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20        /* Assert 
23970 74 68 61 74 20 50 33 20 69 73 20 61 20 76 61 6c  that P3 is a val
23980 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20  id memory cell. 
23990 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
239a0 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  t( pOp->p3<=(p->
239b0 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
239c0 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
239d0 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pMem = &aMem[pOp
239e0 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ->p3];.        m
239f0 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
23a00 70 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  p, pMem);.      
23a10 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
23a20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4d 65 6d 29  memIsValid(pMem)
23a30 20 29 3b 0a 0a 20 20 20 20 20 20 52 45 47 49 53   );..      REGIS
23a40 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
23a50 33 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  3, pMem);.      
23a60 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
23a70 74 65 67 65 72 69 66 79 28 70 4d 65 6d 29 3b 0a  tegerify(pMem);.
23a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
23a90 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
23aa0 5f 49 6e 74 29 21 3d 30 20 29 3b 20 20 2f 2a 20  _Int)!=0 );  /* 
23ab0 6d 65 6d 28 50 33 29 20 68 6f 6c 64 73 20 61 6e  mem(P3) holds an
23ac0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
23ad0 20 20 69 66 28 20 70 4d 65 6d 2d 3e 75 2e 69 3d    if( pMem->u.i=
23ae0 3d 4d 41 58 5f 52 4f 57 49 44 20 7c 7c 20 70 43  =MAX_ROWID || pC
23af0 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
23b00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23b10 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20   SQLITE_FULL;   
23b20 2f 2a 20 49 4d 50 3a 20 52 2d 31 37 38 31 37 2d  /* IMP: R-17817-
23b30 30 30 36 33 30 20 2a 2f 0a 20 20 20 20 20 20 20  00630 */.       
23b40 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
23b50 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
23b60 7d 0a 20 20 20 20 20 20 69 66 28 20 76 3c 70 4d  }.      if( v<pM
23b70 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20 20  em->u.i+1 ){.   
23b80 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
23b90 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d 0a  .i + 1;.      }.
23ba0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
23bb0 3d 20 76 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = v;.    }.#endi
23bc0 66 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 75 73  f.    if( pC->us
23bd0 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a  eRandomRowid ){.
23be0 20 20 20 20 20 20 2f 2a 20 49 4d 50 4c 45 4d 45        /* IMPLEME
23bf0 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 37  NTATION-OF: R-07
23c00 36 37 37 2d 34 31 38 38 31 20 49 66 20 74 68 65  677-41881 If the
23c10 20 6c 61 72 67 65 73 74 20 52 4f 57 49 44 20 69   largest ROWID i
23c20 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 20  s equal to the. 
23c30 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20       ** largest 
23c40 70 6f 73 73 69 62 6c 65 20 69 6e 74 65 67 65 72  possible integer
23c50 20 28 39 32 32 33 33 37 32 30 33 36 38 35 34 37   (92233720368547
23c60 37 35 38 30 37 29 20 74 68 65 6e 20 74 68 65 20  75807) then the 
23c70 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
23c80 2a 20 65 6e 67 69 6e 65 20 73 74 61 72 74 73 20  * engine starts 
23c90 70 69 63 6b 69 6e 67 20 70 6f 73 69 74 69 76 65  picking positive
23ca0 20 63 61 6e 64 69 64 61 74 65 20 52 4f 57 49 44   candidate ROWID
23cb0 73 20 61 74 20 72 61 6e 64 6f 6d 20 75 6e 74 69  s at random unti
23cc0 6c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 66 69  l.      ** it fi
23cd0 6e 64 73 20 6f 6e 65 20 74 68 61 74 20 69 73 20  nds one that is 
23ce0 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75  not previously u
23cf0 73 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  sed. */.      as
23d00 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 30  sert( pOp->p3==0
23d10 20 29 3b 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f   );  /* We canno
23d20 74 20 62 65 20 69 6e 20 72 61 6e 64 6f 6d 20 72  t be in random r
23d30 6f 77 69 64 20 6d 6f 64 65 20 69 66 20 74 68 69  owid mode if thi
23d40 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  s is.           
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d60 20 20 2a 2a 20 61 6e 20 41 55 54 4f 49 4e 43 52    ** an AUTOINCR
23d70 45 4d 45 4e 54 20 74 61 62 6c 65 2e 20 2a 2f 0a  EMENT table. */.
23d80 20 20 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20        cnt = 0;. 
23d90 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
23da0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
23db0 65 73 73 28 73 69 7a 65 6f 66 28 76 29 2c 20 26  ess(sizeof(v), &
23dc0 76 29 3b 0a 20 20 20 20 20 20 20 20 76 20 26 3d  v);.        v &=
23dd0 20 28 4d 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b   (MAX_ROWID>>1);
23de0 20 76 2b 2b 3b 20 20 2f 2a 20 45 6e 73 75 72 65   v++;  /* Ensure
23df0 20 74 68 61 74 20 76 20 69 73 20 67 72 65 61 74   that v is great
23e00 65 72 20 74 68 61 6e 20 7a 65 72 6f 20 2a 2f 0a  er than zero */.
23e10 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 20 28        }while(  (
23e20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
23e30 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
23e40 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
23e50 20 30 2c 20 28 75 36 34 29 76 2c 0a 20 20 20 20   0, (u64)v,.    
23e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
23e90 26 72 65 73 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  &res))==SQLITE_O
23ea0 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  K).            &
23eb0 26 20 28 72 65 73 3d 3d 30 29 0a 20 20 20 20 20  & (res==0).     
23ec0 20 20 20 20 20 20 20 26 26 20 28 2b 2b 63 6e 74         && (++cnt
23ed0 3c 31 30 30 29 29 3b 0a 20 20 20 20 20 20 69 66  <100));.      if
23ee0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
23ef0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
23f00 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
23f10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23f20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20   SQLITE_FULL;   
23f30 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 32 31 39 2d  /* IMP: R-38219-
23f40 35 33 30 30 32 20 2a 2f 0a 20 20 20 20 20 20 20  53002 */.       
23f50 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
23f60 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
23f70 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
23f80 76 3e 30 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52  v>0 );  /* EV: R
23f90 2d 34 30 38 31 32 2d 30 33 35 37 30 20 2a 2f 0a  -40812-03570 */.
23fa0 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 64 65      }.    pC->de
23fb0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
23fc0 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
23fd0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
23fe0 41 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d  ALE;.  }.  pOut-
23ff0 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61  >u.i = v;.  brea
24000 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
24010 20 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33   Insert P1 P2 P3
24020 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
24030 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d  is: intkey=r[P3]
24040 20 64 61 74 61 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a   data=r[P2].**.*
24050 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
24060 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20   into the table 
24070 6f 66 20 63 75 72 73 6f 72 20 50 31 2e 20 20 41  of cursor P1.  A
24080 20 6e 65 77 20 65 6e 74 72 79 20 69 73 0a 2a 2a   new entry is.**
24090 20 63 72 65 61 74 65 64 20 69 66 20 69 74 20 64   created if it d
240a0 6f 65 73 6e 27 74 20 61 6c 72 65 61 64 79 20 65  oesn't already e
240b0 78 69 73 74 20 6f 72 20 74 68 65 20 64 61 74 61  xist or the data
240c0 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
240d0 0a 2a 2a 20 65 6e 74 72 79 20 69 73 20 6f 76 65  .** entry is ove
240e0 72 77 72 69 74 74 65 6e 2e 20 20 54 68 65 20 64  rwritten.  The d
240f0 61 74 61 20 69 73 20 74 68 65 20 76 61 6c 75 65  ata is the value
24100 20 4d 45 4d 5f 42 6c 6f 62 20 73 74 6f 72 65 64   MEM_Blob stored
24110 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20   in register.** 
24120 6e 75 6d 62 65 72 20 50 32 2e 20 54 68 65 20 6b  number P2. The k
24130 65 79 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ey is stored in 
24140 72 65 67 69 73 74 65 72 20 50 33 2e 20 54 68 65  register P3. The
24150 20 6b 65 79 20 6d 75 73 74 0a 2a 2a 20 62 65 20   key must.** be 
24160 61 20 4d 45 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a  a MEM_Int..**.**
24170 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e   If the OPFLAG_N
24180 43 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50  CHANGE flag of P
24190 35 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  5 is set, then t
241a0 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f  he row change co
241b0 75 6e 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d  unt is.** increm
241c0 65 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73 65  ented (otherwise
241d0 20 6e 6f 74 29 2e 20 20 49 66 20 74 68 65 20 4f   not).  If the O
241e0 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20  PFLAG_LASTROWID 
241f0 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65  flag of P5 is se
24200 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 6f 77 69 64  t,.** then rowid
24210 20 69 73 20 73 74 6f 72 65 64 20 66 6f 72 20 73   is stored for s
24220 75 62 73 65 71 75 65 6e 74 20 72 65 74 75 72 6e  ubsequent return
24230 20 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   by the.** sqlit
24240 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
24250 6f 77 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  owid() function 
24260 28 6f 74 68 65 72 77 69 73 65 20 69 74 20 69 73  (otherwise it is
24270 20 75 6e 6d 6f 64 69 66 69 65 64 29 2e 0a 2a 2a   unmodified)..**
24280 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
24290 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20  G_USESEEKRESULT 
242a0 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65  flag of P5 is se
242b0 74 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  t, the implement
242c0 61 74 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a 20 72  ation might.** r
242d0 75 6e 20 66 61 73 74 65 72 20 62 79 20 61 76 6f  un faster by avo
242e0 69 64 69 6e 67 20 61 6e 20 75 6e 6e 65 63 65 73  iding an unneces
242f0 73 61 72 79 20 73 65 65 6b 20 6f 6e 20 63 75 72  sary seek on cur
24300 73 6f 72 20 50 31 2e 20 20 48 6f 77 65 76 65 72  sor P1.  However
24310 2c 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f  ,.** the OPFLAG_
24320 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c  USESEEKRESULT fl
24330 61 67 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20  ag must only be 
24340 73 65 74 20 69 66 20 74 68 65 72 65 20 68 61 76  set if there hav
24350 65 20 62 65 65 6e 20 6e 6f 20 70 72 69 6f 72 0a  e been no prior.
24360 2a 2a 20 73 65 65 6b 73 20 6f 6e 20 74 68 65 20  ** seeks on the 
24370 63 75 72 73 6f 72 20 6f 72 20 69 66 20 74 68 65  cursor or if the
24380 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 65 65   most recent see
24390 6b 20 75 73 65 64 20 61 20 6b 65 79 20 65 71 75  k used a key equ
243a0 61 6c 20 74 6f 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  al to P3..**.** 
243b0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 49 53  If the OPFLAG_IS
243c0 55 50 44 41 54 45 20 66 6c 61 67 20 69 73 20 73  UPDATE flag is s
243d0 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70  et, then this op
243e0 63 6f 64 65 20 69 73 20 70 61 72 74 20 6f 66 20  code is part of 
243f0 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20 6f 70 65  an.** UPDATE ope
24400 72 61 74 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69  ration.  Otherwi
24410 73 65 20 28 69 66 20 74 68 65 20 66 6c 61 67 20  se (if the flag 
24420 69 73 20 63 6c 65 61 72 29 20 74 68 65 6e 20 74  is clear) then t
24430 68 69 73 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  his opcode.** is
24440 20 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45   part of an INSE
24450 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54  RT operation.  T
24460 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
24470 20 6f 6e 6c 79 20 69 6d 70 6f 72 74 61 6e 74 20   only important 
24480 74 6f 0a 2a 2a 20 74 68 65 20 75 70 64 61 74 65  to.** the update
24490 20 68 6f 6f 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   hook..**.** Par
244a0 61 6d 65 74 65 72 20 50 34 20 6d 61 79 20 70 6f  ameter P4 may po
244b0 69 6e 74 20 74 6f 20 61 20 54 61 62 6c 65 20 73  int to a Table s
244c0 74 72 75 63 74 75 72 65 2c 20 6f 72 20 6d 61 79  tructure, or may
244d0 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20   be NULL. If it 
244e0 69 73 20 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c  is .** not NULL,
244f0 20 74 68 65 6e 20 74 68 65 20 75 70 64 61 74 65   then the update
24500 2d 68 6f 6f 6b 20 28 73 71 6c 69 74 65 33 2e 78  -hook (sqlite3.x
24510 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 29 20  UpdateCallback) 
24520 69 73 20 69 6e 76 6f 6b 65 64 20 0a 2a 2a 20 66  is invoked .** f
24530 6f 6c 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65  ollowing a succe
24540 73 73 66 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a  ssful insert..**
24550 0a 2a 2a 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44  .** (WARNING/TOD
24560 4f 3a 20 49 66 20 50 31 20 69 73 20 61 20 70 73  O: If P1 is a ps
24570 65 75 64 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20  eudo-cursor and 
24580 50 32 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c  P2 is dynamicall
24590 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20  y.** allocated, 
245a0 74 68 65 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f  then ownership o
245b0 66 20 50 32 20 69 73 20 74 72 61 6e 73 66 65 72  f P2 is transfer
245c0 72 65 64 20 74 6f 20 74 68 65 20 70 73 65 75 64  red to the pseud
245d0 6f 2d 63 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20  o-cursor.** and 
245e0 72 65 67 69 73 74 65 72 20 50 32 20 62 65 63 6f  register P2 beco
245f0 6d 65 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20  mes ephemeral.  
24600 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
24610 20 63 68 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a   changed, the.**
24620 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74   value of regist
24630 65 72 20 50 32 20 77 69 6c 6c 20 74 68 65 6e 20  er P2 will then 
24640 63 68 61 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75  change.  Make su
24650 72 65 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  re this does not
24660 0a 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72  .** cause any pr
24670 6f 62 6c 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54  oblems.).**.** T
24680 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
24690 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61  only works on ta
246a0 62 6c 65 73 2e 20 20 54 68 65 20 65 71 75 69 76  bles.  The equiv
246b0 61 6c 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  alent instructio
246c0 6e 0a 2a 2a 20 66 6f 72 20 69 6e 64 69 63 65 73  n.** for indices
246d0 20 69 73 20 4f 50 5f 49 64 78 49 6e 73 65 72 74   is OP_IdxInsert
246e0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
246f0 49 6e 73 65 72 74 49 6e 74 20 50 31 20 50 32 20  InsertInt P1 P2 
24700 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
24710 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 50 33 20  psis: intkey=P3 
24720 64 61 74 61 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a  data=r[P2].**.**
24730 20 54 68 69 73 20 77 6f 72 6b 73 20 65 78 61 63   This works exac
24740 74 6c 79 20 6c 69 6b 65 20 4f 50 5f 49 6e 73 65  tly like OP_Inse
24750 72 74 20 65 78 63 65 70 74 20 74 68 61 74 20 74  rt except that t
24760 68 65 20 6b 65 79 20 69 73 20 74 68 65 0a 2a 2a  he key is the.**
24770 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50   integer value P
24780 33 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65  3, not the value
24790 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
247a0 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
247b0 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P3..*/.case O
247c0 50 5f 49 6e 73 65 72 74 3a 20 0a 63 61 73 65 20  P_Insert: .case 
247d0 4f 50 5f 49 6e 73 65 72 74 49 6e 74 3a 20 7b 0a  OP_InsertInt: {.
247e0 20 20 4d 65 6d 20 2a 70 44 61 74 61 3b 20 20 20    Mem *pData;   
247f0 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20      /* MEM cell 
24800 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 66 6f 72  holding data for
24810 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 62   the record to b
24820 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  e inserted */.  
24830 4d 65 6d 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  Mem *pKey;      
24840 20 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 6f    /* MEM cell ho
24850 6c 64 69 6e 67 20 6b 65 79 20 20 66 6f 72 20 74  lding key  for t
24860 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 56  he record */.  V
24870 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20  dbeCursor *pC;  
24880 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 74 61   /* Cursor to ta
24890 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 69  ble into which i
248a0 6e 73 65 72 74 20 69 73 20 77 72 69 74 74 65 6e  nsert is written
248b0 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65   */.  int seekRe
248c0 73 75 6c 74 3b 20 20 20 2f 2a 20 52 65 73 75 6c  sult;   /* Resul
248d0 74 20 6f 66 20 70 72 69 6f 72 20 73 65 65 6b 20  t of prior seek 
248e0 6f 72 20 30 20 69 66 20 6e 6f 20 55 53 45 53 45  or 0 if no USESE
248f0 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 2a 2f  EKRESULT flag */
24900 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24910 44 62 3b 20 20 2f 2a 20 64 61 74 61 62 61 73 65  Db;  /* database
24920 20 6e 61 6d 65 20 2d 20 75 73 65 64 20 62 79 20   name - used by 
24930 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20  the update hook 
24940 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
24950 3b 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ;      /* Table 
24960 73 74 72 75 63 74 75 72 65 20 2d 20 75 73 65 64  structure - used
24970 20 62 79 20 75 70 64 61 74 65 20 61 6e 64 20 70   by update and p
24980 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 73 20  re-update hooks 
24990 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
249a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
249b0 20 66 6f 72 20 75 70 64 61 74 65 20 68 6f 6f 6b   for update hook
249c0 3a 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  : SQLITE_UPDATE 
249d0 6f 72 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  or SQLITE_INSERT
249e0 20 2a 2f 0a 20 20 42 74 72 65 65 50 61 79 6c 6f   */.  BtreePaylo
249f0 61 64 20 78 3b 20 20 20 2f 2a 20 50 61 79 6c 6f  ad x;   /* Paylo
24a00 61 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  ad to be inserte
24a10 64 20 2a 2f 0a 0a 20 20 6f 70 20 3d 20 30 3b 0a  d */..  op = 0;.
24a20 20 20 70 44 61 74 61 20 3d 20 26 61 4d 65 6d 5b    pData = &aMem[
24a30 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65  pOp->p2];.  asse
24a40 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
24a50 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
24a60 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
24a70 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 44 61  ( memIsValid(pDa
24a80 74 61 29 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  ta) );.  pC = p-
24a90 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
24aa0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
24ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24ac0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
24ad0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
24ae0 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
24af0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
24b00 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26  sert( (pOp->p5 &
24b10 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 29 20   OPFLAG_ISNOOP) 
24b20 7c 7c 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29  || pC->isTable )
24b30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
24b40 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c  >p4type==P4_TABL
24b50 45 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65  E || pOp->p4type
24b60 3e 3d 50 34 5f 53 54 41 54 49 43 20 29 3b 0a 20  >=P4_STATIC );. 
24b70 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
24b80 70 4f 70 2d 3e 70 32 2c 20 70 44 61 74 61 29 3b  pOp->p2, pData);
24b90 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ..  if( pOp->opc
24ba0 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 20 29  ode==OP_Insert )
24bb0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 26 61 4d  {.    pKey = &aM
24bc0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
24bd0 20 61 73 73 65 72 74 28 20 70 4b 65 79 2d 3e 66   assert( pKey->f
24be0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
24bf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
24c00 6d 49 73 56 61 6c 69 64 28 70 4b 65 79 29 20 29  mIsValid(pKey) )
24c10 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
24c20 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4b  RACE(pOp->p3, pK
24c30 65 79 29 3b 0a 20 20 20 20 78 2e 6e 4b 65 79 20  ey);.    x.nKey 
24c40 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d  = pKey->u.i;.  }
24c50 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
24c60 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
24c70 50 5f 49 6e 73 65 72 74 49 6e 74 20 29 3b 0a 20  P_InsertInt );. 
24c80 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70 4f 70 2d     x.nKey = pOp-
24c90 3e 70 33 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  >p3;.  }..  if( 
24ca0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
24cb0 54 41 42 4c 45 20 26 26 20 48 41 53 5f 55 50 44  TABLE && HAS_UPD
24cc0 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20 29 7b 0a  ATE_HOOK(db) ){.
24cd0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
24ce0 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 7a 44  iDb>=0 );.    zD
24cf0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e  b = db->aDb[pC->
24d00 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
24d10 20 20 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e 70     pTab = pOp->p
24d20 34 2e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  4.pTab;.    asse
24d30 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f  rt( (pOp->p5 & O
24d40 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c  PFLAG_ISNOOP) ||
24d50 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
24d60 29 3b 0a 20 20 20 20 6f 70 20 3d 20 28 28 70 4f  );.    op = ((pO
24d70 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49  p->p5 & OPFLAG_I
24d80 53 55 50 44 41 54 45 29 20 3f 20 53 51 4c 49 54  SUPDATE) ? SQLIT
24d90 45 5f 55 50 44 41 54 45 20 3a 20 53 51 4c 49 54  E_UPDATE : SQLIT
24da0 45 5f 49 4e 53 45 52 54 29 3b 0a 20 20 7d 65 6c  E_INSERT);.  }el
24db0 73 65 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30  se{.    pTab = 0
24dc0 3b 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e  ; /* Not needed.
24dd0 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d 70    Silence a comp
24de0 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f  iler warning. */
24df0 0a 20 20 20 20 7a 44 62 20 3d 20 30 3b 20 20 2f  .    zDb = 0;  /
24e00 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53  * Not needed.  S
24e10 69 6c 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65  ilence a compile
24e20 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20  r warning. */.  
24e30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
24e40 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
24e50 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20 49 6e 76 6f  E_HOOK.  /* Invo
24e60 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74  ke the pre-updat
24e70 65 20 68 6f 6f 6b 2c 20 69 66 20 61 6e 79 20 2a  e hook, if any *
24e80 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65  /.  if( db->xPre
24e90 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 0a  UpdateCallback .
24ea0 20 20 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70     && pOp->p4typ
24eb0 65 3d 3d 50 34 5f 54 41 42 4c 45 0a 20 20 20 26  e==P4_TABLE.   &
24ec0 26 20 21 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50  & !(pOp->p5 & OP
24ed0 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 0a 20  FLAG_ISUPDATE). 
24ee0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
24ef0 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  dbePreUpdateHook
24f00 28 70 2c 20 70 43 2c 20 53 51 4c 49 54 45 5f 49  (p, pC, SQLITE_I
24f10 4e 53 45 52 54 2c 20 7a 44 62 2c 20 70 54 61 62  NSERT, zDb, pTab
24f20 2c 20 78 2e 6e 4b 65 79 2c 20 70 4f 70 2d 3e 70  , x.nKey, pOp->p
24f30 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f  2);.  }.  if( pO
24f40 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49  p->p5 & OPFLAG_I
24f50 53 4e 4f 4f 50 20 29 20 62 72 65 61 6b 3b 0a 23  SNOOP ) break;.#
24f60 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 70  endif..  if( pOp
24f70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43  ->p5 & OPFLAG_NC
24f80 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e  HANGE ) p->nChan
24f90 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f 70 2d  ge++;.  if( pOp-
24fa0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c 41 53  >p5 & OPFLAG_LAS
24fb0 54 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c 61 73  TROWID ) db->las
24fc0 74 52 6f 77 69 64 20 3d 20 78 2e 6e 4b 65 79 3b  tRowid = x.nKey;
24fd0 0a 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66 6c  .  if( pData->fl
24fe0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
24ff0 7b 0a 20 20 20 20 78 2e 70 44 61 74 61 20 3d 20  {.    x.pData = 
25000 30 3b 0a 20 20 20 20 78 2e 6e 44 61 74 61 20 3d  0;.    x.nData =
25010 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
25020 20 61 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e   assert( pData->
25030 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f  flags & (MEM_Blo
25040 62 7c 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20  b|MEM_Str) );.  
25050 20 20 78 2e 70 44 61 74 61 20 3d 20 70 44 61 74    x.pData = pDat
25060 61 2d 3e 7a 3b 0a 20 20 20 20 78 2e 6e 44 61 74  a->z;.    x.nDat
25070 61 20 3d 20 70 44 61 74 61 2d 3e 6e 3b 0a 20 20  a = pData->n;.  
25080 7d 0a 20 20 73 65 65 6b 52 65 73 75 6c 74 20 3d  }.  seekResult =
25090 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46   ((pOp->p5 & OPF
250a0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
250b0 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73  T) ? pC->seekRes
250c0 75 6c 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ult : 0);.  if( 
250d0 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d  pData->flags & M
250e0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 78  EM_Zero ){.    x
250f0 2e 6e 5a 65 72 6f 20 3d 20 70 44 61 74 61 2d 3e  .nZero = pData->
25100 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73 65  u.nZero;.  }else
25110 7b 0a 20 20 20 20 78 2e 6e 5a 65 72 6f 20 3d 20  {.    x.nZero = 
25120 30 3b 0a 20 20 7d 0a 20 20 78 2e 70 4b 65 79 20  0;.  }.  x.pKey 
25130 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
25140 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70  te3BtreeInsert(p
25150 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26  C->uc.pCursor, &
25160 78 2c 0a 20 20 20 20 20 20 28 70 4f 70 2d 3e 70  x,.      (pOp->p
25170 35 20 26 20 28 4f 50 46 4c 41 47 5f 41 50 50 45  5 & (OPFLAG_APPE
25180 4e 44 7c 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f  ND|OPFLAG_SAVEPO
25190 53 49 54 49 4f 4e 29 29 2c 20 73 65 65 6b 52 65  SITION)), seekRe
251a0 73 75 6c 74 0a 20 20 29 3b 0a 20 20 70 43 2d 3e  sult.  );.  pC->
251b0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
251c0 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   0;.  pC->cacheS
251d0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
251e0 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  ALE;..  /* Invok
251f0 65 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f  e the update-hoo
25200 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  k if required. *
25210 2f 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  /.  if( rc ) got
25220 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
25230 72 72 6f 72 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rror;.  if( db->
25240 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  xUpdateCallback 
25250 26 26 20 6f 70 20 29 7b 0a 20 20 20 20 64 62 2d  && op ){.    db-
25260 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
25270 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c  (db->pUpdateArg,
25280 20 6f 70 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e   op, zDb, pTab->
25290 7a 4e 61 6d 65 2c 20 78 2e 6e 4b 65 79 29 3b 0a  zName, x.nKey);.
252a0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
252b0 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 6c 65 74  /* Opcode: Delet
252c0 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
252d0 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
252e0 65 20 72 65 63 6f 72 64 20 61 74 20 77 68 69 63  e record at whic
252f0 68 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20  h the P1 cursor 
25300 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
25310 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nting..**.** If 
25320 74 68 65 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  the OPFLAG_SAVEP
25330 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f 66 20 74  OSITION bit of t
25340 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
25350 69 73 20 73 65 74 2c 20 74 68 65 6e 0a 2a 2a 20  is set, then.** 
25360 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  the cursor will 
25370 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
25380 20 61 74 20 20 65 69 74 68 65 72 20 74 68 65 20   at  either the 
25390 6e 65 78 74 20 6f 72 20 74 68 65 20 70 72 65 76  next or the prev
253a0 69 6f 75 73 0a 2a 2a 20 72 65 63 6f 72 64 20 69  ious.** record i
253b0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  n the table. If 
253c0 69 74 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  it is left point
253d0 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78 74 20  ing at the next 
253e0 72 65 63 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a 20  record, then.** 
253f0 74 68 65 20 6e 65 78 74 20 4e 65 78 74 20 69 6e  the next Next in
25400 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
25410 65 20 61 20 6e 6f 2d 6f 70 2e 20 41 73 20 61 20  e a no-op. As a 
25420 72 65 73 75 6c 74 2c 20 69 6e 20 74 68 69 73 20  result, in this 
25430 63 61 73 65 0a 2a 2a 20 69 74 20 69 73 20 6f 6b  case.** it is ok
25440 20 74 6f 20 64 65 6c 65 74 65 20 61 20 72 65 63   to delete a rec
25450 6f 72 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ord from within 
25460 61 20 4e 65 78 74 20 6c 6f 6f 70 2e 20 49 66 20  a Next loop. If 
25470 0a 2a 2a 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  .** OPFLAG_SAVEP
25480 4f 53 49 54 49 4f 4e 20 62 69 74 20 6f 66 20 50  OSITION bit of P
25490 35 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e  5 is clear, then
254a0 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   the cursor will
254b0 20 62 65 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 61   be.** left in a
254c0 6e 20 75 6e 64 65 66 69 6e 65 64 20 73 74 61 74  n undefined stat
254d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
254e0 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45  OPFLAG_AUXDELETE
254f0 20 62 69 74 20 69 73 20 73 65 74 20 6f 6e 20 50   bit is set on P
25500 35 2c 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  5, that indicate
25510 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 64  s that this.** d
25520 65 6c 65 74 65 20 6f 6e 65 20 6f 66 20 73 65 76  elete one of sev
25530 65 72 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20  eral associated 
25540 77 69 74 68 20 64 65 6c 65 74 69 6e 67 20 61 20  with deleting a 
25550 74 61 62 6c 65 20 72 6f 77 20 61 6e 64 20 61 6c  table row and al
25560 6c 20 69 74 73 0a 2a 2a 20 61 73 73 6f 63 69 61  l its.** associa
25570 74 65 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  ted index entrie
25580 73 2e 20 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  s.  Exactly one 
25590 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 73  of those deletes
255a0 20 69 73 20 74 68 65 20 22 70 72 69 6d 61 72 79   is the "primary
255b0 22 0a 2a 2a 20 64 65 6c 65 74 65 2e 20 20 54 68  ".** delete.  Th
255c0 65 20 6f 74 68 65 72 73 20 61 72 65 20 61 6c 6c  e others are all
255d0 20 6f 6e 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45   on OPFLAG_FORDE
255e0 4c 45 54 45 20 63 75 72 73 6f 72 73 20 6f 72 20  LETE cursors or 
255f0 65 6c 73 65 20 61 72 65 0a 2a 2a 20 6d 61 72 6b  else are.** mark
25600 65 64 20 77 69 74 68 20 74 68 65 20 41 55 58 44  ed with the AUXD
25610 45 4c 45 54 45 20 66 6c 61 67 2e 0a 2a 2a 0a 2a  ELETE flag..**.*
25620 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f  * If the OPFLAG_
25630 4e 43 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20  NCHANGE flag of 
25640 50 32 20 28 4e 42 3a 20 50 32 20 6e 6f 74 20 50  P2 (NB: P2 not P
25650 35 29 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  5) is set, then 
25660 74 68 65 20 72 6f 77 0a 2a 2a 20 63 68 61 6e 67  the row.** chang
25670 65 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65  e count is incre
25680 6d 65 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73  mented (otherwis
25690 65 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31  e not)..**.** P1
256a0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 70 73 65   must not be pse
256b0 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49 74 20 68  udo-table.  It h
256c0 61 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20  as to be a real 
256d0 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 6d 75  table with.** mu
256e0 6c 74 69 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a  ltiple rows..**.
256f0 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  ** If P4 is not 
25700 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 70 6f 69  NULL then it poi
25710 6e 74 73 20 74 6f 20 61 20 54 61 62 6c 65 20 6f  nts to a Table o
25720 62 6a 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63  bject. In this c
25730 61 73 65 20 65 69 74 68 65 72 20 0a 2a 2a 20 74  ase either .** t
25740 68 65 20 75 70 64 61 74 65 20 6f 72 20 70 72 65  he update or pre
25750 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20 6f 72  -update hook, or
25760 20 62 6f 74 68 2c 20 6d 61 79 20 62 65 20 69 6e   both, may be in
25770 76 6f 6b 65 64 2e 20 54 68 65 20 50 31 20 63 75  voked. The P1 cu
25780 72 73 6f 72 20 6d 75 73 74 0a 2a 2a 20 68 61 76  rsor must.** hav
25790 65 20 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65  e been positione
257a0 64 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74 46 6f  d using OP_NotFo
257b0 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  und prior to inv
257c0 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64  oking this opcod
257d0 65 20 69 6e 20 0a 2a 2a 20 74 68 69 73 20 63 61  e in .** this ca
257e0 73 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  se. Specifically
257f0 2c 20 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e 66  , if one is conf
25800 69 67 75 72 65 64 2c 20 74 68 65 20 70 72 65 2d  igured, the pre-
25810 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 0a  update hook is .
25820 2a 2a 20 69 6e 76 6f 6b 65 64 20 69 66 20 50 34  ** invoked if P4
25830 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 54 68   is not NULL. Th
25840 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73  e update-hook is
25850 20 69 6e 76 6f 6b 65 64 20 69 66 20 6f 6e 65 20   invoked if one 
25860 69 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 0a  is configured, .
25870 2a 2a 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c  ** P4 is not NUL
25880 4c 2c 20 61 6e 64 20 74 68 65 20 4f 50 46 4c 41  L, and the OPFLA
25890 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20 69  G_NCHANGE flag i
258a0 73 20 73 65 74 20 69 6e 20 50 32 2e 0a 2a 2a 0a  s set in P2..**.
258b0 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
258c0 5f 49 53 55 50 44 41 54 45 20 66 6c 61 67 20 69  _ISUPDATE flag i
258d0 73 20 73 65 74 20 69 6e 20 50 32 2c 20 74 68 65  s set in P2, the
258e0 6e 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68  n P3 contains th
258f0 65 20 61 64 64 72 65 73 73 0a 2a 2a 20 6f 66 20  e address.** of 
25900 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
25910 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
25920 65 20 76 61 6c 75 65 20 74 68 61 74 20 74 68 65  e value that the
25930 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f   rowid of the ro
25940 77 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 65 74  w will.** be set
25950 20 74 6f 20 62 79 20 74 68 65 20 75 70 64 61 74   to by the updat
25960 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65  e..*/.case OP_De
25970 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62 65 43 75  lete: {.  VdbeCu
25980 72 73 6f 72 20 2a 70 43 3b 0a 20 20 63 6f 6e 73  rsor *pC;.  cons
25990 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 54  t char *zDb;.  T
259a0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
259b0 74 20 6f 70 66 6c 61 67 73 3b 0a 0a 20 20 6f 70  t opflags;..  op
259c0 66 6c 61 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  flags = pOp->p2;
259d0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
259e0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
259f0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
25a00 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
25a10 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
25a20 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
25a30 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
25a40 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
25a50 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
25a60 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
25a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25a80 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
25a90 3d 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  ==0 );..#ifdef S
25aa0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
25ab0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
25ac0 34 5f 54 41 42 4c 45 20 26 26 20 48 61 73 52 6f  4_TABLE && HasRo
25ad0 77 69 64 28 70 4f 70 2d 3e 70 34 2e 70 54 61 62  wid(pOp->p4.pTab
25ae0 29 20 26 26 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ) && pOp->p5==0 
25af0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 70 35 20  ){.    /* If p5 
25b00 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 65 65  is zero, the see
25b10 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
25b20 20 70 6f 73 69 74 69 6f 6e 65 64 20 74 68 65 20   positioned the 
25b30 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 0a  cursor prior to.
25b40 20 20 20 20 2a 2a 20 4f 50 5f 44 65 6c 65 74 65      ** OP_Delete
25b50 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 73 6f 20   will have also 
25b60 73 65 74 20 74 68 65 20 70 43 2d 3e 6d 6f 76 65  set the pC->move
25b70 74 6f 54 61 72 67 65 74 20 66 69 65 6c 64 20 74  toTarget field t
25b80 6f 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a 20  o the rowid of. 
25b90 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 74 68     ** the row th
25ba0 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
25bb0 74 65 64 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  ted */.    i64 i
25bc0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
25bd0 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d  eeIntegerKey(pC-
25be0 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
25bf0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6d 6f    assert( pC->mo
25c00 76 65 74 6f 54 61 72 67 65 74 3d 3d 69 4b 65 79  vetoTarget==iKey
25c10 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
25c20 20 20 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61    /* If the upda
25c30 74 65 2d 68 6f 6f 6b 20 6f 72 20 70 72 65 2d 75  te-hook or pre-u
25c40 70 64 61 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20  pdate-hook will 
25c50 62 65 20 69 6e 76 6f 6b 65 64 2c 20 73 65 74 20  be invoked, set 
25c60 7a 44 62 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  zDb to.  ** the 
25c70 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 62 20 74  name of the db t
25c80 6f 20 70 61 73 73 20 61 73 20 74 6f 20 69 74 2e  o pass as to it.
25c90 20 41 6c 73 6f 20 73 65 74 20 6c 6f 63 61 6c 20   Also set local 
25ca0 70 54 61 62 20 74 6f 20 61 20 63 6f 70 79 0a 20  pTab to a copy. 
25cb0 20 2a 2a 20 6f 66 20 70 34 2e 70 54 61 62 2e 20   ** of p4.pTab. 
25cc0 46 69 6e 61 6c 6c 79 2c 20 69 66 20 70 35 20 69  Finally, if p5 i
25cd0 73 20 74 72 75 65 2c 20 69 6e 64 69 63 61 74 69  s true, indicati
25ce0 6e 67 20 74 68 61 74 20 74 68 69 73 20 63 75 72  ng that this cur
25cf0 73 6f 72 20 77 61 73 0a 20 20 2a 2a 20 6c 61 73  sor was.  ** las
25d00 74 20 6d 6f 76 65 64 20 77 69 74 68 20 4f 50 5f  t moved with OP_
25d10 4e 65 78 74 20 6f 72 20 4f 50 5f 50 72 65 76 2c  Next or OP_Prev,
25d20 20 6e 6f 74 20 53 65 65 6b 20 6f 72 20 4e 6f 74   not Seek or Not
25d30 46 6f 75 6e 64 2c 20 73 65 74 20 0a 20 20 2a 2a  Found, set .  **
25d40 20 56 64 62 65 43 75 72 73 6f 72 2e 6d 6f 76 65   VdbeCursor.move
25d50 74 6f 54 61 72 67 65 74 20 74 6f 20 74 68 65 20  toTarget to the 
25d60 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 20  current rowid.  
25d70 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  */.  if( pOp->p4
25d80 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26  type==P4_TABLE &
25d90 26 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f  & HAS_UPDATE_HOO
25da0 4b 28 64 62 29 20 29 7b 0a 20 20 20 20 61 73 73  K(db) ){.    ass
25db0 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20  ert( pC->iDb>=0 
25dc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25dd0 4f 70 2d 3e 70 34 2e 70 54 61 62 21 3d 30 20 29  Op->p4.pTab!=0 )
25de0 3b 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e  ;.    zDb = db->
25df0 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62  aDb[pC->iDb].zDb
25e00 53 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61 62 20  SName;.    pTab 
25e10 3d 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a  = pOp->p4.pTab;.
25e20 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35      if( (pOp->p5
25e30 20 26 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f   & OPFLAG_SAVEPO
25e40 53 49 54 49 4f 4e 29 21 3d 30 20 26 26 20 70 43  SITION)!=0 && pC
25e50 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20  ->isTable ){.   
25e60 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72     pC->movetoTar
25e70 67 65 74 20 3d 20 73 71 6c 69 74 65 33 42 74 72  get = sqlite3Btr
25e80 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d  eeIntegerKey(pC-
25e90 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
25ea0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
25eb0 20 7a 44 62 20 3d 20 30 3b 20 20 20 2f 2a 20 4e   zDb = 0;   /* N
25ec0 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65  ot needed.  Sile
25ed0 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77  nce a compiler w
25ee0 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70  arning. */.    p
25ef0 54 61 62 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  Tab = 0;  /* Not
25f00 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63   needed.  Silenc
25f10 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  e a compiler war
25f20 6e 69 6e 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69  ning. */.  }..#i
25f30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
25f40 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
25f50 4b 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  K.  /* Invoke th
25f60 65 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f  e pre-update-hoo
25f70 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  k if required. *
25f80 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65  /.  if( db->xPre
25f90 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
25fa0 26 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 20 29  & pOp->p4.pTab )
25fb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28  {.    assert( !(
25fc0 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  opflags & OPFLAG
25fd0 5f 49 53 55 50 44 41 54 45 29 20 0a 20 20 20 20  _ISUPDATE) .    
25fe0 20 20 20 20 20 7c 7c 20 48 61 73 52 6f 77 69 64       || HasRowid
25ff0 28 70 54 61 62 29 3d 3d 30 20 0a 20 20 20 20 20  (pTab)==0 .     
26000 20 20 20 20 7c 7c 20 28 61 4d 65 6d 5b 70 4f 70      || (aMem[pOp
26010 2d 3e 70 33 5d 2e 66 6c 61 67 73 20 26 20 4d 45  ->p3].flags & ME
26020 4d 5f 49 6e 74 29 20 0a 20 20 20 20 29 3b 0a 20  M_Int) .    );. 
26030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
26040 65 55 70 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70  eUpdateHook(p, p
26050 43 2c 0a 20 20 20 20 20 20 20 20 28 6f 70 66 6c  C,.        (opfl
26060 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 49 53 55  ags & OPFLAG_ISU
26070 50 44 41 54 45 29 20 3f 20 53 51 4c 49 54 45 5f  PDATE) ? SQLITE_
26080 55 50 44 41 54 45 20 3a 20 53 51 4c 49 54 45 5f  UPDATE : SQLITE_
26090 44 45 4c 45 54 45 2c 20 0a 20 20 20 20 20 20 20  DELETE, .       
260a0 20 7a 44 62 2c 20 70 54 61 62 2c 20 70 43 2d 3e   zDb, pTab, pC->
260b0 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 0a 20 20  movetoTarget,.  
260c0 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 0a 20 20        pOp->p3.  
260d0 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f    );.  }.  if( o
260e0 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  pflags & OPFLAG_
260f0 49 53 4e 4f 4f 50 20 29 20 62 72 65 61 6b 3b 0a  ISNOOP ) break;.
26100 23 65 6e 64 69 66 0a 20 0a 20 20 2f 2a 20 4f 6e  #endif. .  /* On
26110 6c 79 20 66 6c 61 67 73 20 74 68 61 74 20 63 61  ly flags that ca
26120 6e 20 62 65 20 73 65 74 20 61 72 65 20 53 41 56  n be set are SAV
26130 45 50 4f 49 53 54 49 4f 4e 20 61 6e 64 20 41 55  EPOISTION and AU
26140 58 44 45 4c 45 54 45 20 2a 2f 20 0a 20 20 61 73  XDELETE */ .  as
26150 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26  sert( (pOp->p5 &
26160 20 7e 28 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f   ~(OPFLAG_SAVEPO
26170 53 49 54 49 4f 4e 7c 4f 50 46 4c 41 47 5f 41 55  SITION|OPFLAG_AU
26180 58 44 45 4c 45 54 45 29 29 3d 3d 30 20 29 3b 0a  XDELETE))==0 );.
26190 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47    assert( OPFLAG
261a0 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 3d 3d 42  _SAVEPOSITION==B
261b0 54 52 45 45 5f 53 41 56 45 50 4f 53 49 54 49 4f  TREE_SAVEPOSITIO
261c0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  N );.  assert( O
261d0 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 3d  PFLAG_AUXDELETE=
261e0 3d 42 54 52 45 45 5f 41 55 58 44 45 4c 45 54 45  =BTREE_AUXDELETE
261f0 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
26200 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
26210 2d 3e 70 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  ->pFrame==0 ){. 
26220 20 20 20 69 66 28 20 70 43 2d 3e 69 73 45 70 68     if( pC->isEph
26230 65 6d 65 72 61 6c 3d 3d 30 0a 20 20 20 20 20 20  emeral==0.      
26240 20 20 26 26 20 28 70 4f 70 2d 3e 70 35 20 26 20    && (pOp->p5 & 
26250 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45  OPFLAG_AUXDELETE
26260 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
26270 28 70 43 2d 3e 77 72 46 6c 61 67 20 26 20 4f 50  (pC->wrFlag & OP
26280 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3d  FLAG_FORDELETE)=
26290 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
262a0 20 20 6e 45 78 74 72 61 44 65 6c 65 74 65 2b 2b    nExtraDelete++
262b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
262c0 70 4f 70 2d 3e 70 32 20 26 20 4f 50 46 4c 41 47  pOp->p2 & OPFLAG
262d0 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20  _NCHANGE ){.    
262e0 20 20 6e 45 78 74 72 61 44 65 6c 65 74 65 2d 2d    nExtraDelete--
262f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
26300 69 66 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  if..  rc = sqlit
26310 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70 43  e3BtreeDelete(pC
26320 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 70 4f  ->uc.pCursor, pO
26330 70 2d 3e 70 35 29 3b 0a 20 20 70 43 2d 3e 63 61  p->p5);.  pC->ca
26340 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
26350 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 73  E_STALE;.  pC->s
26360 65 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20  eekResult = 0;. 
26370 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
26380 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
26390 72 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  r;..  /* Invoke 
263a0 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
263b0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
263c0 20 20 69 66 28 20 6f 70 66 6c 61 67 73 20 26 20    if( opflags & 
263d0 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29  OPFLAG_NCHANGE )
263e0 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65  {.    p->nChange
263f0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ++;.    if( db->
26400 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  xUpdateCallback 
26410 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
26420 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78  ) ){.      db->x
26430 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
26440 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c 20 53  b->pUpdateArg, S
26450 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 44  QLITE_DELETE, zD
26460 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  b, pTab->zName,.
26470 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 6d 6f            pC->mo
26480 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
26490 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
264a0 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  Db>=0 );.    }. 
264b0 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f   }..  break;.}./
264c0 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 43  * Opcode: ResetC
264d0 6f 75 6e 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a  ount * * * * *.*
264e0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  *.** The value o
264f0 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  f the change cou
26500 6e 74 65 72 20 69 73 20 63 6f 70 69 65 64 20 74  nter is copied t
26510 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
26520 61 6e 64 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20  andle.** change 
26530 63 6f 75 6e 74 65 72 20 28 72 65 74 75 72 6e 65  counter (returne
26540 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
26550 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
26560 5f 63 68 61 6e 67 65 73 28 29 29 2e 0a 2a 2a 20  _changes())..** 
26570 54 68 65 6e 20 74 68 65 20 56 4d 73 20 69 6e 74  Then the VMs int
26580 65 72 6e 61 6c 20 63 68 61 6e 67 65 20 63 6f 75  ernal change cou
26590 6e 74 65 72 20 72 65 73 65 74 73 20 74 6f 20 30  nter resets to 0
265a0 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  ..** This is use
265b0 64 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f  d by trigger pro
265c0 67 72 61 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  grams..*/.case O
265d0 50 5f 52 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a  P_ResetCount: {.
265e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
265f0 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
26600 43 68 61 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e 43  Change);.  p->nC
26610 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 62 72 65  hange = 0;.  bre
26620 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
26630 3a 20 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 20  : SorterCompare 
26640 50 31 20 50 32 20 50 33 20 50 34 0a 2a 2a 20 53  P1 P2 P3 P4.** S
26650 79 6e 6f 70 73 69 73 3a 20 69 66 20 6b 65 79 28  ynopsis: if key(
26660 50 31 29 21 3d 74 72 69 6d 28 72 5b 50 33 5d 2c  P1)!=trim(r[P3],
26670 50 34 29 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a  P4) goto P2.**.*
26680 2a 20 50 31 20 69 73 20 61 20 73 6f 72 74 65 72  * P1 is a sorter
26690 20 63 75 72 73 6f 72 2e 20 54 68 69 73 20 69 6e   cursor. This in
266a0 73 74 72 75 63 74 69 6f 6e 20 63 6f 6d 70 61 72  struction compar
266b0 65 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  es a prefix of t
266c0 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 62 6c 6f  he.** record blo
266d0 62 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  b in register P3
266e0 20 61 67 61 69 6e 73 74 20 61 20 70 72 65 66 69   against a prefi
266f0 78 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  x of the entry t
26700 68 61 74 20 0a 2a 2a 20 74 68 65 20 73 6f 72 74  hat .** the sort
26710 65 72 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  er cursor curren
26720 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
26730 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 50  Only the first P
26740 34 20 66 69 65 6c 64 73 0a 2a 2a 20 6f 66 20 72  4 fields.** of r
26750 5b 50 33 5d 20 61 6e 64 20 74 68 65 20 73 6f 72  [P3] and the sor
26760 74 65 72 20 72 65 63 6f 72 64 20 61 72 65 20 63  ter record are c
26770 6f 6d 70 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ompared..**.** I
26780 66 20 65 69 74 68 65 72 20 50 33 20 6f 72 20 74  f either P3 or t
26790 68 65 20 73 6f 72 74 65 72 20 63 6f 6e 74 61 69  he sorter contai
267a0 6e 73 20 61 20 4e 55 4c 4c 20 69 6e 20 6f 6e 65  ns a NULL in one
267b0 20 6f 66 20 74 68 65 69 72 20 73 69 67 6e 69 66   of their signif
267c0 69 63 61 6e 74 0a 2a 2a 20 66 69 65 6c 64 73 20  icant.** fields 
267d0 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
267e0 65 20 50 34 20 66 69 65 6c 64 73 20 61 74 20 74  e P4 fields at t
267f0 68 65 20 65 6e 64 20 77 68 69 63 68 20 61 72 65  he end which are
26800 20 69 67 6e 6f 72 65 64 29 20 74 68 65 6e 0a 2a   ignored) then.*
26810 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
26820 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62   is assumed to b
26830 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 46  e equal..**.** F
26840 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 6e  all through to n
26850 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
26860 69 66 20 74 68 65 20 74 77 6f 20 72 65 63 6f 72  if the two recor
26870 64 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  ds compare equal
26880 20 74 6f 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65   to.** each othe
26890 72 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  r.  Jump to P2 i
268a0 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65  f they are diffe
268b0 72 65 6e 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  rent..*/.case OP
268c0 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 3a 20  _SorterCompare: 
268d0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
268e0 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  pC;.  int res;. 
268f0 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 0a 0a 20   int nKeyCol;.. 
26900 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
26910 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
26920 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20  t( isSorter(pC) 
26930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
26940 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
26950 33 32 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26  32 );.  pIn3 = &
26960 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
26970 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 4f 70 2d 3e   nKeyCol = pOp->
26980 70 34 2e 69 3b 0a 20 20 72 65 73 20 3d 20 30 3b  p4.i;.  res = 0;
26990 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
269a0 64 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  dbeSorterCompare
269b0 28 70 43 2c 20 70 49 6e 33 2c 20 6e 4b 65 79 43  (pC, pIn3, nKeyC
269c0 6f 6c 2c 20 26 72 65 73 29 3b 0a 20 20 56 64 62  ol, &res);.  Vdb
269d0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
269e0 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 63  !=0,2);.  if( rc
269f0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
26a00 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
26a10 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d  ( res ) goto jum
26a20 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b  p_to_p2;.  break
26a30 3b 0a 7d 3b 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.};../* Opcode:
26a40 20 53 6f 72 74 65 72 44 61 74 61 20 50 31 20 50   SorterData P1 P
26a50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
26a60 70 73 69 73 3a 20 72 5b 50 32 5d 3d 64 61 74 61  psis: r[P2]=data
26a70 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
26a80 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74 68  o register P2 th
26a90 65 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65 72  e current sorter
26aa0 20 64 61 74 61 20 66 6f 72 20 73 6f 72 74 65 72   data for sorter
26ab0 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54   cursor P1..** T
26ac0 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 63 6f  hen clear the co
26ad0 6c 75 6d 6e 20 68 65 61 64 65 72 20 63 61 63 68  lumn header cach
26ae0 65 20 6f 6e 20 63 75 72 73 6f 72 20 50 33 2e 0a  e on cursor P3..
26af0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
26b00 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 75 73  e is normally us
26b10 65 20 74 6f 20 6d 6f 76 65 20 61 20 72 65 63 6f  e to move a reco
26b20 72 64 20 6f 75 74 20 6f 66 20 74 68 65 20 73 6f  rd out of the so
26b30 72 74 65 72 20 61 6e 64 20 69 6e 74 6f 0a 2a 2a  rter and into.**
26b40 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
26b50 20 69 73 20 74 68 65 20 73 6f 75 72 63 65 20 66   is the source f
26b60 6f 72 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c  or a pseudo-tabl
26b70 65 20 63 75 72 73 6f 72 20 63 72 65 61 74 65 64  e cursor created
26b80 20 75 73 69 6e 67 0a 2a 2a 20 4f 70 65 6e 50 73   using.** OpenPs
26b90 65 75 64 6f 2e 20 20 54 68 61 74 20 70 73 65 75  eudo.  That pseu
26ba0 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 20  do-table cursor 
26bb0 69 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  is the one that 
26bc0 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
26bd0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 50 33  .** parameter P3
26be0 2e 20 20 43 6c 65 61 72 69 6e 67 20 74 68 65 20  .  Clearing the 
26bf0 50 33 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  P3 column cache 
26c00 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
26c10 6f 70 63 6f 64 65 20 73 61 76 65 73 0a 2a 2a 20  opcode saves.** 
26c20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74  us from having t
26c30 6f 20 69 73 73 75 65 20 61 20 73 65 70 61 72 61  o issue a separa
26c40 74 65 20 4e 75 6c 6c 52 6f 77 20 69 6e 73 74 72  te NullRow instr
26c50 75 63 74 69 6f 6e 20 74 6f 20 63 6c 65 61 72 20  uction to clear 
26c60 74 68 61 74 20 63 61 63 68 65 2e 0a 2a 2f 0a 63  that cache..*/.c
26c70 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  ase OP_SorterDat
26c80 61 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  a: {.  VdbeCurso
26c90 72 20 2a 70 43 3b 0a 0a 20 20 70 4f 75 74 20 3d  r *pC;..  pOut =
26ca0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
26cb0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
26cc0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
26cd0 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43  ert( isSorter(pC
26ce0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
26cf0 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 6f 77  te3VdbeSorterRow
26d00 6b 65 79 28 70 43 2c 20 70 4f 75 74 29 3b 0a 20  key(pC, pOut);. 
26d10 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
26d20 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 4f 75 74 2d  ITE_OK || (pOut-
26d30 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
26d40 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
26d50 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
26d60 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
26d70 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   );.  if( rc ) g
26d80 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
26d90 5f 65 72 72 6f 72 3b 0a 20 20 70 2d 3e 61 70 43  _error;.  p->apC
26da0 73 72 5b 70 4f 70 2d 3e 70 33 5d 2d 3e 63 61 63  sr[pOp->p3]->cac
26db0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
26dc0 5f 53 54 41 4c 45 3b 0a 20 20 62 72 65 61 6b 3b  _STALE;.  break;
26dd0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
26de0 6f 77 44 61 74 61 20 50 31 20 50 32 20 50 33 20  owData P1 P2 P3 
26df0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
26e00 20 72 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a   r[P2]=data.**.*
26e10 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67  * Write into reg
26e20 69 73 74 65 72 20 50 32 20 74 68 65 20 63 6f 6d  ister P2 the com
26e30 70 6c 65 74 65 20 72 6f 77 20 63 6f 6e 74 65 6e  plete row conten
26e40 74 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74  t for the row at
26e50 20 0a 2a 2a 20 77 68 69 63 68 20 63 75 72 73 6f   .** which curso
26e60 72 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  r P1 is currentl
26e70 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 20 54  y pointing..** T
26e80 68 65 72 65 20 69 73 20 6e 6f 20 69 6e 74 65 72  here is no inter
26e90 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  pretation of the
26ea0 20 64 61 74 61 2e 20 20 0a 2a 2a 20 49 74 20 69   data.  .** It i
26eb0 73 20 6a 75 73 74 20 63 6f 70 69 65 64 20 6f 6e  s just copied on
26ec0 74 6f 20 74 68 65 20 50 32 20 72 65 67 69 73 74  to the P2 regist
26ed0 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 0a 2a  er exactly as .*
26ee0 2a 20 69 74 20 69 73 20 66 6f 75 6e 64 20 69 6e  * it is found in
26ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26f00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72  le..**.** If cur
26f10 73 6f 72 20 50 31 20 69 73 20 61 6e 20 69 6e 64  sor P1 is an ind
26f20 65 78 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ex, then the con
26f30 74 65 6e 74 20 69 73 20 74 68 65 20 6b 65 79 20  tent is the key 
26f40 6f 66 20 74 68 65 20 72 6f 77 2e 0a 2a 2a 20 49  of the row..** I
26f50 66 20 63 75 72 73 6f 72 20 50 32 20 69 73 20 61  f cursor P2 is a
26f60 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
26f70 20 63 6f 6e 74 65 6e 74 20 65 78 74 72 61 63 74   content extract
26f80 65 64 20 69 73 20 74 68 65 20 64 61 74 61 2e 0a  ed is the data..
26f90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
26fa0 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70  cursor must be p
26fb0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
26fc0 69 64 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55  id row (not a NU
26fd0 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20  LL row).** of a 
26fe0 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
26ff0 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  a pseudo-table..
27000 2a 2a 0a 2a 2a 20 49 66 20 50 33 21 3d 30 20 74  **.** If P3!=0 t
27010 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20  hen this opcode 
27020 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61  is allowed to ma
27030 6b 65 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c  ke an ephermeral
27040 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 6e 74 6f   pointer.** into
27050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
27060 67 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  ge.  That means 
27070 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
27080 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a   of the output.*
27090 2a 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  * register will 
270a0 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  be invalidated a
270b0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 63 75  s soon as the cu
270c0 72 73 6f 72 20 6d 6f 76 65 73 20 2d 20 69 6e 63  rsor moves - inc
270d0 6c 75 64 69 6e 67 0a 2a 2a 20 6d 6f 76 65 73 20  luding.** moves 
270e0 63 61 75 73 65 64 20 62 79 20 6f 74 68 65 72 20  caused by other 
270f0 63 75 72 73 6f 72 73 20 74 68 61 74 20 22 73 61  cursors that "sa
27100 76 65 22 20 74 68 65 20 74 68 65 20 63 75 72 72  ve" the the curr
27110 65 6e 74 20 63 75 72 73 6f 72 73 0a 2a 2a 20 70  ent cursors.** p
27120 6f 73 69 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72  osition in order
27130 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 77   that they can w
27140 72 69 74 65 20 74 6f 20 74 68 65 20 73 61 6d 65  rite to the same
27150 20 74 61 62 6c 65 2e 20 20 49 66 20 50 33 3d 3d   table.  If P3==
27160 30 0a 2a 2a 20 74 68 65 6e 20 61 20 63 6f 70 79  0.** then a copy
27170 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
27180 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
27190 2e 20 20 50 33 21 3d 30 20 69 73 20 66 61 73 74  .  P3!=0 is fast
271a0 65 72 2c 20 62 75 74 0a 2a 2a 20 50 33 3d 3d 30  er, but.** P3==0
271b0 20 69 73 20 73 61 66 65 72 2e 0a 2a 2a 0a 2a 2a   is safer..**.**
271c0 20 49 66 20 50 33 21 3d 30 20 74 68 65 6e 20 74   If P3!=0 then t
271d0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
271e0 65 20 50 32 20 72 65 67 69 73 74 65 72 20 69 73  e P2 register is
271f0 20 75 6e 73 75 69 74 61 62 6c 65 20 66 6f 72 20   unsuitable for 
27200 75 73 65 0a 2a 2a 20 69 6e 20 4f 50 5f 52 65 73  use.** in OP_Res
27210 75 6c 74 20 61 6e 64 20 61 6e 79 20 4f 50 5f 52  ult and any OP_R
27220 65 73 75 6c 74 20 77 69 6c 6c 20 69 6e 76 61 6c  esult will inval
27230 69 64 61 74 65 20 74 68 65 20 50 32 20 72 65 67  idate the P2 reg
27240 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ister content..*
27250 2a 20 54 68 65 20 50 32 20 72 65 67 69 73 74 65  * The P2 registe
27260 72 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 76  r content is inv
27270 61 6c 69 64 61 74 65 64 20 62 79 20 6f 70 63 6f  alidated by opco
27280 64 65 73 20 6c 69 6b 65 20 4f 50 5f 46 75 6e 63  des like OP_Func
27290 74 69 6f 6e 20 6f 72 0a 2a 2a 20 62 79 20 61 6e  tion or.** by an
272a0 79 20 75 73 65 20 6f 66 20 61 6e 6f 74 68 65 72  y use of another
272b0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
272c0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
272d0 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  le..*/.case OP_R
272e0 6f 77 44 61 74 61 3a 20 7b 0a 20 20 56 64 62 65  owData: {.  Vdbe
272f0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
27300 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
27310 20 75 33 32 20 6e 3b 0a 0a 20 20 70 4f 75 74 20   u32 n;..  pOut 
27320 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
27330 28 70 2c 20 70 4f 70 29 3b 0a 0a 20 20 61 73 73  (p, pOp);..  ass
27340 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
27350 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
27360 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
27370 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
27380 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
27390 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
273a0 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
273b0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
273c0 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65   assert( isSorte
273d0 72 28 70 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73  r(pC)==0 );.  as
273e0 73 65 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f  sert( pC->nullRo
273f0 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
27400 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
27410 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  !=0 );.  pCrsr =
27420 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
27430 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f 52 6f  ..  /* The OP_Ro
27440 77 44 61 74 61 20 6f 70 63 6f 64 65 73 20 61 6c  wData opcodes al
27450 77 61 79 73 20 66 6f 6c 6c 6f 77 20 4f 50 5f 4e  ways follow OP_N
27460 6f 74 45 78 69 73 74 73 20 6f 72 0a 20 20 2a 2a  otExists or.  **
27470 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20 6f 72   OP_SeekRowid or
27480 20 4f 50 5f 52 65 77 69 6e 64 2f 4f 70 5f 4e 65   OP_Rewind/Op_Ne
27490 78 74 20 77 69 74 68 20 6e 6f 20 69 6e 74 65 72  xt with no inter
274a0 76 65 6e 69 6e 67 20 69 6e 73 74 72 75 63 74 69  vening instructi
274b0 6f 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 69  ons.  ** that mi
274c0 67 68 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74  ght invalidate t
274d0 68 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2a 20  he cursor..  ** 
274e0 49 66 20 74 68 69 73 20 77 68 65 72 65 20 6e 6f  If this where no
274f0 74 20 74 68 65 20 63 61 73 65 2c 20 6f 6e 20 6f  t the case, on o
27500 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
27510 61 73 73 65 72 74 28 29 73 0a 20 20 2a 2a 20 77  assert()s.  ** w
27520 6f 75 6c 64 20 66 61 69 6c 2e 20 20 53 68 6f 75  ould fail.  Shou
27530 6c 64 20 74 68 69 73 20 65 76 65 72 20 63 68 61  ld this ever cha
27540 6e 67 65 20 28 62 65 63 61 75 73 65 20 6f 66 20  nge (because of 
27550 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63  changes in the c
27560 6f 64 65 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74  ode.  ** generat
27570 6f 72 29 20 74 68 65 6e 20 74 68 65 20 66 69 78  or) then the fix
27580 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 69 6e 73   would be to ins
27590 65 72 74 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20  ert a call to.  
275a0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  ** sqlite3VdbeCu
275b0 72 73 6f 72 4d 6f 76 65 74 6f 28 29 2e 0a 20 20  rsorMoveto()..  
275c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  */.  assert( pC-
275d0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
275e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
275f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
27600 6f 72 49 73 56 61 6c 69 64 28 70 43 72 73 72 29  orIsValid(pCrsr)
27610 20 29 3b 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f   );.#if 0  /* No
27620 74 20 72 65 71 75 69 72 65 64 20 64 75 65 20 74  t required due t
27630 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  o the previous t
27640 6f 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  o assert() state
27650 6d 65 6e 74 73 20 2a 2f 0a 20 20 72 63 20 3d 20  ments */.  rc = 
27660 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
27670 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69  rMoveto(pC);.  i
27680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27690 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
276a0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64  e_to_error;.#end
276b0 69 66 0a 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  if..  n = sqlite
276c0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
276d0 65 28 70 43 72 73 72 29 3b 0a 20 20 69 66 28 20  e(pCrsr);.  if( 
276e0 6e 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69  n>(u32)db->aLimi
276f0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
27700 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f  ENGTH] ){.    go
27710 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
27720 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 30    testcase( n==0
27730 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
27740 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
27750 65 65 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20  ee(pCrsr, 0, n, 
27760 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 72 63 20  pOut);.  if( rc 
27770 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
27780 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  _to_error;.  if(
27790 20 21 70 4f 70 2d 3e 70 33 20 29 20 44 65 65 70   !pOp->p3 ) Deep
277a0 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29  hemeralize(pOut)
277b0 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
277c0 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
277d0 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
277e0 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a  pOp->p2, pOut);.
277f0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
27800 70 63 6f 64 65 3a 20 52 6f 77 69 64 20 50 31 20  pcode: Rowid P1 
27810 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
27820 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69  psis: r[P2]=rowi
27830 64 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69 6e  d.**.** Store in
27840 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 20   register P2 an 
27850 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
27860 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
27870 74 61 62 6c 65 20 65 6e 74 72 79 20 74 68 61 74  table entry that
27880 0a 2a 2a 20 50 31 20 69 73 20 63 75 72 72 65 6e  .** P1 is curren
27890 74 6c 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a 2a  tly point to..**
278a0 0a 2a 2a 20 50 31 20 63 61 6e 20 62 65 20 65 69  .** P1 can be ei
278b0 74 68 65 72 20 61 6e 20 6f 72 64 69 6e 61 72 79  ther an ordinary
278c0 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74   table or a virt
278d0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 72  ual table.  Ther
278e0 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65 20  e used to.** be 
278f0 61 20 73 65 70 61 72 61 74 65 20 4f 50 5f 56 52  a separate OP_VR
27900 6f 77 69 64 20 6f 70 63 6f 64 65 20 66 6f 72 20  owid opcode for 
27910 75 73 65 20 77 69 74 68 20 76 69 72 74 75 61 6c  use with virtual
27920 20 74 61 62 6c 65 73 2c 20 62 75 74 20 74 68 69   tables, but thi
27930 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63 6f 64 65 20  s.** one opcode 
27940 6e 6f 77 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f  now works for bo
27950 74 68 20 74 61 62 6c 65 20 74 79 70 65 73 2e 0a  th table types..
27960 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 69 64  */.case OP_Rowid
27970 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
27980 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
27990 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
279a0 0a 20 20 69 36 34 20 76 3b 0a 20 20 73 71 6c 69  .  i64 v;.  sqli
279b0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
279c0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
279d0 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
279e0 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  ;..  pOut = out2
279f0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
27a00 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p);.  assert( pO
27a10 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
27a20 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
27a30 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
27a40 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
27a50 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
27a60 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
27a70 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50  rType!=CURTYPE_P
27a80 53 45 55 44 4f 20 7c 7c 20 70 43 2d 3e 6e 75 6c  SEUDO || pC->nul
27a90 6c 52 6f 77 20 29 3b 0a 20 20 69 66 28 20 70 43  lRow );.  if( pC
27aa0 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  ->nullRow ){.   
27ab0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
27ac0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 62 72 65  EM_Null;.    bre
27ad0 61 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ak;.  }else if( 
27ae0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
27af0 74 6f 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 43  to ){.    v = pC
27b00 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a  ->movetoTarget;.
27b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27b20 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
27b30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d  .  }else if( pC-
27b40 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
27b50 50 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 61  PE_VTAB ){.    a
27b60 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 56  ssert( pC->uc.pV
27b70 43 75 72 21 3d 30 20 29 3b 0a 20 20 20 20 70 56  Cur!=0 );.    pV
27b80 74 61 62 20 3d 20 70 43 2d 3e 75 63 2e 70 56 43  tab = pC->uc.pVC
27b90 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 70  ur->pVtab;.    p
27ba0 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
27bb0 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73  pModule;.    ass
27bc0 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  ert( pModule->xR
27bd0 6f 77 69 64 20 29 3b 0a 20 20 20 20 72 63 20 3d  owid );.    rc =
27be0 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64   pModule->xRowid
27bf0 28 70 43 2d 3e 75 63 2e 70 56 43 75 72 2c 20 26  (pC->uc.pVCur, &
27c00 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
27c10 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
27c20 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69  p, pVtab);.    i
27c30 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
27c40 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
27c50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
27c60 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
27c70 42 4c 45 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  BLE */.  }else{.
27c80 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
27c90 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
27ca0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 61  E_BTREE );.    a
27cb0 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
27cc0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
27cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
27ce0 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 43  CursorRestore(pC
27cf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27d00 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
27d10 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  o_error;.    if(
27d20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a   pC->nullRow ){.
27d30 20 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67        pOut->flag
27d40 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
27d50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27d60 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
27d70 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
27d80 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  pC->uc.pCursor);
27d90 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
27da0 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = v;.  break;.}
27db0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c  ../* Opcode: Nul
27dc0 6c 52 6f 77 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  lRow P1 * * * *.
27dd0 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  **.** Move the c
27de0 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20 6e 75  ursor P1 to a nu
27df0 6c 6c 20 72 6f 77 2e 20 20 41 6e 79 20 4f 50 5f  ll row.  Any OP_
27e00 43 6f 6c 75 6d 6e 20 6f 70 65 72 61 74 69 6f 6e  Column operation
27e10 73 0a 2a 2a 20 74 68 61 74 20 6f 63 63 75 72 20  s.** that occur 
27e20 77 68 69 6c 65 20 74 68 65 20 63 75 72 73 6f 72  while the cursor
27e30 20 69 73 20 6f 6e 20 74 68 65 20 6e 75 6c 6c 20   is on the null 
27e40 72 6f 77 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a  row will always.
27e50 2a 2a 20 77 72 69 74 65 20 61 20 4e 55 4c 4c 2e  ** write a NULL.
27e60 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c  .*/.case OP_Null
27e70 52 6f 77 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  Row: {.  VdbeCur
27e80 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65  sor *pC;..  asse
27e90 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
27ea0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
27eb0 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
27ec0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
27ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
27ee0 30 20 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  0 );.  pC->nullR
27ef0 6f 77 20 3d 20 31 3b 0a 20 20 70 43 2d 3e 63 61  ow = 1;.  pC->ca
27f00 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
27f10 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 70  E_STALE;.  if( p
27f20 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
27f30 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20  TYPE_BTREE ){.  
27f40 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63    assert( pC->uc
27f50 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
27f60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
27f70 6c 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 75  learCursor(pC->u
27f80 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  c.pCursor);.  }.
27f90 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
27fa0 70 63 6f 64 65 3a 20 4c 61 73 74 20 50 31 20 50  pcode: Last P1 P
27fb0 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
27fc0 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74  he next use of t
27fd0 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75  he Rowid or Colu
27fe0 6d 6e 20 6f 72 20 50 72 65 76 20 69 6e 73 74 72  mn or Prev instr
27ff0 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a  uction for P1 .*
28000 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20  * will refer to 
28010 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
28020 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
28030 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  able or index..*
28040 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f  * If the table o
28050 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79  r index is empty
28060 20 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20   and P2>0, then 
28070 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
28080 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32   to P2..** If P2
28090 20 69 73 20 30 20 6f 72 20 69 66 20 74 68 65 20   is 0 or if the 
280a0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
280b0 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c  s not empty, fal
280c0 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20  l through.** to 
280d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  the following in
280e0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
280f0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61   This opcode lea
28100 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63  ves the cursor c
28110 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76  onfigured to mov
28120 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  e in reverse ord
28130 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  er,.** from the 
28140 65 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20 62  end toward the b
28150 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74  eginning.  In ot
28160 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
28170 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66  ursor is.** conf
28180 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 50 72  igured to use Pr
28190 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a  ev, not Next..**
281a0 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 2d 31 2c  .** If P3 is -1,
281b0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
281c0 20 69 73 20 70 6f 73 69 74 69 6f 6e 65 64 20 61   is positioned a
281d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
281e0 20 62 74 72 65 65 0a 2a 2a 20 66 6f 72 20 74 68   btree.** for th
281f0 65 20 70 75 72 70 6f 73 65 20 6f 66 20 61 70 70  e purpose of app
28200 65 6e 64 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  ending a new ent
28210 72 79 20 6f 6e 74 6f 20 74 68 65 20 62 74 72 65  ry onto the btre
28220 65 2e 20 20 49 6e 20 74 68 61 74 0a 2a 2a 20 63  e.  In that.** c
28230 61 73 65 20 50 32 20 6d 75 73 74 20 62 65 20 30  ase P2 must be 0
28240 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
28250 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
28260 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f   is used only fo
28270 72 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 61  r.** appending a
28280 6e 64 20 73 6f 20 69 66 20 74 68 65 20 63 75 72  nd so if the cur
28290 73 6f 72 20 69 73 20 76 61 6c 69 64 2c 20 74 68  sor is valid, th
282a0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6d 75  en the cursor mu
282b0 73 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  st already.** be
282c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
282d0 20 65 6e 64 20 6f 66 20 74 68 65 20 62 74 72 65   end of the btre
282e0 65 20 61 6e 64 20 73 6f 20 6e 6f 20 63 68 61 6e  e and so no chan
282f0 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 0a  ges are made to.
28300 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  ** the cursor..*
28310 2f 0a 63 61 73 65 20 4f 50 5f 4c 61 73 74 3a 20  /.case OP_Last: 
28320 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
28330 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
28340 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
28350 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
28360 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
28370 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
28380 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
28390 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
283a0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
283b0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
283c0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
283d0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
283e0 42 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72  BTREE );.  pCrsr
283f0 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
28400 72 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20  r;.  res = 0;.  
28410 61 73 73 65 72 74 28 20 70 43 72 73 72 21 3d 30  assert( pCrsr!=0
28420 20 29 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65   );.  pC->seekRe
28430 73 75 6c 74 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  sult = pOp->p3;.
28440 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28450 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70  BUG.  pC->seekOp
28460 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 23 65 6e 64   = OP_Last;.#end
28470 69 66 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  if.  if( pOp->p3
28480 3d 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  ==0 || !sqlite3B
28490 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
284a0 64 4e 4e 28 70 43 72 73 72 29 20 29 7b 0a 20 20  dNN(pCrsr) ){.  
284b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
284c0 72 65 65 4c 61 73 74 28 70 43 72 73 72 2c 20 26  reeLast(pCrsr, &
284d0 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 6e 75  res);.    pC->nu
284e0 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b  llRow = (u8)res;
284f0 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
28500 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
28510 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
28520 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
28530 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
28540 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
28550 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 4f  rror;.    if( pO
28560 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20  p->p2>0 ){.     
28570 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
28580 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20  (res!=0,2);.    
28590 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f    if( res ) goto
285a0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
285b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
285c0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d  assert( pOp->p2=
285d0 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  =0 );.  }.  brea
285e0 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
285f0 3a 20 53 6f 72 74 65 72 53 6f 72 74 20 50 31 20  : SorterSort P1 
28600 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  P2 * * *.**.** A
28610 66 74 65 72 20 61 6c 6c 20 72 65 63 6f 72 64 73  fter all records
28620 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
28630 74 65 64 20 69 6e 74 6f 20 74 68 65 20 53 6f 72  ted into the Sor
28640 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 69 64  ter object.** id
28650 65 6e 74 69 66 69 65 64 20 62 79 20 50 31 2c 20  entified by P1, 
28660 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f  invoke this opco
28670 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 64  de to actually d
28680 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 0a 2a  o the sorting..*
28690 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
286a0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
286b0 6f 72 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  ords to be sorte
286c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  d..**.** This op
286d0 63 6f 64 65 20 69 73 20 61 6e 20 61 6c 69 61 73  code is an alias
286e0 20 66 6f 72 20 4f 50 5f 53 6f 72 74 20 61 6e 64   for OP_Sort and
286f0 20 4f 50 5f 52 65 77 69 6e 64 20 74 68 61 74 20   OP_Rewind that 
28700 69 73 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 53  is used.** for S
28710 6f 72 74 65 72 20 6f 62 6a 65 63 74 73 2e 0a 2a  orter objects..*
28720 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  /./* Opcode: Sor
28730 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
28740 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
28750 64 6f 65 73 20 65 78 61 63 74 6c 79 20 74 68 65  does exactly the
28760 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 4f   same thing as O
28770 50 5f 52 65 77 69 6e 64 20 65 78 63 65 70 74 20  P_Rewind except 
28780 74 68 61 74 0a 2a 2a 20 69 74 20 69 6e 63 72 65  that.** it incre
28790 6d 65 6e 74 73 20 61 6e 20 75 6e 64 6f 63 75 6d  ments an undocum
287a0 65 6e 74 65 64 20 67 6c 6f 62 61 6c 20 76 61 72  ented global var
287b0 69 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 74  iable used for t
287c0 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f  esting..**.** So
287d0 72 74 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  rting is accompl
287e0 69 73 68 65 64 20 62 79 20 77 72 69 74 69 6e 67  ished by writing
287f0 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 20   records into a 
28800 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 0a 2a  sorting index,.*
28810 2a 20 74 68 65 6e 20 72 65 77 69 6e 64 69 6e 67  * then rewinding
28820 20 74 68 61 74 20 69 6e 64 65 78 20 61 6e 64 20   that index and 
28830 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 20  playing it back 
28840 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74  from beginning t
28850 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57 65 20 75 73  o.** end.  We us
28860 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f 70  e the OP_Sort op
28870 63 6f 64 65 20 69 6e 73 74 65 61 64 20 6f 66 20  code instead of 
28880 4f 50 5f 52 65 77 69 6e 64 20 74 6f 20 64 6f 20  OP_Rewind to do 
28890 74 68 65 0a 2a 2a 20 72 65 77 69 6e 64 69 6e 67  the.** rewinding
288a0 20 73 6f 20 74 68 61 74 20 74 68 65 20 67 6c 6f   so that the glo
288b0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 77 69 6c  bal variable wil
288c0 6c 20 62 65 20 69 6e 63 72 65 6d 65 6e 74 65 64  l be incremented
288d0 20 61 6e 64 0a 2a 2a 20 72 65 67 72 65 73 73 69   and.** regressi
288e0 6f 6e 20 74 65 73 74 73 20 63 61 6e 20 64 65 74  on tests can det
288f0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
28900 72 20 6e 6f 74 20 74 68 65 20 6f 70 74 69 6d 69  r not the optimi
28910 7a 65 72 20 69 73 0a 2a 2a 20 63 6f 72 72 65 63  zer is.** correc
28920 74 6c 79 20 6f 70 74 69 6d 69 7a 69 6e 67 20 6f  tly optimizing o
28930 75 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a 63 61 73  ut sorts..*/.cas
28940 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 3a  e OP_SorterSort:
28950 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
28960 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20 7b 20 20  ase OP_Sort: {  
28970 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
28980 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
28990 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f  EST.  sqlite3_so
289a0 72 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  rt_count++;.  sq
289b0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
289c0 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt--;.#endif.  p
289d0 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54  ->aCounter[SQLIT
289e0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
289f0 54 5d 2b 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20  T]++;.  /* Fall 
28a00 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f  through into OP_
28a10 52 65 77 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f  Rewind */.}./* O
28a20 70 63 6f 64 65 3a 20 52 65 77 69 6e 64 20 50 31  pcode: Rewind P1
28a30 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
28a40 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20  The next use of 
28a50 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c  the Rowid or Col
28a60 75 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73 74  umn or Next inst
28a70 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a  ruction for P1 .
28a80 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f  ** will refer to
28a90 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
28aa0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28ab0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e   table or index.
28ac0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
28ad0 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70   or index is emp
28ae0 74 79 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ty, jump immedia
28af0 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49  tely to P2..** I
28b00 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
28b10 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70 74  ndex is not empt
28b20 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  y, fall through 
28b30 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
28b40 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e   .** instruction
28b50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
28b60 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
28b70 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64  ursor configured
28b80 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77   to move in forw
28b90 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72  ard order,.** fr
28ba0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
28bb0 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e   toward the end.
28bc0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
28bd0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a  , the cursor is.
28be0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  ** configured to
28bf0 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50   use Next, not P
28c00 72 65 76 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  rev..*/.case OP_
28c10 52 65 77 69 6e 64 3a 20 7b 20 20 20 20 20 20 20  Rewind: {       
28c20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64   /* jump */.  Vd
28c30 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
28c40 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
28c50 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
28c60 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
28c70 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
28c80 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
28c90 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
28ca0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
28cb0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
28cc0 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d  ( isSorter(pC)==
28cd0 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  (pOp->opcode==OP
28ce0 5f 53 6f 72 74 65 72 53 6f 72 74 29 20 29 3b 0a  _SorterSort) );.
28cf0 20 20 72 65 73 20 3d 20 31 3b 0a 23 69 66 64 65    res = 1;.#ifde
28d00 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
28d10 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f 50   pC->seekOp = OP
28d20 5f 52 65 77 69 6e 64 3b 0a 23 65 6e 64 69 66 0a  _Rewind;.#endif.
28d30 20 20 69 66 28 20 69 73 53 6f 72 74 65 72 28 70    if( isSorter(p
28d40 43 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  C) ){.    rc = s
28d50 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
28d60 52 65 77 69 6e 64 28 70 43 2c 20 26 72 65 73 29  Rewind(pC, &res)
28d70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
28d80 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
28d90 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
28da0 45 45 20 29 3b 0a 20 20 20 20 70 43 72 73 72 20  EE );.    pCrsr 
28db0 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
28dc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
28dd0 72 73 72 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  rsr );.    rc = 
28de0 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
28df0 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a  t(pCrsr, &res);.
28e00 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64      pC->deferred
28e10 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
28e20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
28e30 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
28e40 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
28e50 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
28e60 65 72 72 6f 72 3b 0a 20 20 70 43 2d 3e 6e 75 6c  error;.  pC->nul
28e70 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a  lRow = (u8)res;.
28e80 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
28e90 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 70  2>0 && pOp->p2<p
28ea0 2d 3e 6e 4f 70 20 29 3b 0a 20 20 56 64 62 65 42  ->nOp );.  VdbeB
28eb0 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
28ec0 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20  0,2);.  if( res 
28ed0 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
28ee0 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  2;.  break;.}../
28ef0 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20 50  * Opcode: Next P
28f00 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
28f10 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72 73  .** Advance curs
28f20 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
28f30 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
28f40 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61 69  ext key/data pai
28f50 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c  r in its.** tabl
28f60 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20  e or index.  If 
28f70 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
28f80 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72  e key/value pair
28f90 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  s then fall thro
28fa0 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f  ugh.** to the fo
28fb0 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74  llowing instruct
28fc0 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65  ion.  But if the
28fd0 20 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65 20   cursor advance 
28fe0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a  was successful,.
28ff0 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  ** jump immediat
29000 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ely to P2..**.**
29010 20 54 68 65 20 4e 65 78 74 20 6f 70 63 6f 64 65   The Next opcode
29020 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
29030 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65 6b  ollowing an Seek
29040 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 0a 2a  GT, SeekGE, or.*
29050 2a 20 4f 50 5f 52 65 77 69 6e 64 20 6f 70 63 6f  * OP_Rewind opco
29060 64 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  de used to posit
29070 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ion the cursor. 
29080 20 4e 65 78 74 20 69 73 20 6e 6f 74 20 61 6c 6c   Next is not all
29090 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f  owed.** to follo
290a0 77 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45  w SeekLT, SeekLE
290b0 2c 20 6f 72 20 4f 50 5f 4c 61 73 74 2e 0a 2a 2a  , or OP_Last..**
290c0 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f  .** The P1 curso
290d0 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20  r must be for a 
290e0 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
290f0 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  a pseudo-table. 
29100 20 50 31 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a   P1 must have.**
29110 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 70 72 69   been opened pri
29120 6f 72 20 74 6f 20 74 68 69 73 20 6f 70 63 6f 64  or to this opcod
29130 65 20 6f 72 20 74 68 65 20 70 72 6f 67 72 61 6d  e or the program
29140 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a   will segfault..
29150 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76 61 6c  **.** The P3 val
29160 75 65 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  ue is a hint to 
29170 74 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  the btree implem
29180 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20 50 33 3d  entation. If P3=
29190 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  =1, that.** mean
291a0 73 20 50 31 20 69 73 20 61 6e 20 53 51 4c 20 69  s P1 is an SQL i
291b0 6e 64 65 78 20 61 6e 64 20 74 68 61 74 20 74 68  ndex and that th
291c0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  is instruction c
291d0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a  ould have been.*
291e0 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 61  * omitted if tha
291f0 74 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  t index had been
29200 20 75 6e 69 71 75 65 2e 20 20 50 33 20 69 73 20   unique.  P3 is 
29210 75 73 75 61 6c 6c 79 20 30 2e 20 20 50 33 20 69  usually 0.  P3 i
29220 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65 69 74 68  s.** always eith
29230 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a  er 0 or 1..**.**
29240 20 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f 66   P4 is always of
29250 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43 45   type P4_ADVANCE
29260 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  . The function p
29270 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ointer points to
29280 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
29290 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Next()..**.** If
292a0 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65 20   P5 is positive 
292b0 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73 20  and the jump is 
292c0 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e  taken, then even
292d0 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d  t counter.** num
292e0 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65 20  ber P5-1 in the 
292f0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
29300 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  nt is incremente
29310 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
29320 6f 3a 20 50 72 65 76 2c 20 4e 65 78 74 49 66 4f  o: Prev, NextIfO
29330 70 65 6e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  pen.*/./* Opcode
29340 3a 20 4e 65 78 74 49 66 4f 70 65 6e 20 50 31 20  : NextIfOpen P1 
29350 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
29360 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f  * This opcode wo
29370 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4e 65  rks just like Ne
29380 78 74 20 65 78 63 65 70 74 20 74 68 61 74 20 69  xt except that i
29390 66 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 6e  f cursor P1 is n
293a0 6f 74 0a 2a 2a 20 6f 70 65 6e 20 69 74 20 62 65  ot.** open it be
293b0 68 61 76 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  haves a no-op..*
293c0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65  /./* Opcode: Pre
293d0 76 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  v P1 P2 P3 P4 P5
293e0 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75 70 20 63  .**.** Back up c
293f0 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
29400 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
29410 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f 64  e previous key/d
29420 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a  ata pair in its.
29430 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ** table or inde
29440 78 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  x.  If there is 
29450 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f  no previous key/
29460 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65 6e  value pairs then
29470 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a   fall through.**
29480 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
29490 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  g instruction.  
294a0 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  But if the curso
294b0 72 20 62 61 63 6b 75 70 20 77 61 73 20 73 75 63  r backup was suc
294c0 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70  cessful,.** jump
294d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
294e0 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  P2..**.**.** The
294f0 20 50 72 65 76 20 6f 70 63 6f 64 65 20 69 73 20   Prev opcode is 
29500 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 6c 6c 6f  only valid follo
29510 77 69 6e 67 20 61 6e 20 53 65 65 6b 4c 54 2c 20  wing an SeekLT, 
29520 53 65 65 6b 4c 45 2c 20 6f 72 0a 2a 2a 20 4f 50  SeekLE, or.** OP
29530 5f 4c 61 73 74 20 6f 70 63 6f 64 65 20 75 73 65  _Last opcode use
29540 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
29550 65 20 63 75 72 73 6f 72 2e 20 20 50 72 65 76 20  e cursor.  Prev 
29560 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 2a  is not allowed.*
29570 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53 65 65 6b  * to follow Seek
29580 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 20 4f  GT, SeekGE, or O
29590 50 5f 52 65 77 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20  P_Rewind..**.** 
295a0 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75  The P1 cursor mu
295b0 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c  st be for a real
295c0 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73   table, not a ps
295d0 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49 66 20  eudo-table.  If 
295e0 50 31 20 69 73 0a 2a 2a 20 6e 6f 74 20 6f 70 65  P1 is.** not ope
295f0 6e 20 74 68 65 6e 20 74 68 65 20 62 65 68 61 76  n then the behav
29600 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ior is undefined
29610 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76  ..**.** The P3 v
29620 61 6c 75 65 20 69 73 20 61 20 68 69 6e 74 20 74  alue is a hint t
29630 6f 20 74 68 65 20 62 74 72 65 65 20 69 6d 70 6c  o the btree impl
29640 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20 50  ementation. If P
29650 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  3==1, that.** me
29660 61 6e 73 20 50 31 20 69 73 20 61 6e 20 53 51 4c  ans P1 is an SQL
29670 20 69 6e 64 65 78 20 61 6e 64 20 74 68 61 74 20   index and that 
29680 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
29690 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
296a0 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74  .** omitted if t
296b0 68 61 74 20 69 6e 64 65 78 20 68 61 64 20 62 65  hat index had be
296c0 65 6e 20 75 6e 69 71 75 65 2e 20 20 50 33 20 69  en unique.  P3 i
296d0 73 20 75 73 75 61 6c 6c 79 20 30 2e 20 20 50 33  s usually 0.  P3
296e0 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65 69   is.** always ei
296f0 74 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a 0a  ther 0 or 1..**.
29700 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73 20  ** P4 is always 
29710 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e  of type P4_ADVAN
29720 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  CE. The function
29730 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
29740 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
29750 65 65 50 72 65 76 69 6f 75 73 28 29 2e 0a 2a 2a  eePrevious()..**
29760 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73  .** If P5 is pos
29770 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75  itive and the ju
29780 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65  mp is taken, the
29790 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a  n event counter.
297a0 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69  ** number P5-1 i
297b0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
297c0 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72  tatement is incr
297d0 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 2f 2a 20 4f  emented..*/./* O
297e0 70 63 6f 64 65 3a 20 50 72 65 76 49 66 4f 70 65  pcode: PrevIfOpe
297f0 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  n P1 P2 P3 P4 P5
29800 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
29810 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  de works just li
29820 6b 65 20 50 72 65 76 20 65 78 63 65 70 74 20 74  ke Prev except t
29830 68 61 74 20 69 66 20 63 75 72 73 6f 72 20 50 31  hat if cursor P1
29840 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 6e 20   is not.** open 
29850 69 74 20 62 65 68 61 76 65 73 20 61 20 6e 6f 2d  it behaves a no-
29860 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  op..*/./* Opcode
29870 3a 20 53 6f 72 74 65 72 4e 65 78 74 20 50 31 20  : SorterNext P1 
29880 50 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20  P2 * * P5.**.** 
29890 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
298a0 73 20 6a 75 73 74 20 6c 69 6b 65 20 4f 50 5f 4e  s just like OP_N
298b0 65 78 74 20 65 78 63 65 70 74 20 74 68 61 74 20  ext except that 
298c0 50 31 20 6d 75 73 74 20 62 65 20 61 0a 2a 2a 20  P1 must be a.** 
298d0 73 6f 72 74 65 72 20 6f 62 6a 65 63 74 20 66 6f  sorter object fo
298e0 72 20 77 68 69 63 68 20 74 68 65 20 4f 50 5f 53  r which the OP_S
298f0 6f 72 74 65 72 53 6f 72 74 20 6f 70 63 6f 64 65  orterSort opcode
29900 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 69 6e 76   has been.** inv
29910 6f 6b 65 64 2e 20 20 54 68 69 73 20 6f 70 63 6f  oked.  This opco
29920 64 65 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  de advances the 
29930 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
29940 78 74 20 73 6f 72 74 65 64 0a 2a 2a 20 72 65 63  xt sorted.** rec
29950 6f 72 64 2c 20 6f 72 20 6a 75 6d 70 73 20 74 6f  ord, or jumps to
29960 20 50 32 20 69 66 20 74 68 65 72 65 20 61 72 65   P2 if there are
29970 20 6e 6f 20 6d 6f 72 65 20 73 6f 72 74 65 64 20   no more sorted 
29980 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 63 61 73 65  records..*/.case
29990 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
299a0 7b 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20  {  /* jump */.  
299b0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
299c0 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 70 43    int res;..  pC
299d0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
299e0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
299f0 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a  isSorter(pC) );.
29a00 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20    res = 0;.  rc 
29a10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
29a20 74 65 72 4e 65 78 74 28 64 62 2c 20 70 43 2c 20  terNext(db, pC, 
29a30 26 72 65 73 29 3b 0a 20 20 67 6f 74 6f 20 6e 65  &res);.  goto ne
29a40 78 74 5f 74 61 69 6c 3b 0a 63 61 73 65 20 4f 50  xt_tail;.case OP
29a50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 20 20 20  _PrevIfOpen:    
29a60 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20  /* jump */.case 
29a70 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 20 20  OP_NextIfOpen:  
29a80 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
29a90 66 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  f( p->apCsr[pOp-
29aa0 3e 70 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  >p1]==0 ) break;
29ab0 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
29ac0 67 68 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72  gh */.case OP_Pr
29ad0 65 76 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev:          /* 
29ae0 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  jump */.case OP_
29af0 4e 65 78 74 3a 20 20 20 20 20 20 20 20 20 20 2f  Next:          /
29b00 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65  * jump */.  asse
29b10 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
29b20 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
29b30 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
29b40 28 20 70 4f 70 2d 3e 70 35 3c 41 72 72 61 79 53  ( pOp->p5<ArrayS
29b50 69 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 72 29  ize(p->aCounter)
29b60 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
29b70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
29b80 72 65 73 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  res = pOp->p3;. 
29b90 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
29ba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
29bb0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
29bc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
29bd0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
29be0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
29bf0 61 73 73 65 72 74 28 20 72 65 73 3d 3d 30 20 7c  assert( res==0 |
29c00 7c 20 28 72 65 73 3d 3d 31 20 26 26 20 70 43 2d  | (res==1 && pC-
29c10 3e 69 73 54 61 62 6c 65 3d 3d 30 29 20 29 3b 0a  >isTable==0) );.
29c20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73 3d    testcase( res=
29c30 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
29c40 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f  pOp->opcode!=OP_
29c50 4e 65 78 74 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e  Next || pOp->p4.
29c60 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65  xAdvance==sqlite
29c70 33 42 74 72 65 65 4e 65 78 74 20 29 3b 0a 20 20  3BtreeNext );.  
29c80 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
29c90 6f 64 65 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20  ode!=OP_Prev || 
29ca0 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
29cb0 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  ==sqlite3BtreePr
29cc0 65 76 69 6f 75 73 20 29 3b 0a 20 20 61 73 73 65  evious );.  asse
29cd0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21  rt( pOp->opcode!
29ce0 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 20 7c  =OP_NextIfOpen |
29cf0 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e  | pOp->p4.xAdvan
29d00 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  ce==sqlite3Btree
29d10 4e 65 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Next );.  assert
29d20 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
29d30 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 7c 7c 20  P_PrevIfOpen || 
29d40 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
29d50 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  ==sqlite3BtreePr
29d60 65 76 69 6f 75 73 29 3b 0a 0a 20 20 2f 2a 20 54  evious);..  /* T
29d70 68 65 20 4e 65 78 74 20 6f 70 63 6f 64 65 20 69  he Next opcode i
29d80 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 66 74 65  s only used afte
29d90 72 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45  r SeekGT, SeekGE
29da0 2c 20 61 6e 64 20 52 65 77 69 6e 64 2e 0a 20 20  , and Rewind..  
29db0 2a 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63 6f  ** The Prev opco
29dc0 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  de is only used 
29dd0 61 66 74 65 72 20 53 65 65 6b 4c 54 2c 20 53 65  after SeekLT, Se
29de0 65 6b 4c 45 2c 20 61 6e 64 20 4c 61 73 74 2e 20  ekLE, and Last. 
29df0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
29e00 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78  ->opcode!=OP_Nex
29e10 74 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  t || pOp->opcode
29e20 21 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 0a  !=OP_NextIfOpen.
29e30 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65         || pC->se
29e40 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20  ekOp==OP_SeekGT 
29e50 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
29e60 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20 20 20  P_SeekGE.       
29e70 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
29e80 50 5f 52 65 77 69 6e 64 20 7c 7c 20 70 43 2d 3e  P_Rewind || pC->
29e90 73 65 65 6b 4f 70 3d 3d 4f 50 5f 46 6f 75 6e 64  seekOp==OP_Found
29ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
29eb0 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65  ->opcode!=OP_Pre
29ec0 76 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  v || pOp->opcode
29ed0 21 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 0a  !=OP_PrevIfOpen.
29ee0 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65         || pC->se
29ef0 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20  ekOp==OP_SeekLT 
29f00 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
29f10 50 5f 53 65 65 6b 4c 45 0a 20 20 20 20 20 20 20  P_SeekLE.       
29f20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
29f30 50 5f 4c 61 73 74 20 29 3b 0a 0a 20 20 72 63 20  P_Last );..  rc 
29f40 3d 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e  = pOp->p4.xAdvan
29f50 63 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ce(pC->uc.pCurso
29f60 72 2c 20 26 72 65 73 29 3b 0a 6e 65 78 74 5f 74  r, &res);.next_t
29f70 61 69 6c 3a 0a 20 20 70 43 2d 3e 63 61 63 68 65  ail:.  pC->cache
29f80 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
29f90 54 41 4c 45 3b 0a 20 20 56 64 62 65 42 72 61 6e  TALE;.  VdbeBran
29fa0 63 68 54 61 6b 65 6e 28 72 65 73 3d 3d 30 2c 32  chTaken(res==0,2
29fb0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
29fc0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
29fd0 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73  error;.  if( res
29fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 2d 3e 6e  ==0 ){.    pC->n
29ff0 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ullRow = 0;.    
2a000 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 70 4f 70 2d  p->aCounter[pOp-
2a010 3e 70 35 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53  >p5]++;.#ifdef S
2a020 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
2a030 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
2a040 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
2a050 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
2a060 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f  2_and_check_for_
2a070 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 65 6c  interrupt;.  }el
2a080 73 65 7b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c  se{.    pC->null
2a090 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 67  Row = 1;.  }.  g
2a0a0 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e  oto check_for_in
2a0b0 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f  terrupt;.}../* O
2a0c0 70 63 6f 64 65 3a 20 49 64 78 49 6e 73 65 72 74  pcode: IdxInsert
2a0d0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
2a0e0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2a0f0 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67  =r[P2].**.** Reg
2a100 69 73 74 65 72 20 50 32 20 68 6f 6c 64 73 20 61  ister P2 holds a
2a110 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79 20  n SQL index key 
2a120 6d 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a 2a  made using the.*
2a130 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73  * MakeRecord ins
2a140 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  tructions.  This
2a150 20 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20 74   opcode writes t
2a160 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20  hat key.** into 
2a170 74 68 65 20 69 6e 64 65 78 20 50 31 2e 20 20 44  the index P1.  D
2a180 61 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72  ata for the entr
2a190 79 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20  y is nil..**.** 
2a1a0 49 66 20 50 34 20 69 73 20 6e 6f 74 20 7a 65 72  If P4 is not zer
2a1b0 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
2a1c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75  e number of valu
2a1d0 65 73 20 69 6e 20 74 68 65 20 75 6e 70 61 63 6b  es in the unpack
2a1e0 65 64 0a 2a 2a 20 6b 65 79 20 6f 66 20 72 65 67  ed.** key of reg
2a1f0 28 50 32 29 2e 20 20 49 6e 20 74 68 61 74 20 63  (P2).  In that c
2a200 61 73 65 2c 20 50 33 20 69 73 20 74 68 65 20 69  ase, P3 is the i
2a210 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
2a220 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 66 6f  t register.** fo
2a230 72 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 6b  r the unpacked k
2a240 65 79 2e 20 20 54 68 65 20 61 76 61 69 6c 61 62  ey.  The availab
2a250 69 6c 69 74 79 20 6f 66 20 74 68 65 20 75 6e 70  ility of the unp
2a260 61 63 6b 65 64 20 6b 65 79 20 63 61 6e 20 73 6f  acked key can so
2a270 6d 65 74 69 6d 65 73 0a 2a 2a 20 62 65 20 61 6e  metimes.** be an
2a280 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
2a290 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73 20 74  *.** If P5 has t
2a2a0 68 65 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  he OPFLAG_APPEND
2a2b0 20 62 69 74 20 73 65 74 2c 20 74 68 61 74 20 69   bit set, that i
2a2c0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
2a2d0 62 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20  b-tree layer.** 
2a2e0 74 68 61 74 20 74 68 69 73 20 69 6e 73 65 72 74  that this insert
2a2f0 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65   is likely to be
2a300 20 61 6e 20 61 70 70 65 6e 64 2e 0a 2a 2a 0a 2a   an append..**.*
2a310 2a 20 49 66 20 50 35 20 68 61 73 20 74 68 65 20  * If P5 has the 
2a320 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 62  OPFLAG_NCHANGE b
2a330 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  it set, then the
2a340 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2a350 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65  is.** incremente
2a360 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75  d by this instru
2a370 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 4f  ction.  If the O
2a380 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 62 69  PFLAG_NCHANGE bi
2a390 74 20 69 73 20 63 6c 65 61 72 2c 0a 2a 2a 20 74  t is clear,.** t
2a3a0 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20 63  hen the change c
2a3b0 6f 75 6e 74 65 72 20 69 73 20 75 6e 63 68 61 6e  ounter is unchan
2a3c0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
2a3d0 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  e OPFLAG_USESEEK
2a3e0 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20 50  RESULT flag of P
2a3f0 35 20 69 73 20 73 65 74 2c 20 74 68 65 20 69 6d  5 is set, the im
2a400 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69 67  plementation mig
2a410 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73 74 65 72  ht.** run faster
2a420 20 62 79 20 61 76 6f 69 64 69 6e 67 20 61 6e 20   by avoiding an 
2a430 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65 65 6b  unnecessary seek
2a440 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 20 20   on cursor P1.  
2a450 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74 68 65 20  However,.** the 
2a460 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
2a470 53 55 4c 54 20 66 6c 61 67 20 6d 75 73 74 20 6f  SULT flag must o
2a480 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20 74 68  nly be set if th
2a490 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
2a4a0 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65 6b 73 20   prior.** seeks 
2a4b0 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6f 72  on the cursor or
2a4c0 20 69 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   if the most rec
2a4d0 65 6e 74 20 73 65 65 6b 20 75 73 65 64 20 61 20  ent seek used a 
2a4e0 6b 65 79 20 65 71 75 69 76 61 6c 65 6e 74 0a 2a  key equivalent.*
2a4f0 2a 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20  * to P2. .**.** 
2a500 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
2a510 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
2a520 69 6e 64 69 63 65 73 2e 20 20 54 68 65 20 65 71  indices.  The eq
2a530 75 69 76 61 6c 65 6e 74 20 69 6e 73 74 72 75 63  uivalent instruc
2a540 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 61 62 6c  tion.** for tabl
2a550 65 73 20 69 73 20 4f 50 5f 49 6e 73 65 72 74 2e  es is OP_Insert.
2a560 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
2a570 6f 72 74 65 72 49 6e 73 65 72 74 20 50 31 20 50  orterInsert P1 P
2a580 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
2a590 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a  sis: key=r[P2].*
2a5a0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 32  *.** Register P2
2a5b0 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e   holds an SQL in
2a5c0 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75 73 69  dex key made usi
2a5d0 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65  ng the.** MakeRe
2a5e0 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  cord instruction
2a5f0 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20  s.  This opcode 
2a600 77 72 69 74 65 73 20 74 68 61 74 20 6b 65 79 0a  writes that key.
2a610 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ** into the sort
2a620 65 72 20 50 31 2e 20 20 44 61 74 61 20 66 6f 72  er P1.  Data for
2a630 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e 69   the entry is ni
2a640 6c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  l..*/.case OP_So
2a650 72 74 65 72 49 6e 73 65 72 74 3a 20 20 20 20 20  rterInsert:     
2a660 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 63 61 73 65    /* in2 */.case
2a670 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3a 20 7b   OP_IdxInsert: {
2a680 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a          /* in2 *
2a690 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
2a6a0 70 43 3b 0a 20 20 42 74 72 65 65 50 61 79 6c 6f  pC;.  BtreePaylo
2a6b0 61 64 20 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad x;..  assert(
2a6c0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
2a6d0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
2a6e0 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
2a6f0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
2a700 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
2a710 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
2a720 72 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e  rter(pC)==(pOp->
2a730 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65  opcode==OP_Sorte
2a740 72 49 6e 73 65 72 74 29 20 29 3b 0a 20 20 70 49  rInsert) );.  pI
2a750 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
2a760 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
2a770 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
2a780 5f 42 6c 6f 62 20 29 3b 0a 20 20 69 66 28 20 70  _Blob );.  if( p
2a790 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
2a7a0 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68  NCHANGE ) p->nCh
2a7b0 61 6e 67 65 2b 2b 3b 0a 20 20 61 73 73 65 72 74  ange++;.  assert
2a7c0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
2a7d0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c  CURTYPE_BTREE ||
2a7e0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2a7f0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29 3b  _SorterInsert );
2a800 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
2a810 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 72  sTable==0 );.  r
2a820 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  c = ExpandBlob(p
2a830 49 6e 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29  In2);.  if( rc )
2a840 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2a850 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  to_error;.  if( 
2a860 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2a870 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29 7b 0a  SorterInsert ){.
2a880 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a890 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65 28  VdbeSorterWrite(
2a8a0 70 43 2c 20 70 49 6e 32 29 3b 0a 20 20 7d 65 6c  pC, pIn2);.  }el
2a8b0 73 65 7b 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d  se{.    x.nKey =
2a8c0 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 78 2e   pIn2->n;.    x.
2a8d0 70 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a  pKey = pIn2->z;.
2a8e0 20 20 20 20 78 2e 61 4d 65 6d 20 3d 20 61 4d 65      x.aMem = aMe
2a8f0 6d 20 2b 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  m + pOp->p3;.   
2a900 20 78 2e 6e 4d 65 6d 20 3d 20 28 75 31 36 29 70   x.nMem = (u16)p
2a910 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72 63  Op->p4.i;.    rc
2a920 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2a930 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e 70 43 75  nsert(pC->uc.pCu
2a940 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20 20  rsor, &x,.      
2a950 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f     (pOp->p5 & (O
2a960 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50 46  PFLAG_APPEND|OPF
2a970 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
2a980 29 29 2c 20 0a 20 20 20 20 20 20 20 20 28 28 70  )), .        ((p
2a990 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
2a9a0 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f  USESEEKRESULT) ?
2a9b0 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
2a9c0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
2a9d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
2a9e0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
2a9f0 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  0 );.    pC->cac
2aa00 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
2aa10 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66  _STALE;.  }.  if
2aa20 28 20 72 63 29 20 67 6f 74 6f 20 61 62 6f 72 74  ( rc) goto abort
2aa30 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2aa40 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2aa50 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65 20  code: IdxDelete 
2aa60 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
2aa70 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2aa80 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  P2@P3].**.** The
2aa90 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33 20 72   content of P3 r
2aaa0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
2aab0 67 20 61 74 20 72 65 67 69 73 74 65 72 20 50 32  g at register P2
2aac0 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70 61   form.** an unpa
2aad0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
2aae0 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 6d 6f  This opcode remo
2aaf0 76 65 73 20 74 68 61 74 20 65 6e 74 72 79 20 66  ves that entry f
2ab00 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65  rom the .** inde
2ab10 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73  x opened by curs
2ab20 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f  or P1..*/.case O
2ab30 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b 0a 20  P_IdxDelete: {. 
2ab40 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
2ab50 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
2ab60 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  sr;.  int res;. 
2ab70 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2ab80 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r;..  assert( pO
2ab90 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61 73 73  p->p3>0 );.  ass
2aba0 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26  ert( pOp->p2>0 &
2abb0 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
2abc0 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
2abd0 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
2abe0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2abf0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
2ac00 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
2ac10 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
2ac20 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
2ac30 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
2ac40 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
2ac50 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
2ac60 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  E );.  pCrsr = p
2ac70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20  C->uc.pCursor;. 
2ac80 20 61 73 73 65 72 74 28 20 70 43 72 73 72 21 3d   assert( pCrsr!=
2ac90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2aca0 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 72  Op->p5==0 );.  r
2acb0 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
2acc0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e 46  pKeyInfo;.  r.nF
2acd0 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70 2d  ield = (u16)pOp-
2ace0 3e 70 33 3b 0a 20 20 72 2e 64 65 66 61 75 6c 74  >p3;.  r.default
2acf0 5f 72 63 20 3d 20 30 3b 0a 20 20 72 2e 61 4d 65  _rc = 0;.  r.aMe
2ad00 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
2ad10 32 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  2];.  rc = sqlit
2ad20 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
2ad30 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72 2c  acked(pCrsr, &r,
2ad40 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20   0, 0, &res);.  
2ad50 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2ad60 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2ad70 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ;.  if( res==0 )
2ad80 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2ad90 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70 43  e3BtreeDelete(pC
2ada0 72 73 72 2c 20 42 54 52 45 45 5f 41 55 58 44 45  rsr, BTREE_AUXDE
2adb0 4c 45 54 45 29 3b 0a 20 20 20 20 69 66 28 20 72  LETE);.    if( r
2adc0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2add0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
2ade0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64  .  assert( pC->d
2adf0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
2ae00 20 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   );.  pC->cacheS
2ae10 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
2ae20 41 4c 45 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52  ALE;.  pC->seekR
2ae30 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 62 72 65  esult = 0;.  bre
2ae40 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2ae50 3a 20 53 65 65 6b 20 50 31 20 2a 20 50 33 20 50  : Seek P1 * P3 P
2ae60 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
2ae70 20 4d 6f 76 65 20 50 33 20 74 6f 20 50 31 2e 72   Move P3 to P1.r
2ae80 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  owid.**.** P1 is
2ae90 20 61 6e 20 6f 70 65 6e 20 69 6e 64 65 78 20 63   an open index c
2aea0 75 72 73 6f 72 20 61 6e 64 20 50 33 20 69 73 20  ursor and P3 is 
2aeb0 61 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  a cursor on the 
2aec0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
2aed0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 6f 70   table.  This op
2aee0 63 6f 64 65 20 64 6f 65 73 20 61 20 64 65 66 65  code does a defe
2aef0 72 72 65 64 20 73 65 65 6b 20 6f 66 20 74 68 65  rred seek of the
2af00 20 50 33 20 74 61 62 6c 65 20 63 75 72 73 6f 72   P3 table cursor
2af10 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 77 20 74  .** to the row t
2af20 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
2af30 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  to the current r
2af40 6f 77 20 6f 66 20 50 31 2e 0a 2a 2a 0a 2a 2a 20  ow of P1..**.** 
2af50 54 68 69 73 20 69 73 20 61 20 64 65 66 65 72 72  This is a deferr
2af60 65 64 20 73 65 65 6b 2e 20 20 4e 6f 74 68 69 6e  ed seek.  Nothin
2af70 67 20 61 63 74 75 61 6c 6c 79 20 68 61 70 70 65  g actually happe
2af80 6e 73 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ns until.** the 
2af90 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 74  cursor is used t
2afa0 6f 20 72 65 61 64 20 61 20 72 65 63 6f 72 64 2e  o read a record.
2afb0 20 20 54 68 61 74 20 77 61 79 2c 20 69 66 20 6e    That way, if n
2afc0 6f 20 72 65 61 64 73 0a 2a 2a 20 6f 63 63 75 72  o reads.** occur
2afd0 2c 20 6e 6f 20 75 6e 6e 65 63 65 73 73 61 72 79  , no unnecessary
2afe0 20 49 2f 4f 20 68 61 70 70 65 6e 73 2e 0a 2a 2a   I/O happens..**
2aff0 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 6e  .** P4 may be an
2b000 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
2b010 72 73 20 28 74 79 70 65 20 50 34 5f 49 4e 54 41  rs (type P4_INTA
2b020 52 52 41 59 29 20 63 6f 6e 74 61 69 6e 69 6e 67  RRAY) containing
2b030 0a 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f  .** one entry fo
2b040 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e  r each column in
2b050 20 74 68 65 20 50 33 20 74 61 62 6c 65 2e 20 20   the P3 table.  
2b060 49 66 20 61 72 72 61 79 20 65 6e 74 72 79 20 61  If array entry a
2b070 28 69 29 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  (i).** is non-ze
2b080 72 6f 2c 20 74 68 65 6e 20 72 65 61 64 69 6e 67  ro, then reading
2b090 20 63 6f 6c 75 6d 6e 20 61 28 69 29 2d 31 20 66   column a(i)-1 f
2b0a0 72 6f 6d 20 63 75 72 73 6f 72 20 50 33 20 69 73  rom cursor P3 is
2b0b0 20 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20   .** equivalent 
2b0c0 74 6f 20 70 65 72 66 6f 72 6d 69 6e 67 20 74 68  to performing th
2b0d0 65 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 20  e deferred seek 
2b0e0 61 6e 64 20 74 68 65 6e 20 72 65 61 64 69 6e 67  and then reading
2b0f0 20 63 6f 6c 75 6d 6e 20 69 20 0a 2a 2a 20 66 72   column i .** fr
2b100 6f 6d 20 50 31 2e 20 20 54 68 69 73 20 69 6e 66  om P1.  This inf
2b110 6f 72 6d 61 74 69 6f 6e 20 69 73 20 73 74 6f 72  ormation is stor
2b120 65 64 20 69 6e 20 50 33 20 61 6e 64 20 75 73 65  ed in P3 and use
2b130 64 20 74 6f 20 72 65 64 69 72 65 63 74 0a 2a 2a  d to redirect.**
2b140 20 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 50   reads against P
2b150 33 20 6f 76 65 72 20 74 6f 20 50 31 2c 20 74 68  3 over to P1, th
2b160 75 73 20 70 6f 73 73 69 62 6c 79 20 61 76 6f 69  us possibly avoi
2b170 64 69 6e 67 20 74 68 65 20 6e 65 65 64 20 74 6f  ding the need to
2b180 0a 2a 2a 20 73 65 65 6b 20 61 6e 64 20 72 65 61  .** seek and rea
2b190 64 20 63 75 72 73 6f 72 20 50 33 2e 0a 2a 2f 0a  d cursor P3..*/.
2b1a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 52 6f  /* Opcode: IdxRo
2b1b0 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  wid P1 P2 * * *.
2b1c0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
2b1d0 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 57  2]=rowid.**.** W
2b1e0 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73 74  rite into regist
2b1f0 65 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65 72  er P2 an integer
2b200 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6c 61   which is the la
2b210 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2b220 72 65 63 6f 72 64 20 61 74 0a 2a 2a 20 74 68 65  record at.** the
2b230 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
2b240 78 20 6b 65 79 20 70 6f 69 6e 74 65 64 20 74 6f  x key pointed to
2b250 20 62 79 20 63 75 72 73 6f 72 20 50 31 2e 20 20   by cursor P1.  
2b260 54 68 69 73 20 69 6e 74 65 67 65 72 20 73 68 6f  This integer sho
2b270 75 6c 64 20 62 65 0a 2a 2a 20 74 68 65 20 72 6f  uld be.** the ro
2b280 77 69 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  wid of the table
2b290 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2b2a0 74 68 69 73 20 69 6e 64 65 78 20 65 6e 74 72 79  this index entry
2b2b0 20 70 6f 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 53   points..**.** S
2b2c0 65 65 20 61 6c 73 6f 3a 20 52 6f 77 69 64 2c 20  ee also: Rowid, 
2b2d0 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 2a 2f 0a 63  MakeRecord..*/.c
2b2e0 61 73 65 20 4f 50 5f 53 65 65 6b 3a 0a 63 61 73  ase OP_Seek:.cas
2b2f0 65 20 4f 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b  e OP_IdxRowid: {
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b310 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43   out2 */.  VdbeC
2b320 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20  ursor *pC;      
2b330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b340 20 50 31 20 69 6e 64 65 78 20 63 75 72 73 6f 72   P1 index cursor
2b350 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
2b360 20 2a 70 54 61 62 43 75 72 3b 20 20 20 20 20 20   *pTabCur;      
2b370 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 74       /* The P2 t
2b380 61 62 6c 65 20 63 75 72 73 6f 72 20 28 4f 50 5f  able cursor (OP_
2b390 53 65 65 6b 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20  Seek only) */.  
2b3a0 69 36 34 20 72 6f 77 69 64 3b 20 20 20 20 20 20  i64 rowid;      
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3c0 2a 20 52 6f 77 69 64 20 74 68 61 74 20 50 31 20  * Rowid that P1 
2b3d0 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 73 20 74  current points t
2b3e0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
2b3f0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2b400 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2b410 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
2b420 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2b430 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
2b440 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
2b450 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2b460 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65  _BTREE );.  asse
2b470 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  rt( pC->uc.pCurs
2b480 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  or!=0 );.  asser
2b490 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d  t( pC->isTable==
2b4a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b4b0 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
2b4c0 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
2b4d0 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 7c  ( !pC->nullRow |
2b4e0 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
2b4f0 50 5f 49 64 78 52 6f 77 69 64 20 29 3b 0a 0a 20  P_IdxRowid );.. 
2b500 20 2f 2a 20 54 68 65 20 49 64 78 52 6f 77 69 64   /* The IdxRowid
2b510 20 61 6e 64 20 53 65 65 6b 20 6f 70 63 6f 64 65   and Seek opcode
2b520 73 20 61 72 65 20 63 6f 6d 62 69 6e 65 64 20 62  s are combined b
2b530 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 63 6f  ecause of the co
2b540 6d 6d 6f 6e 61 6c 69 74 79 0a 20 20 2a 2a 20 6f  mmonality.  ** o
2b550 66 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  f sqlite3VdbeCur
2b560 73 6f 72 52 65 73 74 6f 72 65 28 29 20 61 6e 64  sorRestore() and
2b570 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
2b580 6f 77 69 64 28 29 2e 20 2a 2f 0a 20 20 72 63 20  owid(). */.  rc 
2b590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2b5a0 73 6f 72 52 65 73 74 6f 72 65 28 70 43 29 3b 0a  sorRestore(pC);.
2b5b0 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 62 65  .  /* sqlite3Vbe
2b5c0 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20  CursorRestore() 
2b5d0 63 61 6e 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66  can only fail if
2b5e0 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
2b5f0 62 65 65 6e 20 64 65 6c 65 74 65 64 0a 20 20 2a  been deleted.  *
2b600 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
2b610 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
2b620 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 61  at will never ha
2b630 70 70 65 6e 73 20 66 6f 72 20 61 6e 20 49 64 78  ppens for an Idx
2b640 52 6f 77 69 64 0a 20 20 2a 2a 20 6f 72 20 53 65  Rowid.  ** or Se
2b650 65 6b 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ek opcode */.  i
2b660 66 28 20 4e 45 56 45 52 28 72 63 21 3d 53 51 4c  f( NEVER(rc!=SQL
2b670 49 54 45 5f 4f 4b 29 20 29 20 67 6f 74 6f 20 61  ITE_OK) ) goto a
2b680 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2b690 72 3b 0a 0a 20 20 69 66 28 20 21 70 43 2d 3e 6e  r;..  if( !pC->n
2b6a0 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 72 6f  ullRow ){.    ro
2b6b0 77 69 64 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  wid = 0;  /* Not
2b6c0 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75   needed.  Only u
2b6d0 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61  sed to silence a
2b6e0 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20   warning. */.   
2b6f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
2b700 65 49 64 78 52 6f 77 69 64 28 64 62 2c 20 70 43  eIdxRowid(db, pC
2b710 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72  ->uc.pCursor, &r
2b720 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  owid);.    if( r
2b730 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b740 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
2b750 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2b760 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
2b770 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65  ->opcode==OP_See
2b780 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  k ){.      asser
2b790 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26 26  t( pOp->p3>=0 &&
2b7a0 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 43 75 72   pOp->p3<p->nCur
2b7b0 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 70 54 61  sor );.      pTa
2b7c0 62 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b  bCur = p->apCsr[
2b7d0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20  pOp->p3];.      
2b7e0 61 73 73 65 72 74 28 20 70 54 61 62 43 75 72 21  assert( pTabCur!
2b7f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2b800 72 74 28 20 70 54 61 62 43 75 72 2d 3e 65 43 75  rt( pTabCur->eCu
2b810 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
2b820 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 61 73  TREE );.      as
2b830 73 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e 75  sert( pTabCur->u
2b840 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
2b850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2b860 61 62 43 75 72 2d 3e 69 73 54 61 62 6c 65 20 29  abCur->isTable )
2b870 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d  ;.      pTabCur-
2b880 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20  >nullRow = 0;.  
2b890 20 20 20 20 70 54 61 62 43 75 72 2d 3e 6d 6f 76      pTabCur->mov
2b8a0 65 74 6f 54 61 72 67 65 74 20 3d 20 72 6f 77 69  etoTarget = rowi
2b8b0 64 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72  d;.      pTabCur
2b8c0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
2b8d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   = 1;.      asse
2b8e0 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
2b8f0 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 7c 7c 20  =P4_INTARRAY || 
2b900 70 4f 70 2d 3e 70 34 2e 61 69 3d 3d 30 20 29 3b  pOp->p4.ai==0 );
2b910 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e  .      pTabCur->
2b920 61 41 6c 74 4d 61 70 20 3d 20 70 4f 70 2d 3e 70  aAltMap = pOp->p
2b930 34 2e 61 69 3b 0a 20 20 20 20 20 20 70 54 61 62  4.ai;.      pTab
2b940 43 75 72 2d 3e 70 41 6c 74 43 75 72 73 6f 72 20  Cur->pAltCursor 
2b950 3d 20 70 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = pC;.    }else{
2b960 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20 6f 75  .      pOut = ou
2b970 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
2b980 70 4f 70 29 3b 0a 20 20 20 20 20 20 70 4f 75 74  pOp);.      pOut
2b990 2d 3e 75 2e 69 20 3d 20 72 6f 77 69 64 3b 0a 20  ->u.i = rowid;. 
2b9a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2b9b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
2b9c0 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f 77  pcode==OP_IdxRow
2b9d0 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  id );.    sqlite
2b9e0 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
2b9f0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b  &aMem[pOp->p2]);
2ba00 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2ba10 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 47  ./* Opcode: IdxG
2ba20 45 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  E P1 P2 P3 P4 P5
2ba30 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
2ba40 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
2ba50 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65 72   The P4 register
2ba60 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e   values beginnin
2ba70 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61  g with P3 form a
2ba80 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
2ba90 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d   .** key that om
2baa0 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  its the PRIMARY 
2bab0 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 74 68  KEY.  Compare th
2bac0 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61  is key value aga
2bad0 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a  inst the index .
2bae0 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20 63 75  ** that P1 is cu
2baf0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2bb00 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68   to, ignoring th
2bb10 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  e PRIMARY KEY or
2bb20 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c 64   ROWID .** field
2bb30 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  s at the end..**
2bb40 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e  .** If the P1 in
2bb50 64 65 78 20 65 6e 74 72 79 20 69 73 20 67 72 65  dex entry is gre
2bb60 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
2bb70 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61  al to the key va
2bb80 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70  lue.** then jump
2bb90 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69   to P2.  Otherwi
2bba0 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
2bbb0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2bbc0 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f  ruction..*/./* O
2bbd0 70 63 6f 64 65 3a 20 49 64 78 47 54 20 50 31 20  pcode: IdxGT P1 
2bbe0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
2bbf0 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
2bc00 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  3@P4].**.** The 
2bc10 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  P4 register valu
2bc20 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  es beginning wit
2bc30 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70  h P3 form an unp
2bc40 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20  acked index .** 
2bc50 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74  key that omits t
2bc60 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  he PRIMARY KEY. 
2bc70 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65   Compare this ke
2bc80 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20  y value against 
2bc90 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68  the index .** th
2bca0 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74  at P1 is current
2bcb0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20  ly pointing to, 
2bcc0 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49  ignoring the PRI
2bcd0 4d 41 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49  MARY KEY or ROWI
2bce0 44 20 0a 2a 2a 20 66 69 65 6c 64 73 20 61 74 20  D .** fields at 
2bcf0 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  the end..**.** I
2bd00 66 20 74 68 65 20 50 31 20 69 6e 64 65 78 20 65  f the P1 index e
2bd10 6e 74 72 79 20 69 73 20 67 72 65 61 74 65 72 20  ntry is greater 
2bd20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
2bd30 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20  ue.** then jump 
2bd40 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73  to P2.  Otherwis
2bd50 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  e fall through t
2bd60 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
2bd70 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  uction..*/./* Op
2bd80 63 6f 64 65 3a 20 49 64 78 4c 54 20 50 31 20 50  code: IdxLT P1 P
2bd90 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
2bda0 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
2bdb0 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  @P4].**.** The P
2bdc0 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  4 register value
2bdd0 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
2bde0 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61   P3 form an unpa
2bdf0 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b  cked index .** k
2be00 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  ey that omits th
2be10 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  e PRIMARY KEY or
2be20 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65   ROWID.  Compare
2be30 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20   this key value 
2be40 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 69  against.** the i
2be50 6e 64 65 78 20 74 68 61 74 20 50 31 20 69 73 20  ndex that P1 is 
2be60 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2be70 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20  ng to, ignoring 
2be80 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
2be90 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20 74  or.** ROWID on t
2bea0 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a  he P1 index..**.
2beb0 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64  ** If the P1 ind
2bec0 65 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73  ex entry is less
2bed0 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61   than the key va
2bee0 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  lue then jump to
2bef0 20 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73   P2..** Otherwis
2bf00 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  e fall through t
2bf10 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
2bf20 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  uction..*/./* Op
2bf30 63 6f 64 65 3a 20 49 64 78 4c 45 20 50 31 20 50  code: IdxLE P1 P
2bf40 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
2bf50 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
2bf60 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  @P4].**.** The P
2bf70 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  4 register value
2bf80 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
2bf90 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61   P3 form an unpa
2bfa0 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b  cked index .** k
2bfb0 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  ey that omits th
2bfc0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  e PRIMARY KEY or
2bfd0 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65   ROWID.  Compare
2bfe0 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20   this key value 
2bff0 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 69  against.** the i
2c000 6e 64 65 78 20 74 68 61 74 20 50 31 20 69 73 20  ndex that P1 is 
2c010 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2c020 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20  ng to, ignoring 
2c030 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
2c040 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20 74  or.** ROWID on t
2c050 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a  he P1 index..**.
2c060 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64  ** If the P1 ind
2c070 65 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73  ex entry is less
2c080 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2c090 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  o the key value 
2c0a0 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20  then jump.** to 
2c0b0 50 32 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  P2. Otherwise fa
2c0c0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
2c0d0 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2c0e0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  on..*/.case OP_I
2c0f0 64 78 4c 45 3a 20 20 20 20 20 20 20 20 20 20 2f  dxLE:          /
2c100 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f  * jump */.case O
2c110 50 5f 49 64 78 47 54 3a 20 20 20 20 20 20 20 20  P_IdxGT:        
2c120 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73    /* jump */.cas
2c130 65 20 4f 50 5f 49 64 78 4c 54 3a 20 20 20 20 20  e OP_IdxLT:     
2c140 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
2c150 63 61 73 65 20 4f 50 5f 49 64 78 47 45 3a 20 20  case OP_IdxGE:  
2c160 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20  {       /* jump 
2c170 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
2c180 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  *pC;.  int res;.
2c190 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
2c1a0 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   r;..  assert( p
2c1b0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
2c1c0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
2c1d0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
2c1e0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
2c1f0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
2c200 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
2c210 4f 72 64 65 72 65 64 20 29 3b 0a 20 20 61 73 73  Ordered );.  ass
2c220 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
2c230 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
2c240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c250 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 29  ->uc.pCursor!=0)
2c260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2c270 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
2c280 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2c290 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70  Op->p5==0 || pOp
2c2a0 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20 61 73 73  ->p5==1 );.  ass
2c2b0 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
2c2c0 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20  ==P4_INT32 );.  
2c2d0 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d  r.pKeyInfo = pC-
2c2e0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e  >pKeyInfo;.  r.n
2c2f0 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70  Field = (u16)pOp
2c300 2d 3e 70 34 2e 69 3b 0a 20 20 69 66 28 20 70 4f  ->p4.i;.  if( pO
2c310 70 2d 3e 6f 70 63 6f 64 65 3c 4f 50 5f 49 64 78  p->opcode<OP_Idx
2c320 4c 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  LT ){.    assert
2c330 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2c340 50 5f 49 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e  P_IdxLE || pOp->
2c350 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54  opcode==OP_IdxGT
2c360 20 29 3b 0a 20 20 20 20 72 2e 64 65 66 61 75 6c   );.    r.defaul
2c370 74 5f 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  t_rc = -1;.  }el
2c380 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2c390 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2c3a0 49 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70  IdxGE || pOp->op
2c3b0 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  code==OP_IdxLT )
2c3c0 3b 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f  ;.    r.default_
2c3d0 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 2e  rc = 0;.  }.  r.
2c3e0 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  aMem = &aMem[pOp
2c3f0 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51  ->p3];.#ifdef SQ
2c400 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 69  LITE_DEBUG.  { i
2c410 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69  nt i; for(i=0; i
2c420 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20  <r.nField; i++) 
2c430 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
2c440 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29  id(&r.aMem[i]) )
2c450 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 73  ; }.#endif.  res
2c460 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65   = 0;  /* Not ne
2c470 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64  eded.  Only used
2c480 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61   to silence a wa
2c490 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  rning. */.  rc =
2c4a0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
2c4b0 65 79 43 6f 6d 70 61 72 65 28 64 62 2c 20 70 43  eyCompare(db, pC
2c4c0 2c 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20 61  , &r, &res);.  a
2c4d0 73 73 65 72 74 28 20 28 4f 50 5f 49 64 78 4c 45  ssert( (OP_IdxLE
2c4e0 26 31 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26 31  &1)==(OP_IdxLT&1
2c4f0 29 20 26 26 20 28 4f 50 5f 49 64 78 47 45 26 31  ) && (OP_IdxGE&1
2c500 29 3d 3d 28 4f 50 5f 49 64 78 47 54 26 31 29 20  )==(OP_IdxGT&1) 
2c510 29 3b 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f  );.  if( (pOp->o
2c520 70 63 6f 64 65 26 31 29 3d 3d 28 4f 50 5f 49 64  pcode&1)==(OP_Id
2c530 78 4c 54 26 31 29 20 29 7b 0a 20 20 20 20 61 73  xLT&1) ){.    as
2c540 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2c550 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20 70  e==OP_IdxLE || p
2c560 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2c570 64 78 4c 54 20 29 3b 0a 20 20 20 20 72 65 73 20  dxLT );.    res 
2c580 3d 20 2d 72 65 73 3b 0a 20 20 7d 65 6c 73 65 7b  = -res;.  }else{
2c590 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
2c5a0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
2c5b0 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64  GE || pOp->opcod
2c5c0 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20  e==OP_IdxGT );. 
2c5d0 20 20 20 72 65 73 2b 2b 3b 0a 20 20 7d 0a 20 20     res++;.  }.  
2c5e0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
2c5f0 72 65 73 3e 30 2c 32 29 3b 0a 20 20 69 66 28 20  res>0,2);.  if( 
2c600 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2c610 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2c620 69 66 28 20 72 65 73 3e 30 20 29 20 67 6f 74 6f  if( res>0 ) goto
2c630 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62   jump_to_p2;.  b
2c640 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2c650 64 65 3a 20 44 65 73 74 72 6f 79 20 50 31 20 50  de: Destroy P1 P
2c660 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44  2 P3 * *.**.** D
2c670 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
2c680 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
2c690 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72 6f  r index whose ro
2c6a0 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
2c6b0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
2c6c0 69 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e 0a  is given by P1..
2c6d0 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
2c6e0 62 65 69 6e 67 20 64 65 73 74 72 6f 79 65 64 20  being destroyed 
2c6f0 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  is in the main d
2c700 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
2c710 50 33 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 33  P3==0.  If.** P3
2c720 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61 62  ==1 then the tab
2c730 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69  le to be clear i
2c740 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  s in the auxilia
2c750 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2c760 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65 64  .** that is used
2c770 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73   to store tables
2c780 20 63 72 65 61 74 65 20 75 73 69 6e 67 20 43 52   create using CR
2c790 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54  EATE TEMPORARY T
2c7a0 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41  ABLE..**.** If A
2c7b0 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61  UTOVACUUM is ena
2c7c0 62 6c 65 64 20 74 68 65 6e 20 69 74 20 69 73 20  bled then it is 
2c7d0 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 61 6e  possible that an
2c7e0 6f 74 68 65 72 20 72 6f 6f 74 20 70 61 67 65 0a  other root page.
2c7f0 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d 6f 76 65  ** might be move
2c800 64 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 6c 79  d into the newly
2c810 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 20 70 61   deleted root pa
2c820 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ge in order to k
2c830 65 65 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20  eep all.** root 
2c840 70 61 67 65 73 20 63 6f 6e 74 69 67 75 6f 75 73  pages contiguous
2c850 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2c860 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
2c870 65 2e 20 20 54 68 65 20 66 6f 72 6d 65 72 0a 2a  e.  The former.*
2c880 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72  * value of the r
2c890 6f 6f 74 20 70 61 67 65 20 74 68 61 74 20 6d 6f  oot page that mo
2c8a0 76 65 64 20 2d 20 69 74 73 20 76 61 6c 75 65 20  ved - its value 
2c8b0 62 65 66 6f 72 65 20 74 68 65 20 6d 6f 76 65 20  before the move 
2c8c0 6f 63 63 75 72 72 65 64 20 2d 0a 2a 2a 20 69 73  occurred -.** is
2c8d0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
2c8e0 74 65 72 20 50 32 2e 20 20 49 66 20 6e 6f 20 70  ter P2.  If no p
2c8f0 61 67 65 20 0a 2a 2a 20 6d 6f 76 65 6d 65 6e 74  age .** movement
2c900 20 77 61 73 20 72 65 71 75 69 72 65 64 20 28 62   was required (b
2c910 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65  ecause the table
2c920 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 77   being dropped w
2c930 61 73 20 61 6c 72 65 61 64 79 20 0a 2a 2a 20 74  as already .** t
2c940 68 65 20 6c 61 73 74 20 6f 6e 65 20 69 6e 20 74  he last one in t
2c950 68 65 20 64 61 74 61 62 61 73 65 29 20 74 68 65  he database) the
2c960 6e 20 61 20 7a 65 72 6f 20 69 73 20 73 74 6f 72  n a zero is stor
2c970 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
2c980 32 2e 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  2..** If AUTOVAC
2c990 55 55 4d 20 69 73 20 64 69 73 61 62 6c 65 64 20  UUM is disabled 
2c9a0 74 68 65 6e 20 61 20 7a 65 72 6f 20 69 73 20 73  then a zero is s
2c9b0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
2c9c0 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  r P2..**.** See 
2c9d0 61 6c 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a 63  also: Clear.*/.c
2c9e0 61 73 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a 20  ase OP_Destroy: 
2c9f0 7b 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f  {     /* out2 */
2ca00 0a 20 20 69 6e 74 20 69 4d 6f 76 65 64 3b 0a 20  .  int iMoved;. 
2ca10 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73   int iDb;..  ass
2ca20 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  ert( p->readOnly
2ca30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2ca40 20 70 4f 70 2d 3e 70 31 3e 31 20 29 3b 0a 20 20   pOp->p1>1 );.  
2ca50 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
2ca60 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
2ca70 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
2ca80 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 64  EM_Null;.  if( d
2ca90 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 3e 20 64  b->nVdbeRead > d
2caa0 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 31 20 29  b->nVDestroy+1 )
2cab0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2cac0 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 70 2d  E_LOCKED;.    p-
2cad0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
2cae0 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 67 6f 74  E_Abort;.    got
2caf0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
2cb00 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rror;.  }else{. 
2cb10 20 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33     iDb = pOp->p3
2cb20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 44 62  ;.    assert( Db
2cb30 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65  MaskTest(p->btre
2cb40 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a 20  eMask, iDb) );. 
2cb50 20 20 20 69 4d 6f 76 65 64 20 3d 20 30 3b 20 20     iMoved = 0;  
2cb60 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
2cb70 4f 6e 6c 79 20 74 6f 20 73 69 6c 65 6e 63 65 20  Only to silence 
2cb80 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20  a warning. */.  
2cb90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2cba0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 64 62 2d  reeDropTable(db-
2cbb0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 70  >aDb[iDb].pBt, p
2cbc0 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f 76 65 64 29  Op->p1, &iMoved)
2cbd0 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  ;.    pOut->flag
2cbe0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
2cbf0 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f   pOut->u.i = iMo
2cc00 76 65 64 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ved;.    if( rc 
2cc10 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2cc20 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 69 66 6e 64  _to_error;.#ifnd
2cc30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2cc40 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2cc50 28 20 69 4d 6f 76 65 64 21 3d 30 20 29 7b 0a 20  ( iMoved!=0 ){. 
2cc60 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6f 74       sqlite3Root
2cc70 50 61 67 65 4d 6f 76 65 64 28 64 62 2c 20 69 44  PageMoved(db, iD
2cc80 62 2c 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e  b, iMoved, pOp->
2cc90 70 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  p1);.      /* Al
2cca0 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 70 65  l OP_Destroy ope
2ccb0 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 6f 6e  rations occur on
2ccc0 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 20   the same btree 
2ccd0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2cce0 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61   resetSchemaOnFa
2ccf0 75 6c 74 3d 3d 30 20 7c 7c 20 72 65 73 65 74 53  ult==0 || resetS
2cd00 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 69 44  chemaOnFault==iD
2cd10 62 2b 31 20 29 3b 0a 20 20 20 20 20 20 72 65 73  b+1 );.      res
2cd20 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20  etSchemaOnFault 
2cd30 3d 20 69 44 62 2b 31 3b 0a 20 20 20 20 7d 0a 23  = iDb+1;.    }.#
2cd40 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61  endif.  }.  brea
2cd50 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2cd60 20 43 6c 65 61 72 20 50 31 20 50 32 20 50 33 0a   Clear P1 P2 P3.
2cd70 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  **.** Delete all
2cd80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2cd90 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
2cda0 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72  or index whose r
2cdb0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20 74  oot page.** in t
2cdc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cdd0 20 69 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e   is given by P1.
2cde0 20 20 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44 65    But, unlike De
2cdf0 73 74 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  stroy, do not.**
2ce00 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
2ce10 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20  e or index from 
2ce20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ce30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  e..**.** The tab
2ce40 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 20 69  le being clear i
2ce50 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  s in the main da
2ce60 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
2ce70 32 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32 3d  2==0.  If.** P2=
2ce80 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c  =1 then the tabl
2ce90 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73  e to be clear is
2cea0 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
2ceb0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  y database file.
2cec0 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65 64 20  ** that is used 
2ced0 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20  to store tables 
2cee0 63 72 65 61 74 65 20 75 73 69 6e 67 20 43 52 45  create using CRE
2cef0 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41  ATE TEMPORARY TA
2cf00 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  BLE..**.** If th
2cf10 65 20 50 33 20 76 61 6c 75 65 20 69 73 20 6e 6f  e P3 value is no
2cf20 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
2cf30 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20   table referred 
2cf40 74 6f 20 6d 75 73 74 20 62 65 20 61 6e 0a 2a 2a  to must be an.**
2cf50 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 28 61   intkey table (a
2cf60 6e 20 53 51 4c 20 74 61 62 6c 65 2c 20 6e 6f 74  n SQL table, not
2cf70 20 61 6e 20 69 6e 64 65 78 29 2e 20 49 6e 20 74   an index). In t
2cf80 68 69 73 20 63 61 73 65 20 74 68 65 20 72 6f 77  his case the row
2cf90 20 63 68 61 6e 67 65 20 0a 2a 2a 20 63 6f 75 6e   change .** coun
2cfa0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
2cfb0 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
2cfc0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2cfd0 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65  ble being cleare
2cfe0 64 2e 20 0a 2a 2a 20 49 66 20 50 33 20 69 73 20  d. .** If P3 is 
2cff0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2d000 6f 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  o, then the valu
2d010 65 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  e stored in regi
2d020 73 74 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 6c  ster P3 is.** al
2d030 73 6f 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  so incremented b
2d040 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
2d050 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2d060 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64 2e  e being cleared.
2d070 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
2d080 20 44 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73 65   Destroy.*/.case
2d090 20 4f 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20 69   OP_Clear: {.  i
2d0a0 6e 74 20 6e 43 68 61 6e 67 65 3b 0a 20 0a 20 20  nt nChange;. .  
2d0b0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 61  nChange = 0;.  a
2d0c0 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e  ssert( p->readOn
2d0d0 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
2d0e0 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
2d0f0 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d  >btreeMask, pOp-
2d100 3e 70 32 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  >p2) );.  rc = s
2d110 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2d120 54 61 62 6c 65 28 0a 20 20 20 20 20 20 64 62 2d  Table(.      db-
2d130 3e 61 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42  >aDb[pOp->p2].pB
2d140 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 28 70 4f 70  t, pOp->p1, (pOp
2d150 2d 3e 70 33 20 3f 20 26 6e 43 68 61 6e 67 65 20  ->p3 ? &nChange 
2d160 3a 20 30 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  : 0).  );.  if( 
2d170 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20 70  pOp->p3 ){.    p
2d180 2d 3e 6e 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  ->nChange += nCh
2d190 61 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  ange;.    if( pO
2d1a0 70 2d 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20 20  p->p3>0 ){.     
2d1b0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
2d1c0 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  lid(&aMem[pOp->p
2d1d0 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  3]) );.      mem
2d1e0 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
2d1f0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29   &aMem[pOp->p3])
2d200 3b 0a 20 20 20 20 20 20 61 4d 65 6d 5b 70 4f 70  ;.      aMem[pOp
2d210 2d 3e 70 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43 68  ->p3].u.i += nCh
2d220 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ange;.    }.  }.
2d230 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2d240 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2d250 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  or;.  break;.}..
2d260 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74  /* Opcode: Reset
2d270 53 6f 72 74 65 72 20 50 31 20 2a 20 2a 20 2a 20  Sorter P1 * * * 
2d280 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  *.**.** Delete a
2d290 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 66 72 6f 6d  ll contents from
2d2a0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
2d2b0 61 62 6c 65 20 6f 72 20 73 6f 72 74 65 72 0a 2a  able or sorter.*
2d2c0 2a 20 74 68 61 74 20 69 73 20 6f 70 65 6e 20 6f  * that is open o
2d2d0 6e 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 0a  n cursor P1..**.
2d2e0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f  ** This opcode o
2d2f0 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 63 75  nly works for cu
2d300 72 73 6f 72 73 20 75 73 65 64 20 66 6f 72 20 73  rsors used for s
2d310 6f 72 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 6f 70  orting and.** op
2d320 65 6e 65 64 20 77 69 74 68 20 4f 50 5f 4f 70 65  ened with OP_Ope
2d330 6e 45 70 68 65 6d 65 72 61 6c 20 6f 72 20 4f 50  nEphemeral or OP
2d340 5f 53 6f 72 74 65 72 4f 70 65 6e 2e 0a 2a 2f 0a  _SorterOpen..*/.
2d350 63 61 73 65 20 4f 50 5f 52 65 73 65 74 53 6f 72  case OP_ResetSor
2d360 74 65 72 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  ter: {.  VdbeCur
2d370 73 6f 72 20 2a 70 43 3b 0a 20 0a 20 20 61 73 73  sor *pC;. .  ass
2d380 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
2d390 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
2d3a0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
2d3b0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
2d3c0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
2d3d0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 53 6f  =0 );.  if( isSo
2d3e0 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20 20  rter(pC) ){.    
2d3f0 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
2d400 72 52 65 73 65 74 28 64 62 2c 20 70 43 2d 3e 75  rReset(db, pC->u
2d410 63 2e 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d 65  c.pSorter);.  }e
2d420 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2d430 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
2d440 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
2d450 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
2d460 69 73 45 70 68 65 6d 65 72 61 6c 20 29 3b 0a 20  isEphemeral );. 
2d470 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2d480 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 4f 66  treeClearTableOf
2d490 43 75 72 73 6f 72 28 70 43 2d 3e 75 63 2e 70 43  Cursor(pC->uc.pC
2d4a0 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
2d4b0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2d4c0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2d4d0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
2d4e0 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 54   Opcode: CreateT
2d4f0 61 62 6c 65 20 50 31 20 50 32 20 2a 20 2a 20 2a  able P1 P2 * * *
2d500 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
2d510 50 32 5d 3d 72 6f 6f 74 20 69 44 62 3d 50 31 0a  P2]=root iDb=P1.
2d520 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  **.** Allocate a
2d530 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 74 68   new table in th
2d540 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2d550 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f 72  file if P1==0 or
2d560 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69 6c   in the.** auxil
2d570 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
2d580 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20 69  le if P1==1 or i
2d590 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  n an attached da
2d5a0 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e  tabase if.** P1>
2d5b0 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 72 6f  1.  Write the ro
2d5c0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
2d5d0 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
2d5e0 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72  into.** register
2d5f0 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69   P2.**.** The di
2d600 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2d610 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20   a table and an 
2d620 69 6e 64 65 78 20 69 73 20 74 68 69 73 3a 20 20  index is this:  
2d630 41 20 74 61 62 6c 65 20 6d 75 73 74 0a 2a 2a 20  A table must.** 
2d640 68 61 76 65 20 61 20 34 2d 62 79 74 65 20 69 6e  have a 4-byte in
2d650 74 65 67 65 72 20 6b 65 79 20 61 6e 64 20 63 61  teger key and ca
2d660 6e 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79  n have arbitrary
2d670 20 64 61 74 61 2e 20 20 41 6e 20 69 6e 64 65 78   data.  An index
2d680 0a 2a 2a 20 68 61 73 20 61 6e 20 61 72 62 69 74  .** has an arbit
2d690 72 61 72 79 20 6b 65 79 20 62 75 74 20 6e 6f 20  rary key but no 
2d6a0 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  data..**.** See 
2d6b0 61 6c 73 6f 3a 20 43 72 65 61 74 65 49 6e 64 65  also: CreateInde
2d6c0 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  x.*/./* Opcode: 
2d6d0 43 72 65 61 74 65 49 6e 64 65 78 20 50 31 20 50  CreateIndex P1 P
2d6e0 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
2d6f0 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 6f 74 20  sis: r[P2]=root 
2d700 69 44 62 3d 50 31 0a 2a 2a 0a 2a 2a 20 41 6c 6c  iDb=P1.**.** All
2d710 6f 63 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  ocate a new inde
2d720 78 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  x in the main da
2d730 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
2d740 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a  1==0 or in the.*
2d750 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2d760 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d  base file if P1=
2d770 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74 74 61  =1 or in an atta
2d780 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69 66  ched database if
2d790 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69 74 65  .** P1>1.  Write
2d7a0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
2d7b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
2d7c0 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72   table into.** r
2d7d0 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
2d7e0 2a 20 53 65 65 20 64 6f 63 75 6d 65 6e 74 61 74  * See documentat
2d7f0 69 6f 6e 20 6f 6e 20 4f 50 5f 43 72 65 61 74 65  ion on OP_Create
2d800 54 61 62 6c 65 20 66 6f 72 20 61 64 64 69 74 69  Table for additi
2d810 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2d820 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65  ..*/.case OP_Cre
2d830 61 74 65 49 6e 64 65 78 3a 20 20 20 20 20 20 20  ateIndex:       
2d840 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
2d850 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65 54 61  case OP_CreateTa
2d860 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ble: {          
2d870 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74  /* out2 */.  int
2d880 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 66 6c 61   pgno;.  int fla
2d890 67 73 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  gs;.  Db *pDb;..
2d8a0 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65    pOut = out2Pre
2d8b0 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b  release(p, pOp);
2d8c0 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 61  .  pgno = 0;.  a
2d8d0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
2d8e0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
2d8f0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
2d900 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
2d910 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
2d920 70 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p1) );.  assert(
2d930 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
2d940 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
2d950 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  aDb[pOp->p1];.  
2d960 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74  assert( pDb->pBt
2d970 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  !=0 );.  if( pOp
2d980 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65  ->opcode==OP_Cre
2d990 61 74 65 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ateTable ){.    
2d9a0 2f 2a 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45  /* flags = BTREE
2d9b0 5f 49 4e 54 4b 45 59 3b 20 2a 2f 0a 20 20 20 20  _INTKEY; */.    
2d9c0 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 49 4e  flags = BTREE_IN
2d9d0 54 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TKEY;.  }else{. 
2d9e0 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45     flags = BTREE
2d9f0 5f 42 4c 4f 42 4b 45 59 3b 0a 20 20 7d 0a 20 20  _BLOBKEY;.  }.  
2da00 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2da10 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 44 62  eCreateTable(pDb
2da20 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 66 6c  ->pBt, &pgno, fl
2da30 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
2da40 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2da50 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75 74  to_error;.  pOut
2da60 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f 3b 0a 20 20  ->u.i = pgno;.  
2da70 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2da80 6f 64 65 3a 20 50 61 72 73 65 53 63 68 65 6d 61  ode: ParseSchema
2da90 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
2daa0 2a 2a 20 52 65 61 64 20 61 6e 64 20 70 61 72 73  ** Read and pars
2dab0 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 66 72  e all entries fr
2dac0 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  om the SQLITE_MA
2dad0 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 64 61  STER table of da
2dae0 74 61 62 61 73 65 20 50 31 0a 2a 2a 20 74 68 61  tabase P1.** tha
2daf0 74 20 6d 61 74 63 68 20 74 68 65 20 57 48 45 52  t match the WHER
2db00 45 20 63 6c 61 75 73 65 20 50 34 2e 20 0a 2a 2a  E clause P4. .**
2db10 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
2db20 69 6e 76 6f 6b 65 73 20 74 68 65 20 70 61 72 73  invokes the pars
2db30 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
2db40 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ew virtual machi
2db50 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 75 6e 73  ne,.** then runs
2db60 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c   the new virtual
2db70 20 6d 61 63 68 69 6e 65 2e 20 20 49 74 20 69 73   machine.  It is
2db80 20 74 68 75 73 20 61 20 72 65 2d 65 6e 74 72 61   thus a re-entra
2db90 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61  nt opcode..*/.ca
2dba0 73 65 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  se OP_ParseSchem
2dbb0 61 3a 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  a: {.  int iDb;.
2dbc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2dbd0 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  aster;.  char *z
2dbe0 53 71 6c 3b 0a 20 20 49 6e 69 74 44 61 74 61 20  Sql;.  InitData 
2dbf0 69 6e 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a 20  initData;..  /* 
2dc00 41 6e 79 20 70 72 65 70 61 72 65 64 20 73 74 61  Any prepared sta
2dc10 74 65 6d 65 6e 74 20 74 68 61 74 20 69 6e 76 6f  tement that invo
2dc20 6b 65 73 20 74 68 69 73 20 6f 70 63 6f 64 65 20  kes this opcode 
2dc30 77 69 6c 6c 20 68 6f 6c 64 20 6d 75 74 65 78 65  will hold mutexe
2dc40 73 0a 20 20 2a 2a 20 6f 6e 20 65 76 65 72 79 20  s.  ** on every 
2dc50 62 74 72 65 65 2e 20 20 54 68 69 73 20 69 73 20  btree.  This is 
2dc60 61 20 70 72 65 72 65 71 75 69 73 69 74 65 20 66  a prerequisite f
2dc70 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 0a 20 20 2a  or invoking .  *
2dc80 2a 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c  * sqlite3InitCal
2dc90 6c 62 61 63 6b 28 29 2e 0a 20 20 2a 2f 0a 23 69  lback()..  */.#i
2dca0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2dcb0 47 0a 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69  G.  for(iDb=0; i
2dcc0 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
2dcd0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2dce0 69 44 62 3d 3d 31 20 7c 7c 20 73 71 6c 69 74 65  iDb==1 || sqlite
2dcf0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2dd00 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
2dd10 74 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  t) );.  }.#endif
2dd20 0a 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70  ..  iDb = pOp->p
2dd30 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  1;.  assert( iDb
2dd40 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
2dd50 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
2dd60 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
2dd70 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61  , iDb, DB_Schema
2dd80 4c 6f 61 64 65 64 29 20 29 3b 0a 20 20 2f 2a 20  Loaded) );.  /* 
2dd90 55 73 65 64 20 74 6f 20 62 65 20 61 20 63 6f 6e  Used to be a con
2dda0 64 69 74 69 6f 6e 61 6c 20 2a 2f 20 7b 0a 20 20  ditional */ {.  
2ddb0 20 20 7a 4d 61 73 74 65 72 20 3d 20 4d 41 53 54    zMaster = MAST
2ddc0 45 52 5f 4e 41 4d 45 3b 0a 20 20 20 20 69 6e 69  ER_NAME;.    ini
2ddd0 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20  tData.db = db;. 
2dde0 20 20 20 69 6e 69 74 44 61 74 61 2e 69 44 62 20     initData.iDb 
2ddf0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 69  = pOp->p1;.    i
2de00 6e 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67  nitData.pzErrMsg
2de10 20 3d 20 26 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a   = &p->zErrMsg;.
2de20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2de30 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20 20  e3MPrintf(db,.  
2de40 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
2de50 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c  e, rootpage, sql
2de60 20 46 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48   FROM '%q'.%s WH
2de70 45 52 45 20 25 73 20 4f 52 44 45 52 20 42 59 20  ERE %s ORDER BY 
2de80 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 64  rowid",.       d
2de90 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
2dea0 4e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  Name, zMaster, p
2deb0 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69  Op->p4.z);.    i
2dec0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
2ded0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2dee0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2def0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2df00 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ert( db->init.bu
2df10 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 64  sy==0 );.      d
2df20 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 31  b->init.busy = 1
2df30 3b 0a 20 20 20 20 20 20 69 6e 69 74 44 61 74 61  ;.      initData
2df40 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  .rc = SQLITE_OK;
2df50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2df60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2df70 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
2df80 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2df90 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69  zSql, sqlite3Ini
2dfa0 74 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74  tCallback, &init
2dfb0 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20  Data, 0);.      
2dfc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dfd0 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44 61 74  K ) rc = initDat
2dfe0 61 2e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  a.rc;.      sqli
2dff0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
2e000 71 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  ql);.      db->i
2e010 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20  nit.busy = 0;.  
2e020 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
2e030 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
2e040 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
2e050 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
2e060 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e070 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
2e080 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
2e090 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 61 62     }.    goto ab
2e0a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2e0b0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20  ;.  }.  break;  
2e0c0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
2e0d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41  (SQLITE_OMIT_ANA
2e0e0 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a  LYZE)./* Opcode:
2e0f0 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20 50 31   LoadAnalysis P1
2e100 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52   * * * *.**.** R
2e110 65 61 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ead the sqlite_s
2e120 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72 20 64  tat1 table for d
2e130 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20 6c  atabase P1 and l
2e140 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  oad the content.
2e150 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  ** of that table
2e160 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 6e   into the intern
2e170 61 6c 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  al index hash ta
2e180 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ble.  This will 
2e190 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61  cause.** the ana
2e1a0 6c 79 73 69 73 20 74 6f 20 62 65 20 75 73 65 64  lysis to be used
2e1b0 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20   when preparing 
2e1c0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 71  all subsequent q
2e1d0 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20  ueries..*/.case 
2e1e0 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a  OP_LoadAnalysis:
2e1f0 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
2e200 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2e210 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
2e220 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c  rc = sqlite3Anal
2e230 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70  ysisLoad(db, pOp
2e240 2d 3e 70 31 29 3b 0a 20 20 69 66 28 20 72 63 20  ->p1);.  if( rc 
2e250 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2e260 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
2e270 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  ak;  .}.#endif /
2e280 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
2e290 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20  E_OMIT_ANALYZE) 
2e2a0 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  */../* Opcode: D
2e2b0 72 6f 70 54 61 62 6c 65 20 50 31 20 2a 20 2a 20  ropTable P1 * * 
2e2c0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
2e2d0 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
2e2e0 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
2e2f0 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
2e300 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
2e310 74 61 62 6c 65 20 6e 61 6d 65 64 20 50 34 20 69  table named P4 i
2e320 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20  n database P1.  
2e330 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
2e340 66 74 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20  fter a table.** 
2e350 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  is dropped from 
2e360 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20  disk (using the 
2e370 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 20  Destroy opcode) 
2e380 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
2e390 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61   .** the interna
2e3a0 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
2e3b0 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d   of the.** schem
2e3c0 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  a consistent wit
2e3d0 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
2e3e0 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72  k..*/.case OP_Dr
2e3f0 6f 70 54 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c  opTable: {.  sql
2e400 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2e410 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 4f 70  eteTable(db, pOp
2e420 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  ->p1, pOp->p4.z)
2e430 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2e440 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64   Opcode: DropInd
2e450 65 78 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  ex P1 * * P4 *.*
2e460 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2e470 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d  internal (in-mem
2e480 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74  ory) data struct
2e490 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
2e4a0 62 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  be.** the index 
2e4b0 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61  named P4 in data
2e4c0 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20 69  base P1.  This i
2e4d0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
2e4e0 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72  n index.** is dr
2e4f0 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20  opped from disk 
2e500 28 75 73 69 6e 67 20 74 68 65 20 44 65 73 74 72  (using the Destr
2e510 6f 79 20 6f 70 63 6f 64 65 29 0a 2a 2a 20 69 6e  oy opcode).** in
2e520 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
2e530 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
2e540 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2e550 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73  e.** schema cons
2e560 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74  istent with what
2e570 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a   is on disk..*/.
2e580 63 61 73 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65  case OP_DropInde
2e590 78 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e  x: {.  sqlite3Un
2e5a0 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2e5b0 65 78 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ex(db, pOp->p1, 
2e5c0 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72  pOp->p4.z);.  br
2e5d0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2e5e0 65 3a 20 44 72 6f 70 54 72 69 67 67 65 72 20 50  e: DropTrigger P
2e5f0 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
2e600 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65   Remove the inte
2e610 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29  rnal (in-memory)
2e620 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
2e630 20 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a   that describe.*
2e640 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61  * the trigger na
2e650 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61  med P4 in databa
2e660 73 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20  se P1.  This is 
2e670 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74  called after a t
2e680 72 69 67 67 65 72 0a 2a 2a 20 69 73 20 64 72 6f  rigger.** is dro
2e690 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28  pped from disk (
2e6a0 75 73 69 6e 67 20 74 68 65 20 44 65 73 74 72 6f  using the Destro
2e6b0 79 20 6f 70 63 6f 64 65 29 20 69 6e 20 6f 72 64  y opcode) in ord
2e6c0 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a 2a 20 74  er to keep .** t
2e6d0 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
2e6e0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2e6f0 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73  e.** schema cons
2e700 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74  istent with what
2e710 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a   is on disk..*/.
2e720 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 72 69 67  case OP_DropTrig
2e730 67 65 72 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  ger: {.  sqlite3
2e740 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
2e750 72 69 67 67 65 72 28 64 62 2c 20 70 4f 70 2d 3e  rigger(db, pOp->
2e760 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
2e770 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66    break;.}...#if
2e780 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e790 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2e7a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65  ./* Opcode: Inte
2e7b0 67 72 69 74 79 43 6b 20 50 31 20 50 32 20 50 33  grityCk P1 P2 P3
2e7c0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20   P4 P5.**.** Do 
2e7d0 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74  an analysis of t
2e7e0 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
2e7f0 6e 20 64 61 74 61 62 61 73 65 2e 20 20 53 74 6f  n database.  Sto
2e800 72 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65  re in.** registe
2e810 72 20 50 31 20 74 68 65 20 74 65 78 74 20 6f 66  r P1 the text of
2e820 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2e830 65 20 64 65 73 63 72 69 62 69 6e 67 20 61 6e 79  e describing any
2e840 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66   problems..** If
2e850 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72 65   no problems are
2e860 20 66 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61 20   found, store a 
2e870 4e 55 4c 4c 20 69 6e 20 72 65 67 69 73 74 65 72  NULL in register
2e880 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   P1..**.** The r
2e890 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61  egister P3 conta
2e8a0 69 6e 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ins the maximum 
2e8b0 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65  number of allowe
2e8c0 64 20 65 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20  d errors..** At 
2e8d0 6d 6f 73 74 20 72 65 67 28 50 33 29 20 65 72 72  most reg(P3) err
2e8e0 6f 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ors will be repo
2e8f0 72 74 65 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  rted..** In othe
2e900 72 20 77 6f 72 64 73 2c 20 74 68 65 20 61 6e 61  r words, the ana
2e910 6c 79 73 69 73 20 73 74 6f 70 73 20 61 73 20 73  lysis stops as s
2e920 6f 6f 6e 20 61 73 20 72 65 67 28 50 31 29 20 65  oon as reg(P1) e
2e930 72 72 6f 72 73 20 61 72 65 20 0a 2a 2a 20 73 65  rrors are .** se
2e940 65 6e 2e 20 20 52 65 67 28 50 31 29 20 69 73 20  en.  Reg(P1) is 
2e950 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
2e960 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2e970 73 20 72 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a  s remaining..**.
2e980 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
2e990 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20   numbers of all 
2e9a0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61  tables in the da
2e9b0 74 61 62 61 73 65 20 61 72 65 20 69 6e 74 65 67  tabase are integ
2e9c0 65 72 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ers.** stored in
2e9d0 20 50 34 5f 49 4e 54 41 52 52 41 59 20 61 72 67   P4_INTARRAY arg
2e9e0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
2e9f0 50 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P5 is not zero, 
2ea00 74 68 65 20 63 68 65 63 6b 20 69 73 20 64 6f 6e  the check is don
2ea10 65 20 6f 6e 20 74 68 65 20 61 75 78 69 6c 69 61  e on the auxilia
2ea20 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
2ea30 69 6c 65 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69  ile, not the mai
2ea40 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
2ea50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
2ea60 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  de is used to im
2ea70 70 6c 65 6d 65 6e 74 20 74 68 65 20 69 6e 74 65  plement the inte
2ea80 67 72 69 74 79 5f 63 68 65 63 6b 20 70 72 61 67  grity_check prag
2ea90 6d 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ma..*/.case OP_I
2eaa0 6e 74 65 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20  ntegrityCk: {.  
2eab0 69 6e 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20  int nRoot;      
2eac0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62  /* Number of tab
2ead0 6c 65 73 20 74 6f 20 63 68 65 63 6b 2e 20 20 28  les to check.  (
2eae0 4e 75 6d 62 65 72 20 6f 66 20 72 6f 6f 74 20 70  Number of root p
2eaf0 61 67 65 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20  ages.) */.  int 
2eb00 2a 61 52 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41  *aRoot;     /* A
2eb10 72 72 61 79 20 6f 66 20 72 6f 6f 74 70 61 67 65  rray of rootpage
2eb20 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 74 61 62   numbers for tab
2eb30 6c 65 73 20 74 6f 20 62 65 20 63 68 65 63 6b 65  les to be checke
2eb40 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b  d */.  int nErr;
2eb50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2eb60 20 6f 66 20 65 72 72 6f 72 73 20 72 65 70 6f 72   of errors repor
2eb70 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
2eb80 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74  ;        /* Text
2eb90 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 72 65   of the error re
2eba0 70 6f 72 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  port */.  Mem *p
2ebb0 6e 45 72 72 3b 20 20 20 20 20 2f 2a 20 52 65 67  nErr;     /* Reg
2ebc0 69 73 74 65 72 20 6b 65 65 70 69 6e 67 20 74 72  ister keeping tr
2ebd0 61 63 6b 20 6f 66 20 65 72 72 6f 72 73 20 72 65  ack of errors re
2ebe0 6d 61 69 6e 69 6e 67 20 2a 2f 0a 0a 20 20 61 73  maining */..  as
2ebf0 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
2ec00 65 72 20 29 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20  er );.  nRoot = 
2ec10 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 52 6f 6f 74  pOp->p2;.  aRoot
2ec20 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20   = pOp->p4.ai;. 
2ec30 20 61 73 73 65 72 74 28 20 6e 52 6f 6f 74 3e 30   assert( nRoot>0
2ec40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52   );.  assert( aR
2ec50 6f 6f 74 5b 6e 52 6f 6f 74 5d 3d 3d 30 20 29 3b  oot[nRoot]==0 );
2ec60 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2ec70 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
2ec80 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
2ec90 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
2eca0 6e 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  nErr = &aMem[pOp
2ecb0 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
2ecc0 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26   (pnErr->flags &
2ecd0 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
2ece0 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72    assert( (pnErr
2ecf0 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
2ed00 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  tr|MEM_Blob))==0
2ed10 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   );.  pIn1 = &aM
2ed20 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
2ed30 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64  ssert( pOp->p5<d
2ed40 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
2ed50 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  rt( DbMaskTest(p
2ed60 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70  ->btreeMask, pOp
2ed70 2d 3e 70 35 29 20 29 3b 0a 20 20 7a 20 3d 20 73  ->p5) );.  z = s
2ed80 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
2ed90 72 69 74 79 43 68 65 63 6b 28 64 62 2d 3e 61 44  rityCheck(db->aD
2eda0 62 5b 70 4f 70 2d 3e 70 35 5d 2e 70 42 74 2c 20  b[pOp->p5].pBt, 
2edb0 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 0a 20 20  aRoot, nRoot,.  
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2ede0 69 6e 74 29 70 6e 45 72 72 2d 3e 75 2e 69 2c 20  int)pnErr->u.i, 
2edf0 26 6e 45 72 72 29 3b 0a 20 20 70 6e 45 72 72 2d  &nErr);.  pnErr-
2ee00 3e 75 2e 69 20 2d 3d 20 6e 45 72 72 3b 0a 20 20  >u.i -= nErr;.  
2ee10 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
2ee20 74 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69  tNull(pIn1);.  i
2ee30 66 28 20 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  f( nErr==0 ){.  
2ee40 20 20 61 73 73 65 72 74 28 20 7a 3d 3d 30 20 29    assert( z==0 )
2ee50 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d  ;.  }else if( z=
2ee60 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e  =0 ){.    goto n
2ee70 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  o_mem;.  }else{.
2ee80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
2ee90 65 6d 53 65 74 53 74 72 28 70 49 6e 31 2c 20 7a  emSetStr(pIn1, z
2eea0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
2eeb0 38 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  8, sqlite3_free)
2eec0 3b 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d  ;.  }.  UPDATE_M
2eed0 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31  AX_BLOBSIZE(pIn1
2eee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2eef0 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
2ef00 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  In1, encoding);.
2ef10 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
2ef20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2ef30 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2ef40 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20   */../* Opcode: 
2ef50 52 6f 77 53 65 74 41 64 64 20 50 31 20 50 32 20  RowSetAdd P1 P2 
2ef60 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
2ef70 73 3a 20 72 6f 77 73 65 74 28 50 31 29 3d 72 5b  s: rowset(P1)=r[
2ef80 50 32 5d 0a 2a 2a 0a 2a 2a 20 49 6e 73 65 72 74  P2].**.** Insert
2ef90 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
2efa0 75 65 20 68 65 6c 64 20 62 79 20 72 65 67 69 73  ue held by regis
2efb0 74 65 72 20 50 32 20 69 6e 74 6f 20 61 20 62 6f  ter P2 into a bo
2efc0 6f 6c 65 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 68  olean index.** h
2efd0 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  eld in register 
2efe0 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 73 73  P1..**.** An ass
2eff0 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
2f000 50 32 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  P2 is not an int
2f010 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  eger..*/.case OP
2f020 5f 52 6f 77 53 65 74 41 64 64 3a 20 7b 20 20 20  _RowSetAdd: {   
2f030 20 20 20 20 2f 2a 20 69 6e 31 2c 20 69 6e 32 20      /* in1, in2 
2f040 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
2f050 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
2f060 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
2f070 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  p2];.  assert( (
2f080 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn2->flags & ME
2f090 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 69  M_Int)!=0 );.  i
2f0a0 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
2f0b0 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
2f0c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2f0d0 64 62 65 4d 65 6d 53 65 74 52 6f 77 53 65 74 28  dbeMemSetRowSet(
2f0e0 70 49 6e 31 29 3b 0a 20 20 20 20 69 66 28 20 28  pIn1);.    if( (
2f0f0 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
2f100 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 20 67  M_RowSet)==0 ) g
2f110 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a  oto no_mem;.  }.
2f120 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49    sqlite3RowSetI
2f130 6e 73 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70 52  nsert(pIn1->u.pR
2f140 6f 77 53 65 74 2c 20 70 49 6e 32 2d 3e 75 2e 69  owSet, pIn2->u.i
2f150 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
2f160 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74  * Opcode: RowSet
2f170 52 65 61 64 20 50 31 20 50 32 20 50 33 20 2a 20  Read P1 P2 P3 * 
2f180 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
2f190 5b 50 33 5d 3d 72 6f 77 73 65 74 28 50 31 29 0a  [P3]=rowset(P1).
2f1a0 2a 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 74 68  **.** Extract th
2f1b0 65 20 73 6d 61 6c 6c 65 73 74 20 76 61 6c 75 65  e smallest value
2f1c0 20 66 72 6f 6d 20 62 6f 6f 6c 65 61 6e 20 69 6e   from boolean in
2f1d0 64 65 78 20 50 31 20 61 6e 64 20 70 75 74 20 74  dex P1 and put t
2f1e0 68 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 0a 2a  hat value into.*
2f1f0 2a 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 20  * register P3.  
2f200 4f 72 2c 20 69 66 20 62 6f 6f 6c 65 61 6e 20 69  Or, if boolean i
2f210 6e 64 65 78 20 50 31 20 69 73 20 69 6e 69 74 69  ndex P1 is initi
2f220 61 6c 6c 79 20 65 6d 70 74 79 2c 20 6c 65 61 76  ally empty, leav
2f230 65 20 50 33 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  e P3.** unchange
2f240 64 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 69 6e  d and jump to in
2f250 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f  struction P2..*/
2f260 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 52  .case OP_RowSetR
2f270 65 61 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  ead: {       /* 
2f280 6a 75 6d 70 2c 20 69 6e 31 2c 20 6f 75 74 33 20  jump, in1, out3 
2f290 2a 2f 0a 20 20 69 36 34 20 76 61 6c 3b 0a 0a 20  */.  i64 val;.. 
2f2a0 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
2f2b0 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28 70  p->p1];.  if( (p
2f2c0 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
2f2d0 5f 52 6f 77 53 65 74 29 3d 3d 30 20 0a 20 20 20  _RowSet)==0 .   
2f2e0 7c 7c 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74  || sqlite3RowSet
2f2f0 4e 65 78 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f  Next(pIn1->u.pRo
2f300 77 53 65 74 2c 20 26 76 61 6c 29 3d 3d 30 0a 20  wSet, &val)==0. 
2f310 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62   ){.    /* The b
2f320 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 69 73 20  oolean index is 
2f330 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 73 71 6c  empty */.    sql
2f340 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
2f350 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 20 20 56 64  ll(pIn1);.    Vd
2f360 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c  beBranchTaken(1,
2f370 32 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d  2);.    goto jum
2f380 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63  p_to_p2_and_chec
2f390 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b  k_for_interrupt;
2f3a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2f3b0 20 41 20 76 61 6c 75 65 20 77 61 73 20 70 75 6c   A value was pul
2f3c0 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  led from the ind
2f3d0 65 78 20 2a 2f 0a 20 20 20 20 56 64 62 65 42 72  ex */.    VdbeBr
2f3e0 61 6e 63 68 54 61 6b 65 6e 28 30 2c 32 29 3b 0a  anchTaken(0,2);.
2f3f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
2f400 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d  emSetInt64(&aMem
2f410 5b 70 4f 70 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b  [pOp->p3], val);
2f420 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 63 68 65 63  .  }.  goto chec
2f430 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b  k_for_interrupt;
2f440 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
2f450 6f 77 53 65 74 54 65 73 74 20 50 31 20 50 32 20  owSetTest P1 P2 
2f460 50 33 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69  P3 P4.** Synopsi
2f470 73 3a 20 69 66 20 72 5b 50 33 5d 20 69 6e 20 72  s: if r[P3] in r
2f480 6f 77 73 65 74 28 50 31 29 20 67 6f 74 6f 20 50  owset(P1) goto P
2f490 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  2.**.** Register
2f4a0 20 50 33 20 69 73 20 61 73 73 75 6d 65 64 20 74   P3 is assumed t
2f4b0 6f 20 68 6f 6c 64 20 61 20 36 34 2d 62 69 74 20  o hold a 64-bit 
2f4c0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 49  integer value. I
2f4d0 66 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a  f register P1.**
2f4e0 20 63 6f 6e 74 61 69 6e 73 20 61 20 52 6f 77 53   contains a RowS
2f4f0 65 74 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  et object and th
2f500 61 74 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  at RowSet object
2f510 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
2f520 20 76 61 6c 75 65 20 68 65 6c 64 20 69 6e 20 50   value held in P
2f530 33 2c 20 6a 75 6d 70 20 74 6f 20 72 65 67 69 73  3, jump to regis
2f540 74 65 72 20 50 32 2e 20 4f 74 68 65 72 77 69 73  ter P2. Otherwis
2f550 65 2c 20 69 6e 73 65 72 74 20 74 68 65 0a 2a 2a  e, insert the.**
2f560 20 69 6e 74 65 67 65 72 20 69 6e 20 50 33 20 69   integer in P3 i
2f570 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 20 61  nto the RowSet a
2f580 6e 64 20 63 6f 6e 74 69 6e 75 65 20 6f 6e 20 74  nd continue on t
2f590 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 70  o the.** next op
2f5a0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
2f5b0 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 69 73  RowSet object is
2f5c0 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 74   optimized for t
2f5d0 68 65 20 63 61 73 65 20 77 68 65 72 65 20 73 75  he case where su
2f5e0 63 63 65 73 73 69 76 65 20 73 65 74 73 0a 2a 2a  ccessive sets.**
2f5f0 20 6f 66 20 69 6e 74 65 67 65 72 73 2c 20 77 68   of integers, wh
2f600 65 72 65 20 65 61 63 68 20 73 65 74 20 63 6f 6e  ere each set con
2f610 74 61 69 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61  tains no duplica
2f620 74 65 73 2e 20 45 61 63 68 20 73 65 74 0a 2a 2a  tes. Each set.**
2f630 20 6f 66 20 76 61 6c 75 65 73 20 69 73 20 69 64   of values is id
2f640 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 75 6e  entified by a un
2f650 69 71 75 65 20 50 34 20 76 61 6c 75 65 2e 20 54  ique P4 value. T
2f660 68 65 20 66 69 72 73 74 20 73 65 74 0a 2a 2a 20  he first set.** 
2f670 6d 75 73 74 20 68 61 76 65 20 50 34 3d 3d 30 2c  must have P4==0,
2f680 20 74 68 65 20 66 69 6e 61 6c 20 73 65 74 20 50   the final set P
2f690 34 3d 2d 31 2e 20 20 50 34 20 6d 75 73 74 20 62  4=-1.  P4 must b
2f6a0 65 20 65 69 74 68 65 72 20 2d 31 20 6f 72 0a 2a  e either -1 or.*
2f6b0 2a 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20  * non-negative. 
2f6c0 20 46 6f 72 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   For non-negativ
2f6d0 65 20 76 61 6c 75 65 73 20 6f 66 20 50 34 20 6f  e values of P4 o
2f6e0 6e 6c 79 20 74 68 65 20 6c 6f 77 65 72 20 34 0a  nly the lower 4.
2f6f0 2a 2a 20 62 69 74 73 20 61 72 65 20 73 69 67 6e  ** bits are sign
2f700 69 66 69 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  ificant..**.** T
2f710 68 69 73 20 61 6c 6c 6f 77 73 20 6f 70 74 69 6d  his allows optim
2f720 69 7a 61 74 69 6f 6e 73 3a 20 28 61 29 20 77 68  izations: (a) wh
2f730 65 6e 20 50 34 3d 3d 30 20 74 68 65 72 65 20 69  en P4==0 there i
2f740 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73  s no need to tes
2f750 74 0a 2a 2a 20 74 68 65 20 72 6f 77 73 65 74 20  t.** the rowset 
2f760 6f 62 6a 65 63 74 20 66 6f 72 20 50 33 2c 20 61  object for P3, a
2f770 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  s it is guarante
2f780 65 64 20 6e 6f 74 20 74 6f 20 63 6f 6e 74 61 69  ed not to contai
2f790 6e 20 69 74 2c 0a 2a 2a 20 28 62 29 20 77 68 65  n it,.** (b) whe
2f7a0 6e 20 50 34 3d 3d 2d 31 20 74 68 65 72 65 20 69  n P4==-1 there i
2f7b0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 73  s no need to ins
2f7c0 65 72 74 20 74 68 65 20 76 61 6c 75 65 2c 20 61  ert the value, a
2f7d0 73 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 6e 65 76  s it will.** nev
2f7e0 65 72 20 62 65 20 74 65 73 74 65 64 20 66 6f 72  er be tested for
2f7f0 2c 20 61 6e 64 20 28 63 29 20 77 68 65 6e 20 61  , and (c) when a
2f800 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 70   value that is p
2f810 61 72 74 20 6f 66 20 73 65 74 20 58 20 69 73 0a  art of set X is.
2f820 2a 2a 20 69 6e 73 65 72 74 65 64 2c 20 74 68 65  ** inserted, the
2f830 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
2f840 20 73 65 61 72 63 68 20 74 6f 20 73 65 65 20 69   search to see i
2f850 66 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  f the same value
2f860 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73   was.** previous
2f870 6c 79 20 69 6e 73 65 72 74 65 64 20 61 73 20 70  ly inserted as p
2f880 61 72 74 20 6f 66 20 73 65 74 20 58 20 28 6f 6e  art of set X (on
2f890 6c 79 20 69 66 20 69 74 20 77 61 73 20 70 72 65  ly if it was pre
2f8a0 76 69 6f 75 73 6c 79 0a 2a 2a 20 69 6e 73 65 72  viously.** inser
2f8b0 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73  ted as part of s
2f8c0 6f 6d 65 20 6f 74 68 65 72 20 73 65 74 29 2e 0a  ome other set)..
2f8d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65  */.case OP_RowSe
2f8e0 74 54 65 73 74 3a 20 7b 20 20 20 20 20 20 20 20  tTest: {        
2f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f900 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
2f910 2f 0a 20 20 69 6e 74 20 69 53 65 74 3b 0a 20 20  /.  int iSet;.  
2f920 69 6e 74 20 65 78 69 73 74 73 3b 0a 0a 20 20 70  int exists;..  p
2f930 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
2f940 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26  >p1];.  pIn3 = &
2f950 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
2f960 20 69 53 65 74 20 3d 20 70 4f 70 2d 3e 70 34 2e   iSet = pOp->p4.
2f970 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  i;.  assert( pIn
2f980 33 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  3->flags&MEM_Int
2f990 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2f9a0 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f  re is anything o
2f9b0 74 68 65 72 20 74 68 61 6e 20 61 20 72 6f 77 73  ther than a rows
2f9c0 65 74 20 6f 62 6a 65 63 74 20 69 6e 20 6d 65 6d  et object in mem
2f9d0 6f 72 79 20 63 65 6c 6c 20 50 31 2c 0a 20 20 2a  ory cell P1,.  *
2f9e0 2a 20 64 65 6c 65 74 65 20 69 74 20 6e 6f 77 20  * delete it now 
2f9f0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 50  and initialize P
2fa00 31 20 77 69 74 68 20 61 6e 20 65 6d 70 74 79 20  1 with an empty 
2fa10 72 6f 77 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66  rowset.  */.  if
2fa20 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
2fa30 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
2fa40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2fa50 62 65 4d 65 6d 53 65 74 52 6f 77 53 65 74 28 70  beMemSetRowSet(p
2fa60 49 6e 31 29 3b 0a 20 20 20 20 69 66 28 20 28 70  In1);.    if( (p
2fa70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
2fa80 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 20 67 6f  _RowSet)==0 ) go
2fa90 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a  to no_mem;.  }..
2faa0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2fab0 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
2fac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 65  );.  assert( iSe
2fad0 74 3d 3d 2d 31 20 7c 7c 20 69 53 65 74 3e 3d 30  t==-1 || iSet>=0
2fae0 20 29 3b 0a 20 20 69 66 28 20 69 53 65 74 20 29   );.  if( iSet )
2faf0 7b 0a 20 20 20 20 65 78 69 73 74 73 20 3d 20 73  {.    exists = s
2fb00 71 6c 69 74 65 33 52 6f 77 53 65 74 54 65 73 74  qlite3RowSetTest
2fb10 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74  (pIn1->u.pRowSet
2fb20 2c 20 69 53 65 74 2c 20 70 49 6e 33 2d 3e 75 2e  , iSet, pIn3->u.
2fb30 69 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  i);.    VdbeBran
2fb40 63 68 54 61 6b 65 6e 28 65 78 69 73 74 73 21 3d  chTaken(exists!=
2fb50 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 65 78  0,2);.    if( ex
2fb60 69 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70  ists ) goto jump
2fb70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 69 66  _to_p2;.  }.  if
2fb80 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20  ( iSet>=0 ){.   
2fb90 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e   sqlite3RowSetIn
2fba0 73 65 72 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f  sert(pIn1->u.pRo
2fbb0 77 53 65 74 2c 20 70 49 6e 33 2d 3e 75 2e 69 29  wSet, pIn3->u.i)
2fbc0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
2fbd0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2fbe0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a  E_OMIT_TRIGGER..
2fbf0 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 6f 67 72  /* Opcode: Progr
2fc00 61 6d 20 50 31 20 50 32 20 50 33 20 50 34 20 50  am P1 P2 P3 P4 P
2fc10 35 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  5.**.** Execute 
2fc20 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
2fc30 72 61 6d 20 70 61 73 73 65 64 20 61 73 20 50 34  ram passed as P4
2fc40 20 28 74 79 70 65 20 50 34 5f 53 55 42 50 52 4f   (type P4_SUBPRO
2fc50 47 52 41 4d 29 2e 20 0a 2a 2a 0a 2a 2a 20 50 31  GRAM). .**.** P1
2fc60 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64   contains the ad
2fc70 64 72 65 73 73 20 6f 66 20 74 68 65 20 6d 65 6d  dress of the mem
2fc80 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63 6f  ory cell that co
2fc90 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74  ntains the first
2fca0 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
2fcb0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
2fcc0 76 61 6c 75 65 73 20 75 73 65 64 20 61 73 20 61  values used as a
2fcd0 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
2fce0 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 50 32 20  sub-program. P2 
2fcf0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
2fd00 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70   address to jump
2fd10 20 74 6f 20 69 66 20 74 68 65 20 73 75 62 2d 70   to if the sub-p
2fd20 72 6f 67 72 61 6d 20 74 68 72 6f 77 73 20 61 6e  rogram throws an
2fd30 20 49 47 4e 4f 52 45 20 0a 2a 2a 20 65 78 63 65   IGNORE .** exce
2fd40 70 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20  ption using the 
2fd50 52 41 49 53 45 28 29 20 66 75 6e 63 74 69 6f 6e  RAISE() function
2fd60 2e 20 52 65 67 69 73 74 65 72 20 50 33 20 63 6f  . Register P3 co
2fd70 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65  ntains the addre
2fd80 73 73 20 0a 2a 2a 20 6f 66 20 61 20 6d 65 6d 6f  ss .** of a memo
2fd90 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 69 73 20  ry cell in this 
2fda0 28 74 68 65 20 70 61 72 65 6e 74 29 20 56 4d 20  (the parent) VM 
2fdb0 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20  that is used to 
2fdc0 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 0a 2a 2a  allocate the .**
2fdd0 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
2fde0 20 62 79 20 74 68 65 20 73 75 62 2d 76 64 62 65   by the sub-vdbe
2fdf0 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 0a   at runtime..**.
2fe00 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
2fe10 65 72 20 74 6f 20 74 68 65 20 56 4d 20 63 6f 6e  er to the VM con
2fe20 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67  taining the trig
2fe30 67 65 72 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  ger program..**.
2fe40 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d  ** If P5 is non-
2fe50 7a 65 72 6f 2c 20 74 68 65 6e 20 72 65 63 75 72  zero, then recur
2fe60 73 69 76 65 20 70 72 6f 67 72 61 6d 20 69 6e 76  sive program inv
2fe70 6f 63 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ocation is enabl
2fe80 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  ed..*/.case OP_P
2fe90 72 6f 67 72 61 6d 3a 20 7b 20 20 20 20 20 20 20  rogram: {       
2fea0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e   /* jump */.  in
2feb0 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
2fec0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2fed0 6f 66 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  of memory regist
2fee0 65 72 73 20 66 6f 72 20 73 75 62 2d 70 72 6f 67  ers for sub-prog
2fef0 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ram */.  int nBy
2ff00 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2ff10 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 72 75 6e   /* Bytes of run
2ff20 74 69 6d 65 20 73 70 61 63 65 20 72 65 71 75 69  time space requi
2ff30 72 65 64 20 66 6f 72 20 73 75 62 2d 70 72 6f 67  red for sub-prog
2ff40 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52  ram */.  Mem *pR
2ff50 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2ff60 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20   /* Register to 
2ff70 61 6c 6c 6f 63 61 74 65 20 72 75 6e 74 69 6d 65  allocate runtime
2ff80 20 73 70 61 63 65 20 2a 2f 0a 20 20 4d 65 6d 20   space */.  Mem 
2ff90 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pMem;          
2ffa0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
2ffb0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6d  terate through m
2ffc0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f 0a 20  emory cells */. 
2ffd0 20 4d 65 6d 20 2a 70 45 6e 64 3b 20 20 20 20 20   Mem *pEnd;     
2ffe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
2fff0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
30000 6e 65 77 20 61 72 72 61 79 20 2a 2f 0a 20 20 56  new array */.  V
30010 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
30020 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76 64  ;      /* New vd
30030 62 65 20 66 72 61 6d 65 20 74 6f 20 65 78 65 63  be frame to exec
30040 75 74 65 20 69 6e 20 2a 2f 0a 20 20 53 75 62 50  ute in */.  SubP
30050 72 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72 61 6d  rogram *pProgram
30060 3b 20 20 20 2f 2a 20 53 75 62 2d 70 72 6f 67 72  ;   /* Sub-progr
30070 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f  am to execute */
30080 0a 20 20 76 6f 69 64 20 2a 74 3b 20 20 20 20 20  .  void *t;     
30090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
300a0 6b 65 6e 20 69 64 65 6e 74 69 66 79 69 6e 67 20  ken identifying 
300b0 74 72 69 67 67 65 72 20 2a 2f 0a 0a 20 20 70 50  trigger */..  pP
300c0 72 6f 67 72 61 6d 20 3d 20 70 4f 70 2d 3e 70 34  rogram = pOp->p4
300d0 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 52 74  .pProgram;.  pRt
300e0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
300f0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  ];.  assert( pPr
30100 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  ogram->nOp>0 );.
30110 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70    .  /* If the p
30120 35 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  5 flag is clear,
30130 20 74 68 65 6e 20 72 65 63 75 72 73 69 76 65 20   then recursive 
30140 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 72  invocation of tr
30150 69 67 67 65 72 73 20 69 73 20 0a 20 20 2a 2a 20  iggers is .  ** 
30160 64 69 73 61 62 6c 65 64 20 66 6f 72 20 62 61 63  disabled for bac
30170 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
30180 6c 69 74 79 20 28 70 35 20 69 73 20 73 65 74 20  lity (p5 is set 
30190 69 66 20 74 68 69 73 20 73 75 62 2d 70 72 6f 67  if this sub-prog
301a0 72 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65 61 6c  ram.  ** is real
301b0 6c 79 20 61 20 74 72 69 67 67 65 72 2c 20 6e 6f  ly a trigger, no
301c0 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  t a foreign key 
301d0 61 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 20  action, and the 
301e0 66 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20 61 6e  flag set.  ** an
301f0 64 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65  d cleared by the
30200 20 22 50 52 41 47 4d 41 20 72 65 63 75 72 73 69   "PRAGMA recursi
30210 76 65 5f 74 72 69 67 67 65 72 73 22 20 63 6f 6d  ve_triggers" com
30220 6d 61 6e 64 20 69 73 20 63 6c 65 61 72 29 2e 0a  mand is clear)..
30230 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20 69 73    ** .  ** It is
30240 20 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63   recursive invoc
30250 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 72  ation of trigger
30260 73 2c 20 61 74 20 74 68 65 20 53 51 4c 20 6c 65  s, at the SQL le
30270 76 65 6c 2c 20 74 68 61 74 20 69 73 20 0a 20 20  vel, that is .  
30280 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 49 6e 20  ** disabled. In 
30290 73 6f 6d 65 20 63 61 73 65 73 20 61 20 73 69 6e  some cases a sin
302a0 67 6c 65 20 74 72 69 67 67 65 72 20 6d 61 79 20  gle trigger may 
302b0 67 65 6e 65 72 61 74 65 20 6d 6f 72 65 20 74 68  generate more th
302c0 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53 75 62  an one .  ** Sub
302d0 50 72 6f 67 72 61 6d 20 28 69 66 20 74 68 65 20  Program (if the 
302e0 74 72 69 67 67 65 72 20 6d 61 79 20 62 65 20 65  trigger may be e
302f0 78 65 63 75 74 65 64 20 77 69 74 68 20 6d 6f 72  xecuted with mor
30300 65 20 74 68 61 6e 20 6f 6e 65 20 64 69 66 66 65  e than one diffe
30310 72 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20 43 4f  rent .  ** ON CO
30320 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68 6d  NFLICT algorithm
30330 29 2e 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74  ). SubProgram st
30340 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
30350 74 65 64 20 77 69 74 68 20 61 0a 20 20 2a 2a 20  ted with a.  ** 
30360 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20 61  single trigger a
30370 6c 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ll have the same
30380 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 53   value for the S
30390 75 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e 20  ubProgram.token 
303a0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  .  ** variable. 
303b0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   */.  if( pOp->p
303c0 35 20 29 7b 0a 20 20 20 20 74 20 3d 20 70 50 72  5 ){.    t = pPr
303d0 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  ogram->token;.  
303e0 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
303f0 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 20 26  pFrame; pFrame &
30400 26 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 21  & pFrame->token!
30410 3d 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  =t; pFrame=pFram
30420 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
30430 20 69 66 28 20 70 46 72 61 6d 65 20 29 20 62 72   if( pFrame ) br
30440 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
30450 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e 61  p->nFrame>=db->a
30460 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
30470 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
30480 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ] ){.    rc = SQ
30490 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
304a0 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
304b0 28 70 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65  (p, "too many le
304c0 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20  vels of trigger 
304d0 72 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20  recursion");.   
304e0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
304f0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  to_error;.  }.. 
30500 20 2f 2a 20 52 65 67 69 73 74 65 72 20 70 52 74   /* Register pRt
30510 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
30520 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71  e the memory req
30530 75 69 72 65 64 20 74 6f 20 73 61 76 65 20 74 68  uired to save th
30540 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
30550 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 67  the current prog
30560 72 61 6d 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d  ram, and the mem
30570 6f 72 79 20 72 65 71 75 69 72 65 64 20 61 74 20  ory required at 
30580 72 75 6e 74 69 6d 65 20 74 6f 20 65 78 65 63 75  runtime to execu
30590 74 65 0a 20 20 2a 2a 20 74 68 65 20 74 72 69 67  te.  ** the trig
305a0 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66 20  ger program. If 
305b0 74 68 69 73 20 74 72 69 67 67 65 72 20 68 61 73  this trigger has
305c0 20 62 65 65 6e 20 66 69 72 65 64 20 62 65 66 6f   been fired befo
305d0 72 65 2c 20 74 68 65 6e 20 70 52 74 20 0a 20 20  re, then pRt .  
305e0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 61 6c  ** is already al
305f0 6c 6f 63 61 74 65 64 2e 20 4f 74 68 65 72 77 69  located. Otherwi
30600 73 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 69  se, it must be i
30610 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
30620 20 20 69 66 28 20 28 70 52 74 2d 3e 66 6c 61 67    if( (pRt->flag
30630 73 26 4d 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20  s&MEM_Frame)==0 
30640 29 7b 0a 20 20 20 20 2f 2a 20 53 75 62 50 72 6f  ){.    /* SubPro
30650 67 72 61 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74  gram.nMem is set
30660 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
30670 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75  f memory cells u
30680 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 20 20  sed by the .    
30690 2a 2a 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  ** program store
306a0 64 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e  d in SubProgram.
306b0 61 4f 70 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  aOp. As well as 
306c0 74 68 65 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72  these, one memor
306d0 79 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73  y.    ** cell is
306e0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
306f0 63 68 20 63 75 72 73 6f 72 20 75 73 65 64 20 62  ch cursor used b
30700 79 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 53  y the program. S
30710 65 74 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  et local.    ** 
30720 76 61 72 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61  variable nMem (a
30730 6e 64 20 6c 61 74 65 72 2c 20 56 64 62 65 46 72  nd later, VdbeFr
30740 61 6d 65 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74  ame.nChildMem) t
30750 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 0a 20 20  o this value..  
30760 20 20 2a 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20    */.    nMem = 
30770 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b  pProgram->nMem +
30780 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b   pProgram->nCsr;
30790 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4d 65  .    assert( nMe
307a0 6d 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  m>0 );.    if( p
307b0 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30  Program->nCsr==0
307c0 20 29 20 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 6e   ) nMem++;.    n
307d0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
307e0 7a 65 6f 66 28 56 64 62 65 46 72 61 6d 65 29 29  zeof(VdbeFrame))
307f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b  .              +
30800 20 6e 4d 65 6d 20 2a 20 73 69 7a 65 6f 66 28 4d   nMem * sizeof(M
30810 65 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  em).            
30820 20 20 2b 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43    + pProgram->nC
30830 73 72 20 2a 20 73 69 7a 65 6f 66 28 56 64 62 65  sr * sizeof(Vdbe
30840 43 75 72 73 6f 72 20 2a 29 3b 0a 20 20 20 20 70  Cursor *);.    p
30850 46 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  Frame = sqlite3D
30860 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
30870 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
30880 21 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20  !pFrame ){.     
30890 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
308a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
308b0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52  dbeMemRelease(pR
308c0 74 29 3b 0a 20 20 20 20 70 52 74 2d 3e 66 6c 61  t);.    pRt->fla
308d0 67 73 20 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b 0a  gs = MEM_Frame;.
308e0 20 20 20 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d      pRt->u.pFram
308f0 65 20 3d 20 70 46 72 61 6d 65 3b 0a 0a 20 20 20  e = pFrame;..   
30900 20 70 46 72 61 6d 65 2d 3e 76 20 3d 20 70 3b 0a   pFrame->v = p;.
30910 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69      pFrame->nChi
30920 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20  ldMem = nMem;.  
30930 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64    pFrame->nChild
30940 43 73 72 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  Csr = pProgram->
30950 6e 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d 65  nCsr;.    pFrame
30960 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70  ->pc = (int)(pOp
30970 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 70 46 72   - aOp);.    pFr
30980 61 6d 65 2d 3e 61 4d 65 6d 20 3d 20 70 2d 3e 61  ame->aMem = p->a
30990 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  Mem;.    pFrame-
309a0 3e 6e 4d 65 6d 20 3d 20 70 2d 3e 6e 4d 65 6d 3b  >nMem = p->nMem;
309b0 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 70 43  .    pFrame->apC
309c0 73 72 20 3d 20 70 2d 3e 61 70 43 73 72 3b 0a 20  sr = p->apCsr;. 
309d0 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73     pFrame->nCurs
309e0 6f 72 20 3d 20 70 2d 3e 6e 43 75 72 73 6f 72 3b  or = p->nCursor;
309f0 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 4f 70  .    pFrame->aOp
30a00 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 70   = p->aOp;.    p
30a10 46 72 61 6d 65 2d 3e 6e 4f 70 20 3d 20 70 2d 3e  Frame->nOp = p->
30a20 6e 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  nOp;.    pFrame-
30a30 3e 74 6f 6b 65 6e 20 3d 20 70 50 72 6f 67 72 61  >token = pProgra
30a40 6d 2d 3e 74 6f 6b 65 6e 3b 0a 23 69 66 64 65 66  m->token;.#ifdef
30a50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
30a60 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
30a70 20 20 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65     pFrame->anExe
30a80 63 20 3d 20 70 2d 3e 61 6e 45 78 65 63 3b 0a 23  c = p->anExec;.#
30a90 65 6e 64 69 66 0a 0a 20 20 20 20 70 45 6e 64 20  endif..    pEnd 
30aa0 3d 20 26 56 64 62 65 46 72 61 6d 65 4d 65 6d 28  = &VdbeFrameMem(
30ab0 70 46 72 61 6d 65 29 5b 70 46 72 61 6d 65 2d 3e  pFrame)[pFrame->
30ac0 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20 20  nChildMem];.    
30ad0 66 6f 72 28 70 4d 65 6d 3d 56 64 62 65 46 72 61  for(pMem=VdbeFra
30ae0 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 20 70  meMem(pFrame); p
30af0 4d 65 6d 21 3d 70 45 6e 64 3b 20 70 4d 65 6d 2b  Mem!=pEnd; pMem+
30b00 2b 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  +){.      pMem->
30b10 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65  flags = MEM_Unde
30b20 66 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 4d 65  fined;.      pMe
30b30 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  m->db = db;.    
30b40 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
30b50 46 72 61 6d 65 20 3d 20 70 52 74 2d 3e 75 2e 70  Frame = pRt->u.p
30b60 46 72 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72  Frame;.    asser
30b70 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65  t( pProgram->nMe
30b80 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72  m+pProgram->nCsr
30b90 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  ==pFrame->nChild
30ba0 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  Mem .        || 
30bb0 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d  (pProgram->nCsr=
30bc0 3d 30 20 26 26 20 70 50 72 6f 67 72 61 6d 2d 3e  =0 && pProgram->
30bd0 6e 4d 65 6d 2b 31 3d 3d 70 46 72 61 6d 65 2d 3e  nMem+1==pFrame->
30be0 6e 43 68 69 6c 64 4d 65 6d 29 20 29 3b 0a 20 20  nChildMem) );.  
30bf0 20 20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72    assert( pProgr
30c00 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65  am->nCsr==pFrame
30c10 2d 3e 6e 43 68 69 6c 64 43 73 72 20 29 3b 0a 20  ->nChildCsr );. 
30c20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29     assert( (int)
30c30 28 70 4f 70 20 2d 20 61 4f 70 29 3d 3d 70 46 72  (pOp - aOp)==pFr
30c40 61 6d 65 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a  ame->pc );.  }..
30c50 20 20 70 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20    p->nFrame++;. 
30c60 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
30c70 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20   = p->pFrame;.  
30c80 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
30c90 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  d = db->lastRowi
30ca0 64 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68  d;.  pFrame->nCh
30cb0 61 6e 67 65 20 3d 20 70 2d 3e 6e 43 68 61 6e 67  ange = p->nChang
30cc0 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 44 62  e;.  pFrame->nDb
30cd0 43 68 61 6e 67 65 20 3d 20 70 2d 3e 64 62 2d 3e  Change = p->db->
30ce0 6e 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72  nChange;.  asser
30cf0 74 28 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44  t( pFrame->pAuxD
30d00 61 74 61 3d 3d 30 20 29 3b 0a 20 20 70 46 72 61  ata==0 );.  pFra
30d10 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70  me->pAuxData = p
30d20 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 2d  ->pAuxData;.  p-
30d30 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20  >pAuxData = 0;. 
30d40 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
30d50 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70  .  p->pFrame = p
30d60 46 72 61 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d  Frame;.  p->aMem
30d70 20 3d 20 61 4d 65 6d 20 3d 20 56 64 62 65 46 72   = aMem = VdbeFr
30d80 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 0a  ameMem(pFrame);.
30d90 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    p->nMem = pFra
30da0 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a 20  me->nChildMem;. 
30db0 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
30dc0 31 36 29 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c  16)pFrame->nChil
30dd0 64 43 73 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72  dCsr;.  p->apCsr
30de0 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
30df0 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d  *)&aMem[p->nMem]
30e00 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 61 4f 70  ;.  p->aOp = aOp
30e10 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 61 4f 70   = pProgram->aOp
30e20 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d 20 70 50 72  ;.  p->nOp = pPr
30e30 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 23 69 66 64  ogram->nOp;.#ifd
30e40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
30e50 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
30e60 0a 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 30  .  p->anExec = 0
30e70 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4f 70 20 3d  ;.#endif.  pOp =
30e80 20 26 61 4f 70 5b 2d 31 5d 3b 0a 0a 20 20 62 72   &aOp[-1];..  br
30e90 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
30ea0 65 3a 20 50 61 72 61 6d 20 50 31 20 50 32 20 2a  e: Param P1 P2 *
30eb0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   * *.**.** This 
30ec0 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65  opcode is only e
30ed0 76 65 72 20 70 72 65 73 65 6e 74 20 69 6e 20 73  ver present in s
30ee0 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 61 6c 6c  ub-programs call
30ef0 65 64 20 76 69 61 20 74 68 65 20 0a 2a 2a 20 4f  ed via the .** O
30f00 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74 72 75  P_Program instru
30f10 63 74 69 6f 6e 2e 20 43 6f 70 79 20 61 20 76 61  ction. Copy a va
30f20 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  lue currently st
30f30 6f 72 65 64 20 69 6e 20 61 20 6d 65 6d 6f 72 79  ored in a memory
30f40 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66 20 74 68 65   .** cell of the
30f50 20 63 61 6c 6c 69 6e 67 20 28 70 61 72 65 6e 74   calling (parent
30f60 29 20 66 72 61 6d 65 20 74 6f 20 63 65 6c 6c 20  ) frame to cell 
30f70 50 32 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  P2 in the curren
30f80 74 20 66 72 61 6d 65 73 20 0a 2a 2a 20 61 64 64  t frames .** add
30f90 72 65 73 73 20 73 70 61 63 65 2e 20 54 68 69 73  ress space. This
30fa0 20 69 73 20 75 73 65 64 20 62 79 20 74 72 69 67   is used by trig
30fb0 67 65 72 20 70 72 6f 67 72 61 6d 73 20 74 6f 20  ger programs to 
30fc0 61 63 63 65 73 73 20 74 68 65 20 6e 65 77 2e 2a  access the new.*
30fd0 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64 2e 2a 20 76   .** and old.* v
30fe0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  alues..**.** The
30ff0 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
31000 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65  cell in the pare
31010 6e 74 20 66 72 61 6d 65 20 69 73 20 64 65 74 65  nt frame is dete
31020 72 6d 69 6e 65 64 20 62 79 20 61 64 64 69 6e 67  rmined by adding
31030 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
31040 20 74 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74   the P1 argument
31050 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
31060 20 74 68 65 20 50 31 20 61 72 67 75 6d 65 6e 74   the P1 argument
31070 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69   to the.** calli
31080 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e  ng OP_Program in
31090 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
310a0 73 65 20 4f 50 5f 50 61 72 61 6d 3a 20 7b 20 20  se OP_Param: {  
310b0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
310c0 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20   */.  VdbeFrame 
310d0 2a 70 46 72 61 6d 65 3b 0a 20 20 4d 65 6d 20 2a  *pFrame;.  Mem *
310e0 70 49 6e 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75  pIn;.  pOut = ou
310f0 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
31100 70 4f 70 29 3b 0a 20 20 70 46 72 61 6d 65 20 3d  pOp);.  pFrame =
31110 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 49   p->pFrame;.  pI
31120 6e 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65  n = &pFrame->aMe
31130 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20 70 46 72 61  m[pOp->p1 + pFra
31140 6d 65 2d 3e 61 4f 70 5b 70 46 72 61 6d 65 2d 3e  me->aOp[pFrame->
31150 70 63 5d 2e 70 31 5d 3b 20 20 20 0a 20 20 73 71  pc].p1];   .  sq
31160 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
31170 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49  lowCopy(pOut, pI
31180 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  n, MEM_Ephem);. 
31190 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e 64 69   break;.}..#endi
311a0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
311b0 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
311c0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
311d0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
311e0 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  _KEY./* Opcode: 
311f0 46 6b 43 6f 75 6e 74 65 72 20 50 31 20 50 32 20  FkCounter P1 P2 
31200 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
31210 73 3a 20 66 6b 63 74 72 5b 50 31 5d 2b 3d 50 32  s: fkctr[P1]+=P2
31220 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  .**.** Increment
31230 20 61 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 63   a "constraint c
31240 6f 75 6e 74 65 72 22 20 62 79 20 50 32 20 28 50  ounter" by P2 (P
31250 32 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76  2 may be negativ
31260 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29 2e 0a  e or positive)..
31270 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d  ** If P1 is non-
31280 7a 65 72 6f 2c 20 74 68 65 20 64 61 74 61 62 61  zero, the databa
31290 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  se constraint co
312a0 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65  unter is increme
312b0 6e 74 65 64 20 0a 2a 2a 20 28 64 65 66 65 72 72  nted .** (deferr
312c0 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
312d0 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20 4f 74 68  onstraints). Oth
312e0 65 72 77 69 73 65 2c 20 69 66 20 50 31 20 69 73  erwise, if P1 is
312f0 20 7a 65 72 6f 2c 20 74 68 65 20 0a 2a 2a 20 73   zero, the .** s
31300 74 61 74 65 6d 65 6e 74 20 63 6f 75 6e 74 65 72  tatement counter
31310 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
31320 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
31330 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
31340 74 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ts)..*/.case OP_
31350 46 6b 43 6f 75 6e 74 65 72 3a 20 7b 0a 20 20 69  FkCounter: {.  i
31360 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
31370 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29  QLITE_DeferFKs )
31380 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  {.    db->nDefer
31390 72 65 64 49 6d 6d 43 6f 6e 73 20 2b 3d 20 70 4f  redImmCons += pO
313a0 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 20 69  p->p2;.  }else i
313b0 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  f( pOp->p1 ){.  
313c0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
313d0 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  ons += pOp->p2;.
313e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
313f0 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 2b 3d  nFkConstraint +=
31400 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 0a 20 20   pOp->p2;.  }.  
31410 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
31420 6f 64 65 3a 20 46 6b 49 66 5a 65 72 6f 20 50 31  ode: FkIfZero P1
31430 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
31440 6f 70 73 69 73 3a 20 69 66 20 66 6b 63 74 72 5b  opsis: if fkctr[
31450 50 31 5d 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a  P1]==0 goto P2.*
31460 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
31470 20 74 65 73 74 73 20 69 66 20 61 20 66 6f 72 65   tests if a fore
31480 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
31490 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73 20 63 75  nt-counter is cu
314a0 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a 2a 2a  rrently zero..**
314b0 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20 74 6f 20   If so, jump to 
314c0 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20  instruction P2. 
314d0 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
314e0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
314f0 65 78 74 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74  ext .** instruct
31500 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31  ion..**.** If P1
31510 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
31520 65 6e 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  en the jump is t
31530 61 6b 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  aken if the data
31540 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d  base constraint-
31550 63 6f 75 6e 74 65 72 0a 2a 2a 20 69 73 20 7a 65  counter.** is ze
31560 72 6f 20 28 74 68 65 20 6f 6e 65 20 74 68 61 74  ro (the one that
31570 20 63 6f 75 6e 74 73 20 64 65 66 65 72 72 65 64   counts deferred
31580 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
31590 61 74 69 6f 6e 73 29 2e 20 49 66 20 50 31 20 69  ations). If P1 i
315a0 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68 65 20 6a  s.** zero, the j
315b0 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20  ump is taken if 
315c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  the statement co
315d0 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72  nstraint-counter
315e0 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 69 6d 6d   is zero.** (imm
315f0 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
31600 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ey constraint vi
31610 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a 63 61  olations)..*/.ca
31620 73 65 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 3a 20  se OP_FkIfZero: 
31630 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  {         /* jum
31640 70 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e  p */.  if( pOp->
31650 70 31 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72  p1 ){.    VdbeBr
31660 61 6e 63 68 54 61 6b 65 6e 28 64 62 2d 3e 6e 44  anchTaken(db->nD
31670 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20 26  eferredCons==0 &
31680 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  & db->nDeferredI
31690 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20  mmCons==0, 2);. 
316a0 20 20 20 69 66 28 20 64 62 2d 3e 6e 44 65 66 65     if( db->nDefe
316b0 72 72 65 64 43 6f 6e 73 3d 3d 30 20 26 26 20 64  rredCons==0 && d
316c0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
316d0 6f 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75  ons==0 ) goto ju
316e0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73  mp_to_p2;.  }els
316f0 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  e{.    VdbeBranc
31700 68 54 61 6b 65 6e 28 70 2d 3e 6e 46 6b 43 6f 6e  hTaken(p->nFkCon
31710 73 74 72 61 69 6e 74 3d 3d 30 20 26 26 20 64 62  straint==0 && db
31720 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
31730 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69  ns==0, 2);.    i
31740 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  f( p->nFkConstra
31750 69 6e 74 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44  int==0 && db->nD
31760 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d  eferredImmCons==
31770 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  0 ) goto jump_to
31780 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
31790 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69  ;.}.#endif /* #i
317a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
317b0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 2a 2f  T_FOREIGN_KEY */
317c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
317d0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
317e0 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  ENT./* Opcode: M
317f0 65 6d 4d 61 78 20 50 31 20 50 32 20 2a 20 2a 20  emMax P1 P2 * * 
31800 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
31810 5b 50 31 5d 3d 6d 61 78 28 72 5b 50 31 5d 2c 72  [P1]=max(r[P1],r
31820 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 50 31 20 69  [P2]).**.** P1 i
31830 73 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20  s a register in 
31840 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f  the root frame o
31850 66 20 74 68 69 73 20 56 4d 20 28 74 68 65 20 72  f this VM (the r
31860 6f 6f 74 20 66 72 61 6d 65 20 69 73 0a 2a 2a 20  oot frame is.** 
31870 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
31880 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
31890 20 69 66 20 74 68 69 73 20 69 6e 73 74 72 75 63   if this instruc
318a0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 65 78  tion is being ex
318b0 65 63 75 74 65 64 0a 2a 2a 20 77 69 74 68 69 6e  ecuted.** within
318c0 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 29 2e   a sub-program).
318d0 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
318e0 66 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  f register P1 to
318f0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
31900 0a 2a 2a 20 69 74 73 20 63 75 72 72 65 6e 74 20  .** its current 
31910 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61  value and the va
31920 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
31930 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
31940 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 72 6f 77  nstruction throw
31950 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  s an error if th
31960 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73  e memory cell is
31970 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 0a 2a   not initially.*
31980 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  * an integer..*/
31990 0a 63 61 73 65 20 4f 50 5f 4d 65 6d 4d 61 78 3a  .case OP_MemMax:
319a0 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32   {        /* in2
319b0 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20   */.  VdbeFrame 
319c0 2a 70 46 72 61 6d 65 3b 0a 20 20 69 66 28 20 70  *pFrame;.  if( p
319d0 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
319e0 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
319f0 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
31a00 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
31a10 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
31a20 20 20 20 20 70 49 6e 31 20 3d 20 26 70 46 72 61      pIn1 = &pFra
31a30 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31  me->aMem[pOp->p1
31a40 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
31a50 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
31a60 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20 20 61 73 73  ->p1];.  }.  ass
31a70 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
31a80 70 49 6e 31 29 20 29 3b 0a 20 20 73 71 6c 69 74  pIn1) );.  sqlit
31a90 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
31aa0 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e  ify(pIn1);.  pIn
31ab0 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
31ac0 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2];.  sqlite3Vdb
31ad0 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70  eMemIntegerify(p
31ae0 49 6e 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31  In2);.  if( pIn1
31af0 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e 69 29  ->u.i<pIn2->u.i)
31b00 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20  {.    pIn1->u.i 
31b10 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 7d  = pIn2->u.i;.  }
31b20 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
31b30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
31b40 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  T_AUTOINCREMENT 
31b50 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  */../* Opcode: I
31b60 66 50 6f 73 20 50 31 20 50 32 20 50 33 20 2a 20  fPos P1 P2 P3 * 
31b70 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
31b80 66 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e 20 72  f r[P1]>0 then r
31b90 5b 50 31 5d 2d 3d 50 33 2c 20 67 6f 74 6f 20 50  [P1]-=P3, goto P
31ba0 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  2.**.** Register
31bb0 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e   P1 must contain
31bc0 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20   an integer..** 
31bd0 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  If the value of 
31be0 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 31  register P1 is 1
31bf0 20 6f 72 20 67 72 65 61 74 65 72 2c 20 73 75 62   or greater, sub
31c00 74 72 61 63 74 20 50 33 20 66 72 6f 6d 20 74 68  tract P3 from th
31c10 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 50 31  e.** value in P1
31c20 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 50 32 2e   and jump to P2.
31c30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
31c40 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 72  itial value of r
31c50 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6c 65  egister P1 is le
31c60 73 73 20 74 68 61 6e 20 31 2c 20 74 68 65 6e 20  ss than 1, then 
31c70 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  the.** value is 
31c80 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 63 6f  unchanged and co
31c90 6e 74 72 6f 6c 20 70 61 73 73 65 73 20 74 68 72  ntrol passes thr
31ca0 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
31cb0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
31cc0 0a 63 61 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20  .case OP_IfPos: 
31cd0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
31ce0 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
31cf0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
31d00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
31d10 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
31d20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
31d30 61 6b 65 6e 28 20 70 49 6e 31 2d 3e 75 2e 69 3e  aken( pIn1->u.i>
31d40 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e  0, 2);.  if( pIn
31d50 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a 20 20 20 20  1->u.i>0 ){.    
31d60 70 49 6e 31 2d 3e 75 2e 69 20 2d 3d 20 70 4f 70  pIn1->u.i -= pOp
31d70 2d 3e 70 33 3b 0a 20 20 20 20 67 6f 74 6f 20 6a  ->p3;.    goto j
31d80 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
31d90 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
31da0 63 6f 64 65 3a 20 4f 66 66 73 65 74 4c 69 6d 69  code: OffsetLimi
31db0 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
31dc0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72  * Synopsis: if r
31dd0 5b 50 31 5d 3e 30 20 74 68 65 6e 20 72 5b 50 32  [P1]>0 then r[P2
31de0 5d 3d 72 5b 50 31 5d 2b 6d 61 78 28 30 2c 72 5b  ]=r[P1]+max(0,r[
31df0 50 33 5d 29 20 65 6c 73 65 20 72 5b 50 32 5d 3d  P3]) else r[P2]=
31e00 28 2d 31 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  (-1).**.** This 
31e10 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20  opcode performs 
31e20 61 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20  a commonly used 
31e30 63 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 6f  computation asso
31e40 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 4c  ciated with.** L
31e50 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
31e60 70 72 6f 63 65 73 73 2e 20 20 72 5b 50 31 5d 20  process.  r[P1] 
31e70 68 6f 6c 64 73 20 74 68 65 20 6c 69 6d 69 74 20  holds the limit 
31e80 63 6f 75 6e 74 65 72 2e 20 20 72 5b 50 33 5d 0a  counter.  r[P3].
31e90 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 6f 66 66  ** holds the off
31ea0 73 65 74 20 63 6f 75 6e 74 65 72 2e 20 20 54 68  set counter.  Th
31eb0 65 20 6f 70 63 6f 64 65 20 63 6f 6d 70 75 74 65  e opcode compute
31ec0 73 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 76  s the combined v
31ed0 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4c  alue.** of the L
31ee0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
31ef0 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74 20  and stores that 
31f00 76 61 6c 75 65 20 69 6e 20 72 5b 50 32 5d 2e 20  value in r[P2]. 
31f10 20 54 68 65 20 72 5b 50 32 5d 0a 2a 2a 20 76 61   The r[P2].** va
31f20 6c 75 65 20 63 6f 6d 70 75 74 65 64 20 69 73 20  lue computed is 
31f30 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
31f40 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
31f50 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ll need to be.**
31f60 20 76 69 73 69 74 65 64 20 69 6e 20 6f 72 64 65   visited in orde
31f70 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
31f80 65 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  e query..**.** I
31f90 66 20 72 5b 50 33 5d 20 69 73 20 7a 65 72 6f 20  f r[P3] is zero 
31fa0 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68 61  or negative, tha
31fb0 74 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  t means there is
31fc0 20 6e 6f 20 4f 46 46 53 45 54 0a 2a 2a 20 61 6e   no OFFSET.** an
31fd0 64 20 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74  d r[P2] is set t
31fe0 6f 20 62 65 20 74 68 65 20 76 61 6c 75 65 20 6f  o be the value o
31ff0 66 20 74 68 65 20 4c 49 4d 49 54 2c 20 72 5b 50  f the LIMIT, r[P
32000 31 5d 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 72 5b 50  1]..**.** if r[P
32010 31 5d 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  1] is zero or ne
32020 67 61 74 69 76 65 2c 20 74 68 61 74 20 6d 65 61  gative, that mea
32030 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4c  ns there is no L
32040 49 4d 49 54 0a 2a 2a 20 61 6e 64 20 72 5b 50 32  IMIT.** and r[P2
32050 5d 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2e 20  ] is set to -1. 
32060 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
32070 2c 20 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74  , r[P2] is set t
32080 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 72 5b 50  o the sum of r[P
32090 31 5d 20 61 6e 64 20 72 5b 50 33 5d 2e 0a 2a 2f  1] and r[P3]..*/
320a0 0a 63 61 73 65 20 4f 50 5f 4f 66 66 73 65 74 4c  .case OP_OffsetL
320b0 69 6d 69 74 3a 20 7b 20 20 20 20 2f 2a 20 69 6e  imit: {    /* in
320c0 31 2c 20 6f 75 74 32 2c 20 69 6e 33 20 2a 2f 0a  1, out2, in3 */.
320d0 20 20 69 36 34 20 78 3b 0a 20 20 70 49 6e 31 20    i64 x;.  pIn1 
320e0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
320f0 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ;.  pIn3 = &aMem
32100 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4f 75  [pOp->p3];.  pOu
32110 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
32120 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73  se(p, pOp);.  as
32130 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67  sert( pIn1->flag
32140 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
32150 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
32160 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
32170 3b 0a 20 20 78 20 3d 20 70 49 6e 31 2d 3e 75 2e  ;.  x = pIn1->u.
32180 69 3b 0a 20 20 69 66 28 20 78 3c 3d 30 20 7c 7c  i;.  if( x<=0 ||
32190 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34   sqlite3AddInt64
321a0 28 26 78 2c 20 70 49 6e 33 2d 3e 75 2e 69 3e 30  (&x, pIn3->u.i>0
321b0 3f 70 49 6e 33 2d 3e 75 2e 69 3a 30 29 20 29 7b  ?pIn3->u.i:0) ){
321c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c  .    /* If the L
321d0 49 4d 49 54 20 69 73 20 6c 65 73 73 20 74 68 61  IMIT is less tha
321e0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
321f0 72 6f 2c 20 6c 6f 6f 70 20 66 6f 72 65 76 65 72  ro, loop forever
32200 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  .  This.    ** i
32210 73 20 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 42  s documented.  B
32220 75 74 20 61 6c 73 6f 2c 20 69 66 20 74 68 65 20  ut also, if the 
32230 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 78 63  LIMIT+OFFSET exc
32240 65 65 64 73 20 32 5e 36 33 20 74 68 65 6e 0a 20  eeds 2^63 then. 
32250 20 20 20 2a 2a 20 61 6c 73 6f 20 6c 6f 6f 70 20     ** also loop 
32260 66 6f 72 65 76 65 72 2e 20 20 54 68 69 73 20 69  forever.  This i
32270 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20  s undocumented. 
32280 20 49 6e 20 66 61 63 74 2c 20 6f 6e 65 20 63 6f   In fact, one co
32290 75 6c 64 20 61 72 67 75 65 0a 20 20 20 20 2a 2a  uld argue.    **
322a0 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 20 73   that the loop s
322b0 68 6f 75 6c 64 20 74 65 72 6d 69 6e 61 74 65 2e  hould terminate.
322c0 20 20 42 75 74 20 61 73 73 75 6d 69 6e 67 20 31    But assuming 1
322d0 20 62 69 6c 6c 69 6f 6e 20 69 74 65 72 61 74 69   billion iterati
322e0 6f 6e 73 0a 20 20 20 20 2a 2a 20 70 65 72 20 73  ons.    ** per s
322f0 65 63 6f 6e 64 20 28 66 61 72 20 65 78 63 65 65  econd (far excee
32300 64 69 6e 67 20 74 68 65 20 63 61 70 61 62 69 6c  ding the capabil
32310 69 74 69 65 73 20 6f 66 20 61 6e 79 20 63 75 72  ities of any cur
32320 72 65 6e 74 20 68 61 72 64 77 61 72 65 29 0a 20  rent hardware). 
32330 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64 20 74     ** it would t
32340 61 6b 65 20 6e 65 61 72 6c 79 20 33 30 30 20 79  ake nearly 300 y
32350 65 61 72 73 20 74 6f 20 61 63 74 75 61 6c 6c 79  ears to actually
32360 20 72 65 61 63 68 20 74 68 65 20 6c 69 6d 69 74   reach the limit
32370 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 6c 6f 6f  .  So.    ** loo
32380 70 69 6e 67 20 66 6f 72 65 76 65 72 20 69 73 20  ping forever is 
32390 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 61 70 70  a reasonable app
323a0 72 6f 78 69 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20  roximation. */. 
323b0 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2d     pOut->u.i = -
323c0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
323d0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 78 3b 0a 20  pOut->u.i = x;. 
323e0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
323f0 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74 5a  * Opcode: IfNotZ
32400 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ero P1 P2 * * *.
32410 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20  ** Synopsis: if 
32420 72 5b 50 31 5d 21 3d 30 20 74 68 65 6e 20 72 5b  r[P1]!=0 then r[
32430 50 31 5d 2d 2d 2c 20 67 6f 74 6f 20 50 32 0a 2a  P1]--, goto P2.*
32440 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31  *.** Register P1
32450 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 6e   must contain an
32460 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68   integer.  If th
32470 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
32480 69 73 74 65 72 20 50 31 20 69 73 0a 2a 2a 20 69  ister P1 is.** i
32490 6e 69 74 69 61 6c 6c 79 20 67 72 65 61 74 65 72  nitially greater
324a0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
324b0 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 76   decrement the v
324c0 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
324d0 20 50 31 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73   P1..** If it is
324e0 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 65 67 61 74   non-zero (negat
324f0 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29  ive or positive)
32500 20 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 6a   and then also j
32510 75 6d 70 20 74 6f 20 50 32 2e 20 20 0a 2a 2a 20  ump to P2.  .** 
32520 49 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  If register P1 i
32530 73 20 69 6e 69 74 69 61 6c 6c 79 20 7a 65 72 6f  s initially zero
32540 2c 20 6c 65 61 76 65 20 69 74 20 75 6e 63 68 61  , leave it uncha
32550 6e 67 65 64 20 61 6e 64 20 66 61 6c 6c 20 74 68  nged and fall th
32560 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f  rough..*/.case O
32570 50 5f 49 66 4e 6f 74 5a 65 72 6f 3a 20 7b 20 20  P_IfNotZero: {  
32580 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
32590 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
325a0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
325b0 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
325c0 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a  lags&MEM_Int );.
325d0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
325e0 6e 28 70 49 6e 31 2d 3e 75 2e 69 3c 30 2c 20 32  n(pIn1->u.i<0, 2
325f0 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
32600 2e 69 20 29 7b 0a 20 20 20 20 20 69 66 28 20 70  .i ){.     if( p
32610 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 20 70 49 6e  In1->u.i>0 ) pIn
32620 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 20 20 20 67  1->u.i--;.     g
32630 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
32640 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
32650 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 63 72 4a  /* Opcode: DecrJ
32660 75 6d 70 5a 65 72 6f 20 50 31 20 50 32 20 2a 20  umpZero P1 P2 * 
32670 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
32680 20 69 66 20 28 2d 2d 72 5b 50 31 5d 29 3d 3d 30   if (--r[P1])==0
32690 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52   goto P2.**.** R
326a0 65 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 20  egister P1 must 
326b0 68 6f 6c 64 20 61 6e 20 69 6e 74 65 67 65 72 2e  hold an integer.
326c0 20 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20    Decrement the 
326d0 76 61 6c 75 65 20 69 6e 20 50 31 0a 2a 2a 20 61  value in P1.** a
326e0 6e 64 20 6a 75 6d 70 20 74 6f 20 50 32 20 69 66  nd jump to P2 if
326f0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69   the new value i
32700 73 20 65 78 61 63 74 6c 79 20 7a 65 72 6f 2e 0a  s exactly zero..
32710 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 63 72 4a  */.case OP_DecrJ
32720 75 6d 70 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20  umpZero: {      
32730 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
32740 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
32750 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
32760 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d  t( pIn1->flags&M
32770 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28 20  EM_Int );.  if( 
32780 70 49 6e 31 2d 3e 75 2e 69 3e 53 4d 41 4c 4c 45  pIn1->u.i>SMALLE
32790 53 54 5f 49 4e 54 36 34 20 29 20 70 49 6e 31 2d  ST_INT64 ) pIn1-
327a0 3e 75 2e 69 2d 2d 3b 0a 20 20 56 64 62 65 42 72  >u.i--;.  VdbeBr
327b0 61 6e 63 68 54 61 6b 65 6e 28 70 49 6e 31 2d 3e  anchTaken(pIn1->
327c0 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66  u.i==0, 2);.  if
327d0 28 20 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29  ( pIn1->u.i==0 )
327e0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
327f0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f  ;.  break;.}.../
32800 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65  * Opcode: AggSte
32810 70 30 20 2a 20 50 32 20 50 33 20 50 34 20 50 35  p0 * P2 P3 P4 P5
32820 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63  .** Synopsis: ac
32830 63 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70 28 72  cum=r[P3] step(r
32840 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45  [P2@P5]).**.** E
32850 78 65 63 75 74 65 20 74 68 65 20 73 74 65 70 20  xecute the step 
32860 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20  function for an 
32870 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a  aggregate.  The.
32880 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
32890 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20  P5 arguments.   
328a0 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
328b0 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 0a 2a  to the FuncDef.*
328c0 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  * structure that
328d0 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 66   specifies the f
328e0 75 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69 73 74  unction.  Regist
328f0 65 72 20 50 33 20 69 73 20 74 68 65 0a 2a 2a 20  er P3 is the.** 
32900 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
32910 2a 2a 20 54 68 65 20 50 35 20 61 72 67 75 6d 65  ** The P5 argume
32920 6e 74 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72  nts are taken fr
32930 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32 20 61  om register P2 a
32940 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63 63 65 73  nd its.** succes
32950 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  sors..*/./* Opco
32960 64 65 3a 20 41 67 67 53 74 65 70 20 2a 20 50 32  de: AggStep * P2
32970 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
32980 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50  opsis: accum=r[P
32990 33 5d 20 73 74 65 70 28 72 5b 50 32 40 50 35 5d  3] step(r[P2@P5]
329a0 29 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ).**.** Execute 
329b0 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
329c0 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  n for an aggrega
329d0 74 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63  te.  The.** func
329e0 74 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75  tion has P5 argu
329f0 6d 65 6e 74 73 2e 20 20 20 50 34 20 69 73 20 61  ments.   P4 is a
32a00 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
32a10 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 0a 2a  qlite3_context.*
32a20 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  * object that is
32a30 20 75 73 65 64 20 74 6f 20 72 75 6e 20 74 68 65   used to run the
32a40 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69   function.  Regi
32a50 73 74 65 72 20 50 33 20 69 73 0a 2a 2a 20 61 73  ster P3 is.** as
32a60 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
32a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61  ..**.** The P5 a
32a80 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b  rguments are tak
32a90 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  en from register
32aa0 20 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73   P2 and its.** s
32ab0 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  uccessors..**.**
32ac0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
32ad0 69 6e 69 74 69 61 6c 6c 79 20 63 6f 64 65 64 20  initially coded 
32ae0 61 73 20 4f 50 5f 41 67 67 53 74 65 70 30 2e 20  as OP_AggStep0. 
32af0 20 4f 6e 20 66 69 72 73 74 20 65 76 61 6c 75 61   On first evalua
32b00 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 46 75 6e  tion,.** the Fun
32b10 63 44 65 66 20 73 74 6f 72 65 64 20 69 6e 20 50  cDef stored in P
32b20 34 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69  4 is converted i
32b30 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 63  nto an sqlite3_c
32b40 6f 6e 74 65 78 74 20 61 6e 64 0a 2a 2a 20 74 68  ontext and.** th
32b50 65 20 6f 70 63 6f 64 65 20 69 73 20 63 68 61 6e  e opcode is chan
32b60 67 65 64 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ged.  In this wa
32b70 79 2c 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  y, the initializ
32b80 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
32b90 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
32ba0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63  only happens onc
32bb0 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  e, instead of on
32bc0 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68   each call to th
32bd0 65 0a 2a 2a 20 73 74 65 70 20 66 75 6e 63 74 69  e.** step functi
32be0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  on..*/.case OP_A
32bf0 67 67 53 74 65 70 30 3a 20 7b 0a 20 20 69 6e 74  ggStep0: {.  int
32c00 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f   n;.  sqlite3_co
32c10 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 0a 20 20  ntext *pCtx;..  
32c20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
32c30 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45 46 20  ype==P4_FUNCDEF 
32c40 29 3b 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35  );.  n = pOp->p5
32c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
32c60 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
32c70 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
32c80 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
32c90 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 7c 7c 20  assert( n==0 || 
32ca0 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f  (pOp->p2>0 && pO
32cb0 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65  p->p2+n<=(p->nMe
32cc0 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
32cd0 29 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  )+1) );.  assert
32ce0 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70  ( pOp->p3<pOp->p
32cf0 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f  2 || pOp->p3>=pO
32d00 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20 70 43 74  p->p2+n );.  pCt
32d10 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
32d20 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
32d30 65 6f 66 28 2a 70 43 74 78 29 20 2b 20 28 6e 2d  eof(*pCtx) + (n-
32d40 31 29 2a 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  1)*sizeof(sqlite
32d50 33 5f 76 61 6c 75 65 2a 29 29 3b 0a 20 20 69 66  3_value*));.  if
32d60 28 20 70 43 74 78 3d 3d 30 20 29 20 67 6f 74 6f  ( pCtx==0 ) goto
32d70 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 74 78 2d   no_mem;.  pCtx-
32d80 3e 70 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 43 74  >pMem = 0;.  pCt
32d90 78 2d 3e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e  x->pFunc = pOp->
32da0 70 34 2e 70 46 75 6e 63 3b 0a 20 20 70 43 74 78  p4.pFunc;.  pCtx
32db0 2d 3e 69 4f 70 20 3d 20 28 69 6e 74 29 28 70 4f  ->iOp = (int)(pO
32dc0 70 20 2d 20 61 4f 70 29 3b 0a 20 20 70 43 74 78  p - aOp);.  pCtx
32dd0 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70  ->pVdbe = p;.  p
32de0 43 74 78 2d 3e 61 72 67 63 20 3d 20 6e 3b 0a 20  Ctx->argc = n;. 
32df0 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
32e00 34 5f 46 55 4e 43 43 54 58 3b 0a 20 20 70 4f 70  4_FUNCCTX;.  pOp
32e10 2d 3e 70 34 2e 70 43 74 78 20 3d 20 70 43 74 78  ->p4.pCtx = pCtx
32e20 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
32e30 3d 20 4f 50 5f 41 67 67 53 74 65 70 3b 0a 20 20  = OP_AggStep;.  
32e40 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
32e50 69 6e 74 6f 20 4f 50 5f 41 67 67 53 74 65 70 20  into OP_AggStep 
32e60 2a 2f 0a 7d 0a 63 61 73 65 20 4f 50 5f 41 67 67  */.}.case OP_Agg
32e70 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74 20 69 3b  Step: {.  int i;
32e80 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
32e90 78 74 20 2a 70 43 74 78 3b 0a 20 20 4d 65 6d 20  xt *pCtx;.  Mem 
32ea0 2a 70 4d 65 6d 3b 0a 20 20 4d 65 6d 20 74 3b 0a  *pMem;.  Mem t;.
32eb0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
32ec0 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 43  p4type==P4_FUNCC
32ed0 54 58 20 29 3b 0a 20 20 70 43 74 78 20 3d 20 70  TX );.  pCtx = p
32ee0 4f 70 2d 3e 70 34 2e 70 43 74 78 3b 0a 20 20 70  Op->p4.pCtx;.  p
32ef0 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
32f00 3e 70 33 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >p3];..  /* If t
32f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32f20 69 6e 73 69 64 65 20 6f 66 20 61 20 74 72 69 67  inside of a trig
32f30 67 65 72 2c 20 74 68 65 20 72 65 67 69 73 74 65  ger, the registe
32f40 72 20 61 72 72 61 79 20 69 6e 20 61 4d 65 6d 5b  r array in aMem[
32f50 5d 0a 20 20 2a 2a 20 6d 69 67 68 74 20 63 68 61  ].  ** might cha
32f60 6e 67 65 20 66 72 6f 6d 20 6f 6e 65 20 65 76 61  nge from one eva
32f70 6c 75 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 6e  luation to the n
32f80 65 78 74 2e 20 20 54 68 65 20 6e 65 78 74 20 62  ext.  The next b
32f90 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 0a 20 20 2a  lock of code.  *
32fa0 2a 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  * checks to see 
32fb0 69 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  if the register 
32fc0 61 72 72 61 79 20 68 61 73 20 63 68 61 6e 67 65  array has change
32fd0 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 69 74 0a  d, and if so it.
32fe0 20 20 2a 2a 20 72 65 69 6e 69 74 69 61 6c 69 7a    ** reinitializ
32ff0 65 73 20 74 68 65 20 72 65 6c 61 76 61 6e 74 20  es the relavant 
33000 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 71 6c  parts of the sql
33010 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a  ite3_context obj
33020 65 63 74 20 2a 2f 0a 20 20 69 66 28 20 70 43 74  ect */.  if( pCt
33030 78 2d 3e 70 4d 65 6d 20 21 3d 20 70 4d 65 6d 20  x->pMem != pMem 
33040 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4d 65  ){.    pCtx->pMe
33050 6d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 66 6f  m = pMem;.    fo
33060 72 28 69 3d 70 43 74 78 2d 3e 61 72 67 63 2d 31  r(i=pCtx->argc-1
33070 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 70 43 74  ; i>=0; i--) pCt
33080 78 2d 3e 61 72 67 76 5b 69 5d 20 3d 20 26 61 4d  x->argv[i] = &aM
33090 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69 5d 3b 0a 20  em[pOp->p2+i];. 
330a0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
330b0 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
330c0 30 3b 20 69 3c 70 43 74 78 2d 3e 61 72 67 63 3b  0; i<pCtx->argc;
330d0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
330e0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 43  t( memIsValid(pC
330f0 74 78 2d 3e 61 72 67 76 5b 69 5d 29 20 29 3b 0a  tx->argv[i]) );.
33100 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
33110 43 45 28 70 4f 70 2d 3e 70 32 2b 69 2c 20 70 43  CE(pOp->p2+i, pC
33120 74 78 2d 3e 61 72 67 76 5b 69 5d 29 3b 0a 20 20  tx->argv[i]);.  
33130 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4d 65 6d  }.#endif..  pMem
33140 2d 3e 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  ->n++;.  sqlite3
33150 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 74 2c 20  VdbeMemInit(&t, 
33160 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
33170 20 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20 26 74   pCtx->pOut = &t
33180 3b 0a 20 20 70 43 74 78 2d 3e 66 45 72 72 6f 72  ;.  pCtx->fError
33190 4f 72 41 75 78 20 3d 20 30 3b 0a 20 20 70 43 74  OrAux = 0;.  pCt
331a0 78 2d 3e 73 6b 69 70 46 6c 61 67 20 3d 20 30 3b  x->skipFlag = 0;
331b0 0a 20 20 28 70 43 74 78 2d 3e 70 46 75 6e 63 2d  .  (pCtx->pFunc-
331c0 3e 78 53 46 75 6e 63 29 28 70 43 74 78 2c 70 43  >xSFunc)(pCtx,pC
331d0 74 78 2d 3e 61 72 67 63 2c 70 43 74 78 2d 3e 61  tx->argc,pCtx->a
331e0 72 67 76 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  rgv); /* IMP: R-
331f0 32 34 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a 20  24505-23230 */. 
33200 20 69 66 28 20 70 43 74 78 2d 3e 66 45 72 72 6f   if( pCtx->fErro
33210 72 4f 72 41 75 78 20 29 7b 0a 20 20 20 20 69 66  rOrAux ){.    if
33220 28 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72 20  ( pCtx->isError 
33230 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
33240 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73  VdbeError(p, "%s
33250 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ", sqlite3_value
33260 5f 74 65 78 74 28 26 74 29 29 3b 0a 20 20 20 20  _text(&t));.    
33270 20 20 72 63 20 3d 20 70 43 74 78 2d 3e 69 73 45    rc = pCtx->isE
33280 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
33290 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
332a0 6c 65 61 73 65 28 26 74 29 3b 0a 20 20 20 20 69  lease(&t);.    i
332b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
332c0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
332d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
332e0 73 65 72 74 28 20 74 2e 66 6c 61 67 73 3d 3d 4d  sert( t.flags==M
332f0 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 7d 0a 20  EM_Null );.  }. 
33300 20 69 66 28 20 70 43 74 78 2d 3e 73 6b 69 70 46   if( pCtx->skipF
33310 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  lag ){.    asser
33320 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
33330 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b  e==OP_CollSeq );
33340 0a 20 20 20 20 69 20 3d 20 70 4f 70 5b 2d 31 5d  .    i = pOp[-1]
33350 2e 70 31 3b 0a 20 20 20 20 69 66 28 20 69 20 29  .p1;.    if( i )
33360 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
33370 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 69 5d  etInt64(&aMem[i]
33380 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  , 1);.  }.  brea
33390 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
333a0 20 41 67 67 46 69 6e 61 6c 20 50 31 20 50 32 20   AggFinal P1 P2 
333b0 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
333c0 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50 31 5d 20  is: accum=r[P1] 
333d0 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75  N=P2.**.** Execu
333e0 74 65 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72  te the finalizer
333f0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
33400 20 61 67 67 72 65 67 61 74 65 2e 20 20 50 31 20   aggregate.  P1 
33410 69 73 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  is.** the memory
33420 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74 20 69   location that i
33430 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  s the accumulato
33440 72 20 66 6f 72 20 74 68 65 20 61 67 67 72 65 67  r for the aggreg
33450 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73  ate..**.** P2 is
33460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
33470 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 74 68  rguments that th
33480 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  e step function 
33490 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20 50 34 20  takes and.** P4 
334a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
334b0 74 68 65 20 46 75 6e 63 44 65 66 20 66 6f 72 20  the FuncDef for 
334c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
334d0 54 68 65 20 50 32 0a 2a 2a 20 61 72 67 75 6d 65  The P2.** argume
334e0 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  nt is not used b
334f0 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20  y this opcode.  
33500 49 74 20 69 73 20 6f 6e 6c 79 20 74 68 65 72 65  It is only there
33510 20 74 6f 20 64 69 73 61 6d 62 69 67 75 61 74 65   to disambiguate
33520 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  .** functions th
33530 61 74 20 63 61 6e 20 74 61 6b 65 20 76 61 72 79  at can take vary
33540 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66 20 61  ing numbers of a
33550 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 0a 2a  rguments.  The.*
33560 2a 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69 73  * P4 argument is
33570 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   only needed for
33580 20 74 68 65 20 64 65 67 65 6e 65 72 61 74 65 20   the degenerate 
33590 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 74 68  case where.** th
335a0 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  e step function 
335b0 77 61 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73  was not previous
335c0 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 63 61  ly called..*/.ca
335d0 73 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 3a 20  se OP_AggFinal: 
335e0 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  {.  Mem *pMem;. 
335f0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
33600 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28  >0 && pOp->p1<=(
33610 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
33620 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4d 65  Cursor) );.  pMe
33630 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
33640 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  1];.  assert( (p
33650 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 7e 28 4d  Mem->flags & ~(M
33660 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67 67 29  EM_Null|MEM_Agg)
33670 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  )==0 );.  rc = s
33680 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 69 6e  qlite3VdbeMemFin
33690 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70 4f 70 2d  alize(pMem, pOp-
336a0 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20 20 69 66  >p4.pFunc);.  if
336b0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
336c0 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
336d0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  "%s", sqlite3_va
336e0 6c 75 65 5f 74 65 78 74 28 70 4d 65 6d 29 29 3b  lue_text(pMem));
336f0 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
33700 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
33710 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
33720 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d  hangeEncoding(pM
33730 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  em, encoding);. 
33740 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
33750 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20 20 69 66  SIZE(pMem);.  if
33760 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
33770 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20 29 7b 0a  TooBig(pMem) ){.
33780 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
33790 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
337a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
337b0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 4f 70 63  _OMIT_WAL./* Opc
337c0 6f 64 65 3a 20 43 68 65 63 6b 70 6f 69 6e 74 20  ode: Checkpoint 
337d0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
337e0 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
337f0 74 61 62 61 73 65 20 50 31 2e 20 54 68 69 73 20  tabase P1. This 
33800 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 50 31  is a no-op if P1
33810 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
33820 79 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d 6f 64 65  y in.** WAL mode
33830 2e 20 50 61 72 61 6d 65 74 65 72 20 50 32 20 69  . Parameter P2 i
33840 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  s one of SQLITE_
33850 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
33860 56 45 2c 20 46 55 4c 4c 2c 0a 2a 2a 20 52 45 53  VE, FULL,.** RES
33870 54 41 52 54 2c 20 6f 72 20 54 52 55 4e 43 41 54  TART, or TRUNCAT
33880 45 2e 20 20 57 72 69 74 65 20 31 20 6f 72 20 30  E.  Write 1 or 0
33890 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d 20 69 66   into mem[P3] if
338a0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
338b0 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54  returns.** SQLIT
338c0 45 5f 42 55 53 59 20 6f 72 20 6e 6f 74 2c 20 72  E_BUSY or not, r
338d0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 57 72  espectively.  Wr
338e0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
338f0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a  f pages in the.*
33900 2a 20 57 41 4c 20 61 66 74 65 72 20 74 68 65 20  * WAL after the 
33910 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e 74 6f 20  checkpoint into 
33920 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 20 74 68  mem[P3+1] and th
33930 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
33940 73 0a 2a 2a 20 69 6e 20 74 68 65 20 57 41 4c 20  s.** in the WAL 
33950 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 63  that have been c
33960 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 66 74 65  heckpointed afte
33970 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  r the checkpoint
33980 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 20 69 6e  .** completes in
33990 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e 20 20 48  to mem[P3+2].  H
339a0 6f 77 65 76 65 72 20 6f 6e 20 61 6e 20 65 72 72  owever on an err
339b0 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e  or, mem[P3+1] an
339c0 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32 5d 20 61  d.** mem[P3+2] a
339d0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  re initialized t
339e0 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  o -1..*/.case OP
339f0 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 20 7b 0a 20  _Checkpoint: {. 
33a00 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
33a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
33a30 20 2a 2f 0a 20 20 69 6e 74 20 61 52 65 73 5b 33   */.  int aRes[3
33a40 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
33a50 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
33a60 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   */.  Mem *pMem;
33a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a80 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
33a90 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 0a  esults here */..
33aa0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
33ab0 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 52  dOnly==0 );.  aR
33ac0 65 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 52 65  es[0] = 0;.  aRe
33ad0 73 5b 31 5d 20 3d 20 61 52 65 73 5b 32 5d 20 3d  s[1] = aRes[2] =
33ae0 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70   -1;.  assert( p
33af0 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43  Op->p2==SQLITE_C
33b00 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
33b10 45 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d  E.       || pOp-
33b20 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43  >p2==SQLITE_CHEC
33b30 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a 20 20 20 20  KPOINT_FULL.    
33b40 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53     || pOp->p2==S
33b50 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
33b60 5f 52 45 53 54 41 52 54 0a 20 20 20 20 20 20 20  _RESTART.       
33b70 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  || pOp->p2==SQLI
33b80 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
33b90 55 4e 43 41 54 45 0a 20 20 29 3b 0a 20 20 72 63  UNCATE.  );.  rc
33ba0 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
33bb0 6f 69 6e 74 28 64 62 2c 20 70 4f 70 2d 3e 70 31  oint(db, pOp->p1
33bc0 2c 20 70 4f 70 2d 3e 70 32 2c 20 26 61 52 65 73  , pOp->p2, &aRes
33bd0 5b 31 5d 2c 20 26 61 52 65 73 5b 32 5d 29 3b 0a  [1], &aRes[2]);.
33be0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
33bf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
33c00 55 53 59 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  USY ) goto abort
33c10 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
33c20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
33c30 4b 3b 0a 20 20 20 20 61 52 65 73 5b 30 5d 20 3d  K;.    aRes[0] =
33c40 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   1;.  }.  for(i=
33c50 30 2c 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b  0, pMem = &aMem[
33c60 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33 3b 20 69  pOp->p3]; i<3; i
33c70 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20  ++, pMem++){.   
33c80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
33c90 65 74 49 6e 74 36 34 28 70 4d 65 6d 2c 20 28 69  etInt64(pMem, (i
33ca0 36 34 29 61 52 65 73 5b 69 5d 29 3b 0a 20 20 7d  64)aRes[i]);.  }
33cb0 20 20 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b      .  break;.};
33cc0 20 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64    .#endif..#ifnd
33cd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
33ce0 52 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f 64 65 3a  RAGMA./* Opcode:
33cf0 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20 50 31 20   JournalMode P1 
33d00 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
33d10 43 68 61 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e  Change the journ
33d20 61 6c 20 6d 6f 64 65 20 6f 66 20 64 61 74 61 62  al mode of datab
33d30 61 73 65 20 50 31 20 74 6f 20 50 33 2e 20 50 33  ase P1 to P3. P3
33d40 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
33d50 74 68 65 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  the.** PAGER_JOU
33d60 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 76 61 6c  RNALMODE_XXX val
33d70 75 65 73 2e 20 49 66 20 63 68 61 6e 67 69 6e 67  ues. If changing
33d80 20 62 65 74 77 65 65 6e 20 74 68 65 20 76 61 72   between the var
33d90 69 6f 75 73 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ious rollback.**
33da0 20 6d 6f 64 65 73 20 28 64 65 6c 65 74 65 2c 20   modes (delete, 
33db0 74 72 75 6e 63 61 74 65 2c 20 70 65 72 73 69 73  truncate, persis
33dc0 74 2c 20 6f 66 66 20 61 6e 64 20 6d 65 6d 6f 72  t, off and memor
33dd0 79 29 2c 20 74 68 69 73 20 69 73 20 61 20 73 69  y), this is a si
33de0 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mple.** operatio
33df0 6e 2e 20 4e 6f 20 49 4f 20 69 73 20 72 65 71 75  n. No IO is requ
33e00 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  ired..**.** If c
33e10 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20 6f 72 20  hanging into or 
33e20 6f 75 74 20 6f 66 20 57 41 4c 20 6d 6f 64 65 20  out of WAL mode 
33e30 74 68 65 20 70 72 6f 63 65 64 75 72 65 20 69 73  the procedure is
33e40 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65   more complicate
33e50 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61  d..**.** Write a
33e60 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
33e70 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 6a 6f 75  ng the final jou
33e80 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20 72 65 67  rnal-mode to reg
33e90 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
33ea0 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
33eb0 3a 20 7b 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a  : {    /* out2 *
33ec0 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20  /.  Btree *pBt; 
33ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ee0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 6f 20      /* Btree to 
33ef0 63 68 61 6e 67 65 20 6a 6f 75 72 6e 61 6c 20 6d  change journal m
33f00 6f 64 65 20 6f 66 20 2a 2f 0a 20 20 50 61 67 65  ode of */.  Page
33f10 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20  r *pPager;      
33f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
33f30 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
33f40 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 69 6e  with pBt */.  in
33f50 74 20 65 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t eNew;         
33f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33f70 20 4e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   New journal mod
33f80 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 6c 64 3b  e */.  int eOld;
33f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c         /* The ol
33fb0 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a  d journal mode *
33fc0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
33fd0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 63 6f 6e 73  _OMIT_WAL.  cons
33fe0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
33ff0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  e;          /* N
34000 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ame of database 
34010 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 20  file for pPager 
34020 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f 75  */.#endif..  pOu
34030 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
34040 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 65 4e  se(p, pOp);.  eN
34050 65 77 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  ew = pOp->p3;.  
34060 61 73 73 65 72 74 28 20 65 4e 65 77 3d 3d 50 41  assert( eNew==PA
34070 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
34080 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 7c  DELETE .       |
34090 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f  | eNew==PAGER_JO
340a0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
340b0 54 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  TE .       || eN
340c0 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
340d0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 0a 20  LMODE_PERSIST . 
340e0 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50        || eNew==P
340f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
34100 5f 4f 46 46 0a 20 20 20 20 20 20 20 7c 7c 20 65  _OFF.       || e
34110 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
34120 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 20 20  ALMODE_MEMORY.  
34130 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
34140 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
34150 57 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  WAL.       || eN
34160 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
34170 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 29 3b  LMODE_QUERY.  );
34180 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
34190 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
341a0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
341b0 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
341c0 79 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d  y==0 );..  pBt =
341d0 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
341e0 5d 2e 70 42 74 3b 0a 20 20 70 50 61 67 65 72 20  ].pBt;.  pPager 
341f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
34200 67 65 72 28 70 42 74 29 3b 0a 20 20 65 4f 6c 64  ger(pBt);.  eOld
34210 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
34220 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
34230 61 67 65 72 29 3b 0a 20 20 69 66 28 20 65 4e 65  ager);.  if( eNe
34240 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
34250 4d 4f 44 45 5f 51 55 45 52 59 20 29 20 65 4e 65  MODE_QUERY ) eNe
34260 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 69 66 28 20  w = eOld;.  if( 
34270 21 73 71 6c 69 74 65 33 50 61 67 65 72 4f 6b 54  !sqlite3PagerOkT
34280 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f  oChangeJournalMo
34290 64 65 28 70 50 61 67 65 72 29 20 29 20 65 4e 65  de(pPager) ) eNe
342a0 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23 69 66 6e 64  w = eOld;..#ifnd
342b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
342c0 41 4c 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  AL.  zFilename =
342d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
342e0 65 6e 61 6d 65 28 70 50 61 67 65 72 2c 20 31 29  ename(pPager, 1)
342f0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  ;..  /* Do not a
34300 6c 6c 6f 77 20 61 20 74 72 61 6e 73 69 74 69 6f  llow a transitio
34310 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  n to journal_mod
34320 65 3d 57 41 4c 20 66 6f 72 20 61 20 64 61 74 61  e=WAL for a data
34330 62 61 73 65 0a 20 20 2a 2a 20 69 6e 20 74 65 6d  base.  ** in tem
34340 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 6f  porary storage o
34350 72 20 69 66 20 74 68 65 20 56 46 53 20 64 6f 65  r if the VFS doe
34360 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68  s not support sh
34370 61 72 65 64 20 6d 65 6d 6f 72 79 20 0a 20 20 2a  ared memory .  *
34380 2f 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41  /.  if( eNew==PA
34390 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
343a0 57 41 4c 0a 20 20 20 26 26 20 28 73 71 6c 69 74  WAL.   && (sqlit
343b0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
343c0 6e 61 6d 65 29 3d 3d 30 20 20 20 20 20 20 20 20  name)==0        
343d0 20 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 20     /* Temp file 
343e0 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 21 73 71  */.       || !sq
343f0 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53 75 70  lite3PagerWalSup
34400 70 6f 72 74 65 64 28 70 50 61 67 65 72 29 29 20  ported(pPager)) 
34410 20 20 2f 2a 20 4e 6f 20 73 68 61 72 65 64 2d 6d    /* No shared-m
34420 65 6d 6f 72 79 20 73 75 70 70 6f 72 74 20 2a 2f  emory support */
34430 0a 20 20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d  .  ){.    eNew =
34440 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69 66   eOld;.  }..  if
34450 28 20 28 65 4e 65 77 21 3d 65 4f 6c 64 29 0a 20  ( (eNew!=eOld). 
34460 20 20 26 26 20 28 65 4f 6c 64 3d 3d 50 41 47 45    && (eOld==PAGE
34470 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
34480 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52  L || eNew==PAGER
34490 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
344a0 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ).  ){.    if( !
344b0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c  db->autoCommit |
344c0 7c 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  | db->nVdbeRead>
344d0 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
344e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
344f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
34500 72 72 6f 72 28 70 2c 0a 20 20 20 20 20 20 20 20  rror(p,.        
34510 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65    "cannot change
34520 20 25 73 20 77 61 6c 20 6d 6f 64 65 20 66 72 6f   %s wal mode fro
34530 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  m within a trans
34540 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20  action",.       
34550 20 20 20 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f     (eNew==PAGER_
34560 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
34570 3f 20 22 69 6e 74 6f 22 20 3a 20 22 6f 75 74 20  ? "into" : "out 
34580 6f 66 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  of").      );.  
34590 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
345a0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
345b0 20 7d 65 6c 73 65 7b 0a 20 0a 20 20 20 20 20 20   }else{. .      
345c0 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f  if( eOld==PAGER_
345d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
345e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
345f0 20 6c 65 61 76 69 6e 67 20 57 41 4c 20 6d 6f 64   leaving WAL mod
34600 65 2c 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67  e, close the log
34610 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
34620 73 66 75 6c 2c 20 74 68 65 20 63 61 6c 6c 0a 20  sful, the call. 
34630 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 50 61 67         ** to Pag
34640 65 72 43 6c 6f 73 65 57 61 6c 28 29 20 63 68 65  erCloseWal() che
34650 63 6b 70 6f 69 6e 74 73 20 61 6e 64 20 64 65 6c  ckpoints and del
34660 65 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 61  etes the write-a
34670 68 65 61 64 2d 6c 6f 67 20 0a 20 20 20 20 20 20  head-log .      
34680 20 20 2a 2a 20 66 69 6c 65 2e 20 41 6e 20 45 58    ** file. An EX
34690 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6d 61 79  CLUSIVE lock may
346a0 20 73 74 69 6c 6c 20 62 65 20 68 65 6c 64 20 6f   still be held o
346b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
346c0 69 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile .        ** 
346d0 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  after a successf
346e0 75 6c 20 72 65 74 75 72 6e 2e 20 0a 20 20 20 20  ul return. .    
346f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
34700 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34710 43 6c 6f 73 65 57 61 6c 28 70 50 61 67 65 72 2c  CloseWal(pPager,
34720 20 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66   db);.        if
34730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
34750 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72  ite3PagerSetJour
34760 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20  nalMode(pPager, 
34770 65 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  eNew);.        }
34780 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
34790 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55   eOld==PAGER_JOU
347a0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
347b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
347c0 6e 6e 6f 74 20 74 72 61 6e 73 69 74 69 6f 6e 20  nnot transition 
347d0 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 4d 45  directly from ME
347e0 4d 4f 52 59 20 74 6f 20 57 41 4c 2e 20 20 55 73  MORY to WAL.  Us
347f0 65 20 6d 6f 64 65 20 4f 46 46 0a 20 20 20 20 20  e mode OFF.     
34800 20 20 20 2a 2a 20 61 73 20 61 6e 20 69 6e 74 65     ** as an inte
34810 72 6d 65 64 69 61 74 65 20 2a 2f 0a 20 20 20 20  rmediate */.    
34820 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34830 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70  SetJournalMode(p
34840 50 61 67 65 72 2c 20 50 41 47 45 52 5f 4a 4f 55  Pager, PAGER_JOU
34850 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 3b 0a 20  RNALMODE_OFF);. 
34860 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
34870 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61 6e 73 61  /* Open a transa
34880 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
34890 61 62 61 73 65 20 66 69 6c 65 2e 20 52 65 67 61  abase file. Rega
348a0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6a 6f  rdless of the jo
348b0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 6d  urnal.      ** m
348c0 6f 64 65 2c 20 74 68 69 73 20 74 72 61 6e 73 61  ode, this transa
348d0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
348e0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
348f0 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
34900 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
34910 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
34920 6e 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  ns(pBt)==0 );.  
34930 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
34960 65 65 53 65 74 56 65 72 73 69 6f 6e 28 70 42 74  eeSetVersion(pBt
34970 2c 20 28 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  , (eNew==PAGER_J
34980 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f  OURNALMODE_WAL ?
34990 20 32 20 3a 20 31 29 29 3b 0a 20 20 20 20 20 20   2 : 1));.      
349a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
349b0 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  if /* ifndef SQL
349c0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
349d0 0a 20 20 69 66 28 20 72 63 20 29 20 65 4e 65 77  .  if( rc ) eNew
349e0 20 3d 20 65 4f 6c 64 3b 0a 20 20 65 4e 65 77 20   = eOld;.  eNew 
349f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
34a00 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61  tJournalMode(pPa
34a10 67 65 72 2c 20 65 4e 65 77 29 3b 0a 0a 20 20 70  ger, eNew);..  p
34a20 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
34a30 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c  _Str|MEM_Static|
34a40 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74  MEM_Term;.  pOut
34a50 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ->z = (char *)sq
34a60 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
34a70 6e 61 6d 65 28 65 4e 65 77 29 3b 0a 20 20 70 4f  name(eNew);.  pO
34a80 75 74 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ut->n = sqlite3S
34a90 74 72 6c 65 6e 33 30 28 70 4f 75 74 2d 3e 7a 29  trlen30(pOut->z)
34aa0 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
34ab0 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 73  SQLITE_UTF8;.  s
34ac0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
34ad0 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65  Encoding(pOut, e
34ae0 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 69 66 28 20  ncoding);.  if( 
34af0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
34b00 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
34b10 62 72 65 61 6b 3b 0a 7d 3b 0a 23 65 6e 64 69 66  break;.};.#endif
34b20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
34b30 50 52 41 47 4d 41 20 2a 2f 0a 0a 23 69 66 20 21  PRAGMA */..#if !
34b40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
34b50 4d 49 54 5f 56 41 43 55 55 4d 29 20 26 26 20 21  MIT_VACUUM) && !
34b60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
34b70 4d 49 54 5f 41 54 54 41 43 48 29 0a 2f 2a 20 4f  MIT_ATTACH)./* O
34b80 70 63 6f 64 65 3a 20 56 61 63 75 75 6d 20 50 31  pcode: Vacuum P1
34b90 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 56   * * * *.**.** V
34ba0 61 63 75 75 6d 20 74 68 65 20 65 6e 74 69 72 65  acuum the entire
34bb0 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 50   database P1.  P
34bc0 31 20 69 73 20 30 20 66 6f 72 20 22 6d 61 69 6e  1 is 0 for "main
34bd0 22 2c 20 61 6e 64 20 32 20 6f 72 20 6d 6f 72 65  ", and 2 or more
34be0 0a 2a 2a 20 66 6f 72 20 61 6e 20 61 74 74 61 63  .** for an attac
34bf0 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 20 54  hed database.  T
34c00 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  he "temp" databa
34c10 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 76 61  se may not be va
34c20 63 75 75 6d 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  cuumed..*/.case 
34c30 4f 50 5f 56 61 63 75 75 6d 3a 20 7b 0a 20 20 61  OP_Vacuum: {.  a
34c40 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e  ssert( p->readOn
34c50 6c 79 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  ly==0 );.  rc = 
34c60 73 71 6c 69 74 65 33 52 75 6e 56 61 63 75 75 6d  sqlite3RunVacuum
34c70 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
34c80 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 69 66  , pOp->p1);.  if
34c90 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
34ca0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
34cb0 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
34cc0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
34cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
34ce0 56 41 43 55 55 4d 29 0a 2f 2a 20 4f 70 63 6f 64  VACUUM)./* Opcod
34cf0 65 3a 20 49 6e 63 72 56 61 63 75 75 6d 20 50 31  e: IncrVacuum P1
34d00 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
34d10 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
34d20 20 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 63   step of the inc
34d30 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
34d40 70 72 6f 63 65 64 75 72 65 20 6f 6e 0a 2a 2a 20  procedure on.** 
34d50 74 68 65 20 50 31 20 64 61 74 61 62 61 73 65 2e  the P1 database.
34d60 20 49 66 20 74 68 65 20 76 61 63 75 75 6d 20 68   If the vacuum h
34d70 61 73 20 66 69 6e 69 73 68 65 64 2c 20 6a 75 6d  as finished, jum
34d80 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  p to instruction
34d90 0a 2a 2a 20 50 32 2e 20 4f 74 68 65 72 77 69 73  .** P2. Otherwis
34da0 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  e, fall through 
34db0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
34dc0 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
34dd0 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 3a 20   OP_IncrVacuum: 
34de0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
34df0 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74   */.  Btree *pBt
34e00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
34e10 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
34e20 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
34e30 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
34e40 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
34e50 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 61   pOp->p1) );.  a
34e60 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e  ssert( p->readOn
34e70 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d  ly==0 );.  pBt =
34e80 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
34e90 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d 20 73 71  ].pBt;.  rc = sq
34ea0 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
34eb0 63 75 75 6d 28 70 42 74 29 3b 0a 20 20 56 64 62  cuum(pBt);.  Vdb
34ec0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 63 3d  eBranchTaken(rc=
34ed0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 2c 32 29 3b  =SQLITE_DONE,2);
34ee0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
34ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34f00 44 4f 4e 45 20 29 20 67 6f 74 6f 20 61 62 6f 72  DONE ) goto abor
34f10 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
34f20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34f30 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d  OK;.    goto jum
34f40 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
34f50 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
34f60 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 78 70 69 72  /* Opcode: Expir
34f70 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  e P1 * * * *.**.
34f80 2a 2a 20 43 61 75 73 65 20 70 72 65 63 6f 6d 70  ** Cause precomp
34f90 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  iled statements 
34fa0 74 6f 20 65 78 70 69 72 65 2e 20 20 57 68 65 6e  to expire.  When
34fb0 20 61 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   an expired stat
34fc0 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65 78 65 63  ement.** is exec
34fd0 75 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  uted using sqlit
34fe0 65 33 5f 73 74 65 70 28 29 20 69 74 20 77 69 6c  e3_step() it wil
34ff0 6c 20 65 69 74 68 65 72 20 61 75 74 6f 6d 61 74  l either automat
35000 69 63 61 6c 6c 79 0a 2a 2a 20 72 65 70 72 65 70  ically.** reprep
35010 61 72 65 20 69 74 73 65 6c 66 20 28 69 66 20 69  are itself (if i
35020 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
35030 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 73   created using s
35040 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
35050 32 28 29 29 0a 2a 2a 20 6f 72 20 69 74 20 77 69  2()).** or it wi
35060 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
35070 49 54 45 5f 53 43 48 45 4d 41 2e 0a 2a 2a 20 0a  ITE_SCHEMA..** .
35080 2a 2a 20 49 66 20 50 31 20 69 73 20 30 2c 20 74  ** If P1 is 0, t
35090 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73 74 61 74  hen all SQL stat
350a0 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65 20 65 78  ements become ex
350b0 70 69 72 65 64 2e 20 49 66 20 50 31 20 69 73 20  pired. If P1 is 
350c0 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65  non-zero,.** the
350d0 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75 72 72 65  n only the curre
350e0 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67 20 73  ntly executing s
350f0 74 61 74 65 6d 65 6e 74 20 69 73 20 65 78 70 69  tatement is expi
35100 72 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  red..*/.case OP_
35110 45 78 70 69 72 65 3a 20 7b 0a 20 20 69 66 28 20  Expire: {.  if( 
35120 21 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20  !pOp->p1 ){.    
35130 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
35140 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
35150 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  db);.  }else{.  
35160 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
35170 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
35180 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
35190 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
351a0 48 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 61  HE./* Opcode: Ta
351b0 62 6c 65 4c 6f 63 6b 20 50 31 20 50 32 20 50 33  bleLock P1 P2 P3
351c0 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
351d0 73 3a 20 69 44 62 3d 50 31 20 72 6f 6f 74 3d 50  s: iDb=P1 root=P
351e0 32 20 77 72 69 74 65 3d 50 33 0a 2a 2a 0a 2a 2a  2 write=P3.**.**
351f0 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   Obtain a lock o
35200 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
35210 61 62 6c 65 2e 20 54 68 69 73 20 69 6e 73 74 72  able. This instr
35220 75 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  uction is only u
35230 73 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  sed when.** the 
35240 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
35250 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  ture is enabled.
35260 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68   .**.** P1 is th
35270 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
35280 61 74 61 62 61 73 65 20 69 6e 20 73 71 6c 69 74  atabase in sqlit
35290 65 33 2e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  e3.aDb[] of the 
352a0 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f 6e 20 77  database.** on w
352b0 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 69 73  hich the lock is
352c0 20 61 63 71 75 69 72 65 64 2e 20 20 41 20 72 65   acquired.  A re
352d0 61 64 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  adlock is obtain
352e0 65 64 20 69 66 20 50 33 3d 3d 30 20 6f 72 0a 2a  ed if P3==0 or.*
352f0 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  * a write lock i
35300 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a 20 50  f P3==1..**.** P
35310 32 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  2 contains the r
35320 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65 20  oot-page of the 
35330 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 2e 0a 2a  table to lock..*
35340 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74 61 69 6e 73  *.** P4 contains
35350 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
35360 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
35370 62 6c 65 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ble being locked
35380 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a 2a  . This is only.*
35390 2a 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  * used to genera
353a0 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
353b0 61 67 65 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  age if the lock 
353c0 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
353d0 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  ed..*/.case OP_T
353e0 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20 20 75 38  ableLock: {.  u8
353f0 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28   isWriteLock = (
35400 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66  u8)pOp->p3;.  if
35410 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ( isWriteLock ||
35420 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53   0==(db->flags&S
35430 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
35440 69 74 74 65 64 29 20 29 7b 0a 20 20 20 20 69 6e  itted) ){.    in
35450 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  t p1 = pOp->p1; 
35460 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
35470 3d 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62  =0 && p1<db->nDb
35480 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
35490 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74  DbMaskTest(p->bt
354a0 72 65 65 4d 61 73 6b 2c 20 70 31 29 20 29 3b 0a  reeMask, p1) );.
354b0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 57 72      assert( isWr
354c0 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73  iteLock==0 || is
354d0 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  WriteLock==1 );.
354e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
354f0 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 64  BtreeLockTable(d
35500 62 2d 3e 61 44 62 5b 70 31 5d 2e 70 42 74 2c 20  b->aDb[p1].pBt, 
35510 70 4f 70 2d 3e 70 32 2c 20 69 73 57 72 69 74 65  pOp->p2, isWrite
35520 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
35530 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  c ){.      if( (
35540 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
35550 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
35560 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
35570 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
35580 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35590 65 45 72 72 6f 72 28 70 2c 20 22 64 61 74 61 62  eError(p, "datab
355a0 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
355b0 6b 65 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ked: %s", z);.  
355c0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
355d0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
355e0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
355f0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
35600 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
35610 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
35620 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35630 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
35640 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 42 65  E./* Opcode: VBe
35650 67 69 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a  gin * * * P4 *.*
35660 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61  *.** P4 may be a
35670 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
35680 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
35690 63 74 75 72 65 2e 20 49 66 20 73 6f 2c 20 63 61  cture. If so, ca
356a0 6c 6c 20 74 68 65 20 0a 2a 2a 20 78 42 65 67 69  ll the .** xBegi
356b0 6e 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 61  n method for tha
356c0 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  t table..**.** A
356d0 6c 73 6f 2c 20 77 68 65 74 68 65 72 20 6f 72 20  lso, whether or 
356e0 6e 6f 74 20 50 34 20 69 73 20 73 65 74 2c 20 63  not P4 is set, c
356f0 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
35700 73 20 6e 6f 74 20 62 65 69 6e 67 20 63 61 6c 6c  s not being call
35710 65 64 20 66 72 6f 6d 0a 2a 2a 20 77 69 74 68 69  ed from.** withi
35720 6e 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  n a callback to 
35730 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
35740 78 53 79 6e 63 28 29 20 6d 65 74 68 6f 64 2e 20  xSync() method. 
35750 49 66 20 69 74 20 69 73 2c 20 74 68 65 20 65 72  If it is, the er
35760 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  ror.** code will
35770 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
35780 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73  E_LOCKED..*/.cas
35790 65 20 4f 50 5f 56 42 65 67 69 6e 3a 20 7b 0a 20  e OP_VBegin: {. 
357a0 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 3b 0a   VTable *pVTab;.
357b0 20 20 70 56 54 61 62 20 3d 20 70 4f 70 2d 3e 70    pVTab = pOp->p
357c0 34 2e 70 56 74 61 62 3b 0a 20 20 72 63 20 3d 20  4.pVtab;.  rc = 
357d0 73 71 6c 69 74 65 33 56 74 61 62 42 65 67 69 6e  sqlite3VtabBegin
357e0 28 64 62 2c 20 70 56 54 61 62 29 3b 0a 20 20 69  (db, pVTab);.  i
357f0 66 28 20 70 56 54 61 62 20 29 20 73 71 6c 69 74  f( pVTab ) sqlit
35800 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
35810 73 67 28 70 2c 20 70 56 54 61 62 2d 3e 70 56 74  sg(p, pVTab->pVt
35820 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ab);.  if( rc ) 
35830 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
35840 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
35850 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
35860 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
35870 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
35880 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
35890 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
358a0 70 63 6f 64 65 3a 20 56 43 72 65 61 74 65 20 50  pcode: VCreate P
358b0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
358c0 20 50 32 20 69 73 20 61 20 72 65 67 69 73 74 65   P2 is a registe
358d0 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  r that holds the
358e0 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75   name of a virtu
358f0 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61  al table in data
35900 62 61 73 65 20 0a 2a 2a 20 50 31 2e 20 43 61 6c  base .** P1. Cal
35910 6c 20 74 68 65 20 78 43 72 65 61 74 65 20 6d 65  l the xCreate me
35920 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74 61  thod for that ta
35930 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ble..*/.case OP_
35940 56 43 72 65 61 74 65 3a 20 7b 0a 20 20 4d 65 6d  VCreate: {.  Mem
35950 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   sMem;          
35960 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20 74  /* For storing t
35970 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20  he record being 
35980 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e  decoded */.  con
35990 73 74 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20  st char *zTab;  
359a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76  /* Name of the v
359b0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
359c0 0a 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c  .  memset(&sMem,
359d0 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29   0, sizeof(sMem)
359e0 29 3b 0a 20 20 73 4d 65 6d 2e 64 62 20 3d 20 64  );.  sMem.db = d
359f0 62 3b 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20  b;.  /* Because 
35a00 50 32 20 69 73 20 61 6c 77 61 79 73 20 61 20 73  P2 is always a s
35a10 74 61 74 69 63 20 73 74 72 69 6e 67 2c 20 69 74  tatic string, it
35a20 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
35a30 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  or the.  ** sqli
35a40 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 29  te3VdbeMemCopy()
35a50 20 74 6f 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73   to fail */.  as
35a60 73 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d  sert( (aMem[pOp-
35a70 3e 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  >p2].flags & MEM
35a80 5f 53 74 72 29 21 3d 30 20 29 3b 0a 20 20 61 73  _Str)!=0 );.  as
35a90 73 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d  sert( (aMem[pOp-
35aa0 3e 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  >p2].flags & MEM
35ab0 5f 53 74 61 74 69 63 29 21 3d 30 20 29 3b 0a 20  _Static)!=0 );. 
35ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
35ad0 65 4d 65 6d 43 6f 70 79 28 26 73 4d 65 6d 2c 20  eMemCopy(&sMem, 
35ae0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b  &aMem[pOp->p2]);
35af0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
35b00 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7a 54  QLITE_OK );.  zT
35b10 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ab = (const char
35b20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
35b30 74 65 78 74 28 26 73 4d 65 6d 29 3b 0a 20 20 61  text(&sMem);.  a
35b40 73 73 65 72 74 28 20 7a 54 61 62 20 7c 7c 20 64  ssert( zTab || d
35b50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
35b60 29 3b 0a 20 20 69 66 28 20 7a 54 61 62 20 29 7b  );.  if( zTab ){
35b70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35b80 33 56 74 61 62 43 61 6c 6c 43 72 65 61 74 65 28  3VtabCallCreate(
35b90 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 7a 54 61  db, pOp->p1, zTa
35ba0 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  b, &p->zErrMsg);
35bb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
35bc0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d  beMemRelease(&sM
35bd0 65 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  em);.  if( rc ) 
35be0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
35bf0 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
35c00 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
35c10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
35c20 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
35c30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
35c40 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
35c50 70 63 6f 64 65 3a 20 56 44 65 73 74 72 6f 79 20  pcode: VDestroy 
35c60 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
35c70 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65  * P4 is the name
35c80 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
35c90 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20  ble in database 
35ca0 50 31 2e 20 20 43 61 6c 6c 20 74 68 65 20 78 44  P1.  Call the xD
35cb0 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a  estroy method.**
35cc0 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 0a   of that table..
35cd0 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65 73 74  */.case OP_VDest
35ce0 72 6f 79 3a 20 7b 0a 20 20 64 62 2d 3e 6e 56 44  roy: {.  db->nVD
35cf0 65 73 74 72 6f 79 2b 2b 3b 0a 20 20 72 63 20 3d  estroy++;.  rc =
35d00 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
35d10 44 65 73 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d  Destroy(db, pOp-
35d20 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
35d30 0a 20 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f 79  .  db->nVDestroy
35d40 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  --;.  if( rc ) g
35d50 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
35d60 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
35d70 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
35d80 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
35d90 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
35da0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
35db0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
35dc0 63 6f 64 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a  code: VOpen P1 *
35dd0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
35de0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
35df0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
35e00 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69   object, an sqli
35e10 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
35e20 72 65 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20 63  re..** P1 is a c
35e30 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54  ursor number.  T
35e40 68 69 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73  his opcode opens
35e50 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65   a cursor to the
35e60 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
35e70 65 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61  e and stores tha
35e80 74 20 63 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a  t cursor in P1..
35e90 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e  */.case OP_VOpen
35ea0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
35eb0 20 2a 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65   *pCur;.  sqlite
35ec0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
35ed0 56 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  VCur;.  sqlite3_
35ee0 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63  vtab *pVtab;.  c
35ef0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
35f00 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20  ule *pModule;.. 
35f10 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
35f20 65 61 64 65 72 20 29 3b 0a 20 20 70 43 75 72 20  eader );.  pCur 
35f30 3d 20 30 3b 0a 20 20 70 56 43 75 72 20 3d 20 30  = 0;.  pVCur = 0
35f40 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d  ;.  pVtab = pOp-
35f50 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
35f60 3b 0a 20 20 69 66 28 20 70 56 74 61 62 3d 3d 30  ;.  if( pVtab==0
35f70 20 7c 7c 20 4e 45 56 45 52 28 70 56 74 61 62 2d   || NEVER(pVtab-
35f80 3e 70 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b 0a  >pModule==0) ){.
35f90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35fa0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74 6f  LOCKED;.    goto
35fb0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
35fc0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64 75  ror;.  }.  pModu
35fd0 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  le = pVtab->pMod
35fe0 75 6c 65 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64  ule;.  rc = pMod
35ff0 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 56 74 61 62  ule->xOpen(pVtab
36000 2c 20 26 70 56 43 75 72 29 3b 0a 20 20 73 71 6c  , &pVCur);.  sql
36010 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
36020 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a  rmsg(p, pVtab);.
36030 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
36040 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
36050 6f 72 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  or;..  /* Initia
36060 6c 69 7a 65 20 73 71 6c 69 74 65 33 5f 76 74 61  lize sqlite3_vta
36070 62 5f 63 75 72 73 6f 72 20 62 61 73 65 20 63 6c  b_cursor base cl
36080 61 73 73 20 2a 2f 0a 20 20 70 56 43 75 72 2d 3e  ass */.  pVCur->
36090 70 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 0a  pVtab = pVtab;..
360a0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
360b0 76 64 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65  vdbe cursor obje
360c0 63 74 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61  ct */.  pCur = a
360d0 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c  llocateCursor(p,
360e0 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c   pOp->p1, 0, -1,
360f0 20 43 55 52 54 59 50 45 5f 56 54 41 42 29 3b 0a   CURTYPE_VTAB);.
36100 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
36110 20 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72    pCur->uc.pVCur
36120 20 3d 20 70 56 43 75 72 3b 0a 20 20 20 20 70 56   = pVCur;.    pV
36130 74 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  tab->nRef++;.  }
36140 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
36150 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
36160 65 64 20 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c  ed );.    pModul
36170 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29  e->xClose(pVCur)
36180 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ;.    goto no_me
36190 6d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  m;.  }.  break;.
361a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
361b0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
361c0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
361d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
361e0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
361f0 6f 64 65 3a 20 56 46 69 6c 74 65 72 20 50 31 20  ode: VFilter P1 
36200 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79  P2 P3 P4 *.** Sy
36210 6e 6f 70 73 69 73 3a 20 69 70 6c 61 6e 3d 72 5b  nopsis: iplan=r[
36220 50 33 5d 20 7a 70 6c 61 6e 3d 27 50 34 27 0a 2a  P3] zplan='P4'.*
36230 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72  *.** P1 is a cur
36240 73 6f 72 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  sor opened using
36250 20 56 4f 70 65 6e 2e 20 20 50 32 20 69 73 20 61   VOpen.  P2 is a
36260 6e 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  n address to jum
36270 70 20 74 6f 20 69 66 0a 2a 2a 20 74 68 65 20 66  p to if.** the f
36280 69 6c 74 65 72 65 64 20 72 65 73 75 6c 74 20 73  iltered result s
36290 65 74 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  et is empty..**.
362a0 2a 2a 20 50 34 20 69 73 20 65 69 74 68 65 72 20  ** P4 is either 
362b0 4e 55 4c 4c 20 6f 72 20 61 20 73 74 72 69 6e 67  NULL or a string
362c0 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
362d0 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ted by the xBest
362e0 49 6e 64 65 78 0a 2a 2a 20 6d 65 74 68 6f 64 20  Index.** method 
362f0 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 20  of the module.  
36300 54 68 65 20 69 6e 74 65 72 70 72 65 74 61 74 69  The interpretati
36310 6f 6e 20 6f 66 20 74 68 65 20 50 34 20 73 74 72  on of the P4 str
36320 69 6e 67 20 69 73 20 6c 65 66 74 0a 2a 2a 20 74  ing is left.** t
36330 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20 69 6d 70  o the module imp
36340 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  lementation..**.
36350 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
36360 6e 76 6f 6b 65 73 20 74 68 65 20 78 46 69 6c 74  nvokes the xFilt
36370 65 72 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65  er method on the
36380 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73   virtual table s
36390 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 50  pecified.** by P
363a0 31 2e 20 20 54 68 65 20 69 6e 74 65 67 65 72 20  1.  The integer 
363b0 71 75 65 72 79 20 70 6c 61 6e 20 70 61 72 61 6d  query plan param
363c0 65 74 65 72 20 74 6f 20 78 46 69 6c 74 65 72 20  eter to xFilter 
363d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
363e0 69 73 74 65 72 0a 2a 2a 20 50 33 2e 20 52 65 67  ister.** P3. Reg
363f0 69 73 74 65 72 20 50 33 2b 31 20 73 74 6f 72 65  ister P3+1 store
36400 73 20 74 68 65 20 61 72 67 63 20 70 61 72 61 6d  s the argc param
36410 65 74 65 72 20 74 6f 20 62 65 20 70 61 73 73 65  eter to be passe
36420 64 20 74 6f 20 74 68 65 0a 2a 2a 20 78 46 69 6c  d to the.** xFil
36430 74 65 72 20 6d 65 74 68 6f 64 2e 20 52 65 67 69  ter method. Regi
36440 73 74 65 72 73 20 50 33 2b 32 2e 2e 50 33 2b 31  sters P3+2..P3+1
36450 2b 61 72 67 63 20 61 72 65 20 74 68 65 20 61 72  +argc are the ar
36460 67 63 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  gc.** additional
36470 20 70 61 72 61 6d 65 74 65 72 73 20 77 68 69 63   parameters whic
36480 68 20 61 72 65 20 70 61 73 73 65 64 20 74 6f 0a  h are passed to.
36490 2a 2a 20 78 46 69 6c 74 65 72 20 61 73 20 61 72  ** xFilter as ar
364a0 67 76 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b  gv. Register P3+
364b0 32 20 62 65 63 6f 6d 65 73 20 61 72 67 76 5b 30  2 becomes argv[0
364c0 5d 20 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f  ] when passed to
364d0 20 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   xFilter..**.** 
364e0 41 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74  A jump is made t
364f0 6f 20 50 32 20 69 66 20 74 68 65 20 72 65 73 75  o P2 if the resu
36500 6c 74 20 73 65 74 20 61 66 74 65 72 20 66 69 6c  lt set after fil
36510 74 65 72 69 6e 67 20 77 6f 75 6c 64 20 62 65 20  tering would be 
36520 65 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  empty..*/.case O
36530 50 5f 56 46 69 6c 74 65 72 3a 20 7b 20 20 20 2f  P_VFilter: {   /
36540 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20  * jump */.  int 
36550 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69 51 75 65  nArg;.  int iQue
36560 72 79 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ry;.  const sqli
36570 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
36580 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 51 75 65  ule;.  Mem *pQue
36590 72 79 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 63  ry;.  Mem *pArgc
365a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
365b0 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 3b 0a  _cursor *pVCur;.
365c0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
365d0 70 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75 72  pVtab;.  VdbeCur
365e0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
365f0 20 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   res;.  int i;. 
36600 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20   Mem **apArg;.. 
36610 20 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b   pQuery = &aMem[
36620 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67  pOp->p3];.  pArg
36630 63 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a  c = &pQuery[1];.
36640 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73    pCur = p->apCs
36650 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
36660 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
36670 28 70 51 75 65 72 79 29 20 29 3b 0a 20 20 52 45  (pQuery) );.  RE
36680 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
36690 2d 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20  ->p3, pQuery);. 
366a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
366b0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
366c0 5f 56 54 41 42 20 29 3b 0a 20 20 70 56 43 75 72  _VTAB );.  pVCur
366d0 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75   = pCur->uc.pVCu
366e0 72 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 56 43  r;.  pVtab = pVC
366f0 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f  ur->pVtab;.  pMo
36700 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d  dule = pVtab->pM
36710 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72 61  odule;..  /* Gra
36720 62 20 74 68 65 20 69 6e 64 65 78 20 6e 75 6d 62  b the index numb
36730 65 72 20 61 6e 64 20 61 72 67 63 20 70 61 72 61  er and argc para
36740 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
36750 72 74 28 20 28 70 51 75 65 72 79 2d 3e 66 6c 61  rt( (pQuery->fla
36760 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 26  gs&MEM_Int)!=0 &
36770 26 20 70 41 72 67 63 2d 3e 66 6c 61 67 73 3d 3d  & pArgc->flags==
36780 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e 41 72  MEM_Int );.  nAr
36790 67 20 3d 20 28 69 6e 74 29 70 41 72 67 63 2d 3e  g = (int)pArgc->
367a0 75 2e 69 3b 0a 20 20 69 51 75 65 72 79 20 3d 20  u.i;.  iQuery = 
367b0 28 69 6e 74 29 70 51 75 65 72 79 2d 3e 75 2e 69  (int)pQuery->u.i
367c0 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ;..  /* Invoke t
367d0 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  he xFilter metho
367e0 64 20 2a 2f 0a 20 20 72 65 73 20 3d 20 30 3b 0a  d */.  res = 0;.
367f0 20 20 61 70 41 72 67 20 3d 20 70 2d 3e 61 70 41    apArg = p->apA
36800 72 67 3b 0a 20 20 66 6f 72 28 69 20 3d 20 30 3b  rg;.  for(i = 0;
36810 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
36820 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 26 70     apArg[i] = &p
36830 41 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 7d 0a 20  Argc[i+1];.  }. 
36840 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
36850 46 69 6c 74 65 72 28 70 56 43 75 72 2c 20 69 51  Filter(pVCur, iQ
36860 75 65 72 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c  uery, pOp->p4.z,
36870 20 6e 41 72 67 2c 20 61 70 41 72 67 29 3b 0a 20   nArg, apArg);. 
36880 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
36890 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61  rtErrmsg(p, pVta
368a0 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  b);.  if( rc ) g
368b0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
368c0 5f 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d 20  _error;.  res = 
368d0 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56  pModule->xEof(pV
368e0 43 75 72 29 3b 0a 20 20 70 43 75 72 2d 3e 6e 75  Cur);.  pCur->nu
368f0 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 56 64 62  llRow = 0;.  Vdb
36900 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
36910 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65  !=0,2);.  if( re
36920 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  s ) goto jump_to
36930 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
36940 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
36950 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
36960 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
36970 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
36980 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
36990 65 3a 20 56 43 6f 6c 75 6d 6e 20 50 31 20 50 32  e: VColumn P1 P2
369a0 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
369b0 73 69 73 3a 20 72 5b 50 33 5d 3d 76 63 6f 6c 75  sis: r[P3]=vcolu
369c0 6d 6e 28 50 32 29 0a 2a 2a 0a 2a 2a 20 53 74 6f  mn(P2).**.** Sto
369d0 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
369e0 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e  the P2-th column
369f0 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 6f   of.** the row o
36a00 66 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74 61  f the virtual-ta
36a10 62 6c 65 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  ble that the .**
36a20 20 50 31 20 63 75 72 73 6f 72 20 69 73 20 70 6f   P1 cursor is po
36a30 69 6e 74 69 6e 67 20 74 6f 20 69 6e 74 6f 20 72  inting to into r
36a40 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63  egister P3..*/.c
36a50 61 73 65 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a 20  ase OP_VColumn: 
36a60 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
36a70 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74   *pVtab;.  const
36a80 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
36a90 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20  *pModule;.  Mem 
36aa0 2a 70 44 65 73 74 3b 0a 20 20 73 71 6c 69 74 65  *pDest;.  sqlite
36ab0 33 5f 63 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65  3_context sConte
36ac0 78 74 3b 0a 0a 20 20 56 64 62 65 43 75 72 73 6f  xt;..  VdbeCurso
36ad0 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70 43  r *pCur = p->apC
36ae0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
36af0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 43 75  ssert( pCur->eCu
36b00 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56  rType==CURTYPE_V
36b10 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TAB );.  assert(
36b20 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f   pOp->p3>0 && pO
36b30 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p3<=(p->nMem+
36b40 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
36b50 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d  );.  pDest = &aM
36b60 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d  em[pOp->p3];.  m
36b70 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
36b80 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 69 66 28  p, pDest);.  if(
36b90 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29   pCur->nullRow )
36ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
36bb0 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73  eMemSetNull(pDes
36bc0 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
36bd0 20 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75   }.  pVtab = pCu
36be0 72 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74  r->uc.pVCur->pVt
36bf0 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20  ab;.  pModule = 
36c00 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
36c10 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c    assert( pModul
36c20 65 2d 3e 78 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  e->xColumn );.  
36c30 6d 65 6d 73 65 74 28 26 73 43 6f 6e 74 65 78 74  memset(&sContext
36c40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f 6e  , 0, sizeof(sCon
36c50 74 65 78 74 29 29 3b 0a 20 20 73 43 6f 6e 74 65  text));.  sConte
36c60 78 74 2e 70 4f 75 74 20 3d 20 70 44 65 73 74 3b  xt.pOut = pDest;
36c70 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
36c80 67 28 70 44 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c  g(pDest, MEM_Nul
36c90 6c 29 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75  l);.  rc = pModu
36ca0 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 28 70 43 75 72  le->xColumn(pCur
36cb0 2d 3e 75 63 2e 70 56 43 75 72 2c 20 26 73 43 6f  ->uc.pVCur, &sCo
36cc0 6e 74 65 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b  ntext, pOp->p2);
36cd0 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d  .  sqlite3VtabIm
36ce0 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56  portErrmsg(p, pV
36cf0 74 61 62 29 3b 0a 20 20 69 66 28 20 73 43 6f 6e  tab);.  if( sCon
36d00 74 65 78 74 2e 69 73 45 72 72 6f 72 20 29 7b 0a  text.isError ){.
36d10 20 20 20 20 72 63 20 3d 20 73 43 6f 6e 74 65 78      rc = sContex
36d20 74 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  t.isError;.  }. 
36d30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
36d40 67 65 45 6e 63 6f 64 69 6e 67 28 70 44 65 73 74  geEncoding(pDest
36d50 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 52  , encoding);.  R
36d60 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
36d70 70 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a 20  p->p3, pDest);. 
36d80 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
36d90 53 49 5a 45 28 70 44 65 73 74 29 3b 0a 0a 20 20  SIZE(pDest);..  
36da0 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
36db0 65 6d 54 6f 6f 42 69 67 28 70 44 65 73 74 29 20  emTooBig(pDest) 
36dc0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
36dd0 62 69 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  big;.  }.  if( r
36de0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
36df0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
36e00 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
36e10 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
36e20 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
36e30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36e40 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
36e50 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4e 65 78 74  /* Opcode: VNext
36e60 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
36e70 2a 2a 20 41 64 76 61 6e 63 65 20 76 69 72 74 75  ** Advance virtu
36e80 61 6c 20 74 61 62 6c 65 20 50 31 20 74 6f 20 74  al table P1 to t
36e90 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 69  he next row in i
36ea0 74 73 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  ts result set an
36eb0 64 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73  d.** jump to ins
36ec0 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 72  truction P2.  Or
36ed0 2c 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  , if the virtual
36ee0 20 74 61 62 6c 65 20 68 61 73 20 72 65 61 63 68   table has reach
36ef0 65 64 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  ed.** the end of
36f00 20 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 2c   its result set,
36f10 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
36f20 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
36f30 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  nstruction..*/.c
36f40 61 73 65 20 4f 50 5f 56 4e 65 78 74 3a 20 7b 20  ase OP_VNext: { 
36f50 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 73    /* jump */.  s
36f60 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
36f70 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ab;.  const sqli
36f80 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
36f90 75 6c 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  ule;.  int res;.
36fa0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
36fb0 75 72 3b 0a 0a 20 20 72 65 73 20 3d 20 30 3b 0a  ur;..  res = 0;.
36fc0 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73    pCur = p->apCs
36fd0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
36fe0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 43 75 72  sert( pCur->eCur
36ff0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54  Type==CURTYPE_VT
37000 41 42 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  AB );.  if( pCur
37010 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  ->nullRow ){.   
37020 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56   break;.  }.  pV
37030 74 61 62 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70  tab = pCur->uc.p
37040 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70  VCur->pVtab;.  p
37050 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
37060 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72  pModule;.  asser
37070 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78  t( pModule->xNex
37080 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  t );..  /* Invok
37090 65 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d 65  e the xNext() me
370a0 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75  thod of the modu
370b0 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
370c0 77 61 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  way for the.  **
370d0 20 75 6e 64 65 72 6c 79 69 6e 67 20 69 6d 70 6c   underlying impl
370e0 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 72 65  ementation to re
370f0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 66  turn an error if
37100 20 6f 6e 65 20 6f 63 63 75 72 73 20 64 75 72 69   one occurs duri
37110 6e 67 0a 20 20 2a 2a 20 78 4e 65 78 74 28 29 2e  ng.  ** xNext().
37120 20 49 6e 73 74 65 61 64 2c 20 69 66 20 61 6e 20   Instead, if an 
37130 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 72  error occurs, tr
37140 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  ue is returned (
37150 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
37160 0a 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76  .  ** data is av
37170 61 69 6c 61 62 6c 65 29 20 61 6e 64 20 74 68 65  ailable) and the
37180 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
37190 72 6e 65 64 20 77 68 65 6e 20 78 43 6f 6c 75 6d  rned when xColum
371a0 6e 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f  n or.  ** some o
371b0 74 68 65 72 20 6d 65 74 68 6f 64 20 69 73 20 6e  ther method is n
371c0 65 78 74 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74  ext invoked on t
371d0 68 65 20 73 61 76 65 20 76 69 72 74 75 61 6c 20  he save virtual 
371e0 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 20 20  table cursor..  
371f0 2a 2f 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  */.  rc = pModul
37200 65 2d 3e 78 4e 65 78 74 28 70 43 75 72 2d 3e 75  e->xNext(pCur->u
37210 63 2e 70 56 43 75 72 29 3b 0a 20 20 73 71 6c 69  c.pVCur);.  sqli
37220 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
37230 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20  msg(p, pVtab);. 
37240 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
37250 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
37260 72 3b 0a 20 20 72 65 73 20 3d 20 70 4d 6f 64 75  r;.  res = pModu
37270 6c 65 2d 3e 78 45 6f 66 28 70 43 75 72 2d 3e 75  le->xEof(pCur->u
37280 63 2e 70 56 43 75 72 29 3b 0a 20 20 56 64 62 65  c.pVCur);.  Vdbe
37290 42 72 61 6e 63 68 54 61 6b 65 6e 28 21 72 65 73  BranchTaken(!res
372a0 2c 32 29 3b 0a 20 20 69 66 28 20 21 72 65 73 20  ,2);.  if( !res 
372b0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
372c0 72 65 20 69 73 20 64 61 74 61 2c 20 6a 75 6d 70  re is data, jump
372d0 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 67 6f   to P2 */.    go
372e0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e  to jump_to_p2_an
372f0 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65  d_check_for_inte
37300 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20 67 6f 74  rrupt;.  }.  got
37310 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65  o check_for_inte
37320 72 72 75 70 74 3b 0a 7d 0a 23 65 6e 64 69 66 20  rrupt;.}.#endif 
37330 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
37340 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
37350 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37360 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
37370 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 52 65 6e  ./* Opcode: VRen
37380 61 6d 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ame P1 * * P4 *.
37390 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
373a0 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 75  inter to a virtu
373b0 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c  al table object,
373c0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
373d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
373e0 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b  his opcode invok
373f0 65 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  es the correspon
37400 64 69 6e 67 20 78 52 65 6e 61 6d 65 20 6d 65 74  ding xRename met
37410 68 6f 64 2e 20 54 68 65 20 76 61 6c 75 65 0a 2a  hod. The value.*
37420 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  * in register P1
37430 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
37440 65 20 7a 4e 61 6d 65 20 61 72 67 75 6d 65 6e 74  e zName argument
37450 20 74 6f 20 74 68 65 20 78 52 65 6e 61 6d 65 20   to the xRename 
37460 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 63 61 73 65 20  method..*/.case 
37470 4f 50 5f 56 52 65 6e 61 6d 65 3a 20 7b 0a 20 20  OP_VRename: {.  
37480 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
37490 74 61 62 3b 0a 20 20 4d 65 6d 20 2a 70 4e 61 6d  tab;.  Mem *pNam
374a0 65 3b 0a 0a 20 20 70 56 74 61 62 20 3d 20 70 4f  e;..  pVtab = pO
374b0 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
374c0 61 62 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 26 61  ab;.  pName = &a
374d0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
374e0 61 73 73 65 72 74 28 20 70 56 74 61 62 2d 3e 70  assert( pVtab->p
374f0 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 20  Module->xRename 
37500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  );.  assert( mem
37510 49 73 56 61 6c 69 64 28 70 4e 61 6d 65 29 20 29  IsValid(pName) )
37520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
37530 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
37540 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
37550 4f 70 2d 3e 70 31 2c 20 70 4e 61 6d 65 29 3b 0a  Op->p1, pName);.
37560 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
37570 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
37580 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
37590 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pName->enc==SQLI
375a0 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 74 65 73  TE_UTF8 );.  tes
375b0 74 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e  tcase( pName->en
375c0 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
375d0 45 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  E );.  testcase(
375e0 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c   pName->enc==SQL
375f0 49 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20  ITE_UTF16LE );. 
37600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
37610 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
37620 70 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  pName, SQLITE_UT
37630 46 38 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  F8);.  if( rc ) 
37640 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
37650 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20 3d 20  o_error;.  rc = 
37660 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
37670 78 52 65 6e 61 6d 65 28 70 56 74 61 62 2c 20 70  xRename(pVtab, p
37680 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69  Name->z);.  sqli
37690 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
376a0 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20  msg(p, pVtab);. 
376b0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
376c0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
376d0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
376e0 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ror;.  break;.}.
376f0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
37700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
37710 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
37720 64 65 3a 20 56 55 70 64 61 74 65 20 50 31 20 50  de: VUpdate P1 P
37730 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
37740 6e 6f 70 73 69 73 3a 20 64 61 74 61 3d 72 5b 50  nopsis: data=r[P
37750 33 40 50 32 5d 0a 2a 2a 0a 2a 2a 20 50 34 20 69  3@P2].**.** P4 i
37760 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
37770 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
37780 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65  bject, an sqlite
37790 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
377a0 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  ..** This opcode
377b0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 72   invokes the cor
377c0 72 65 73 70 6f 6e 64 69 6e 67 20 78 55 70 64 61  responding xUpda
377d0 74 65 20 6d 65 74 68 6f 64 2e 20 50 32 20 76 61  te method. P2 va
377e0 6c 75 65 73 0a 2a 2a 20 61 72 65 20 63 6f 6e 74  lues.** are cont
377f0 69 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20 63 65  iguous memory ce
37800 6c 6c 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  lls starting at 
37810 50 33 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  P3 to pass to th
37820 65 20 78 55 70 64 61 74 65 20 0a 2a 2a 20 69 6e  e xUpdate .** in
37830 76 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 76 61  vocation. The va
37840 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
37850 28 50 33 2b 50 32 2d 31 29 20 63 6f 72 72 65 73  (P3+P2-1) corres
37860 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 0a 2a 2a  ponds to the .**
37870 20 70 32 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66   p2th element of
37880 20 74 68 65 20 61 72 67 76 20 61 72 72 61 79 20   the argv array 
37890 70 61 73 73 65 64 20 74 6f 20 78 55 70 64 61 74  passed to xUpdat
378a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 55 70  e..**.** The xUp
378b0 64 61 74 65 20 6d 65 74 68 6f 64 20 77 69 6c 6c  date method will
378c0 20 64 6f 20 61 20 44 45 4c 45 54 45 20 6f 72 20   do a DELETE or 
378d0 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 62 6f 74  an INSERT or bot
378e0 68 2e 0a 2a 2a 20 54 68 65 20 61 72 67 76 5b 30  h..** The argv[0
378f0 5d 20 65 6c 65 6d 65 6e 74 20 28 77 68 69 63 68  ] element (which
37900 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
37910 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 33 29 0a  memory cell P3).
37920 2a 2a 20 69 73 20 74 68 65 20 72 6f 77 69 64 20  ** is the rowid 
37930 6f 66 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65  of a row to dele
37940 74 65 2e 20 20 49 66 20 61 72 67 76 5b 30 5d 20  te.  If argv[0] 
37950 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 6e 6f 20  is NULL then no 
37960 0a 2a 2a 20 64 65 6c 65 74 69 6f 6e 20 6f 63 63  .** deletion occ
37970 75 72 73 2e 20 20 54 68 65 20 61 72 67 76 5b 31  urs.  The argv[1
37980 5d 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  ] element is the
37990 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65   rowid of the ne
379a0 77 20 0a 2a 2a 20 72 6f 77 2e 20 20 54 68 69 73  w .** row.  This
379b0 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 74 6f 20   can be NULL to 
379c0 68 61 76 65 20 74 68 65 20 76 69 72 74 75 61 6c  have the virtual
379d0 20 74 61 62 6c 65 20 73 65 6c 65 63 74 20 74 68   table select th
379e0 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 69 64 20  e new .** rowid 
379f0 66 6f 72 20 69 74 73 65 6c 66 2e 20 20 54 68 65  for itself.  The
37a00 20 73 75 62 73 65 71 75 65 6e 74 20 65 6c 65 6d   subsequent elem
37a10 65 6e 74 73 20 69 6e 20 74 68 65 20 61 72 72 61  ents in the arra
37a20 79 20 61 72 65 20 0a 2a 2a 20 74 68 65 20 76 61  y are .** the va
37a30 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  lues of columns 
37a40 69 6e 20 74 68 65 20 6e 65 77 20 72 6f 77 2e 0a  in the new row..
37a50 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d 3d 31 20 74  **.** If P2==1 t
37a60 68 65 6e 20 6e 6f 20 69 6e 73 65 72 74 20 69 73  hen no insert is
37a70 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 61 72 67   performed.  arg
37a80 76 5b 30 5d 20 69 73 20 74 68 65 20 72 6f 77 69  v[0] is the rowi
37a90 64 20 6f 66 0a 2a 2a 20 61 20 72 6f 77 20 74 6f  d of.** a row to
37aa0 20 64 65 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 50   delete..**.** P
37ab0 31 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 66  1 is a boolean f
37ac0 6c 61 67 2e 20 49 66 20 69 74 20 69 73 20 73 65  lag. If it is se
37ad0 74 20 74 6f 20 74 72 75 65 20 61 6e 64 20 74 68  t to true and th
37ae0 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c 0a 2a  e xUpdate call.*
37af0 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  * is successful,
37b00 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
37b10 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
37b20 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
37b30 72 6f 77 69 64 28 29 20 0a 2a 2a 20 69 73 20 73  rowid() .** is s
37b40 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
37b50 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  of the rowid for
37b60 20 74 68 65 20 72 6f 77 20 6a 75 73 74 20 69 6e   the row just in
37b70 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 35  serted..**.** P5
37b80 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 61 63   is the error ac
37b90 74 69 6f 6e 73 20 28 4f 45 5f 52 65 70 6c 61 63  tions (OE_Replac
37ba0 65 2c 20 4f 45 5f 46 61 69 6c 2c 20 4f 45 5f 49  e, OE_Fail, OE_I
37bb0 67 6e 6f 72 65 2c 20 65 74 63 29 20 74 6f 0a 2a  gnore, etc) to.*
37bc0 2a 20 61 70 70 6c 79 20 69 6e 20 74 68 65 20 63  * apply in the c
37bd0 61 73 65 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ase of a constra
37be0 69 6e 74 20 66 61 69 6c 75 72 65 20 6f 6e 20 61  int failure on a
37bf0 6e 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61  n insert or upda
37c00 74 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  te..*/.case OP_V
37c10 55 70 64 61 74 65 3a 20 7b 0a 20 20 73 71 6c 69  Update: {.  sqli
37c20 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
37c30 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
37c40 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
37c50 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20  ;.  int nArg;.  
37c60 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f  int i;.  sqlite_
37c70 69 6e 74 36 34 20 72 6f 77 69 64 3b 0a 20 20 4d  int64 rowid;.  M
37c80 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 20 20 4d 65  em **apArg;.  Me
37c90 6d 20 2a 70 58 3b 0a 0a 20 20 61 73 73 65 72 74  m *pX;..  assert
37ca0 28 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 20 20 20  ( pOp->p2==1    
37cb0 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d      || pOp->p5==
37cc0 4f 45 5f 46 61 69 6c 20 20 20 7c 7c 20 70 4f 70  OE_Fail   || pOp
37cd0 2d 3e 70 35 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  ->p5==OE_Rollbac
37ce0 6b 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  k .       || pOp
37cf0 2d 3e 70 35 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c  ->p5==OE_Abort |
37d00 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 49 67  | pOp->p5==OE_Ig
37d10 6e 6f 72 65 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d  nore || pOp->p5=
37d20 3d 4f 45 5f 52 65 70 6c 61 63 65 0a 20 20 29 3b  =OE_Replace.  );
37d30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
37d40 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70  adOnly==0 );.  p
37d50 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
37d60 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Vtab->pVtab;.  i
37d70 66 28 20 70 56 74 61 62 3d 3d 30 20 7c 7c 20 4e  f( pVtab==0 || N
37d80 45 56 45 52 28 70 56 74 61 62 2d 3e 70 4d 6f 64  EVER(pVtab->pMod
37d90 75 6c 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ule==0) ){.    r
37da0 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
37db0 44 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  D;.    goto abor
37dc0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
37dd0 20 20 7d 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20    }.  pModule = 
37de0 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
37df0 20 20 6e 41 72 67 20 3d 20 70 4f 70 2d 3e 70 32    nArg = pOp->p2
37e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
37e10 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 54 41 42  >p4type==P4_VTAB
37e20 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
37e30 28 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61 74  (pModule->xUpdat
37e40 65 29 20 29 7b 0a 20 20 20 20 75 38 20 76 74 61  e) ){.    u8 vta
37e50 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 64 62  bOnConflict = db
37e60 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74  ->vtabOnConflict
37e70 3b 0a 20 20 20 20 61 70 41 72 67 20 3d 20 70 2d  ;.    apArg = p-
37e80 3e 61 70 41 72 67 3b 0a 20 20 20 20 70 58 20 3d  >apArg;.    pX =
37e90 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
37ea0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
37eb0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
37ec0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
37ed0 61 6c 69 64 28 70 58 29 20 29 3b 0a 20 20 20 20  alid(pX) );.    
37ee0 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
37ef0 67 65 28 70 2c 20 70 58 29 3b 0a 20 20 20 20 20  ge(p, pX);.     
37f00 20 61 70 41 72 67 5b 69 5d 20 3d 20 70 58 3b 0a   apArg[i] = pX;.
37f10 20 20 20 20 20 20 70 58 2b 2b 3b 0a 20 20 20 20        pX++;.    
37f20 7d 0a 20 20 20 20 64 62 2d 3e 76 74 61 62 4f 6e  }.    db->vtabOn
37f30 43 6f 6e 66 6c 69 63 74 20 3d 20 70 4f 70 2d 3e  Conflict = pOp->
37f40 70 35 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f  p5;.    rc = pMo
37f50 64 75 6c 65 2d 3e 78 55 70 64 61 74 65 28 70 56  dule->xUpdate(pV
37f60 74 61 62 2c 20 6e 41 72 67 2c 20 61 70 41 72 67  tab, nArg, apArg
37f70 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20 20 64  , &rowid);.    d
37f80 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63  b->vtabOnConflic
37f90 74 20 3d 20 76 74 61 62 4f 6e 43 6f 6e 66 6c 69  t = vtabOnConfli
37fa0 63 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ct;.    sqlite3V
37fb0 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
37fc0 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69  p, pVtab);.    i
37fd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37fe0 20 26 26 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20   && pOp->p1 ){. 
37ff0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
38000 67 3e 31 20 26 26 20 61 70 41 72 67 5b 30 5d 20  g>1 && apArg[0] 
38010 26 26 20 28 61 70 41 72 67 5b 30 5d 2d 3e 66 6c  && (apArg[0]->fl
38020 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 20 29 3b  ags&MEM_Null) );
38030 0a 20 20 20 20 20 20 64 62 2d 3e 6c 61 73 74 52  .      db->lastR
38040 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20  owid = rowid;.  
38050 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 26    }.    if( (rc&
38060 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
38070 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
38080 3e 70 34 2e 70 56 74 61 62 2d 3e 62 43 6f 6e 73  >p4.pVtab->bCons
38090 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  traint ){.      
380a0 69 66 28 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f  if( pOp->p5==OE_
380b0 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
380c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
380d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
380e0 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f 72 41         p->errorA
380f0 63 74 69 6f 6e 20 3d 20 28 28 70 4f 70 2d 3e 70  ction = ((pOp->p
38100 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 20 3f  5==OE_Replace) ?
38110 20 4f 45 5f 41 62 6f 72 74 20 3a 20 70 4f 70 2d   OE_Abort : pOp-
38120 3e 70 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >p5);.      }.  
38130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
38140 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20  ->nChange++;.   
38150 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
38160 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
38170 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62  o_error;.  }.  b
38180 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
38190 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
381a0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
381b0 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f 4f  ifndef  SQLITE_O
381c0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
381d0 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 67  S./* Opcode: Pag
381e0 65 63 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a  ecount P1 P2 * *
381f0 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74   *.**.** Write t
38200 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
38210 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
38220 74 61 62 61 73 65 20 50 31 20 74 6f 20 6d 65 6d  tabase P1 to mem
38230 6f 72 79 20 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a  ory cell P2..*/.
38240 63 61 73 65 20 4f 50 5f 50 61 67 65 63 6f 75 6e  case OP_Pagecoun
38250 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
38260 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75  /* out2 */.  pOu
38270 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
38280 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f  se(p, pOp);.  pO
38290 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c 69 74 65  ut->u.i = sqlite
382a0 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 64  3BtreeLastPage(d
382b0 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
382c0 70 42 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  pBt);.  break;.}
382d0 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
382e0 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  f